diff --git a/app/Api/V1/Controllers/Autocomplete/CurrencyController.php b/app/Api/V1/Controllers/Autocomplete/CurrencyController.php index fe6cc5648f..8aa7d6cf52 100644 --- a/app/Api/V1/Controllers/Autocomplete/CurrencyController.php +++ b/app/Api/V1/Controllers/Autocomplete/CurrencyController.php @@ -62,7 +62,7 @@ class CurrencyController extends Controller * * @return JsonResponse */ - public function currenciesWithCode(AutocompleteRequest $request): JsonResponse + public function currencies(AutocompleteRequest $request): JsonResponse { $data = $request->getData(); $collection = $this->repository->searchCurrency($data['query'], $data['limit']); @@ -71,8 +71,8 @@ class CurrencyController extends Controller /** @var TransactionCurrency $currency */ foreach ($collection as $currency) { $result[] = [ - 'id' => (string) $currency->id, - 'name' => sprintf('%s (%s)', $currency->name, $currency->code), + 'id' => (string)$currency->id, + 'name' => $currency->name, 'code' => $currency->code, 'symbol' => $currency->symbol, 'decimal_places' => $currency->decimal_places, @@ -87,7 +87,7 @@ class CurrencyController extends Controller * * @return JsonResponse */ - public function currencies(AutocompleteRequest $request): JsonResponse + public function currenciesWithCode(AutocompleteRequest $request): JsonResponse { $data = $request->getData(); $collection = $this->repository->searchCurrency($data['query'], $data['limit']); @@ -96,8 +96,8 @@ class CurrencyController extends Controller /** @var TransactionCurrency $currency */ foreach ($collection as $currency) { $result[] = [ - 'id' => (string) $currency->id, - 'name' => $currency->name, + 'id' => (string)$currency->id, + 'name' => sprintf('%s (%s)', $currency->name, $currency->code), 'code' => $currency->code, 'symbol' => $currency->symbol, 'decimal_places' => $currency->decimal_places, diff --git a/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php b/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php index c1499c9f25..4887963ea1 100644 --- a/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php +++ b/app/Api/V1/Controllers/Autocomplete/PiggyBankController.php @@ -37,11 +37,9 @@ use Illuminate\Http\JsonResponse; */ class PiggyBankController extends Controller { + private AccountRepositoryInterface $accountRepository; private PiggyBankRepositoryInterface $piggyRepository; - private AccountRepositoryInterface $accountRepository; - - /** * PiggyBankController constructor. */ diff --git a/app/Api/V1/Controllers/Autocomplete/RuleController.php b/app/Api/V1/Controllers/Autocomplete/RuleController.php index cbd9022ed2..05510fceea 100644 --- a/app/Api/V1/Controllers/Autocomplete/RuleController.php +++ b/app/Api/V1/Controllers/Autocomplete/RuleController.php @@ -62,7 +62,7 @@ class RuleController extends Controller public function rules(AutocompleteRequest $request): JsonResponse { $data = $request->getData(); - $rules = $this->repository->searchRule($data['query'], $data['limit']); + $rules = $this->repository->searchRule($data['query'], $data['limit']); $response = []; /** @var Rule $rule */ diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionController.php b/app/Api/V1/Controllers/Autocomplete/TransactionController.php index 680e72bba4..579eb422b1 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionController.php @@ -38,10 +38,8 @@ use Illuminate\Support\Collection; */ class TransactionController extends Controller { - private JournalRepositoryInterface $repository; - private TransactionGroupRepositoryInterface $groupRepository; - + private JournalRepositoryInterface $repository; /** * TransactionController constructor. @@ -102,7 +100,7 @@ class TransactionController extends Controller $result = new Collection; if (is_numeric($data['query'])) { // search for group, not journal. - $firstResult = $this->groupRepository->find((int) $data['query']); + $firstResult = $this->groupRepository->find((int)$data['query']); if (null !== $firstResult) { // group may contain multiple journals, each a result: foreach ($firstResult->transactionJournals as $journal) { diff --git a/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php b/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php index 38faca2036..2984aab1e9 100644 --- a/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php +++ b/app/Api/V1/Controllers/Autocomplete/TransactionTypeController.php @@ -69,7 +69,7 @@ class TransactionTypeController extends Controller foreach ($types as $type) { // different key for consistency. $array[] = [ - 'id' =>(string) $type->id, + 'id' => (string)$type->id, 'name' => $type->type, 'type' => $type->type, ]; diff --git a/app/Api/V1/Controllers/Data/Export/ExportController.php b/app/Api/V1/Controllers/Data/Export/ExportController.php index 7f4aa32dbf..5851a4e34b 100644 --- a/app/Api/V1/Controllers/Data/Export/ExportController.php +++ b/app/Api/V1/Controllers/Data/Export/ExportController.php @@ -27,6 +27,7 @@ use FireflyIII\Api\V1\Requests\Data\Export\ExportRequest; use FireflyIII\Support\Export\ExportDataGenerator; use FireflyIII\User; use Illuminate\Http\Response as LaravelResponse; +use League\Csv\CannotInsertRecord; /** * Class ExportController @@ -59,7 +60,7 @@ class ExportController extends Controller * @param ExportRequest $request * * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord + * @throws CannotInsertRecord */ public function accounts(ExportRequest $request): LaravelResponse { @@ -69,120 +70,11 @@ class ExportController extends Controller } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function bills(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportBills(true); - - return $this->returnExport('bills'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function budgets(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportBudgets(true); - - return $this->returnExport('budgets'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function categories(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportCategories(true); - - return $this->returnExport('categories'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function piggyBanks(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportPiggies(true); - - return $this->returnExport('piggies'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function recurring(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportRecurring(true); - - return $this->returnExport('recurrences'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function rules(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportRules(true); - - return $this->returnExport('rules'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function tags(ExportRequest $request): LaravelResponse - { - $this->exporter->setExportTags(true); - - return $this->returnExport('tags'); - } - - /** - * @param ExportRequest $request - * - * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord - */ - public function transactions(ExportRequest $request): LaravelResponse - { - $params = $request->getAll(); - $this->exporter->setStart($params['start']); - $this->exporter->setEnd($params['end']); - $this->exporter->setAccounts($params['accounts']); - $this->exporter->setExportTransactions(true); - - return $this->returnExport('transactions'); - } - /** * @param string $key * * @return LaravelResponse - * @throws \League\Csv\CannotInsertRecord + * @throws CannotInsertRecord */ private function returnExport(string $key): LaravelResponse { @@ -206,4 +98,112 @@ class ExportController extends Controller return $response; } + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function bills(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportBills(true); + + return $this->returnExport('bills'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function budgets(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportBudgets(true); + + return $this->returnExport('budgets'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function categories(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportCategories(true); + + return $this->returnExport('categories'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function piggyBanks(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportPiggies(true); + + return $this->returnExport('piggies'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function recurring(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportRecurring(true); + + return $this->returnExport('recurrences'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function rules(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportRules(true); + + return $this->returnExport('rules'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function tags(ExportRequest $request): LaravelResponse + { + $this->exporter->setExportTags(true); + + return $this->returnExport('tags'); + } + + /** + * @param ExportRequest $request + * + * @return LaravelResponse + * @throws CannotInsertRecord + */ + public function transactions(ExportRequest $request): LaravelResponse + { + $params = $request->getAll(); + $this->exporter->setStart($params['start']); + $this->exporter->setEnd($params['end']); + $this->exporter->setAccounts($params['accounts']); + $this->exporter->setExportTransactions(true); + + return $this->returnExport('transactions'); + } + } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Insight/Expense/AccountController.php b/app/Api/V1/Controllers/Insight/Expense/AccountController.php index b41f203da6..66fd5c8ce8 100644 --- a/app/Api/V1/Controllers/Insight/Expense/AccountController.php +++ b/app/Api/V1/Controllers/Insight/Expense/AccountController.php @@ -44,8 +44,8 @@ class AccountController extends Controller use ApiSupport; private CurrencyRepositoryInterface $currencyRepository; - private AccountRepositoryInterface $repository; private OperationsRepositoryInterface $opsRepository; + private AccountRepositoryInterface $repository; /** * AccountController constructor. @@ -72,6 +72,32 @@ class AccountController extends Controller ); } + /** + * @param GenericRequest $request + * + * @return JsonResponse + */ + public function asset(GenericRequest $request): JsonResponse + { + $start = $request->getStart(); + $end = $request->getEnd(); + $assetAccounts = $request->getAssetAccounts(); + $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts); + $result = []; + + /** @var array $expense */ + foreach ($expenses as $expense) { + $result[] = [ + 'difference' => $expense['sum'], + 'difference_float' => (float)$expense['sum'], + 'currency_id' => (string)$expense['currency_id'], + 'currency_code' => $expense['currency_code'], + ]; + } + + return response()->json($result); + } + /** * @param GenericRequest $request * @@ -99,30 +125,4 @@ class AccountController extends Controller return response()->json($result); } - /** - * @param GenericRequest $request - * - * @return JsonResponse - */ - public function asset(GenericRequest $request): JsonResponse - { - $start = $request->getStart(); - $end = $request->getEnd(); - $assetAccounts = $request->getAssetAccounts(); - $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts); - $result = []; - - /** @var array $expense */ - foreach ($expenses as $expense) { - $result[] = [ - 'difference' => $expense['sum'], - 'difference_float' => (float)$expense['sum'], - 'currency_id' => (string)$expense['currency_id'], - 'currency_code' => $expense['currency_code'], - ]; - } - - return response()->json($result); - } - } diff --git a/app/Api/V1/Controllers/Insight/Expense/BillController.php b/app/Api/V1/Controllers/Insight/Expense/BillController.php index 8cc53cc329..2a6f398810 100644 --- a/app/Api/V1/Controllers/Insight/Expense/BillController.php +++ b/app/Api/V1/Controllers/Insight/Expense/BillController.php @@ -87,7 +87,7 @@ class BillController extends Controller $foreignKey = sprintf('%d-%d', $billId, $foreignCurrencyId); if (0 !== $currencyId) { - $response[$key] = $response[$key] ?? [ + $response[$key] = $response[$key] ?? [ 'id' => (string)$billId, 'name' => $journal['bill_name'], 'difference' => '0', @@ -139,7 +139,7 @@ class BillController extends Controller $foreignCurrencyId = (int)$journal['foreign_currency_id']; if (0 !== $currencyId) { - $response[$currencyId] = $response[$currencyId] ?? [ + $response[$currencyId] = $response[$currencyId] ?? [ 'difference' => '0', 'difference_float' => 0, 'currency_id' => (string)$currencyId, diff --git a/app/Api/V1/Controllers/Insight/Expense/BudgetController.php b/app/Api/V1/Controllers/Insight/Expense/BudgetController.php index 69deaa6e84..0d8431a60b 100644 --- a/app/Api/V1/Controllers/Insight/Expense/BudgetController.php +++ b/app/Api/V1/Controllers/Insight/Expense/BudgetController.php @@ -36,9 +36,9 @@ use Illuminate\Support\Collection; */ class BudgetController extends Controller { + private NoBudgetRepositoryInterface $noRepository; private OperationsRepositoryInterface $opsRepository; private BudgetRepositoryInterface $repository; - private NoBudgetRepositoryInterface $noRepository; /** * AccountController constructor. diff --git a/app/Api/V1/Controllers/Insight/Expense/CategoryController.php b/app/Api/V1/Controllers/Insight/Expense/CategoryController.php index 7d2b5de843..bea6b88901 100644 --- a/app/Api/V1/Controllers/Insight/Expense/CategoryController.php +++ b/app/Api/V1/Controllers/Insight/Expense/CategoryController.php @@ -18,9 +18,9 @@ use Illuminate\Support\Collection; */ class CategoryController extends Controller { + private NoCategoryRepositoryInterface $noRepository; private OperationsRepositoryInterface $opsRepository; private CategoryRepositoryInterface $repository; - private NoCategoryRepositoryInterface $noRepository; /** * AccountController constructor. diff --git a/app/Api/V1/Controllers/Insight/Expense/TagController.php b/app/Api/V1/Controllers/Insight/Expense/TagController.php index 98a84457e4..0894fd16c3 100644 --- a/app/Api/V1/Controllers/Insight/Expense/TagController.php +++ b/app/Api/V1/Controllers/Insight/Expense/TagController.php @@ -53,6 +53,56 @@ class TagController extends Controller ); } + /** + * Expenses for no tag filtered by account. + * + * @param GenericRequest $request + * + * @return JsonResponse + */ + public function noTag(GenericRequest $request): JsonResponse + { + $accounts = $request->getAssetAccounts(); + $start = $request->getStart(); + $end = $request->getEnd(); + $response = []; + + // collect all expenses in this period (regardless of type) by the given bills and accounts. + $collector = app(GroupCollectorInterface::class); + $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); + $collector->withoutTags(); + + $genericSet = $collector->getExtractedJournals(); + + foreach ($genericSet as $journal) { + $currencyId = (int)$journal['currency_id']; + $foreignCurrencyId = (int)$journal['foreign_currency_id']; + + if (0 !== $currencyId) { + $response[$currencyId] = $response[$currencyId] ?? [ + 'difference' => '0', + 'difference_float' => 0, + 'currency_id' => (string)$currencyId, + 'currency_code' => $journal['currency_code'], + ]; + $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); + $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; + } + if (0 !== $foreignCurrencyId) { + $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ + 'difference' => '0', + 'difference_float' => 0, + 'currency_id' => (string)$foreignCurrencyId, + 'currency_code' => $journal['foreign_currency_code'], + ]; + $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); + $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; + } + } + + return response()->json(array_values($response)); + } + /** * Expenses per tag, possibly filtered by tag and account. * @@ -120,54 +170,4 @@ class TagController extends Controller return response()->json(array_values($response)); } - /** - * Expenses for no tag filtered by account. - * - * @param GenericRequest $request - * - * @return JsonResponse - */ - public function noTag(GenericRequest $request): JsonResponse - { - $accounts = $request->getAssetAccounts(); - $start = $request->getStart(); - $end = $request->getEnd(); - $response = []; - - // collect all expenses in this period (regardless of type) by the given bills and accounts. - $collector = app(GroupCollectorInterface::class); - $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); - $collector->withoutTags(); - - $genericSet = $collector->getExtractedJournals(); - - foreach ($genericSet as $journal) { - $currencyId = (int)$journal['currency_id']; - $foreignCurrencyId = (int)$journal['foreign_currency_id']; - - if (0 !== $currencyId) { - $response[$currencyId] = $response[$currencyId] ?? [ - 'difference' => '0', - 'difference_float' => 0, - 'currency_id' => (string)$currencyId, - 'currency_code' => $journal['currency_code'], - ]; - $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], $journal['amount']); - $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; - } - if (0 !== $foreignCurrencyId) { - $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ - 'difference' => '0', - 'difference_float' => 0, - 'currency_id' => (string)$foreignCurrencyId, - 'currency_code' => $journal['foreign_currency_code'], - ]; - $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); - $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; - } - } - - return response()->json(array_values($response)); - } - } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Insight/Income/AccountController.php b/app/Api/V1/Controllers/Insight/Income/AccountController.php index 8fc49cee7c..9de160f284 100644 --- a/app/Api/V1/Controllers/Insight/Income/AccountController.php +++ b/app/Api/V1/Controllers/Insight/Income/AccountController.php @@ -45,8 +45,8 @@ class AccountController extends Controller use ApiSupport; private CurrencyRepositoryInterface $currencyRepository; - private AccountRepositoryInterface $repository; private OperationsRepositoryInterface $opsRepository; + private AccountRepositoryInterface $repository; /** * AccountController constructor. @@ -73,34 +73,6 @@ class AccountController extends Controller ); } - /** - * // TOOD same as - * @param GenericRequest $request - * - * @return JsonResponse - */ - public function revenue(GenericRequest $request): JsonResponse - { - $start = $request->getStart(); - $end = $request->getEnd(); - $assetAccounts = $request->getAssetAccounts(); - $revenueAccounts = $request->getRevenueAccounts(); - $income = $this->opsRepository->sumIncome($start, $end, $assetAccounts, $revenueAccounts); - $result = []; - - /** @var array $entry */ - foreach ($income as $entry) { - $result[] = [ - 'difference' => $entry['sum'], - 'difference_float' => (float)$entry['sum'], - 'currency_id' => (string)$entry['currency_id'], - 'currency_code' => $entry['currency_code'], - ]; - } - - return response()->json($result); - } - /** * TODO same code as Expense/AccountController. * @@ -128,4 +100,33 @@ class AccountController extends Controller return response()->json($result); } + /** + * // TOOD same as + * + * @param GenericRequest $request + * + * @return JsonResponse + */ + public function revenue(GenericRequest $request): JsonResponse + { + $start = $request->getStart(); + $end = $request->getEnd(); + $assetAccounts = $request->getAssetAccounts(); + $revenueAccounts = $request->getRevenueAccounts(); + $income = $this->opsRepository->sumIncome($start, $end, $assetAccounts, $revenueAccounts); + $result = []; + + /** @var array $entry */ + foreach ($income as $entry) { + $result[] = [ + 'difference' => $entry['sum'], + 'difference_float' => (float)$entry['sum'], + 'currency_id' => (string)$entry['currency_id'], + 'currency_code' => $entry['currency_code'], + ]; + } + + return response()->json($result); + } + } diff --git a/app/Api/V1/Controllers/Insight/Income/CategoryController.php b/app/Api/V1/Controllers/Insight/Income/CategoryController.php index c368bd5b9a..431233d0b7 100644 --- a/app/Api/V1/Controllers/Insight/Income/CategoryController.php +++ b/app/Api/V1/Controllers/Insight/Income/CategoryController.php @@ -19,9 +19,9 @@ use Illuminate\Support\Collection; */ class CategoryController extends Controller { + private NoCategoryRepositoryInterface $noRepository; private OperationsRepositoryInterface $opsRepository; private CategoryRepositoryInterface $repository; - private NoCategoryRepositoryInterface $noRepository; /** * AccountController constructor. diff --git a/app/Api/V1/Controllers/Insight/Income/PeriodController.php b/app/Api/V1/Controllers/Insight/Income/PeriodController.php index bf43a4fba5..f32bcc4fc8 100644 --- a/app/Api/V1/Controllers/Insight/Income/PeriodController.php +++ b/app/Api/V1/Controllers/Insight/Income/PeriodController.php @@ -71,7 +71,9 @@ class PeriodController extends Controller 'currency_id' => (string)$foreignCurrencyId, 'currency_code' => $journal['foreign_currency_code'], ]; - $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])); + $response[$foreignCurrencyId]['difference'] = bcadd( + $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) + ); $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; } } diff --git a/app/Api/V1/Controllers/Insight/Income/TagController.php b/app/Api/V1/Controllers/Insight/Income/TagController.php index eca5d01b4f..af88ccfe3c 100644 --- a/app/Api/V1/Controllers/Insight/Income/TagController.php +++ b/app/Api/V1/Controllers/Insight/Income/TagController.php @@ -53,6 +53,58 @@ class TagController extends Controller ); } + /** + * Expenses for no tag filtered by account. + * + * @param GenericRequest $request + * + * @return JsonResponse + */ + public function noTag(GenericRequest $request): JsonResponse + { + $accounts = $request->getAssetAccounts(); + $start = $request->getStart(); + $end = $request->getEnd(); + $response = []; + + // collect all expenses in this period (regardless of type) by the given bills and accounts. + $collector = app(GroupCollectorInterface::class); + $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); + $collector->withoutTags(); + + $genericSet = $collector->getExtractedJournals(); + + foreach ($genericSet as $journal) { + $currencyId = (int)$journal['currency_id']; + $foreignCurrencyId = (int)$journal['foreign_currency_id']; + + if (0 !== $currencyId) { + $response[$currencyId] = $response[$currencyId] ?? [ + 'difference' => '0', + 'difference_float' => 0, + 'currency_id' => (string)$currencyId, + 'currency_code' => $journal['currency_code'], + ]; + $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); + $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; + } + if (0 !== $foreignCurrencyId) { + $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ + 'difference' => '0', + 'difference_float' => 0, + 'currency_id' => (string)$foreignCurrencyId, + 'currency_code' => $journal['foreign_currency_code'], + ]; + $response[$foreignCurrencyId]['difference'] = bcadd( + $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) + ); + $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; + } + } + + return response()->json(array_values($response)); + } + /** * Expenses per tag, possibly filtered by tag and account. * @@ -111,7 +163,9 @@ class TagController extends Controller 'currency_id' => (string)$foreignCurrencyId, 'currency_code' => $journal['foreign_currency_code'], ]; - $response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount'])); + $response[$foreignKey]['difference'] = bcadd( + $response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount']) + ); $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; } } @@ -120,54 +174,4 @@ class TagController extends Controller return response()->json(array_values($response)); } - /** - * Expenses for no tag filtered by account. - * - * @param GenericRequest $request - * - * @return JsonResponse - */ - public function noTag(GenericRequest $request): JsonResponse - { - $accounts = $request->getAssetAccounts(); - $start = $request->getStart(); - $end = $request->getEnd(); - $response = []; - - // collect all expenses in this period (regardless of type) by the given bills and accounts. - $collector = app(GroupCollectorInterface::class); - $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); - $collector->withoutTags(); - - $genericSet = $collector->getExtractedJournals(); - - foreach ($genericSet as $journal) { - $currencyId = (int)$journal['currency_id']; - $foreignCurrencyId = (int)$journal['foreign_currency_id']; - - if (0 !== $currencyId) { - $response[$currencyId] = $response[$currencyId] ?? [ - 'difference' => '0', - 'difference_float' => 0, - 'currency_id' => (string)$currencyId, - 'currency_code' => $journal['currency_code'], - ]; - $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); - $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; - } - if (0 !== $foreignCurrencyId) { - $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ - 'difference' => '0', - 'difference_float' => 0, - 'currency_id' => (string)$foreignCurrencyId, - 'currency_code' => $journal['foreign_currency_code'], - ]; - $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])); - $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; - } - } - - return response()->json(array_values($response)); - } - } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Insight/Transfer/CategoryController.php b/app/Api/V1/Controllers/Insight/Transfer/CategoryController.php index 1f13918a0f..3fea7cf04a 100644 --- a/app/Api/V1/Controllers/Insight/Transfer/CategoryController.php +++ b/app/Api/V1/Controllers/Insight/Transfer/CategoryController.php @@ -36,9 +36,9 @@ use Illuminate\Support\Collection; */ class CategoryController extends Controller { + private NoCategoryRepositoryInterface $noRepository; private OperationsRepositoryInterface $opsRepository; private CategoryRepositoryInterface $repository; - private NoCategoryRepositoryInterface $noRepository; /** * AccountController constructor. diff --git a/app/Api/V1/Controllers/Insight/Transfer/PeriodController.php b/app/Api/V1/Controllers/Insight/Transfer/PeriodController.php index b03788c0d3..8be400b2d4 100644 --- a/app/Api/V1/Controllers/Insight/Transfer/PeriodController.php +++ b/app/Api/V1/Controllers/Insight/Transfer/PeriodController.php @@ -71,7 +71,9 @@ class PeriodController extends Controller 'currency_id' => (string)$foreignCurrencyId, 'currency_code' => $journal['foreign_currency_code'], ]; - $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])); + $response[$foreignCurrencyId]['difference'] = bcadd( + $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) + ); $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; } } diff --git a/app/Api/V1/Controllers/Insight/Transfer/TagController.php b/app/Api/V1/Controllers/Insight/Transfer/TagController.php index 5001cf21bb..51b949d651 100644 --- a/app/Api/V1/Controllers/Insight/Transfer/TagController.php +++ b/app/Api/V1/Controllers/Insight/Transfer/TagController.php @@ -54,6 +54,58 @@ class TagController extends Controller ); } + /** + * Expenses for no tag filtered by account. + * + * @param GenericRequest $request + * + * @return JsonResponse + */ + public function noTag(GenericRequest $request): JsonResponse + { + $accounts = $request->getAssetAccounts(); + $start = $request->getStart(); + $end = $request->getEnd(); + $response = []; + + // collect all expenses in this period (regardless of type) by the given bills and accounts. + $collector = app(GroupCollectorInterface::class); + $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); + $collector->withoutTags(); + + $genericSet = $collector->getExtractedJournals(); + + foreach ($genericSet as $journal) { + $currencyId = (int)$journal['currency_id']; + $foreignCurrencyId = (int)$journal['foreign_currency_id']; + + if (0 !== $currencyId) { + $response[$currencyId] = $response[$currencyId] ?? [ + 'difference' => '0', + 'difference_float' => 0, + 'currency_id' => (string)$currencyId, + 'currency_code' => $journal['currency_code'], + ]; + $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); + $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; + } + if (0 !== $foreignCurrencyId) { + $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ + 'difference' => '0', + 'difference_float' => 0, + 'currency_id' => (string)$foreignCurrencyId, + 'currency_code' => $journal['foreign_currency_code'], + ]; + $response[$foreignCurrencyId]['difference'] = bcadd( + $response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount']) + ); + $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; + } + } + + return response()->json(array_values($response)); + } + /** * Transfers per tag, possibly filtered by tag and account. * @@ -112,7 +164,9 @@ class TagController extends Controller 'currency_id' => (string)$foreignCurrencyId, 'currency_code' => $journal['foreign_currency_code'], ]; - $response[$foreignKey]['difference'] = bcadd($response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount'])); + $response[$foreignKey]['difference'] = bcadd( + $response[$foreignKey]['difference'], app('steam')->positive($journal['foreign_amount']) + ); $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; } } @@ -120,54 +174,4 @@ class TagController extends Controller return response()->json(array_values($response)); } - - /** - * Expenses for no tag filtered by account. - * - * @param GenericRequest $request - * - * @return JsonResponse - */ - public function noTag(GenericRequest $request): JsonResponse - { - $accounts = $request->getAssetAccounts(); - $start = $request->getStart(); - $end = $request->getEnd(); - $response = []; - - // collect all expenses in this period (regardless of type) by the given bills and accounts. - $collector = app(GroupCollectorInterface::class); - $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); - $collector->withoutTags(); - - $genericSet = $collector->getExtractedJournals(); - - foreach ($genericSet as $journal) { - $currencyId = (int)$journal['currency_id']; - $foreignCurrencyId = (int)$journal['foreign_currency_id']; - - if (0 !== $currencyId) { - $response[$currencyId] = $response[$currencyId] ?? [ - 'difference' => '0', - 'difference_float' => 0, - 'currency_id' => (string)$currencyId, - 'currency_code' => $journal['currency_code'], - ]; - $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], app('steam')->positive($journal['amount'])); - $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; - } - if (0 !== $foreignCurrencyId) { - $response[$foreignCurrencyId] = $response[$foreignCurrencyId] ?? [ - 'difference' => '0', - 'difference_float' => 0, - 'currency_id' => (string)$foreignCurrencyId, - 'currency_code' => $journal['foreign_currency_code'], - ]; - $response[$foreignCurrencyId]['difference'] = bcadd($response[$foreignCurrencyId]['difference'], app('steam')->positive($journal['foreign_amount'])); - $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; - } - } - - return response()->json(array_values($response)); - } } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/Account/StoreController.php b/app/Api/V1/Controllers/Models/Account/StoreController.php index a0d8d464ef..89254c6c1f 100644 --- a/app/Api/V1/Controllers/Models/Account/StoreController.php +++ b/app/Api/V1/Controllers/Models/Account/StoreController.php @@ -67,7 +67,7 @@ class StoreController extends Controller */ public function store(StoreRequest $request): JsonResponse { - $data = $request->getAllAccountData(); + $data = $request->getAllAccountData(); $this->repository->resetAccountOrder(); $account = $this->repository->store($data); $manager = $this->getManager(); diff --git a/app/Api/V1/Controllers/Models/Attachment/ShowController.php b/app/Api/V1/Controllers/Models/Attachment/ShowController.php index cc49aa53ba..8047339f7c 100644 --- a/app/Api/V1/Controllers/Models/Attachment/ShowController.php +++ b/app/Api/V1/Controllers/Models/Attachment/ShowController.php @@ -119,7 +119,7 @@ class ShowController extends Controller $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of attachments. Count it and split it. $collection = $this->repository->get(); @@ -141,7 +141,6 @@ class ShowController extends Controller } - /** * Display the specified resource. * diff --git a/app/Api/V1/Controllers/Models/Attachment/StoreController.php b/app/Api/V1/Controllers/Models/Attachment/StoreController.php index 63218934cb..a6bc307bd1 100644 --- a/app/Api/V1/Controllers/Models/Attachment/StoreController.php +++ b/app/Api/V1/Controllers/Models/Attachment/StoreController.php @@ -67,7 +67,6 @@ class StoreController extends Controller } - /** * Store a newly created resource in storage. * diff --git a/app/Api/V1/Controllers/Models/Attachment/UpdateController.php b/app/Api/V1/Controllers/Models/Attachment/UpdateController.php index 209a2c6b65..fd2a8271b3 100644 --- a/app/Api/V1/Controllers/Models/Attachment/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Attachment/UpdateController.php @@ -63,12 +63,11 @@ class UpdateController extends Controller } - /** * Update the specified resource in storage. * * @param UpdateRequest $request - * @param Attachment $attachment + * @param Attachment $attachment * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/AvailableBudget/DestroyController.php b/app/Api/V1/Controllers/Models/AvailableBudget/DestroyController.php index 79f264d4cf..482ec355c1 100644 --- a/app/Api/V1/Controllers/Models/AvailableBudget/DestroyController.php +++ b/app/Api/V1/Controllers/Models/AvailableBudget/DestroyController.php @@ -54,6 +54,7 @@ class DestroyController extends Controller } ); } + /** * Remove the specified resource from storage. * diff --git a/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php b/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php index 459e6816ca..a767b144ac 100644 --- a/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php +++ b/app/Api/V1/Controllers/Models/AvailableBudget/ShowController.php @@ -71,7 +71,7 @@ class ShowController extends Controller $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $start = $this->parameters->get('start'); $end = $this->parameters->get('end'); diff --git a/app/Api/V1/Controllers/Models/AvailableBudget/UpdateController.php b/app/Api/V1/Controllers/Models/AvailableBudget/UpdateController.php index e9c8bb53ad..50c1d77e61 100644 --- a/app/Api/V1/Controllers/Models/AvailableBudget/UpdateController.php +++ b/app/Api/V1/Controllers/Models/AvailableBudget/UpdateController.php @@ -26,7 +26,6 @@ use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Models\AvailableBudget\Request; use FireflyIII\Factory\TransactionCurrencyFactory; use FireflyIII\Models\AvailableBudget; -use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Transformers\AvailableBudgetTransformer; use FireflyIII\User; @@ -73,9 +72,9 @@ class UpdateController extends Controller $data = $request->getAll(); // find and validate currency ID - if(array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) { - $factory = app(TransactionCurrencyFactory::class); - $currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null) ?? app('amount')->getDefaultCurrency(); + if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) { + $factory = app(TransactionCurrencyFactory::class); + $currency = $factory->find($data['currency_id'] ?? null, $data['currency_code'] ?? null) ?? app('amount')->getDefaultCurrency(); $currency->enabled = true; $currency->save(); unset($data['currency_code']); diff --git a/app/Api/V1/Controllers/Models/Bill/ListController.php b/app/Api/V1/Controllers/Models/Bill/ListController.php index d5d91b45d4..fef22d7896 100644 --- a/app/Api/V1/Controllers/Models/Bill/ListController.php +++ b/app/Api/V1/Controllers/Models/Bill/ListController.php @@ -80,7 +80,7 @@ class ListController extends Controller public function attachments(Bill $bill): JsonResponse { $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $collection = $this->repository->getAttachments($bill); $count = $collection->count(); @@ -101,7 +101,6 @@ class ListController extends Controller } - /** * List all of them. * @@ -115,7 +114,7 @@ class ListController extends Controller $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. $collection = $this->repository->getRulesForBill($bill); @@ -139,7 +138,6 @@ class ListController extends Controller } - /** * Show all transactions. * @@ -152,7 +150,7 @@ class ListController extends Controller */ public function transactions(Request $request, Bill $bill): JsonResponse { - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $type = $request->get('type') ?? 'default'; $this->parameters->set('type', $type); diff --git a/app/Api/V1/Controllers/Models/Bill/ShowController.php b/app/Api/V1/Controllers/Models/Bill/ShowController.php index 385066d96b..b80093d496 100644 --- a/app/Api/V1/Controllers/Models/Bill/ShowController.php +++ b/app/Api/V1/Controllers/Models/Bill/ShowController.php @@ -25,7 +25,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Bill; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\BillTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -74,7 +73,7 @@ class ShowController extends Controller $this->repository->correctOrder(); $bills = $this->repository->getBills(); $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $count = $bills->count(); $bills = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); diff --git a/app/Api/V1/Controllers/Models/Budget/StoreController.php b/app/Api/V1/Controllers/Models/Budget/StoreController.php index 9fd4299a77..8ce134b648 100644 --- a/app/Api/V1/Controllers/Models/Budget/StoreController.php +++ b/app/Api/V1/Controllers/Models/Budget/StoreController.php @@ -67,7 +67,7 @@ class StoreController extends Controller */ public function store(StoreRequest $request): JsonResponse { - $budget = $this->repository->store($request->getAll()); + $budget = $this->repository->store($request->getAll()); $budget->refresh(); $manager = $this->getManager(); diff --git a/app/Api/V1/Controllers/Models/BudgetLimit/ShowController.php b/app/Api/V1/Controllers/Models/BudgetLimit/ShowController.php index 4f7120b52d..52b05b11af 100644 --- a/app/Api/V1/Controllers/Models/BudgetLimit/ShowController.php +++ b/app/Api/V1/Controllers/Models/BudgetLimit/ShowController.php @@ -96,31 +96,6 @@ class ShowController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * @param Request $request - * @param Budget $budget - * @param BudgetLimit $budgetLimit - * - * @return JsonResponse - */ - public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse - { - if ((int)$budget->id !== (int)$budgetLimit->budget_id) { - throw new FireflyException('20028: The budget limit does not belong to the budget.'); - } - // continue! - $manager = $this->getManager(); - - /** @var BudgetLimitTransformer $transformer */ - $transformer = app(BudgetLimitTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($budgetLimit, $transformer, 'budget_limits'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - - /** * Display a listing of the budget limits for this budget.. * @@ -150,4 +125,28 @@ class ShowController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } + /** + * @param Request $request + * @param Budget $budget + * @param BudgetLimit $budgetLimit + * + * @return JsonResponse + */ + public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse + { + if ((int)$budget->id !== (int)$budgetLimit->budget_id) { + throw new FireflyException('20028: The budget limit does not belong to the budget.'); + } + // continue! + $manager = $this->getManager(); + + /** @var BudgetLimitTransformer $transformer */ + $transformer = app(BudgetLimitTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($budgetLimit, $transformer, 'budget_limits'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } + } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/BudgetLimit/UpdateController.php b/app/Api/V1/Controllers/Models/BudgetLimit/UpdateController.php index bad2d4418b..1930a955a7 100644 --- a/app/Api/V1/Controllers/Models/BudgetLimit/UpdateController.php +++ b/app/Api/V1/Controllers/Models/BudgetLimit/UpdateController.php @@ -28,7 +28,6 @@ use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; -use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Transformers\BudgetLimitTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; diff --git a/app/Api/V1/Controllers/Models/Category/DestroyController.php b/app/Api/V1/Controllers/Models/Category/DestroyController.php index b0ad5d5e0a..0a3dd9854e 100644 --- a/app/Api/V1/Controllers/Models/Category/DestroyController.php +++ b/app/Api/V1/Controllers/Models/Category/DestroyController.php @@ -74,5 +74,4 @@ class DestroyController extends Controller } - } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/Category/ShowController.php b/app/Api/V1/Controllers/Models/Category/ShowController.php index e7b5e267b6..f33dc446dd 100644 --- a/app/Api/V1/Controllers/Models/Category/ShowController.php +++ b/app/Api/V1/Controllers/Models/Category/ShowController.php @@ -74,7 +74,7 @@ class ShowController extends Controller $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. $collection = $this->repository->getCategories(); diff --git a/app/Api/V1/Controllers/Models/Category/UpdateController.php b/app/Api/V1/Controllers/Models/Category/UpdateController.php index 565def622b..05cd41adf1 100644 --- a/app/Api/V1/Controllers/Models/Category/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Category/UpdateController.php @@ -64,7 +64,7 @@ class UpdateController extends Controller * Update the category. * * @param UpdateRequest $request - * @param Category $category + * @param Category $category * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php b/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php index 258e641ce7..9a2375ffde 100644 --- a/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php +++ b/app/Api/V1/Controllers/Models/ObjectGroup/ListController.php @@ -61,6 +61,37 @@ class ListController extends Controller ); } + /** + * List all bills + * + * @param ObjectGroup $objectGroup + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function bills(ObjectGroup $objectGroup): JsonResponse + { + $manager = $this->getManager(); + + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + // get list of piggy banks. Count it and split it. + $collection = $this->repository->getBills($objectGroup); + $count = $collection->count(); + $bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + + // make paginator: + $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); + $paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]) . $this->buildParams()); + + /** @var BillTransformer $transformer */ + $transformer = app(BillTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new FractalCollection($bills, $transformer, 'bills'); + $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } /** * List all piggies under the object group. @@ -97,36 +128,4 @@ class ListController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - - /** - * List all bills - * - * @param ObjectGroup $objectGroup - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function bills(ObjectGroup $objectGroup): JsonResponse - { - $manager = $this->getManager(); - - $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - // get list of piggy banks. Count it and split it. - $collection = $this->repository->getBills($objectGroup); - $count = $collection->count(); - $bills = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); - - // make paginator: - $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); - $paginator->setPath(route('api.v1.currencies.bills', [$objectGroup->id]) . $this->buildParams()); - - /** @var BillTransformer $transformer */ - $transformer = app(BillTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new FractalCollection($bills, $transformer, 'bills'); - $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/PiggyBank/ListController.php b/app/Api/V1/Controllers/Models/PiggyBank/ListController.php index d4b65206f0..33ae7728f3 100644 --- a/app/Api/V1/Controllers/Models/PiggyBank/ListController.php +++ b/app/Api/V1/Controllers/Models/PiggyBank/ListController.php @@ -67,7 +67,7 @@ class ListController extends Controller public function attachments(PiggyBank $piggyBank): JsonResponse { $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $collection = $this->repository->getAttachments($piggyBank); $count = $collection->count(); @@ -98,7 +98,7 @@ class ListController extends Controller public function piggyBankEvents(PiggyBank $piggyBank): JsonResponse { // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $manager = $this->getManager(); $collection = $this->repository->getEvents($piggyBank); diff --git a/app/Api/V1/Controllers/Models/PiggyBank/ShowController.php b/app/Api/V1/Controllers/Models/PiggyBank/ShowController.php index f9d5ddd584..fa9dce1248 100644 --- a/app/Api/V1/Controllers/Models/PiggyBank/ShowController.php +++ b/app/Api/V1/Controllers/Models/PiggyBank/ShowController.php @@ -68,7 +68,7 @@ class ShowController extends Controller { $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. $collection = $this->repository->getPiggyBanks(); diff --git a/app/Api/V1/Controllers/Models/PiggyBank/UpdateController.php b/app/Api/V1/Controllers/Models/PiggyBank/UpdateController.php index 718fdaa206..6a756c6b30 100644 --- a/app/Api/V1/Controllers/Models/PiggyBank/UpdateController.php +++ b/app/Api/V1/Controllers/Models/PiggyBank/UpdateController.php @@ -60,7 +60,7 @@ class UpdateController extends Controller * Update piggy bank. * * @param UpdateRequest $request - * @param PiggyBank $piggyBank + * @param PiggyBank $piggyBank * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/Recurrence/UpdateController.php b/app/Api/V1/Controllers/Models/Recurrence/UpdateController.php index 5c988790f4..8065bdf2c1 100644 --- a/app/Api/V1/Controllers/Models/Recurrence/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Recurrence/UpdateController.php @@ -61,20 +61,19 @@ class UpdateController extends Controller } - /** * Update single recurrence. * * @param UpdateRequest $request - * @param Recurrence $recurrence + * @param Recurrence $recurrence * * @return JsonResponse */ public function update(UpdateRequest $request, Recurrence $recurrence): JsonResponse { - $data = $request->getAll(); + $data = $request->getAll(); $recurrence = $this->repository->update($recurrence, $data); - $manager = $this->getManager(); + $manager = $this->getManager(); /** @var RecurrenceTransformer $transformer */ $transformer = app(RecurrenceTransformer::class); diff --git a/app/Api/V1/Controllers/Models/Rule/DestroyController.php b/app/Api/V1/Controllers/Models/Rule/DestroyController.php index 237f44621a..5238a31249 100644 --- a/app/Api/V1/Controllers/Models/Rule/DestroyController.php +++ b/app/Api/V1/Controllers/Models/Rule/DestroyController.php @@ -24,7 +24,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Rule; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\Rule; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\User; use Illuminate\Http\JsonResponse; diff --git a/app/Api/V1/Controllers/Models/Rule/ListController.php b/app/Api/V1/Controllers/Models/Rule/ListController.php index 86a9a99a44..3f52273e79 100644 --- a/app/Api/V1/Controllers/Models/Rule/ListController.php +++ b/app/Api/V1/Controllers/Models/Rule/ListController.php @@ -33,7 +33,7 @@ use FireflyIII\User; class ListController extends Controller { private AccountRepositoryInterface $accountRepository; - private RuleRepositoryInterface $ruleRepository; + private RuleRepositoryInterface $ruleRepository; /** diff --git a/app/Api/V1/Controllers/Models/Rule/ShowController.php b/app/Api/V1/Controllers/Models/Rule/ShowController.php index 6a46329d62..8ab227136c 100644 --- a/app/Api/V1/Controllers/Models/Rule/ShowController.php +++ b/app/Api/V1/Controllers/Models/Rule/ShowController.php @@ -24,7 +24,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Rule; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\Rule; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Transformers\RuleTransformer; use FireflyIII\User; @@ -74,7 +73,7 @@ class ShowController extends Controller $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. $collection = $this->ruleRepository->getAll(); @@ -97,7 +96,6 @@ class ShowController extends Controller } - /** * List single resource. * diff --git a/app/Api/V1/Controllers/Models/Rule/UpdateController.php b/app/Api/V1/Controllers/Models/Rule/UpdateController.php index 84d91db599..6488aee87c 100644 --- a/app/Api/V1/Controllers/Models/Rule/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Rule/UpdateController.php @@ -65,7 +65,7 @@ class UpdateController extends Controller * Update a rule. * * @param UpdateRequest $request - * @param Rule $rule + * @param Rule $rule * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/RuleGroup/TriggerController.php b/app/Api/V1/Controllers/Models/RuleGroup/TriggerController.php index 7813528869..7a7e4fec6b 100644 --- a/app/Api/V1/Controllers/Models/RuleGroup/TriggerController.php +++ b/app/Api/V1/Controllers/Models/RuleGroup/TriggerController.php @@ -69,7 +69,7 @@ class TriggerController extends Controller /** * @param TestRequest $request - * @param RuleGroup $group + * @param RuleGroup $group * * @return JsonResponse * @throws FireflyException @@ -126,7 +126,7 @@ class TriggerController extends Controller * Execute the given rule group on a set of existing transactions. * * @param TriggerRequest $request - * @param RuleGroup $group + * @param RuleGroup $group * * @return JsonResponse * @throws Exception diff --git a/app/Api/V1/Controllers/Models/RuleGroup/UpdateController.php b/app/Api/V1/Controllers/Models/RuleGroup/UpdateController.php index d99a8ed8b4..98ee2ef161 100644 --- a/app/Api/V1/Controllers/Models/RuleGroup/UpdateController.php +++ b/app/Api/V1/Controllers/Models/RuleGroup/UpdateController.php @@ -66,7 +66,7 @@ class UpdateController extends Controller * Update a rule group. * * @param UpdateRequest $request - * @param RuleGroup $ruleGroup + * @param RuleGroup $ruleGroup * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/Tag/DestroyController.php b/app/Api/V1/Controllers/Models/Tag/DestroyController.php index 93d273be1b..d8b9a7d4f8 100644 --- a/app/Api/V1/Controllers/Models/Tag/DestroyController.php +++ b/app/Api/V1/Controllers/Models/Tag/DestroyController.php @@ -25,7 +25,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Tag; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\Tag; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -59,7 +58,6 @@ class DestroyController extends Controller } - /** * Delete the resource. * diff --git a/app/Api/V1/Controllers/Models/Tag/ListController.php b/app/Api/V1/Controllers/Models/Tag/ListController.php index 57f3ada42d..82d41d8f64 100644 --- a/app/Api/V1/Controllers/Models/Tag/ListController.php +++ b/app/Api/V1/Controllers/Models/Tag/ListController.php @@ -42,6 +42,7 @@ use League\Fractal\Resource\Collection as FractalCollection; class ListController extends Controller { use TransactionFilter; + private TagRepositoryInterface $repository; @@ -67,7 +68,6 @@ class ListController extends Controller } - /** * @param Tag $tag * @@ -77,7 +77,7 @@ class ListController extends Controller public function attachments(Tag $tag): JsonResponse { $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $collection = $this->repository->getAttachments($tag); $count = $collection->count(); @@ -98,7 +98,6 @@ class ListController extends Controller } - /** * Show all transactions. * @@ -110,7 +109,7 @@ class ListController extends Controller */ public function transactions(Request $request, Tag $tag): JsonResponse { - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $type = $request->get('type') ?? 'default'; $this->parameters->set('type', $type); diff --git a/app/Api/V1/Controllers/Models/Tag/ShowController.php b/app/Api/V1/Controllers/Models/Tag/ShowController.php index edf104fb85..c834493adf 100644 --- a/app/Api/V1/Controllers/Models/Tag/ShowController.php +++ b/app/Api/V1/Controllers/Models/Tag/ShowController.php @@ -25,7 +25,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Tag; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\Tag; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\TagTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -73,7 +72,7 @@ class ShowController extends Controller { $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. $collection = $this->repository->get(); @@ -95,7 +94,6 @@ class ShowController extends Controller } - /** * List single resource. * diff --git a/app/Api/V1/Controllers/Models/Tag/StoreController.php b/app/Api/V1/Controllers/Models/Tag/StoreController.php index 11b264a5a2..e958ed2ea3 100644 --- a/app/Api/V1/Controllers/Models/Tag/StoreController.php +++ b/app/Api/V1/Controllers/Models/Tag/StoreController.php @@ -25,7 +25,6 @@ namespace FireflyIII\Api\V1\Controllers\Models\Tag; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Models\Tag\StoreRequest; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\TagTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -61,7 +60,6 @@ class StoreController extends Controller } - /** * Store new object. * diff --git a/app/Api/V1/Controllers/Models/Tag/UpdateController.php b/app/Api/V1/Controllers/Models/Tag/UpdateController.php index 87811a2ad1..b229ca3785 100644 --- a/app/Api/V1/Controllers/Models/Tag/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Tag/UpdateController.php @@ -26,7 +26,6 @@ use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Models\Tag\UpdateRequest; use FireflyIII\Models\Tag; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\TagTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; @@ -62,12 +61,11 @@ class UpdateController extends Controller } - /** * Update a rule. * * @param UpdateRequest $request - * @param Tag $tag + * @param Tag $tag * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/Transaction/DestroyController.php b/app/Api/V1/Controllers/Models/Transaction/DestroyController.php index f4eacf40f7..f997a28536 100644 --- a/app/Api/V1/Controllers/Models/Transaction/DestroyController.php +++ b/app/Api/V1/Controllers/Models/Transaction/DestroyController.php @@ -27,7 +27,6 @@ use FireflyIII\Events\DestroyedTransactionGroup; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\User; use Illuminate\Http\JsonResponse; diff --git a/app/Api/V1/Controllers/Models/Transaction/ListController.php b/app/Api/V1/Controllers/Models/Transaction/ListController.php index ce9393db4a..9acf1f58d2 100644 --- a/app/Api/V1/Controllers/Models/Transaction/ListController.php +++ b/app/Api/V1/Controllers/Models/Transaction/ListController.php @@ -26,8 +26,6 @@ use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; -use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Support\Http\Api\TransactionFilter; use FireflyIII\Transformers\AttachmentTransformer; use FireflyIII\Transformers\PiggyBankEventTransformer; use FireflyIII\Transformers\TransactionLinkTransformer; @@ -75,8 +73,8 @@ class ListController extends Controller */ public function attachments(TransactionGroup $transactionGroup): JsonResponse { - $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $manager = $this->getManager(); + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $collection = new Collection; foreach ($transactionGroup->transactionJournals as $transactionJournal) { $collection = $this->journalAPIRepository->getAttachments($transactionJournal)->merge($collection); @@ -108,13 +106,13 @@ class ListController extends Controller */ public function piggyBankEvents(TransactionGroup $transactionGroup): JsonResponse { - $manager = $this->getManager(); - $collection = new Collection; - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $manager = $this->getManager(); + $collection = new Collection; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; foreach ($transactionGroup->transactionJournals as $transactionJournal) { $collection = $this->journalAPIRepository->getPiggyBankEvents($transactionJournal)->merge($collection); } - $count = $collection->count(); + $count = $collection->count(); $events = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); @@ -130,12 +128,11 @@ class ListController extends Controller $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); - -// /** @var PiggyBankEventTransformer $transformer */ -// $transformer = app(PiggyBankEventTransformer::class); -// $transformer->setParameters($this->parameters); -// -// $resource = new FractalCollection($events, $transformer, 'piggy_bank_events'); + // /** @var PiggyBankEventTransformer $transformer */ + // $transformer = app(PiggyBankEventTransformer::class); + // $transformer->setParameters($this->parameters); + // + // $resource = new FractalCollection($events, $transformer, 'piggy_bank_events'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } @@ -150,9 +147,9 @@ class ListController extends Controller public function transactionLinks(TransactionJournal $transactionJournal): JsonResponse { $manager = $this->getManager(); - $collection = $this->journalAPIRepository->getJournalLinks($transactionJournal); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; - $count = $collection->count(); + $collection = $this->journalAPIRepository->getJournalLinks($transactionJournal); + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $count = $collection->count(); $journalLinks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); // make paginator: diff --git a/app/Api/V1/Controllers/Models/Transaction/ShowController.php b/app/Api/V1/Controllers/Models/Transaction/ShowController.php index b1fa5a81ac..0b0bd67c57 100644 --- a/app/Api/V1/Controllers/Models/Transaction/ShowController.php +++ b/app/Api/V1/Controllers/Models/Transaction/ShowController.php @@ -94,6 +94,18 @@ class ShowController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } + /** + * Show a single transaction, by transaction journal. + * + * @param TransactionJournal $transactionJournal + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function showJournal(TransactionJournal $transactionJournal): JsonResponse + { + return $this->show($transactionJournal->transactionGroup); + } /** * Show a single transaction. @@ -130,17 +142,4 @@ class ShowController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Show a single transaction, by transaction journal. - * - * @param TransactionJournal $transactionJournal - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function showJournal(TransactionJournal $transactionJournal): JsonResponse - { - return $this->show($transactionJournal->transactionGroup); - } - } \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/Transaction/UpdateController.php b/app/Api/V1/Controllers/Models/Transaction/UpdateController.php index 515ef16a72..e1365cb6bc 100644 --- a/app/Api/V1/Controllers/Models/Transaction/UpdateController.php +++ b/app/Api/V1/Controllers/Models/Transaction/UpdateController.php @@ -32,8 +32,8 @@ use FireflyIII\Transformers\TransactionGroupTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; use League\Fractal\Resource\Item; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Log; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class UpdateController @@ -67,8 +67,8 @@ class UpdateController extends Controller /** * Update a transaction. * - * @param UpdateRequest $request - * @param TransactionGroup $transactionGroup + * @param UpdateRequest $request + * @param TransactionGroup $transactionGroup * * @return JsonResponse */ diff --git a/app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php index 4e99811b26..3d6f185db0 100644 --- a/app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/ListController.php @@ -89,7 +89,7 @@ class ListController extends Controller // types to get, page size: $types = $this->mapAccountTypes($this->parameters->get('type')); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of accounts. Count it and split it. /** @var AccountRepositoryInterface $accountRepository */ @@ -99,7 +99,7 @@ class ListController extends Controller // filter list on currency preference: $collection = $unfiltered->filter( static function (Account $account) use ($currency, $accountRepository) { - $currencyId = (int) $accountRepository->getMetaValue($account, 'currency_id'); + $currencyId = (int)$accountRepository->getMetaValue($account, 'currency_id'); return $currencyId === $currency->id; } @@ -135,7 +135,7 @@ class ListController extends Controller { $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of available budgets. Count it and split it. /** @var AvailableBudgetRepositoryInterface $abRepository */ @@ -174,7 +174,7 @@ class ListController extends Controller /** @var BillRepositoryInterface $billRepos */ $billRepos = app(BillRepositoryInterface::class); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $unfiltered = $billRepos->getBills(); // filter and paginate list: @@ -214,7 +214,7 @@ class ListController extends Controller $blRepository = app(BudgetLimitRepositoryInterface::class); $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $collection = $blRepository->getAllBudgetLimitsByCurrency($currency, $this->parameters->get('start'), $this->parameters->get('end')); $count = $collection->count(); $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); @@ -243,7 +243,7 @@ class ListController extends Controller { $manager = $this->getManager(); // types to get, page size: - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. /** @var RecurringRepositoryInterface $recurringRepos */ @@ -294,7 +294,7 @@ class ListController extends Controller public function rules(TransactionCurrency $currency): JsonResponse { $manager = $this->getManager(); - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; // get list of budgets. Count it and split it. /** @var RuleRepositoryInterface $ruleRepos */ @@ -344,7 +344,7 @@ class ListController extends Controller */ public function transactions(Request $request, TransactionCurrency $currency): JsonResponse { - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $type = $request->get('type') ?? 'default'; $this->parameters->set('type', $type); diff --git a/app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php index 6af9f38832..840aaa0e18 100644 --- a/app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/StoreController.php @@ -50,8 +50,6 @@ class StoreController extends Controller } - - /** * Store new currency. * diff --git a/app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php b/app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php index c844b88c58..2495bd783a 100644 --- a/app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php +++ b/app/Api/V1/Controllers/Models/TransactionCurrency/UpdateController.php @@ -137,7 +137,7 @@ class UpdateController extends Controller /** * Update a currency. * - * @param UpdateRequest $request + * @param UpdateRequest $request * @param TransactionCurrency $currency * * @return JsonResponse diff --git a/app/Api/V1/Controllers/Models/TransactionLink/StoreController.php b/app/Api/V1/Controllers/Models/TransactionLink/StoreController.php index 856dd39e34..f2f1ca1903 100644 --- a/app/Api/V1/Controllers/Models/TransactionLink/StoreController.php +++ b/app/Api/V1/Controllers/Models/TransactionLink/StoreController.php @@ -18,7 +18,8 @@ use League\Fractal\Resource\Item; class StoreController extends Controller { use TransactionFilter; - private JournalRepositoryInterface $journalRepository; + + private JournalRepositoryInterface $journalRepository; private LinkTypeRepositoryInterface $repository; diff --git a/app/Api/V1/Controllers/Models/TransactionLink/UpdateController.php b/app/Api/V1/Controllers/Models/TransactionLink/UpdateController.php index a1c3caca0b..68c65ecb53 100644 --- a/app/Api/V1/Controllers/Models/TransactionLink/UpdateController.php +++ b/app/Api/V1/Controllers/Models/TransactionLink/UpdateController.php @@ -53,6 +53,8 @@ class UpdateController extends Controller * * @return JsonResponse * @throws FireflyException + * + * TODO generates query exception when link exists. */ public function update(UpdateRequest $request, TransactionJournalLink $journalLink): JsonResponse { diff --git a/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php b/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php index 0a4c077bb3..b2dc4aa630 100644 --- a/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php +++ b/app/Api/V1/Controllers/Models/TransactionLinkType/ListController.php @@ -49,7 +49,6 @@ class ListController extends Controller } - /** * Delete the resource. * diff --git a/app/Api/V1/Controllers/Models/TransactionLinkType/ShowController.php b/app/Api/V1/Controllers/Models/TransactionLinkType/ShowController.php index 9d5b6fb45f..5f9560cf67 100644 --- a/app/Api/V1/Controllers/Models/TransactionLinkType/ShowController.php +++ b/app/Api/V1/Controllers/Models/TransactionLinkType/ShowController.php @@ -81,7 +81,6 @@ class ShowController extends Controller } - /** * List single resource. * diff --git a/app/Api/V1/Controllers/Models/TransactionLinkType/StoreController.php b/app/Api/V1/Controllers/Models/TransactionLinkType/StoreController.php index 1154d9c451..7a66d5cd88 100644 --- a/app/Api/V1/Controllers/Models/TransactionLinkType/StoreController.php +++ b/app/Api/V1/Controllers/Models/TransactionLinkType/StoreController.php @@ -47,7 +47,6 @@ class StoreController extends Controller } - /** * Store new object. * diff --git a/app/Api/V1/Controllers/Models/TransactionLinkType/UpdateController.php b/app/Api/V1/Controllers/Models/TransactionLinkType/UpdateController.php index 9c06b2a672..c9c6a63aa7 100644 --- a/app/Api/V1/Controllers/Models/TransactionLinkType/UpdateController.php +++ b/app/Api/V1/Controllers/Models/TransactionLinkType/UpdateController.php @@ -48,12 +48,11 @@ class UpdateController extends Controller } - /** * Update object. * * @param UpdateRequest $request - * @param LinkType $linkType + * @param LinkType $linkType * * @return JsonResponse * @throws FireflyException diff --git a/app/Api/V1/Controllers/Summary/BasicController.php b/app/Api/V1/Controllers/Summary/BasicController.php index d18af60f8c..5d8d830f03 100644 --- a/app/Api/V1/Controllers/Summary/BasicController.php +++ b/app/Api/V1/Controllers/Summary/BasicController.php @@ -49,11 +49,11 @@ use Illuminate\Http\JsonResponse; class BasicController extends Controller { private AvailableBudgetRepositoryInterface $abRepository; - private AccountRepositoryInterface $accountRepository; - private BillRepositoryInterface $billRepository; - private BudgetRepositoryInterface $budgetRepository; - private CurrencyRepositoryInterface $currencyRepos; - private OperationsRepositoryInterface $opsRepository; + private AccountRepositoryInterface $accountRepository; + private BillRepositoryInterface $billRepository; + private BudgetRepositoryInterface $budgetRepository; + private CurrencyRepositoryInterface $currencyRepos; + private OperationsRepositoryInterface $opsRepository; /** * BasicController constructor. @@ -146,7 +146,7 @@ class BasicController extends Controller $set = $collector->getExtractedJournals(); /** @var array $transactionJournal */ foreach ($set as $transactionJournal) { - $currencyId = (int) $transactionJournal['currency_id']; + $currencyId = (int)$transactionJournal['currency_id']; $incomes[$currencyId] = $incomes[$currencyId] ?? '0'; $incomes[$currencyId] = bcadd($incomes[$currencyId], bcmul($transactionJournal['amount'], '-1')); $sums[$currencyId] = $sums[$currencyId] ?? '0'; @@ -168,7 +168,7 @@ class BasicController extends Controller /** @var array $transactionJournal */ foreach ($set as $transactionJournal) { - $currencyId = (int) $transactionJournal['currency_id']; + $currencyId = (int)$transactionJournal['currency_id']; $expenses[$currencyId] = $expenses[$currencyId] ?? '0'; $expenses[$currencyId] = bcadd($expenses[$currencyId], $transactionJournal['amount']); $sums[$currencyId] = $sums[$currencyId] ?? '0'; @@ -186,7 +186,7 @@ class BasicController extends Controller $return[] = [ 'key' => sprintf('balance-in-%s', $currency->code), 'title' => trans('firefly.box_balance_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => round((float) $sums[$currencyId] ?? 0, $currency->decimal_places), + 'monetary_value' => round((float)$sums[$currencyId] ?? 0, $currency->decimal_places), 'currency_id' => $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, @@ -199,7 +199,7 @@ class BasicController extends Controller $return[] = [ 'key' => sprintf('spent-in-%s', $currency->code), 'title' => trans('firefly.box_spent_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => round((float) ($expenses[$currencyId] ?? 0), $currency->decimal_places), + 'monetary_value' => round((float)($expenses[$currencyId] ?? 0), $currency->decimal_places), 'currency_id' => $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, @@ -211,7 +211,7 @@ class BasicController extends Controller $return[] = [ 'key' => sprintf('earned-in-%s', $currency->code), 'title' => trans('firefly.box_earned_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => round((float) ($incomes[$currencyId] ?? 0), $currency->decimal_places), + 'monetary_value' => round((float)($incomes[$currencyId] ?? 0), $currency->decimal_places), 'currency_id' => $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, @@ -242,14 +242,14 @@ class BasicController extends Controller $return = []; foreach ($paidAmount as $currencyId => $amount) { $amount = bcmul($amount, '-1'); - $currency = $this->currencyRepos->findNull((int) $currencyId); + $currency = $this->currencyRepos->findNull((int)$currencyId); if (null === $currency) { continue; } $return[] = [ 'key' => sprintf('bills-paid-in-%s', $currency->code), 'title' => trans('firefly.box_bill_paid_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => round((float) $amount, $currency->decimal_places), + 'monetary_value' => round((float)$amount, $currency->decimal_places), 'currency_id' => $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, @@ -262,14 +262,14 @@ class BasicController extends Controller foreach ($unpaidAmount as $currencyId => $amount) { $amount = bcmul($amount, '-1'); - $currency = $this->currencyRepos->findNull((int) $currencyId); + $currency = $this->currencyRepos->findNull((int)$currencyId); if (null === $currency) { continue; } $return[] = [ 'key' => sprintf('bills-unpaid-in-%s', $currency->code), 'title' => trans('firefly.box_bill_unpaid_in_currency', ['currency' => $currency->symbol]), - 'monetary_value' => round((float) $amount, $currency->decimal_places), + 'monetary_value' => round((float)$amount, $currency->decimal_places), 'currency_id' => $currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, @@ -307,20 +307,20 @@ class BasicController extends Controller $days = $today->diffInDays($end) + 1; $perDay = '0'; if (0 !== $days && bccomp($leftToSpend, '0') > -1) { - $perDay = bcdiv($leftToSpend, (string) $days); + $perDay = bcdiv($leftToSpend, (string)$days); } $return[] = [ 'key' => sprintf('left-to-spend-in-%s', $row['currency_code']), 'title' => trans('firefly.box_left_to_spend_in_currency', ['currency' => $row['currency_symbol']]), - 'monetary_value' => round((float) $leftToSpend, $row['currency_decimal_places']), + 'monetary_value' => round((float)$leftToSpend, $row['currency_decimal_places']), 'currency_id' => $row['currency_id'], 'currency_code' => $row['currency_code'], 'currency_symbol' => $row['currency_symbol'], 'currency_decimal_places' => $row['currency_decimal_places'], 'value_parsed' => app('amount')->formatFlat($row['currency_symbol'], $row['currency_decimal_places'], $leftToSpend, false), 'local_icon' => 'money', - 'sub_title' => (string) trans( + 'sub_title' => (string)trans( 'firefly.box_spend_per_day', ['amount' => app('amount')->formatFlat( $row['currency_symbol'], @@ -373,7 +373,7 @@ class BasicController extends Controller foreach ($netWorthSet as $data) { /** @var TransactionCurrency $currency */ $currency = $data['currency']; - $amount = round((float) $data['balance'], $currency->decimal_places); + $amount = round((float)$data['balance'], $currency->decimal_places); if (0.0 === $amount) { continue; } diff --git a/app/Api/V1/Controllers/System/ConfigurationController.php b/app/Api/V1/Controllers/System/ConfigurationController.php index f91cad2b8d..d52ccf332f 100644 --- a/app/Api/V1/Controllers/System/ConfigurationController.php +++ b/app/Api/V1/Controllers/System/ConfigurationController.php @@ -85,6 +85,41 @@ class ConfigurationController extends Controller return response()->json($return); } + /** + * Get all config values. + * + * @return array + * @throws FireflyException + */ + private function getDynamicConfiguration(): array + { + $isDemoSite = app('fireflyconfig')->get('is_demo_site'); + $updateCheck = app('fireflyconfig')->get('permission_update_check'); + $lastCheck = app('fireflyconfig')->get('last_update_check'); + $singleUser = app('fireflyconfig')->get('single_user_mode'); + + return [ + 'is_demo_site' => null === $isDemoSite ? null : $isDemoSite->data, + 'permission_update_check' => null === $updateCheck ? null : (int)$updateCheck->data, + 'last_update_check' => null === $lastCheck ? null : (int)$lastCheck->data, + 'single_user_mode' => null === $singleUser ? null : $singleUser->data, + ]; + } + + /** + * @return array + */ + private function getStaticConfiguration(): array + { + $list = EitherConfigKey::$static; + $return = []; + foreach ($list as $key) { + $return[$key] = config($key); + } + + return $return; + } + /** * @param string $configKey * @@ -118,7 +153,7 @@ class ConfigurationController extends Controller * Update the configuration. * * @param UpdateRequest $request - * @param string $name + * @param string $name * * @return JsonResponse */ @@ -127,8 +162,8 @@ class ConfigurationController extends Controller if (!$this->repository->hasRole(auth()->user(), 'owner')) { throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore } - $data = $request->getAll(); - $shortName = str_replace('configuration.','', $name); + $data = $request->getAll(); + $shortName = str_replace('configuration.', '', $name); app('fireflyconfig')->set($shortName, $data['value']); @@ -136,49 +171,12 @@ class ConfigurationController extends Controller $newConfig = $this->getDynamicConfiguration(); - $data = [ - 'title' => $name, - 'value' => $newConfig[$shortName], - 'editable' => true, - ]; + $data = [ + 'title' => $name, + 'value' => $newConfig[$shortName], + 'editable' => true, + ]; return response()->json(['data' => $data])->header('Content-Type', self::CONTENT_TYPE); } - - - /** - * @return array - */ - private function getStaticConfiguration(): array - { - $list = EitherConfigKey::$static; - $return = []; - foreach ($list as $key) { - $return[$key] = config($key); - } - - return $return; - } - - - /** - * Get all config values. - * - * @return array - * @throws FireflyException - */ - private function getDynamicConfiguration(): array - { - $isDemoSite = app('fireflyconfig')->get('is_demo_site'); - $updateCheck = app('fireflyconfig')->get('permission_update_check'); - $lastCheck = app('fireflyconfig')->get('last_update_check'); - $singleUser = app('fireflyconfig')->get('single_user_mode'); - - return [ - 'is_demo_site' => null === $isDemoSite ? null : $isDemoSite->data, - 'permission_update_check' => null === $updateCheck ? null : (int)$updateCheck->data, - 'last_update_check' => null === $lastCheck ? null : (int)$lastCheck->data, - 'single_user_mode' => null === $singleUser ? null : $singleUser->data, - ]; - } } \ No newline at end of file diff --git a/app/Api/V1/Controllers/System/CronController.php b/app/Api/V1/Controllers/System/CronController.php new file mode 100644 index 0000000000..b4f6895da0 --- /dev/null +++ b/app/Api/V1/Controllers/System/CronController.php @@ -0,0 +1,59 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\System; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\System\CronRequest; +use FireflyIII\Support\Http\Controllers\CronRunner; +use Illuminate\Http\JsonResponse; +use Log; + +/** + * Class CronController + */ +class CronController extends Controller +{ + use CronRunner; + + /** + * @param CronRequest $request + * @param string $token + * + * @return JsonResponse + */ + public function cron(CronRequest $request, string $token): JsonResponse + { + $config = $request->getAll(); + + Log::debug(sprintf('Now in %s', __METHOD__)); + + $return = []; + $return['recurring_transactions'] = $this->runRecurring($config['force'], $config['date']); + $return['auto_budgets'] = $this->runAutoBudget($config['force'], $config['date']); + $return['telemetry'] = $this->runTelemetry($config['force'], $config['date']); + + + return response()->json($return); + } + +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/System/UserController.php b/app/Api/V1/Controllers/System/UserController.php index 75fca8d115..0165d2afcb 100644 --- a/app/Api/V1/Controllers/System/UserController.php +++ b/app/Api/V1/Controllers/System/UserController.php @@ -77,7 +77,7 @@ class UserController extends Controller { /** @var User $admin */ $admin = auth()->user(); - if($admin->id === $user->id) { + if ($admin->id === $user->id) { return response()->json([], 500); } @@ -98,7 +98,7 @@ class UserController extends Controller public function index(): JsonResponse { // user preferences - $pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; + $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $manager = $this->getManager(); // build collection diff --git a/app/Api/V1/Controllers/User/PreferencesController.php b/app/Api/V1/Controllers/User/PreferencesController.php index 255e993979..39e26e0994 100644 --- a/app/Api/V1/Controllers/User/PreferencesController.php +++ b/app/Api/V1/Controllers/User/PreferencesController.php @@ -73,6 +73,26 @@ class PreferencesController extends Controller } + /** + * Return a single preference by name. + * + * @param Preference $preference + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function show(Preference $preference): JsonResponse + { + $manager = $this->getManager(); + /** @var PreferenceTransformer $transformer */ + $transformer = app(PreferenceTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($preference, $transformer, 'preferences'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } + /** * @param PreferenceStoreRequest $request * @@ -113,24 +133,4 @@ class PreferencesController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Return a single preference by name. - * - * @param Preference $preference - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function show(Preference $preference): JsonResponse - { - $manager = $this->getManager(); - /** @var PreferenceTransformer $transformer */ - $transformer = app(PreferenceTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($preference, $transformer, 'preferences'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } - } diff --git a/app/Api/V1/Controllers/Webhook/AttemptController.php b/app/Api/V1/Controllers/Webhook/AttemptController.php index 25b1e76fc1..dd130f1a2d 100644 --- a/app/Api/V1/Controllers/Webhook/AttemptController.php +++ b/app/Api/V1/Controllers/Webhook/AttemptController.php @@ -29,7 +29,6 @@ use FireflyIII\Models\WebhookAttempt; use FireflyIII\Models\WebhookMessage; use FireflyIII\Repositories\Webhook\WebhookRepositoryInterface; use FireflyIII\Transformers\WebhookAttemptTransformer; -use FireflyIII\Transformers\WebhookMessageTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Pagination\LengthAwarePaginator; @@ -42,8 +41,8 @@ use League\Fractal\Resource\Item; */ class AttemptController extends Controller { - private WebhookRepositoryInterface $repository; public const RESOURCE_KEY = 'webhook_attempts'; + private WebhookRepositoryInterface $repository; /** * @codeCoverageIgnore @@ -108,10 +107,10 @@ class AttemptController extends Controller */ public function show(Webhook $webhook, WebhookMessage $message, WebhookAttempt $attempt): JsonResponse { - if($message->webhook_id !== $webhook->id) { + if ($message->webhook_id !== $webhook->id) { throw new FireflyException('Webhook and webhook message are no match'); } - if($attempt->webhook_message_id !== $message->id) { + if ($attempt->webhook_message_id !== $message->id) { throw new FireflyException('Webhook message and webhook attempt are no match'); } diff --git a/app/Api/V1/Controllers/Webhook/DestroyController.php b/app/Api/V1/Controllers/Webhook/DestroyController.php index 61fe2acec5..268613e60c 100644 --- a/app/Api/V1/Controllers/Webhook/DestroyController.php +++ b/app/Api/V1/Controllers/Webhook/DestroyController.php @@ -103,12 +103,17 @@ class DestroyController extends Controller * @return JsonResponse * @codeCoverageIgnore */ - public function destroyMessage(Webhook $webhook, WebhookMessage $message): JsonResponse + public function destroyAttempt(Webhook $webhook, WebhookMessage $message, WebhookAttempt $attempt): JsonResponse { if ($message->webhook_id !== $webhook->id) { throw new FireflyException('Webhook and webhook message are no match'); } - $this->repository->destroyMessage($message); + if ($attempt->webhook_message_id !== $message->id) { + throw new FireflyException('Webhook message and webhook attempt are no match'); + + } + + $this->repository->destroyAttempt($attempt); return response()->json([], 204); } @@ -121,21 +126,15 @@ class DestroyController extends Controller * @return JsonResponse * @codeCoverageIgnore */ - public function destroyAttempt(Webhook $webhook, WebhookMessage $message, WebhookAttempt $attempt): JsonResponse + public function destroyMessage(Webhook $webhook, WebhookMessage $message): JsonResponse { if ($message->webhook_id !== $webhook->id) { throw new FireflyException('Webhook and webhook message are no match'); } - if($attempt->webhook_message_id !== $message->id) { - throw new FireflyException('Webhook message and webhook attempt are no match'); - - } - - $this->repository->destroyAttempt($attempt); + $this->repository->destroyMessage($message); return response()->json([], 204); } - } diff --git a/app/Api/V1/Controllers/Webhook/MessageController.php b/app/Api/V1/Controllers/Webhook/MessageController.php index 25bab9f655..33f5124282 100644 --- a/app/Api/V1/Controllers/Webhook/MessageController.php +++ b/app/Api/V1/Controllers/Webhook/MessageController.php @@ -71,7 +71,7 @@ class MessageController extends Controller $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; $collection = $this->repository->getMessages($webhook); - $count = $collection->count(); + $count = $collection->count(); $messages = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); // make paginator: @@ -99,7 +99,7 @@ class MessageController extends Controller */ public function show(Webhook $webhook, WebhookMessage $message): JsonResponse { - if($message->webhook_id !== $webhook->id) { + if ($message->webhook_id !== $webhook->id) { throw new FireflyException('Webhook and webhook message are no match'); } diff --git a/app/Api/V1/Requests/Data/Export/ExportRequest.php b/app/Api/V1/Requests/Data/Export/ExportRequest.php index 41ed66d0b8..6eefffa754 100644 --- a/app/Api/V1/Requests/Data/Export/ExportRequest.php +++ b/app/Api/V1/Requests/Data/Export/ExportRequest.php @@ -37,21 +37,6 @@ class ExportRequest extends FormRequest { use ChecksLogin, ConvertsDataTypes; - /** - * The rules that the incoming request must be matched against. - * - * @return array - */ - public function rules(): array - { - return [ - 'type' => 'in:csv', - 'accounts' => 'min:1', - 'start' => 'date|before:end', - 'end' => 'date|after:start', - ]; - } - public function getAll(): array { $result = [ @@ -77,4 +62,19 @@ class ExportRequest extends FormRequest return $result; } + + /** + * The rules that the incoming request must be matched against. + * + * @return array + */ + public function rules(): array + { + return [ + 'type' => 'in:csv', + 'accounts' => 'min:1', + 'start' => 'date|before:end', + 'end' => 'date|after:start', + ]; + } } \ No newline at end of file diff --git a/app/Api/V1/Requests/Insight/GenericRequest.php b/app/Api/V1/Requests/Insight/GenericRequest.php index 0ebac45ef1..504178c906 100644 --- a/app/Api/V1/Requests/Insight/GenericRequest.php +++ b/app/Api/V1/Requests/Insight/GenericRequest.php @@ -25,31 +25,110 @@ class GenericRequest extends FormRequest use ConvertsDataTypes, ChecksLogin; private Collection $accounts; + private Collection $bills; private Collection $budgets; private Collection $categories; - private Collection $bills; private Collection $tags; /** - * @return Carbon + * Get all data from the request. + * + * @return array */ - public function getStart(): Carbon + public function getAll(): array { - $date = $this->date('start'); - $date->startOfDay(); - - return $date; + return [ + 'start' => $this->date('start'), + 'end' => $this->date('end'), + ]; } /** - * @return Carbon + * @return Collection */ - public function getEnd(): Carbon + public function getAssetAccounts(): Collection { - $date = $this->date('end'); - $date->endOfDay(); + $this->parseAccounts(); + $return = new Collection; + /** @var Account $account */ + foreach ($this->accounts as $account) { + $type = $account->accountType->type; + if (in_array($type, [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE])) { + $return->push($account); + } + } - return $date; + return $return; + } + + /** + * + */ + private function parseAccounts(): void + { + if (null === $this->accounts) { + $this->accounts = new Collection; + } + if (0 !== $this->accounts->count()) { + return; + } + $repository = app(AccountRepositoryInterface::class); + $repository->setUser(auth()->user()); + $array = $this->get('accounts'); + if (is_array($array)) { + foreach ($array as $accountId) { + $accountId = (int)$accountId; + $account = $repository->findNull($accountId); + if (null !== $account) { + $this->accounts->push($account); + } + } + } + } + + /** + * @return Collection + */ + public function getBills(): Collection + { + $this->parseBills(); + + return $this->bills; + } + + /** + * + */ + private function parseBills(): void + { + if (null === $this->bills) { + $this->bills = new Collection; + } + if (0 !== $this->bills->count()) { + return; + } + $repository = app(BillRepositoryInterface::class); + $repository->setUser(auth()->user()); + $array = $this->get('bills'); + if (is_array($array)) { + foreach ($array as $billId) { + $billId = (int)$billId; + $bill = $repository->find($billId); + if (null !== $billId) { + $this->bills->push($bill); + } + } + } + } + + /** + * @return Collection + */ + public function getBudgets(): Collection + { + $this->parseBudgets(); + + return $this->budgets; } /** @@ -77,16 +156,6 @@ class GenericRequest extends FormRequest } } - /** - * @return Collection - */ - public function getBudgets(): Collection - { - $this->parseBudgets(); - - return $this->budgets; - } - /** * @return Collection */ @@ -98,42 +167,39 @@ class GenericRequest extends FormRequest } /** - * @return Collection + * */ - public function getBills(): Collection + private function parseCategories(): void { - $this->parseBills(); - - return $this->bills; - } - - /** - * @return Collection - */ - public function getTags(): Collection - { - $this->parseTags(); - - return $this->tags; - } - - - /** - * @return Collection - */ - public function getAssetAccounts(): Collection - { - $this->parseAccounts(); - $return = new Collection; - /** @var Account $account */ - foreach ($this->accounts as $account) { - $type = $account->accountType->type; - if (in_array($type, [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE])) { - $return->push($account); + if (null === $this->categories) { + $this->categories = new Collection; + } + if (0 !== $this->categories->count()) { + return; + } + $repository = app(CategoryRepositoryInterface::class); + $repository->setUser(auth()->user()); + $array = $this->get('categories'); + if (is_array($array)) { + foreach ($array as $categoryId) { + $categoryId = (int)$categoryId; + $category = $repository->findNull($categoryId); + if (null !== $categoryId) { + $this->categories->push($category); + } } } + } - return $return; + /** + * @return Carbon + */ + public function getEnd(): Carbon + { + $date = $this->date('end'); + $date->endOfDay(); + + return $date; } /** @@ -173,111 +239,24 @@ class GenericRequest extends FormRequest } /** - * Get all data from the request. - * - * @return array + * @return Carbon */ - public function getAll(): array + public function getStart(): Carbon { - return [ - 'start' => $this->date('start'), - 'end' => $this->date('end'), - ]; + $date = $this->date('start'); + $date->startOfDay(); + + return $date; } /** - * The rules that the incoming request must be matched against. - * - * @return array + * @return Collection */ - public function rules(): array + public function getTags(): Collection { - // this is cheating but it works: - $this->accounts = new Collection; - $this->budgets = new Collection; - $this->categories = new Collection; - $this->bills = new Collection; - $this->tags = new Collection; + $this->parseTags(); - return [ - 'start' => 'required|date', - 'end' => 'required|date|after:start', - ]; - } - - /** - * - */ - private function parseAccounts(): void - { - if (null === $this->accounts) { - $this->accounts = new Collection; - } - if (0 !== $this->accounts->count()) { - return; - } - $repository = app(AccountRepositoryInterface::class); - $repository->setUser(auth()->user()); - $array = $this->get('accounts'); - if (is_array($array)) { - foreach ($array as $accountId) { - $accountId = (int)$accountId; - $account = $repository->findNull($accountId); - if (null !== $account) { - $this->accounts->push($account); - } - } - } - } - - /** - * - */ - private function parseBills(): void - { - if (null === $this->bills) { - $this->bills = new Collection; - } - if (0 !== $this->bills->count()) { - return; - } - $repository = app(BillRepositoryInterface::class); - $repository->setUser(auth()->user()); - $array = $this->get('bills'); - if (is_array($array)) { - foreach ($array as $billId) { - $billId = (int)$billId; - $bill = $repository->find($billId); - if (null !== $billId) { - $this->bills->push($bill); - } - } - } - } - - /** - * - */ - private function parseCategories(): void - { - if (null === $this->categories) { - $this->categories = new Collection; - } - if (0 !== $this->categories->count()) { - return; - } - $repository = app(CategoryRepositoryInterface::class); - $repository->setUser(auth()->user()); - $array = $this->get('categories'); - if (is_array($array)) { - foreach ($array as $categoryId) { - $categoryId = (int)$categoryId; - $category = $repository->findNull($categoryId); - if (null !== $categoryId) { - $this->categories->push($category); - } - } - } + return $this->tags; } /** @@ -304,4 +283,24 @@ class GenericRequest extends FormRequest } } } + + /** + * The rules that the incoming request must be matched against. + * + * @return array + */ + public function rules(): array + { + // this is cheating but it works: + $this->accounts = new Collection; + $this->budgets = new Collection; + $this->categories = new Collection; + $this->bills = new Collection; + $this->tags = new Collection; + + return [ + 'start' => 'required|date', + 'end' => 'required|date|after:start', + ]; + } } \ No newline at end of file diff --git a/app/Api/V1/Requests/Models/Account/UpdateRequest.php b/app/Api/V1/Requests/Models/Account/UpdateRequest.php index 0a110e8d16..c1c484f5f8 100644 --- a/app/Api/V1/Requests/Models/Account/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Account/UpdateRequest.php @@ -47,47 +47,32 @@ class UpdateRequest extends FormRequest */ public function getUpdateData(): array { - $active = null; - $includeNetWorth = null; - if (null !== $this->get('active')) { - $active = $this->boolean('active'); - } - if (null !== $this->get('include_net_worth')) { - $includeNetWorth = $this->boolean('include_net_worth'); - } - $data = [ - 'name' => $this->nullableString('name'), - 'active' => $active, - 'include_net_worth' => $includeNetWorth, - 'account_type' => $this->nullableString('type'), - 'account_type_id' => null, - 'virtual_balance' => $this->nullableString('virtual_balance'), - 'iban' => $this->nullableString('iban'), - 'BIC' => $this->nullableString('bic'), - 'account_number' => $this->nullableString('account_number'), - 'account_role' => $this->nullableString('account_role'), - 'liability_type' => $this->nullableString('liability_type'), - 'opening_balance' => $this->nullableString('opening_balance'), - 'opening_balance_date' => $this->date('opening_balance_date'), - 'cc_type' => $this->nullableString('credit_card_type'), - 'cc_monthly_payment_date' => $this->nullableString('monthly_payment_date'), - 'notes' => $this->nullableNlString('notes'), - 'interest' => $this->nullableString('interest'), - 'interest_period' => $this->nullableString('interest_period'), + $fields = [ + 'name' => ['name', 'string'], + 'active' => ['active', 'boolean'], + 'include_net_worth' => ['include_net_worth', 'boolean'], + 'account_type' => ['type', 'string'], + 'virtual_balance' => ['virtual_balance', 'string'], + 'iban' => ['iban', 'string'], + 'BIC' => ['bic', 'string'], + 'account_number' => ['account_number', 'string'], + 'account_role' => ['account_role', 'string'], + 'liability_type' => ['liability_type', 'string'], + 'opening_balance' => ['opening_balance', 'string'], + 'opening_balance_date' => ['opening_balance_date', 'date'], + 'cc_type' => ['credit_card_type', 'string'], + 'cc_monthly_payment_date' => ['monthly_payment_date', 'string'], + 'notes' => ['notes', 'nlString'], + 'interest' => ['interest', 'string'], + 'interest_period' => ['interest_period', 'string'], + 'order' => ['order', 'integer'], + 'currency_id' => ['currency_id', 'integer'], + 'currency_code' => ['currency_code', 'string'], ]; - if (null !== $this->get('order')) { - $data['order'] = $this->integer('order'); - } - if (null !== $this->get('currency_id')) { - $data['currency_id'] = $this->nullableInteger('currency_id'); - } - if (null !== $this->get('currency_code')) { - $data['currency_code'] = $this->nullableString('currency_code'); - } + $data = $this->getAllData($fields); + $data = $this->appendLocationData($data, null); - $data = $this->appendLocationData($data, null); - - if ('liability' === $data['account_type']) { + if (array_key_exists('account_type', $data) && 'liability' === $data['account_type']) { $data['opening_balance'] = bcmul($this->nullableString('liability_amount'), '-1'); $data['opening_balance_date'] = $this->date('liability_start_date'); $data['account_type'] = $this->nullableString('liability_type'); @@ -123,9 +108,9 @@ class UpdateRequest extends FormRequest 'currency_code' => 'min:3|max:3|exists:transaction_currencies,code', 'active' => [new IsBoolean], 'include_net_worth' => [new IsBoolean], - 'account_role' => sprintf('in:%s|required_if:type,asset', $accountRoles), - 'credit_card_type' => sprintf('in:%s|required_if:account_role,ccAsset', $ccPaymentTypes), - 'monthly_payment_date' => 'date' . '|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull', + 'account_role' => sprintf('in:%s|nullable|required_if:type,asset', $accountRoles), + 'credit_card_type' => sprintf('in:%s|nullable|required_if:account_role,ccAsset', $ccPaymentTypes), + 'monthly_payment_date' => 'date' . '|nullable|required_if:account_role,ccAsset|required_if:credit_card_type,monthlyFull', 'liability_type' => 'required_if:type,liability|in:loan,debt,mortgage', 'interest' => 'required_if:type,liability|between:0,100|numeric', 'interest_period' => 'required_if:type,liability|in:daily,monthly,yearly', diff --git a/app/Api/V1/Requests/Models/Category/UpdateRequest.php b/app/Api/V1/Requests/Models/Category/UpdateRequest.php index befa561963..ee0b56880c 100644 --- a/app/Api/V1/Requests/Models/Category/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Category/UpdateRequest.php @@ -44,9 +44,10 @@ class UpdateRequest extends FormRequest public function getAll(): array { $fields = [ - 'name' => ['name', 'string'], - 'notes' => ['notes', 'nlString'] + 'name' => ['name', 'string'], + 'notes' => ['notes', 'nlString'], ]; + return $this->getAllData($fields); } diff --git a/app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php b/app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php index e0e8c282df..6d3c5c9740 100644 --- a/app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/ObjectGroup/UpdateRequest.php @@ -44,8 +44,9 @@ class UpdateRequest extends FormRequest { $fields = [ 'title' => ['title', 'string'], - 'order' =>['order', 'integer'] + 'order' => ['order', 'integer'], ]; + return $this->getAllData($fields); } diff --git a/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php b/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php index b632c4ddcc..02634ba488 100644 --- a/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Recurrence/UpdateRequest.php @@ -76,29 +76,6 @@ class UpdateRequest extends FormRequest return $return; } - /** - * Returns the transaction data as it is found in the submitted data. It's a complex method according to code - * standards but it just has a lot of ??-statements because of the fields that may or may not exist. - * - * @return array|null - */ - private function getTransactionData(): ?array - { - $return = []; - // transaction data: - /** @var array $transactions */ - $transactions = $this->get('transactions'); - if (null === $transactions) { - return null; - } - /** @var array $transaction */ - foreach ($transactions as $transaction) { - $return[] = $this->getSingleRecurrenceData($transaction); - } - - return $return; - } - /** * Returns the repetition data as it is found in the submitted data. * @@ -140,6 +117,29 @@ class UpdateRequest extends FormRequest return $return; } + /** + * Returns the transaction data as it is found in the submitted data. It's a complex method according to code + * standards but it just has a lot of ??-statements because of the fields that may or may not exist. + * + * @return array|null + */ + private function getTransactionData(): ?array + { + $return = []; + // transaction data: + /** @var array $transactions */ + $transactions = $this->get('transactions'); + if (null === $transactions) { + return null; + } + /** @var array $transaction */ + foreach ($transactions as $transaction) { + $return[] = $this->getSingleTransactionData($transaction); + } + + return $return; + } + /** * The rules that the incoming request must be matched against. * diff --git a/app/Api/V1/Requests/Models/Rule/TriggerRequest.php b/app/Api/V1/Requests/Models/Rule/TriggerRequest.php index 8fe6b92fcf..479647ce73 100644 --- a/app/Api/V1/Requests/Models/Rule/TriggerRequest.php +++ b/app/Api/V1/Requests/Models/Rule/TriggerRequest.php @@ -38,7 +38,6 @@ class TriggerRequest extends FormRequest use ConvertsDataTypes, ChecksLogin; - /** * @return array */ diff --git a/app/Api/V1/Requests/Models/Rule/UpdateRequest.php b/app/Api/V1/Requests/Models/Rule/UpdateRequest.php index f1d3ef43be..d73f5c7806 100644 --- a/app/Api/V1/Requests/Models/Rule/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Rule/UpdateRequest.php @@ -59,10 +59,10 @@ class UpdateRequest extends FormRequest $return = $this->getAllData($fields); $triggers = $this->getRuleTriggers(); $actions = $this->getRuleActions(); - if(null !== $triggers) { + if (null !== $triggers) { $return['triggers'] = $triggers; } - if(null !== $actions) { + if (null !== $actions) { $return['actions'] = $actions; } @@ -81,9 +81,9 @@ class UpdateRequest extends FormRequest $return = []; if (is_array($triggers)) { foreach ($triggers as $trigger) { - $active = array_key_exists('active', $trigger) ? $trigger['active'] : true; - $stopProcessing= array_key_exists('stop_processing', $trigger) ? $trigger['stop_processing'] : false; - $return[] = [ + $active = array_key_exists('active', $trigger) ? $trigger['active'] : true; + $stopProcessing = array_key_exists('stop_processing', $trigger) ? $trigger['stop_processing'] : false; + $return[] = [ 'type' => $trigger['type'], 'value' => $trigger['value'], 'active' => $active, diff --git a/app/Api/V1/Requests/Models/RuleGroup/TestRequest.php b/app/Api/V1/Requests/Models/RuleGroup/TestRequest.php index ef7d1bedb8..51a9bc9e0b 100644 --- a/app/Api/V1/Requests/Models/RuleGroup/TestRequest.php +++ b/app/Api/V1/Requests/Models/RuleGroup/TestRequest.php @@ -29,7 +29,6 @@ use Carbon\Carbon; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Support\Collection; /** * Class TestRequest @@ -39,7 +38,6 @@ class TestRequest extends FormRequest use ConvertsDataTypes, ChecksLogin; - /** * @return array */ diff --git a/app/Api/V1/Requests/Models/RuleGroup/TriggerRequest.php b/app/Api/V1/Requests/Models/RuleGroup/TriggerRequest.php index 033f5feae9..c8d1f87ded 100644 --- a/app/Api/V1/Requests/Models/RuleGroup/TriggerRequest.php +++ b/app/Api/V1/Requests/Models/RuleGroup/TriggerRequest.php @@ -38,7 +38,6 @@ class TriggerRequest extends FormRequest use ConvertsDataTypes, ChecksLogin; - /** * @return array */ diff --git a/app/Api/V1/Requests/Models/Transaction/StoreRequest.php b/app/Api/V1/Requests/Models/Transaction/StoreRequest.php index c6ab9280e2..19854987d5 100644 --- a/app/Api/V1/Requests/Models/Transaction/StoreRequest.php +++ b/app/Api/V1/Requests/Models/Transaction/StoreRequest.php @@ -59,6 +59,7 @@ class StoreRequest extends FormRequest 'apply_rules' => $this->boolean('apply_rules', true), 'transactions' => $this->getTransactionData(), ]; + // TODO location return $data; } @@ -79,64 +80,64 @@ class StoreRequest extends FormRequest $return[] = [ 'type' => $this->stringFromValue($object['type']), 'date' => $this->dateFromValue($object['date']), - 'order' => $this->integerFromValue((string) $object['order']), + 'order' => $this->integerFromValue((string)$object['order']), - 'currency_id' => $this->integerFromValue((string) $object['currency_id']), + 'currency_id' => $this->integerFromValue((string)$object['currency_id']), 'currency_code' => $this->stringFromValue($object['currency_code']), // foreign currency info: - 'foreign_currency_id' => $this->integerFromValue((string) $object['foreign_currency_id']), - 'foreign_currency_code' => $this->stringFromValue((string) $object['foreign_currency_code']), + 'foreign_currency_id' => $this->integerFromValue((string)$object['foreign_currency_id']), + 'foreign_currency_code' => $this->stringFromValue((string)$object['foreign_currency_code']), // amount and foreign amount. Cannot be 0. - 'amount' => $this->stringFromValue((string) $object['amount']), - 'foreign_amount' => $this->stringFromValue((string) $object['foreign_amount']), + 'amount' => $this->stringFromValue((string)$object['amount']), + 'foreign_amount' => $this->stringFromValue((string)$object['foreign_amount']), // description. 'description' => $this->stringFromValue($object['description']), // source of transaction. If everything is null, assume cash account. - 'source_id' => $this->integerFromValue((string) $object['source_id']), - 'source_name' => $this->stringFromValue((string) $object['source_name']), - 'source_iban' => $this->stringFromValue((string) $object['source_iban']), - 'source_number' => $this->stringFromValue((string) $object['source_number']), - 'source_bic' => $this->stringFromValue((string) $object['source_bic']), + 'source_id' => $this->integerFromValue((string)$object['source_id']), + 'source_name' => $this->stringFromValue((string)$object['source_name']), + 'source_iban' => $this->stringFromValue((string)$object['source_iban']), + 'source_number' => $this->stringFromValue((string)$object['source_number']), + 'source_bic' => $this->stringFromValue((string)$object['source_bic']), // destination of transaction. If everything is null, assume cash account. - 'destination_id' => $this->integerFromValue((string) $object['destination_id']), - 'destination_name' => $this->stringFromValue((string) $object['destination_name']), - 'destination_iban' => $this->stringFromValue((string) $object['destination_iban']), - 'destination_number' => $this->stringFromValue((string) $object['destination_number']), - 'destination_bic' => $this->stringFromValue((string) $object['destination_bic']), + 'destination_id' => $this->integerFromValue((string)$object['destination_id']), + 'destination_name' => $this->stringFromValue((string)$object['destination_name']), + 'destination_iban' => $this->stringFromValue((string)$object['destination_iban']), + 'destination_number' => $this->stringFromValue((string)$object['destination_number']), + 'destination_bic' => $this->stringFromValue((string)$object['destination_bic']), // budget info - 'budget_id' => $this->integerFromValue((string) $object['budget_id']), - 'budget_name' => $this->stringFromValue((string) $object['budget_name']), + 'budget_id' => $this->integerFromValue((string)$object['budget_id']), + 'budget_name' => $this->stringFromValue((string)$object['budget_name']), // category info - 'category_id' => $this->integerFromValue((string) $object['category_id']), - 'category_name' => $this->stringFromValue((string) $object['category_name']), + 'category_id' => $this->integerFromValue((string)$object['category_id']), + 'category_name' => $this->stringFromValue((string)$object['category_name']), // journal bill reference. Optional. Will only work for withdrawals - 'bill_id' => $this->integerFromValue((string) $object['bill_id']), - 'bill_name' => $this->stringFromValue((string) $object['bill_name']), + 'bill_id' => $this->integerFromValue((string)$object['bill_id']), + 'bill_name' => $this->stringFromValue((string)$object['bill_name']), // piggy bank reference. Optional. Will only work for transfers - 'piggy_bank_id' => $this->integerFromValue((string) $object['piggy_bank_id']), - 'piggy_bank_name' => $this->stringFromValue((string) $object['piggy_bank_name']), + 'piggy_bank_id' => $this->integerFromValue((string)$object['piggy_bank_id']), + 'piggy_bank_name' => $this->stringFromValue((string)$object['piggy_bank_name']), // some other interesting properties - 'reconciled' => $this->convertBoolean((string) $object['reconciled']), - 'notes' => $this->nlStringFromValue((string) $object['notes']), + 'reconciled' => $this->convertBoolean((string)$object['reconciled']), + 'notes' => $this->nlStringFromValue((string)$object['notes']), 'tags' => $this->arrayFromValue($object['tags']), // all custom fields: - 'internal_reference' => $this->stringFromValue((string) $object['internal_reference']), - 'external_id' => $this->stringFromValue((string) $object['external_id']), + 'internal_reference' => $this->stringFromValue((string)$object['internal_reference']), + 'external_id' => $this->stringFromValue((string)$object['external_id']), 'original_source' => sprintf('ff3-v%s|api-v%s', config('firefly.version'), config('firefly.api_version')), 'recurrence_id' => $this->integerFromValue($object['recurrence_id']), - 'bunq_payment_id' => $this->stringFromValue((string) $object['bunq_payment_id']), - 'external_uri' => $this->stringFromValue((string) $object['external_uri']), + 'bunq_payment_id' => $this->stringFromValue((string)$object['bunq_payment_id']), + 'external_uri' => $this->stringFromValue((string)$object['external_uri']), 'sepa_cc' => $this->stringFromValue($object['sepa_cc']), 'sepa_ct_op' => $this->stringFromValue($object['sepa_ct_op']), diff --git a/app/Api/V1/Requests/Models/Transaction/UpdateRequest.php b/app/Api/V1/Requests/Models/Transaction/UpdateRequest.php index ac82f4a817..21ae0d8f92 100644 --- a/app/Api/V1/Requests/Models/Transaction/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Transaction/UpdateRequest.php @@ -156,13 +156,13 @@ class UpdateRequest extends FormRequest */ foreach ($this->get('transactions') as $transaction) { // default response is to update nothing in the transaction: - $current = []; - $current = $this->getIntegerData($current, $transaction); - $current = $this->getStringData($current, $transaction); - $current = $this->getNlStringData($current, $transaction); - $current = $this->getDateData($current, $transaction); - $current = $this->getBooleanData($current, $transaction); - $current = $this->getArrayData($current, $transaction); + $current = []; + $current = $this->getIntegerData($current, $transaction); + $current = $this->getStringData($current, $transaction); + $current = $this->getNlStringData($current, $transaction); + $current = $this->getDateData($current, $transaction); + $current = $this->getBooleanData($current, $transaction); + $current = $this->getArrayData($current, $transaction); $return[] = $current; } diff --git a/app/Api/V1/Requests/Models/TransactionLink/StoreRequest.php b/app/Api/V1/Requests/Models/TransactionLink/StoreRequest.php index 1b8540728f..fb7c1741b1 100644 --- a/app/Api/V1/Requests/Models/TransactionLink/StoreRequest.php +++ b/app/Api/V1/Requests/Models/TransactionLink/StoreRequest.php @@ -102,8 +102,8 @@ class StoreRequest extends FormRequest $journalRepos->setUser($user); $data = $validator->getData(); - $inwardId = (int) ($data['inward_id'] ?? 0); - $outwardId = (int) ($data['outward_id'] ?? 0); + $inwardId = (int)($data['inward_id'] ?? 0); + $outwardId = (int)($data['outward_id'] ?? 0); $inward = $journalRepos->findNull($inwardId); $outward = $journalRepos->findNull($outwardId); diff --git a/app/Api/V1/Requests/Models/TransactionLinkType/StoreRequest.php b/app/Api/V1/Requests/Models/TransactionLinkType/StoreRequest.php index 3794b87a83..00a6376489 100644 --- a/app/Api/V1/Requests/Models/TransactionLinkType/StoreRequest.php +++ b/app/Api/V1/Requests/Models/TransactionLinkType/StoreRequest.php @@ -23,11 +23,9 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests\Models\TransactionLinkType; -use FireflyIII\Models\LinkType; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Validation\Rule; /** * Class StoreRequest diff --git a/app/Api/V1/Requests/Models/TransactionLinkType/UpdateRequest.php b/app/Api/V1/Requests/Models/TransactionLinkType/UpdateRequest.php index fb50a34a7d..3d738cfef7 100644 --- a/app/Api/V1/Requests/Models/TransactionLinkType/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/TransactionLinkType/UpdateRequest.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests\Models\TransactionLinkType; -use FireflyIII\Models\LinkType; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use Illuminate\Foundation\Http\FormRequest; @@ -61,7 +60,8 @@ class UpdateRequest extends FormRequest */ public function rules(): array { - $linkType = $this->route()->parameter('linkType'); + $linkType = $this->route()->parameter('linkType'); + return [ 'name' => [Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1'], 'outward' => ['different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1'], diff --git a/app/Api/V1/Requests/System/CronRequest.php b/app/Api/V1/Requests/System/CronRequest.php new file mode 100644 index 0000000000..c60af678c8 --- /dev/null +++ b/app/Api/V1/Requests/System/CronRequest.php @@ -0,0 +1,83 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Api\V1\Requests\System; + +use Carbon\Carbon; +use FireflyIII\Support\Request\ConvertsDataTypes; +use Illuminate\Foundation\Http\FormRequest; + +/** + * Class CronRequest + * + * @codeCoverageIgnore + */ +class CronRequest extends FormRequest +{ + use ConvertsDataTypes; + + /** + * Verify the request. + * + * @return bool + */ + public function authorize(): bool + { + return true; + } + + /** + * Get all data from the request. + * + * @return array + */ + public function getAll(): array + { + $data = [ + 'force' => false, + 'date' => Carbon::now(), + ]; + if ($this->has('force')) { + $data['force'] = $this->boolean('force'); + } + if ($this->has('date')) { + $data['date'] = $this->date('date'); + } + + return $data; + } + + /** + * The rules that the incoming request must be matched against. + * + * @return array + */ + public function rules(): array + { + return [ + 'force' => 'in:true,false', + 'date' => 'date', + ]; + } +} diff --git a/app/Api/V1/Requests/System/UpdateRequest.php b/app/Api/V1/Requests/System/UpdateRequest.php index cf6ddf5c6d..67b40c52a0 100644 --- a/app/Api/V1/Requests/System/UpdateRequest.php +++ b/app/Api/V1/Requests/System/UpdateRequest.php @@ -39,7 +39,6 @@ class UpdateRequest extends FormRequest use ConvertsDataTypes, ChecksLogin; - /** * Get all data from the request. * diff --git a/app/Api/V1/Requests/User/PreferenceStoreRequest.php b/app/Api/V1/Requests/User/PreferenceStoreRequest.php index 38f4eca932..fe589f2801 100644 --- a/app/Api/V1/Requests/User/PreferenceStoreRequest.php +++ b/app/Api/V1/Requests/User/PreferenceStoreRequest.php @@ -45,7 +45,7 @@ class PreferenceStoreRequest extends FormRequest if ('false' === $array['data']) { $array['data'] = false; } - if(is_numeric($array['data'])) { + if (is_numeric($array['data'])) { $array['data'] = (float)$array['data']; } diff --git a/app/Api/V1/Requests/User/PreferenceUpdateRequest.php b/app/Api/V1/Requests/User/PreferenceUpdateRequest.php index 2dcf0f1f86..60d91d4d5e 100644 --- a/app/Api/V1/Requests/User/PreferenceUpdateRequest.php +++ b/app/Api/V1/Requests/User/PreferenceUpdateRequest.php @@ -45,7 +45,7 @@ class PreferenceUpdateRequest extends FormRequest if ('false' === $array['data']) { $array['data'] = false; } - if(is_numeric($array['data'])) { + if (is_numeric($array['data'])) { $array['data'] = (float)$array['data']; } diff --git a/app/Console/Commands/Correction/CorrectOpeningBalanceCurrencies.php b/app/Console/Commands/Correction/CorrectOpeningBalanceCurrencies.php index 4e44b49307..fb5d5e97a9 100644 --- a/app/Console/Commands/Correction/CorrectOpeningBalanceCurrencies.php +++ b/app/Console/Commands/Correction/CorrectOpeningBalanceCurrencies.php @@ -159,7 +159,7 @@ class CorrectOpeningBalanceCurrencies extends Command } /** - * @param TransactionJournal $journal + * @param TransactionJournal $journal * @param TransactionCurrency $currency * * @return int diff --git a/app/Console/Commands/CreateFirstUser.php b/app/Console/Commands/CreateFirstUser.php index be7bcb1155..3ddec90a24 100644 --- a/app/Console/Commands/CreateFirstUser.php +++ b/app/Console/Commands/CreateFirstUser.php @@ -31,24 +31,23 @@ use Str; /** * Class CreateFirstUser + * * @package FireflyIII\Console\Commands */ class CreateFirstUser extends Command { - /** - * The name and signature of the console command. - * - * @var string - */ - protected $signature = 'firefly-iii:create-first-user {email}'; - /** * The console command description. * * @var string */ protected $description = 'Creates a new user and gives admin rights. Outputs the password on the command line. Strictly for testing.'; - + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'firefly-iii:create-first-user {email}'; private UserRepositoryInterface $repository; /** @@ -60,12 +59,14 @@ class CreateFirstUser extends Command { if ('testing' !== env('APP_ENV', 'local')) { $this->error('This command only works in the testing environment.'); + return 1; } $this->stupidLaravel(); $count = $this->repository->count(); if ($count > 0) { $this->error('Already have more than zero users in DB.'); + return 1; } $data = [ @@ -82,6 +83,7 @@ class CreateFirstUser extends Command $this->info(sprintf('Created new admin user (ID #%d) with email address "%s" and password "%s".', $user->id, $user->email, $password)); $this->error('Change this password.'); + return 0; } diff --git a/app/Console/Commands/DecryptDatabase.php b/app/Console/Commands/DecryptDatabase.php index a8f1bbed63..41e8004fa8 100644 --- a/app/Console/Commands/DecryptDatabase.php +++ b/app/Console/Commands/DecryptDatabase.php @@ -85,6 +85,26 @@ class DecryptDatabase extends Command return 0; } + /** + * @param string $table + * @param array $fields + */ + private function decryptTable(string $table, array $fields): void + { + if ($this->isDecrypted($table)) { + $this->info(sprintf('No decryption required for table "%s".', $table)); + + return; + } + foreach ($fields as $field) { + $this->decryptField($table, $field); + } + $this->line(sprintf('Decrypted the data in table "%s".', $table)); + // mark as decrypted: + $configName = sprintf('is_decrypted_%s', $table); + app('fireflyconfig')->set($configName, true); + } + /** * @param string $table * @@ -100,53 +120,12 @@ class DecryptDatabase extends Command Log::error($e->getMessage()); } if (null !== $configVar) { - return (bool) $configVar->data; + return (bool)$configVar->data; } return false; } - - /** - * Tries to decrypt data. Will only throw an exception when the MAC is invalid. - * - * @param $value - * - * @return string - * @throws FireflyException - */ - private function tryDecrypt($value) - { - try { - $value = Crypt::decrypt($value); - } catch (DecryptException $e) { - if ('The MAC is invalid.' === $e->getMessage()) { - throw new FireflyException($e->getMessage()); // @codeCoverageIgnore - } - } - - return $value; - } - - /** - * @param string $table - * @param array $fields - */ - private function decryptTable(string $table, array $fields): void - { - if ($this->isDecrypted($table)) { - $this->info(sprintf('No decryption required for table "%s".', $table)); - return; - } - foreach ($fields as $field) { - $this->decryptField($table, $field); - } - $this->line(sprintf('Decrypted the data in table "%s".', $table)); - // mark as decrypted: - $configName = sprintf('is_decrypted_%s', $table); - app('fireflyconfig')->set($configName, true); - } - /** * @param string $table * @param string $field @@ -171,7 +150,7 @@ class DecryptDatabase extends Command if (null === $original) { return; } - $id = (int) $row->id; + $id = (int)$row->id; $value = ''; try { @@ -186,6 +165,7 @@ class DecryptDatabase extends Command // A separate routine for preferences table: if ('preferences' === $table) { $this->decryptPreferencesRow($id, $value); + return; } @@ -194,6 +174,27 @@ class DecryptDatabase extends Command } } + /** + * Tries to decrypt data. Will only throw an exception when the MAC is invalid. + * + * @param $value + * + * @return string + * @throws FireflyException + */ + private function tryDecrypt($value) + { + try { + $value = Crypt::decrypt($value); + } catch (DecryptException $e) { + if ('The MAC is invalid.' === $e->getMessage()) { + throw new FireflyException($e->getMessage()); // @codeCoverageIgnore + } + } + + return $value; + } + /** * @param int $id * @param string $value @@ -209,11 +210,12 @@ class DecryptDatabase extends Command Log::warning($message); Log::warning($value); Log::warning($e->getTraceAsString()); + return; } /** @var Preference $object */ - $object = Preference::find((int) $id); + $object = Preference::find((int)$id); if (null !== $object) { $object->data = $newValue; $object->save(); diff --git a/app/Console/Commands/ScanAttachments.php b/app/Console/Commands/ScanAttachments.php index abe7b209f2..51e2a42abe 100644 --- a/app/Console/Commands/ScanAttachments.php +++ b/app/Console/Commands/ScanAttachments.php @@ -88,6 +88,7 @@ class ScanAttachments extends Command } app('telemetry')->feature('system.command.executed', $this->signature); + return 0; } } diff --git a/app/Console/Commands/Upgrade/MigrateRecurrenceType.php b/app/Console/Commands/Upgrade/MigrateRecurrenceType.php index bb86826544..af5e5a7a7a 100644 --- a/app/Console/Commands/Upgrade/MigrateRecurrenceType.php +++ b/app/Console/Commands/Upgrade/MigrateRecurrenceType.php @@ -63,14 +63,6 @@ class MigrateRecurrenceType extends Command return false; // @codeCoverageIgnore } - /** - * - */ - private function getInvalidType(): TransactionType - { - return TransactionType::whereType(TransactionType::INVALID)->firstOrCreate(['type' => TransactionType::INVALID]); - } - /** * */ @@ -85,14 +77,6 @@ class MigrateRecurrenceType extends Command } } - /** - * - */ - private function markAsExecuted(): void - { - app('fireflyconfig')->set(self::CONFIG_NAME, true); - } - private function migrateRecurrence(Recurrence $recurrence): void { $originalType = (int)$recurrence->transaction_type_id; @@ -106,4 +90,20 @@ class MigrateRecurrenceType extends Command } $this->line(sprintf('Updated recurrence #%d to new transaction type model.', $recurrence->id)); } + + /** + * + */ + private function getInvalidType(): TransactionType + { + return TransactionType::whereType(TransactionType::INVALID)->firstOrCreate(['type' => TransactionType::INVALID]); + } + + /** + * + */ + private function markAsExecuted(): void + { + app('fireflyconfig')->set(self::CONFIG_NAME, true); + } } diff --git a/app/Console/Commands/UpgradeFireflyInstructions.php b/app/Console/Commands/UpgradeFireflyInstructions.php index e2fb1027a4..f905385b12 100644 --- a/app/Console/Commands/UpgradeFireflyInstructions.php +++ b/app/Console/Commands/UpgradeFireflyInstructions.php @@ -80,6 +80,53 @@ class UpgradeFireflyInstructions extends Command return 0; } + /** + * Render upgrade instructions. + */ + private function updateInstructions(): void + { + /** @var string $version */ + $version = config('firefly.version'); + $config = config('upgrade.text.upgrade'); + $text = ''; + foreach (array_keys($config) as $compare) { + // if string starts with: + if (0 === strpos($version, $compare)) { + $text = $config[$compare]; + } + } + + $this->showLine(); + $this->boxed(''); + if (null === $text) { + $this->boxed(sprintf('Thank you for updating to Firefly III, v%s', $version)); + $this->boxedInfo('There are no extra upgrade instructions.'); + $this->boxed('Firefly III should be ready for use.'); + $this->boxed(''); + $this->showLine(); + + return; + } + + $this->boxed(sprintf('Thank you for updating to Firefly III, v%s!', $version)); + $this->boxedInfo($text); + $this->boxed(''); + $this->showLine(); + } + + /** + * Show a line. + */ + private function showLine(): void + { + $line = '+'; + for ($i = 0; $i < 78; ++$i) { + $line .= '-'; + } + $line .= '+'; + $this->line($line); + } + /** * Show a nice box. * @@ -113,8 +160,8 @@ class UpgradeFireflyInstructions extends Command { /** @var string $version */ $version = config('firefly.version'); - $config = config('upgrade.text.install'); - $text = ''; + $config = config('upgrade.text.install'); + $text = ''; foreach (array_keys($config) as $compare) { // if string starts with: if (0 === strpos($version, $compare)) { @@ -140,51 +187,4 @@ class UpgradeFireflyInstructions extends Command $this->boxed(''); $this->showLine(); } - - /** - * Show a line. - */ - private function showLine(): void - { - $line = '+'; - for ($i = 0; $i < 78; ++$i) { - $line .= '-'; - } - $line .= '+'; - $this->line($line); - } - - /** - * Render upgrade instructions. - */ - private function updateInstructions(): void - { - /** @var string $version */ - $version = config('firefly.version'); - $config = config('upgrade.text.upgrade'); - $text = ''; - foreach (array_keys($config) as $compare) { - // if string starts with: - if (0 === strpos($version, $compare)) { - $text = $config[$compare]; - } - } - - $this->showLine(); - $this->boxed(''); - if (null === $text) { - $this->boxed(sprintf('Thank you for updating to Firefly III, v%s', $version)); - $this->boxedInfo('There are no extra upgrade instructions.'); - $this->boxed('Firefly III should be ready for use.'); - $this->boxed(''); - $this->showLine(); - - return; - } - - $this->boxed(sprintf('Thank you for updating to Firefly III, v%s!', $version)); - $this->boxedInfo($text); - $this->boxed(''); - $this->showLine(); - } } diff --git a/app/Console/Commands/VerifiesAccessToken.php b/app/Console/Commands/VerifiesAccessToken.php index 89fa96fc76..7f243ca710 100644 --- a/app/Console/Commands/VerifiesAccessToken.php +++ b/app/Console/Commands/VerifiesAccessToken.php @@ -38,12 +38,12 @@ use Log; trait VerifiesAccessToken { /** - * @throws FireflyException * @return User + * @throws FireflyException */ public function getUser(): User { - $userId = (int) $this->option('user'); + $userId = (int)$this->option('user'); /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); $user = $repository->findNull($userId); @@ -70,8 +70,8 @@ trait VerifiesAccessToken */ protected function verifyAccessToken(): bool { - $userId = (int) $this->option('user'); - $token = (string) $this->option('token'); + $userId = (int)$this->option('user'); + $token = (string)$this->option('token'); /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); $user = $repository->findNull($userId); diff --git a/app/Events/DestroyedTransactionGroup.php b/app/Events/DestroyedTransactionGroup.php index 68d3f6a941..483dbc1abc 100644 --- a/app/Events/DestroyedTransactionGroup.php +++ b/app/Events/DestroyedTransactionGroup.php @@ -35,6 +35,7 @@ use Illuminate\Queue\SerializesModels; class DestroyedTransactionGroup extends Event { use SerializesModels; + public TransactionGroup $transactionGroup; diff --git a/app/Events/StoredTransactionGroup.php b/app/Events/StoredTransactionGroup.php index 95fe3c92da..56b80fd217 100644 --- a/app/Events/StoredTransactionGroup.php +++ b/app/Events/StoredTransactionGroup.php @@ -36,7 +36,7 @@ class StoredTransactionGroup extends Event { use SerializesModels; - public bool $applyRules; + public bool $applyRules; public TransactionGroup $transactionGroup; diff --git a/app/Events/StoredTransactionLink.php b/app/Events/StoredTransactionLink.php index f97f22799b..401a506b0b 100644 --- a/app/Events/StoredTransactionLink.php +++ b/app/Events/StoredTransactionLink.php @@ -20,6 +20,7 @@ */ declare(strict_types=1); + namespace FireflyIII\Events; diff --git a/app/Events/UpdatedTransactionLink.php b/app/Events/UpdatedTransactionLink.php index 386ea2041c..6e18ee2463 100644 --- a/app/Events/UpdatedTransactionLink.php +++ b/app/Events/UpdatedTransactionLink.php @@ -20,6 +20,7 @@ */ declare(strict_types=1); + namespace FireflyIII\Events; diff --git a/app/Exceptions/GracefulNotFoundHandler.php b/app/Exceptions/GracefulNotFoundHandler.php index 91df0dfd59..9af5faa991 100644 --- a/app/Exceptions/GracefulNotFoundHandler.php +++ b/app/Exceptions/GracefulNotFoundHandler.php @@ -128,8 +128,10 @@ class GracefulNotFoundHandler extends ExceptionHandler case 'transactions.bulk.edit': if ('POST' === $request->method()) { $request->session()->reflash(); + return redirect(route('index')); } + return parent::render($request, $exception); } @@ -148,7 +150,7 @@ class GracefulNotFoundHandler extends ExceptionHandler /** @var User $user */ $user = auth()->user(); $route = $request->route(); - $accountId = (int) $route->parameter('account'); + $accountId = (int)$route->parameter('account'); /** @var Account $account */ $account = $user->accounts()->with(['accountType'])->withTrashed()->find($accountId); if (null === $account) { @@ -163,6 +165,46 @@ class GracefulNotFoundHandler extends ExceptionHandler return redirect(route('accounts.index', [$shortType])); } + /** + * @param Throwable $request + * @param Exception $exception + * + * @return RedirectResponse|\Illuminate\Http\Response|Redirector|Response + * @throws Exception + */ + private function handleGroup(Request $request, Throwable $exception) + { + Log::debug('404 page is probably a deleted group. Redirect to overview of group types.'); + /** @var User $user */ + $user = auth()->user(); + $route = $request->route(); + $groupId = (int)$route->parameter('transactionGroup'); + + /** @var TransactionGroup $group */ + $group = $user->transactionGroups()->withTrashed()->find($groupId); + if (null === $group) { + Log::error(sprintf('Could not find group %d, so give big fat error.', $groupId)); + + return parent::render($request, $exception); + } + /** @var TransactionJournal $journal */ + $journal = $group->transactionJournals()->withTrashed()->first(); + if (null === $journal) { + Log::error(sprintf('Could not find journal for group %d, so give big fat error.', $groupId)); + + return parent::render($request, $exception); + } + $type = $journal->transactionType->type; + $request->session()->reflash(); + + if (TransactionType::RECONCILIATION === $type) { + return redirect(route('accounts.index', ['asset'])); + } + + return redirect(route('transactions.index', [strtolower($type)])); + + } + /** * @param Request $request * @param Throwable $exception @@ -176,7 +218,7 @@ class GracefulNotFoundHandler extends ExceptionHandler /** @var User $user */ $user = auth()->user(); $route = $request->route(); - $attachmentId = (int) $route->parameter('attachment'); + $attachmentId = (int)$route->parameter('attachment'); /** @var Attachment $attachment */ $attachment = $user->attachments()->withTrashed()->find($attachmentId); if (null === $attachment) { @@ -208,44 +250,4 @@ class GracefulNotFoundHandler extends ExceptionHandler return parent::render($request, $exception); } - /** - * @param Throwable $request - * @param Exception $exception - * - * @return RedirectResponse|\Illuminate\Http\Response|Redirector|Response - * @throws Exception - */ - private function handleGroup(Request $request, Throwable $exception) - { - Log::debug('404 page is probably a deleted group. Redirect to overview of group types.'); - /** @var User $user */ - $user = auth()->user(); - $route = $request->route(); - $groupId = (int) $route->parameter('transactionGroup'); - - /** @var TransactionGroup $group */ - $group = $user->transactionGroups()->withTrashed()->find($groupId); - if (null === $group) { - Log::error(sprintf('Could not find group %d, so give big fat error.', $groupId)); - - return parent::render($request, $exception); - } - /** @var TransactionJournal $journal */ - $journal = $group->transactionJournals()->withTrashed()->first(); - if (null === $journal) { - Log::error(sprintf('Could not find journal for group %d, so give big fat error.', $groupId)); - - return parent::render($request, $exception); - } - $type = $journal->transactionType->type; - $request->session()->reflash(); - - if (TransactionType::RECONCILIATION === $type) { - return redirect(route('accounts.index', ['asset'])); - } - - return redirect(route('transactions.index', [strtolower($type)])); - - } - } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index d780e47191..2e94350ecc 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -36,6 +36,7 @@ use Illuminate\Validation\ValidationException as LaravelValidationException; use League\OAuth2\Server\Exception\OAuthServerException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Throwable; + /** * Class Handler * @@ -87,7 +88,9 @@ class Handler extends ExceptionHandler ); } - return response()->json(['message' => sprintf('Internal Firefly III Exception: %s', $exception->getMessage()), 'exception' => get_class($exception)], 500); + return response()->json( + ['message' => sprintf('Internal Firefly III Exception: %s', $exception->getMessage()), 'exception' => get_class($exception)], 500 + ); } if ($exception instanceof NotFoundHttpException) { @@ -115,9 +118,9 @@ class Handler extends ExceptionHandler * * @param Exception $exception * + * @return void * @throws Exception * - * @return void */ public function report(Throwable $exception) { @@ -150,7 +153,7 @@ class Handler extends ExceptionHandler // create job that will mail. $ipAddress = request()->ip() ?? '0.0.0.0'; - $job = new MailError($userData, (string) config('firefly.site_owner'), $ipAddress, $data); + $job = new MailError($userData, (string)config('firefly.site_owner'), $ipAddress, $data); dispatch($job); } diff --git a/app/Factory/AccountFactory.php b/app/Factory/AccountFactory.php index 833cfe9658..74c349d22d 100644 --- a/app/Factory/AccountFactory.php +++ b/app/Factory/AccountFactory.php @@ -65,6 +65,31 @@ class AccountFactory } + /** + * @param string $accountName + * @param string $accountType + * + * @return Account + * @throws FireflyException + */ + public function findOrCreate(string $accountName, string $accountType): Account + { + Log::debug(sprintf('Searching for "%s" of type "%s"', $accountName, $accountType)); + /** @var AccountType $type */ + $type = AccountType::whereType($accountType)->first(); + $return = $this->user->accounts->where('account_type_id', $type->id)->where('name', $accountName)->first(); + + if (null === $return) { + Log::debug('Found nothing. Will create a new one.'); + $return = $this->create( + ['user_id' => $this->user->id, 'name' => $accountName, 'account_type_id' => $type->id, 'account_type' => null, 'virtual_balance' => '0', + 'iban' => null, 'active' => true,] + ); + } + + return $return; + } + /** * @param array $data * @@ -150,52 +175,6 @@ class AccountFactory return $return; } - /** - * @param string $accountName - * @param string $accountType - * - * @return Account|null - */ - public function find(string $accountName, string $accountType): ?Account - { - $type = AccountType::whereType($accountType)->first(); - - return $this->user->accounts()->where('account_type_id', $type->id)->where('name', $accountName)->first(); - } - - /** - * @param string $accountName - * @param string $accountType - * - * @return Account - * @throws FireflyException - */ - public function findOrCreate(string $accountName, string $accountType): Account - { - Log::debug(sprintf('Searching for "%s" of type "%s"', $accountName, $accountType)); - /** @var AccountType $type */ - $type = AccountType::whereType($accountType)->first(); - $return = $this->user->accounts->where('account_type_id', $type->id)->where('name', $accountName)->first(); - - if (null === $return) { - Log::debug('Found nothing. Will create a new one.'); - $return = $this->create( - ['user_id' => $this->user->id, 'name' => $accountName, 'account_type_id' => $type->id, 'account_type' => null, 'virtual_balance' => '0', - 'iban' => null, 'active' => true,] - ); - } - - return $return; - } - - /** - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - } - /** * @param int|null $accountTypeId * @param null|string $accountType @@ -234,5 +213,26 @@ class AccountFactory } + /** + * @param string $accountName + * @param string $accountType + * + * @return Account|null + */ + public function find(string $accountName, string $accountType): ?Account + { + $type = AccountType::whereType($accountType)->first(); + + return $this->user->accounts()->where('account_type_id', $type->id)->where('name', $accountName)->first(); + } + + /** + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + } + } diff --git a/app/Factory/AccountMetaFactory.php b/app/Factory/AccountMetaFactory.php index ff139598c7..ae74aeefb7 100644 --- a/app/Factory/AccountMetaFactory.php +++ b/app/Factory/AccountMetaFactory.php @@ -34,16 +34,6 @@ use Log; */ class AccountMetaFactory { - /** - * @param array $data - * - * @return AccountMeta|null - */ - public function create(array $data): ?AccountMeta - { - return AccountMeta::create($data); - } - /** * Create update or delete meta data. * @@ -87,4 +77,14 @@ class AccountMetaFactory return $entry; } + /** + * @param array $data + * + * @return AccountMeta|null + */ + public function create(array $data): ?AccountMeta + { + return AccountMeta::create($data); + } + } diff --git a/app/Factory/AttachmentFactory.php b/app/Factory/AttachmentFactory.php index 98d87967de..53a08866a3 100644 --- a/app/Factory/AttachmentFactory.php +++ b/app/Factory/AttachmentFactory.php @@ -40,23 +40,24 @@ class AttachmentFactory /** * @param array $data * - * @throws FireflyException * @return Attachment|null + * @throws FireflyException */ public function create(array $data): ?Attachment { // append if necessary. - $model = false === strpos($data['attachable_type'], 'FireflyIII') ? sprintf('FireflyIII\\Models\\%s', $data['attachable_type']) : $data['attachable_type']; + $model = false === strpos($data['attachable_type'], 'FireflyIII') ? sprintf('FireflyIII\\Models\\%s', $data['attachable_type']) + : $data['attachable_type']; // get journal instead of transaction. if (Transaction::class === $model) { /** @var Transaction $transaction */ - $transaction = $this->user->transactions()->find((int) $data['attachable_id']); + $transaction = $this->user->transactions()->find((int)$data['attachable_id']); if (null === $transaction) { throw new FireflyException('Unexpectedly could not find transaction'); // @codeCoverageIgnore } $data['attachable_id'] = $transaction->transaction_journal_id; - $model = TransactionJournal::class; + $model = TransactionJournal::class; } // create attachment: @@ -74,7 +75,7 @@ class AttachmentFactory 'uploaded' => 0, ] ); - $notes = (string) ($data['notes'] ?? ''); + $notes = (string)($data['notes'] ?? ''); if ('' !== $notes) { $note = new Note; $note->noteable()->associate($attachment); diff --git a/app/Factory/BudgetFactory.php b/app/Factory/BudgetFactory.php index 69a25e6b92..f3ea839f9e 100644 --- a/app/Factory/BudgetFactory.php +++ b/app/Factory/BudgetFactory.php @@ -41,8 +41,8 @@ class BudgetFactory */ public function find(?int $budgetId, ?string $budgetName): ?Budget { - $budgetId = (int) $budgetId; - $budgetName = (string) $budgetName; + $budgetId = (int)$budgetId; + $budgetName = (string)$budgetName; if (0 === $budgetId && '' === $budgetName) { return null; diff --git a/app/Factory/CategoryFactory.php b/app/Factory/CategoryFactory.php index 1be0a4c0c6..9a84dda2a6 100644 --- a/app/Factory/CategoryFactory.php +++ b/app/Factory/CategoryFactory.php @@ -37,16 +37,6 @@ class CategoryFactory { private User $user; - /** - * @param string $name - * - * @return Category|null - */ - public function findByName(string $name): ?Category - { - return $this->user->categories()->where('name', $name)->first(); - } - /** * @param int|null $categoryId * @param null|string $categoryName @@ -94,6 +84,16 @@ class CategoryFactory return null; } + /** + * @param string $name + * + * @return Category|null + */ + public function findByName(string $name): ?Category + { + return $this->user->categories()->where('name', $name)->first(); + } + /** * @param User $user */ diff --git a/app/Factory/PiggyBankFactory.php b/app/Factory/PiggyBankFactory.php index e512e9f1e8..4d337dcf1e 100644 --- a/app/Factory/PiggyBankFactory.php +++ b/app/Factory/PiggyBankFactory.php @@ -42,8 +42,8 @@ class PiggyBankFactory */ public function find(?int $piggyBankId, ?string $piggyBankName): ?PiggyBank { - $piggyBankId = (int) $piggyBankId; - $piggyBankName = (string) $piggyBankName; + $piggyBankId = (int)$piggyBankId; + $piggyBankName = (string)$piggyBankName; if ('' === $piggyBankName && 0 === $piggyBankId) { return null; } diff --git a/app/Factory/RecurrenceFactory.php b/app/Factory/RecurrenceFactory.php index 4ce667d307..7a9298e88a 100644 --- a/app/Factory/RecurrenceFactory.php +++ b/app/Factory/RecurrenceFactory.php @@ -73,13 +73,14 @@ class RecurrenceFactory throw new FireflyException($message); } - $firstDate = null; - $repeatUntil = null; - $repetitions = 0; - $title = null; - $description = ''; - $applyRules = true; - $active = true; + $firstDate = null; + $repeatUntil = null; + $repetitions = 0; + $title = null; + $description = ''; + $applyRules = true; + $active = true; + $repeatUntilString = null; if (array_key_exists('first_date', $data['recurrence'])) { /** @var Carbon $firstDate */ $firstDate = $data['recurrence']['first_date']; @@ -102,8 +103,8 @@ class RecurrenceFactory if (array_key_exists('active', $data['recurrence'])) { $active = $data['recurrence']['active']; } - if ($repetitions > 0 && null === $repeatUntil) { - $repeatUntil = Carbon::create()->addyear(); + if (null !== $repeatUntil) { + $repeatUntilString = $repeatUntil->format('Y-m-d'); } $recurrence = new Recurrence( @@ -113,7 +114,7 @@ class RecurrenceFactory 'title' => $title, 'description' => $description, 'first_date' => $firstDate ? $firstDate->format('Y-m-d') : null, - 'repeat_until' => $repetitions > 0 ? null : $repeatUntil->format('Y-m-d'), + 'repeat_until' => $repetitions > 0 ? null : $repeatUntilString, 'latest_date' => null, 'repetitions' => $repetitions, 'apply_rules' => $applyRules, diff --git a/app/Factory/TagFactory.php b/app/Factory/TagFactory.php index 8db6c25fb9..406fb4e1ad 100644 --- a/app/Factory/TagFactory.php +++ b/app/Factory/TagFactory.php @@ -36,6 +36,43 @@ class TagFactory { private User $user; + /** + * @param string $tag + * + * @return Tag|null + */ + public function findOrCreate(string $tag): ?Tag + { + $tag = trim($tag); + Log::debug(sprintf('Now in TagFactory::findOrCreate("%s")', $tag)); + + /** @var Tag $dbTag */ + $dbTag = $this->user->tags()->where('tag', $tag)->first(); + if (null !== $dbTag) { + Log::debug(sprintf('Tag exists (#%d), return it.', $dbTag->id)); + + return $dbTag; + } + $newTag = $this->create( + [ + 'tag' => $tag, + 'date' => null, + 'description' => null, + 'latitude' => null, + 'longitude' => null, + 'zoom_level' => null, + ] + ); + if (null === $newTag) { + Log::error(sprintf('TagFactory::findOrCreate("%s") but tag is unexpectedly NULL!', $tag)); + + return null; + } + Log::debug(sprintf('Created new tag #%d ("%s")', $newTag->id, $newTag->tag)); + + return $newTag; + } + /** * @param array $data * @@ -43,9 +80,9 @@ class TagFactory */ public function create(array $data): ?Tag { - $zoomLevel = 0 === (int) $data['zoom_level'] ? null : (int) $data['zoom_level']; - $latitude = 0.0 === (float) $data['latitude'] ? null : (float) $data['latitude']; - $longitude = 0.0 === (float) $data['longitude'] ? null : (float) $data['longitude']; + $zoomLevel = 0 === (int)$data['zoom_level'] ? null : (int)$data['zoom_level']; + $latitude = 0.0 === (float)$data['latitude'] ? null : (float)$data['latitude']; + $longitude = 0.0 === (float)$data['longitude'] ? null : (float)$data['longitude']; $array = [ 'user_id' => $this->user->id, 'tag' => trim($data['tag']), @@ -70,41 +107,6 @@ class TagFactory return $tag; } - /** - * @param string $tag - * - * @return Tag|null - */ - public function findOrCreate(string $tag): ?Tag - { - $tag = trim($tag); - Log::debug(sprintf('Now in TagFactory::findOrCreate("%s")', $tag)); - - /** @var Tag $dbTag */ - $dbTag = $this->user->tags()->where('tag', $tag)->first(); - if (null !== $dbTag) { - Log::debug(sprintf('Tag exists (#%d), return it.', $dbTag->id)); - return $dbTag; - } - $newTag = $this->create( - [ - 'tag' => $tag, - 'date' => null, - 'description' => null, - 'latitude' => null, - 'longitude' => null, - 'zoom_level' => null, - ] - ); - if (null === $newTag) { - Log::error(sprintf('TagFactory::findOrCreate("%s") but tag is unexpectedly NULL!', $tag)); - return null; - } - Log::debug(sprintf('Created new tag #%d ("%s")', $newTag->id, $newTag->tag)); - - return $newTag; - } - /** * @param User $user */ diff --git a/app/Factory/TransactionCurrencyFactory.php b/app/Factory/TransactionCurrencyFactory.php index 1c739c8506..4e355b3c09 100644 --- a/app/Factory/TransactionCurrencyFactory.php +++ b/app/Factory/TransactionCurrencyFactory.php @@ -40,8 +40,8 @@ class TransactionCurrencyFactory /** * @param array $data * - * @throws FireflyException * @return TransactionCurrency + * @throws FireflyException */ public function create(array $data): TransactionCurrency { @@ -73,8 +73,8 @@ class TransactionCurrencyFactory */ public function find(?int $currencyId, ?string $currencyCode): ?TransactionCurrency { - $currencyCode = (string) $currencyCode; - $currencyId = (int) $currencyId; + $currencyCode = (string)$currencyCode; + $currencyId = (int)$currencyId; if ('' === $currencyCode && 0 === $currencyId) { Log::debug('Cannot find anything on empty currency code and empty currency ID!'); diff --git a/app/Factory/TransactionFactory.php b/app/Factory/TransactionFactory.php index 49a1b59ffd..66739d3209 100644 --- a/app/Factory/TransactionFactory.php +++ b/app/Factory/TransactionFactory.php @@ -38,12 +38,12 @@ use Log; */ class TransactionFactory { - private Account $account; - private TransactionCurrency $currency; + private Account $account; + private TransactionCurrency $currency; private ?TransactionCurrency $foreignCurrency; - private TransactionJournal $journal; - private bool $reconciled; - private User $user; + private TransactionJournal $journal; + private bool $reconciled; + private User $user; /** @@ -62,8 +62,8 @@ class TransactionFactory * @param string $amount * @param string|null $foreignAmount * - * @throws FireflyException * @return Transaction + * @throws FireflyException */ public function createNegative(string $amount, ?string $foreignAmount): Transaction { @@ -77,14 +77,74 @@ class TransactionFactory return $this->create(app('steam')->negative($amount), $foreignAmount); } + /** + * @param string $amount + * @param string|null $foreignAmount + * + * @return Transaction + * @throws FireflyException + */ + private function create(string $amount, ?string $foreignAmount): Transaction + { + $result = null; + if ('' === $foreignAmount) { + $foreignAmount = null; + } + $data = [ + 'reconciled' => $this->reconciled, + 'account_id' => $this->account->id, + 'transaction_journal_id' => $this->journal->id, + 'description' => null, + 'transaction_currency_id' => $this->currency->id, + 'amount' => $amount, + 'foreign_amount' => null, + 'foreign_currency_id' => null, + 'identifier' => 0, + ]; + try { + $result = Transaction::create($data); + // @codeCoverageIgnoreStart + } catch (QueryException $e) { + Log::error(sprintf('Could not create transaction: %s', $e->getMessage()), $data); + Log::error($e->getMessage()); + Log::error($e->getTraceAsString()); + throw new FireflyException('Query exception when creating transaction.'); + } + if (null === $result) { + throw new FireflyException('Transaction is NULL.'); + } + // @codeCoverageIgnoreEnd + if (null !== $result) { + Log::debug( + sprintf( + 'Created transaction #%d (%s %s, account %s), part of journal #%d', + $result->id, + $this->currency->code, + $amount, + $this->account->name, + $this->journal->id + ) + ); + + // do foreign currency thing: add foreign currency info to $one and $two if necessary. + if (null !== $this->foreignCurrency && null !== $foreignAmount && $this->foreignCurrency->id !== $this->currency->id && '' !== $foreignAmount) { + $result->foreign_currency_id = $this->foreignCurrency->id; + $result->foreign_amount = $foreignAmount; + } + $result->save(); + } + + return $result; + } + /** * Create transaction with positive amount (for destination accounts). * * @param string $amount * @param string|null $foreignAmount * - * @throws FireflyException * @return Transaction + * @throws FireflyException */ public function createPositive(string $amount, ?string $foreignAmount): Transaction { @@ -157,64 +217,4 @@ class TransactionFactory { $this->user = $user; } - - /** - * @param string $amount - * @param string|null $foreignAmount - * - * @throws FireflyException - * @return Transaction - */ - private function create(string $amount, ?string $foreignAmount): Transaction - { - $result = null; - if ('' === $foreignAmount) { - $foreignAmount = null; - } - $data = [ - 'reconciled' => $this->reconciled, - 'account_id' => $this->account->id, - 'transaction_journal_id' => $this->journal->id, - 'description' => null, - 'transaction_currency_id' => $this->currency->id, - 'amount' => $amount, - 'foreign_amount' => null, - 'foreign_currency_id' => null, - 'identifier' => 0, - ]; - try { - $result = Transaction::create($data); - // @codeCoverageIgnoreStart - } catch (QueryException $e) { - Log::error(sprintf('Could not create transaction: %s', $e->getMessage()), $data); - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - throw new FireflyException('Query exception when creating transaction.'); - } - if (null === $result) { - throw new FireflyException('Transaction is NULL.'); - } - // @codeCoverageIgnoreEnd - if (null !== $result) { - Log::debug( - sprintf( - 'Created transaction #%d (%s %s, account %s), part of journal #%d', - $result->id, - $this->currency->code, - $amount, - $this->account->name, - $this->journal->id - ) - ); - - // do foreign currency thing: add foreign currency info to $one and $two if necessary. - if (null !== $this->foreignCurrency && null !== $foreignAmount && $this->foreignCurrency->id !== $this->currency->id && '' !== $foreignAmount) { - $result->foreign_currency_id = $this->foreignCurrency->id; - $result->foreign_amount = $foreignAmount; - } - $result->save(); - } - - return $result; - } } diff --git a/app/Factory/TransactionGroupFactory.php b/app/Factory/TransactionGroupFactory.php index 146c7ac139..e7f6d99e1a 100644 --- a/app/Factory/TransactionGroupFactory.php +++ b/app/Factory/TransactionGroupFactory.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Factory; use FireflyIII\Exceptions\DuplicateTransactionException; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\TransactionGroup; use FireflyIII\User; use Log; @@ -54,8 +55,8 @@ class TransactionGroupFactory * * @param array $data * - * @throws DuplicateTransactionException * @return TransactionGroup + * @throws DuplicateTransactionException */ public function create(array $data): TransactionGroup { @@ -74,6 +75,9 @@ class TransactionGroupFactory if (null !== $title) { $title = substr($title, 0, 1000); } + if(0 === $collection->count()) { + throw new FireflyException('Created zero transaction journals.'); + } $group = new TransactionGroup; $group->user()->associate($this->user); diff --git a/app/Factory/TransactionJournalFactory.php b/app/Factory/TransactionJournalFactory.php index 1dc51b5db6..3350b2720e 100644 --- a/app/Factory/TransactionJournalFactory.php +++ b/app/Factory/TransactionJournalFactory.php @@ -140,74 +140,6 @@ class TransactionJournalFactory return $collection; } - /** - * @param bool $errorOnHash - */ - public function setErrorOnHash(bool $errorOnHash): void - { - $this->errorOnHash = $errorOnHash; - if (true === $errorOnHash) { - Log::info('Will trigger duplication alert for this journal.'); - } - } - - /** - * Set the user. - * - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - $this->currencyRepository->setUser($this->user); - $this->tagFactory->setUser($user); - $this->billRepository->setUser($this->user); - $this->budgetRepository->setUser($this->user); - $this->categoryRepository->setUser($this->user); - $this->piggyRepository->setUser($this->user); - $this->accountRepository->setUser($this->user); - } - - /** - * @param TransactionJournal $journal - * @param NullArrayObject $data - * @param string $field - */ - protected function storeMeta(TransactionJournal $journal, NullArrayObject $data, string $field): void - { - $set = [ - 'journal' => $journal, - 'name' => $field, - 'data' => (string)($data[$field] ?? ''), - ]; - - Log::debug(sprintf('Going to store meta-field "%s", with value "%s".', $set['name'], $set['data'])); - - /** @var TransactionJournalMetaFactory $factory */ - $factory = app(TransactionJournalMetaFactory::class); - $factory->updateOrCreate($set); - } - - /** - * Set foreign currency to NULL if it's the same as the normal currency: - * - * @param TransactionCurrency $currency - * @param TransactionCurrency|null $foreignCurrency - * - * @return TransactionCurrency|null - */ - private function compareCurrencies(?TransactionCurrency $currency, ?TransactionCurrency $foreignCurrency): ?TransactionCurrency - { - if (null === $currency) { - return null; - } - if (null !== $foreignCurrency && $foreignCurrency->id === $currency->id) { - return null; - } - - return $foreignCurrency; - } - /** * @param NullArrayObject $row * @@ -360,6 +292,29 @@ class TransactionJournalFactory return $journal; } + /** + * @param NullArrayObject $row + * + * @return string + */ + private function hashArray(NullArrayObject $row): string + { + $dataRow = $row->getArrayCopy(); + + unset($dataRow['import_hash_v2'], $dataRow['original_source']); + $json = json_encode($dataRow, JSON_THROW_ON_ERROR, 512); + if (false === $json) { + // @codeCoverageIgnoreStart + $json = json_encode((string)microtime(), JSON_THROW_ON_ERROR, 512); + Log::error(sprintf('Could not hash the original row! %s', json_last_error_msg()), $dataRow); + // @codeCoverageIgnoreEnd + } + $hash = hash('sha256', $json); + Log::debug(sprintf('The hash is: %s', $hash), $dataRow); + + return $hash; + } + /** * If this transaction already exists, throw an error. * @@ -387,6 +342,127 @@ class TransactionJournalFactory } } + /** + * @param NullArrayObject $data + * + * @throws FireflyException + */ + private function validateAccounts(NullArrayObject $data): void + { + $transactionType = $data['type'] ?? 'invalid'; + $this->accountValidator->setUser($this->user); + $this->accountValidator->setTransactionType($transactionType); + + // validate source account. + $sourceId = $data['source_id'] ? (int)$data['source_id'] : null; + $sourceName = $data['source_name'] ? (string)$data['source_name'] : null; + $validSource = $this->accountValidator->validateSource($sourceId, $sourceName, null); + + // do something with result: + if (false === $validSource) { + throw new FireflyException(sprintf('Source: %s', $this->accountValidator->sourceError)); // @codeCoverageIgnore + } + Log::debug('Source seems valid.'); + // validate destination account + $destinationId = $data['destination_id'] ? (int)$data['destination_id'] : null; + $destinationName = $data['destination_name'] ? (string)$data['destination_name'] : null; + $validDestination = $this->accountValidator->validateDestination($destinationId, $destinationName, null); + // do something with result: + if (false === $validDestination) { + throw new FireflyException(sprintf('Destination: %s', $this->accountValidator->destError)); // @codeCoverageIgnore + } + } + + /** + * @param string $type + * @param TransactionCurrency|null $currency + * @param Account $source + * @param Account $destination + * + * @return TransactionCurrency + */ + private function getCurrencyByAccount(string $type, ?TransactionCurrency $currency, Account $source, Account $destination): TransactionCurrency + { + Log::debug('Now ingetCurrencyByAccount()'); + switch ($type) { + default: + case TransactionType::WITHDRAWAL: + case TransactionType::TRANSFER: + return $this->getCurrency($currency, $source); + case TransactionType::DEPOSIT: + return $this->getCurrency($currency, $destination); + + } + } + + /** + * @param TransactionCurrency|null $currency + * @param Account $account + * + * @return TransactionCurrency + */ + private function getCurrency(?TransactionCurrency $currency, Account $account): TransactionCurrency + { + Log::debug('Now in getCurrency()'); + $preference = $this->accountRepository->getAccountCurrency($account); + if (null === $preference && null === $currency) { + // return user's default: + return app('amount')->getDefaultCurrencyByUser($this->user); + } + $result = ($preference ?? $currency) ?? app('amount')->getSystemCurrency(); + Log::debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name)); + + return $result; + } + + /** + * Set foreign currency to NULL if it's the same as the normal currency: + * + * @param TransactionCurrency $currency + * @param TransactionCurrency|null $foreignCurrency + * + * @return TransactionCurrency|null + */ + private function compareCurrencies(?TransactionCurrency $currency, ?TransactionCurrency $foreignCurrency): ?TransactionCurrency + { + if (null === $currency) { + return null; + } + if (null !== $foreignCurrency && $foreignCurrency->id === $currency->id) { + return null; + } + + return $foreignCurrency; + } + + /** + * @param string $type + * @param TransactionCurrency|null $foreignCurrency + * @param Account $destination + * + * @return TransactionCurrency|null + */ + private function getForeignByAccount(string $type, ?TransactionCurrency $foreignCurrency, Account $destination): ?TransactionCurrency + { + if (TransactionType::TRANSFER === $type) { + return $this->getCurrency($foreignCurrency, $destination); + } + + return $foreignCurrency; + } + + /** + * @param string $description + * + * @return string + */ + private function getDescription(string $description): string + { + $description = '' === $description ? '(empty description)' : $description; + + return substr($description, 0, 255); + } + /** * Force the deletion of an entire set of transaction journals and their meta object in case of * an error creating a group. @@ -418,110 +494,6 @@ class TransactionJournalFactory } } - /** - * @param TransactionCurrency|null $currency - * @param Account $account - * - * @return TransactionCurrency - */ - private function getCurrency(?TransactionCurrency $currency, Account $account): TransactionCurrency - { - Log::debug('Now in getCurrency()'); - $preference = $this->accountRepository->getAccountCurrency($account); - if (null === $preference && null === $currency) { - // return user's default: - return app('amount')->getDefaultCurrencyByUser($this->user); - } - $result = ($preference ?? $currency) ?? app('amount')->getSystemCurrency(); - Log::debug(sprintf('Currency is now #%d (%s) because of account #%d (%s)', $result->id, $result->code, $account->id, $account->name)); - - return $result; - } - - /** - * @param string $type - * @param TransactionCurrency|null $currency - * @param Account $source - * @param Account $destination - * - * @return TransactionCurrency - */ - private function getCurrencyByAccount(string $type, ?TransactionCurrency $currency, Account $source, Account $destination): TransactionCurrency - { - Log::debug('Now ingetCurrencyByAccount()'); - switch ($type) { - default: - case TransactionType::WITHDRAWAL: - case TransactionType::TRANSFER: - return $this->getCurrency($currency, $source); - case TransactionType::DEPOSIT: - return $this->getCurrency($currency, $destination); - - } - } - - /** - * @param string $description - * - * @return string - */ - private function getDescription(string $description): string - { - $description = '' === $description ? '(empty description)' : $description; - - return substr($description, 0, 255); - } - - /** - * @param string $type - * @param TransactionCurrency|null $foreignCurrency - * @param Account $destination - * - * @return TransactionCurrency|null - */ - private function getForeignByAccount(string $type, ?TransactionCurrency $foreignCurrency, Account $destination): ?TransactionCurrency - { - if (TransactionType::TRANSFER === $type) { - return $this->getCurrency($foreignCurrency, $destination); - } - - return $foreignCurrency; - } - - /** - * @param NullArrayObject $row - * - * @return string - */ - private function hashArray(NullArrayObject $row): string - { - $dataRow = $row->getArrayCopy(); - - unset($dataRow['import_hash_v2'], $dataRow['original_source']); - $json = json_encode($dataRow, JSON_THROW_ON_ERROR, 512); - if (false === $json) { - // @codeCoverageIgnoreStart - $json = json_encode((string)microtime(), JSON_THROW_ON_ERROR, 512); - Log::error(sprintf('Could not hash the original row! %s', json_last_error_msg()), $dataRow); - // @codeCoverageIgnoreEnd - } - $hash = hash('sha256', $json); - Log::debug(sprintf('The hash is: %s', $hash), $dataRow); - - return $hash; - } - - /** - * @param TransactionJournal $journal - * @param NullArrayObject $transaction - */ - private function storeMetaFields(TransactionJournal $journal, NullArrayObject $transaction): void - { - foreach ($this->fields as $field) { - $this->storeMeta($journal, $transaction, $field); - } - } - /** * Link a piggy bank to this journal. * @@ -549,35 +521,63 @@ class TransactionJournalFactory } /** - * @param NullArrayObject $data - * - * @throws FireflyException + * @param TransactionJournal $journal + * @param NullArrayObject $transaction */ - private function validateAccounts(NullArrayObject $data): void + private function storeMetaFields(TransactionJournal $journal, NullArrayObject $transaction): void { - $transactionType = $data['type'] ?? 'invalid'; - $this->accountValidator->setUser($this->user); - $this->accountValidator->setTransactionType($transactionType); - - // validate source account. - $sourceId = $data['source_id'] ? (int)$data['source_id'] : null; - $sourceName = $data['source_name'] ? (string)$data['source_name'] : null; - $validSource = $this->accountValidator->validateSource($sourceId, $sourceName, null); - - // do something with result: - if (false === $validSource) { - throw new FireflyException(sprintf('Source: %s', $this->accountValidator->sourceError)); // @codeCoverageIgnore + foreach ($this->fields as $field) { + $this->storeMeta($journal, $transaction, $field); } - Log::debug('Source seems valid.'); - // validate destination account - $destinationId = $data['destination_id'] ? (int)$data['destination_id'] : null; - $destinationName = $data['destination_name'] ? (string)$data['destination_name'] : null; - $validDestination = $this->accountValidator->validateDestination($destinationId, $destinationName, null); - // do something with result: - if (false === $validDestination) { - throw new FireflyException(sprintf('Destination: %s', $this->accountValidator->destError)); // @codeCoverageIgnore + } + + /** + * @param TransactionJournal $journal + * @param NullArrayObject $data + * @param string $field + */ + protected function storeMeta(TransactionJournal $journal, NullArrayObject $data, string $field): void + { + $set = [ + 'journal' => $journal, + 'name' => $field, + 'data' => (string)($data[$field] ?? ''), + ]; + + Log::debug(sprintf('Going to store meta-field "%s", with value "%s".', $set['name'], $set['data'])); + + /** @var TransactionJournalMetaFactory $factory */ + $factory = app(TransactionJournalMetaFactory::class); + $factory->updateOrCreate($set); + } + + /** + * @param bool $errorOnHash + */ + public function setErrorOnHash(bool $errorOnHash): void + { + $this->errorOnHash = $errorOnHash; + if (true === $errorOnHash) { + Log::info('Will trigger duplication alert for this journal.'); } } + /** + * Set the user. + * + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + $this->currencyRepository->setUser($this->user); + $this->tagFactory->setUser($user); + $this->billRepository->setUser($this->user); + $this->budgetRepository->setUser($this->user); + $this->categoryRepository->setUser($this->user); + $this->piggyRepository->setUser($this->user); + $this->accountRepository->setUser($this->user); + } + } diff --git a/app/Factory/TransactionJournalMetaFactory.php b/app/Factory/TransactionJournalMetaFactory.php index 872e0ca601..d3adb5777b 100644 --- a/app/Factory/TransactionJournalMetaFactory.php +++ b/app/Factory/TransactionJournalMetaFactory.php @@ -60,7 +60,7 @@ class TransactionJournalMetaFactory Log::debug('Is a carbon object.'); $value = $data['data']->toW3cString(); } - if ('' === (string) $value) { + if ('' === (string)$value) { Log::debug('Is an empty string.'); // don't store blank strings. if (null !== $entry) { diff --git a/app/Factory/TransactionTypeFactory.php b/app/Factory/TransactionTypeFactory.php index 2ec9b54a29..437055f184 100644 --- a/app/Factory/TransactionTypeFactory.php +++ b/app/Factory/TransactionTypeFactory.php @@ -26,7 +26,6 @@ declare(strict_types=1); namespace FireflyIII\Factory; use FireflyIII\Models\TransactionType; -use Log; /** * Class TransactionTypeFactory diff --git a/app/Generator/Chart/Basic/ChartJsGenerator.php b/app/Generator/Chart/Basic/ChartJsGenerator.php index a9158ca78b..a2d9d2aea7 100644 --- a/app/Generator/Chart/Basic/ChartJsGenerator.php +++ b/app/Generator/Chart/Basic/ChartJsGenerator.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Generator\Chart\Basic; use FireflyIII\Support\ChartColour; -use Log; /** * Class ChartJsGenerator. @@ -51,7 +50,7 @@ class ChartJsGenerator implements GeneratorInterface $amounts = array_column($data, 'amount'); $next = next($amounts); $sortFlag = SORT_ASC; - if (!is_bool($next) && 1 === bccomp((string) $next, '0')) { + if (!is_bool($next) && 1 === bccomp((string)$next, '0')) { $sortFlag = SORT_DESC; } array_multisort($amounts, $sortFlag, $data); @@ -60,7 +59,7 @@ class ChartJsGenerator implements GeneratorInterface $index = 0; foreach ($data as $key => $valueArray) { // make larger than 0 - $chartData['datasets'][0]['data'][] = (float) app('steam')->positive((string) $valueArray['amount']); + $chartData['datasets'][0]['data'][] = (float)app('steam')->positive((string)$valueArray['amount']); $chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index); $chartData['datasets'][0]['currency_symbol'][] = $valueArray['currency_symbol']; $chartData['labels'][] = $key; @@ -166,7 +165,7 @@ class ChartJsGenerator implements GeneratorInterface // different sort when values are positive and when they're negative. asort($data); $next = next($data); - if (!is_bool($next) && 1 === bccomp((string) $next, '0')) { + if (!is_bool($next) && 1 === bccomp((string)$next, '0')) { // next is positive, sort other way around. arsort($data); } @@ -175,7 +174,7 @@ class ChartJsGenerator implements GeneratorInterface $index = 0; foreach ($data as $key => $value) { // make larger than 0 - $chartData['datasets'][0]['data'][] = (float) app('steam')->positive((string) $value); + $chartData['datasets'][0]['data'][] = (float)app('steam')->positive((string)$value); $chartData['datasets'][0]['backgroundColor'][] = ChartColour::getColour($index); $chartData['labels'][] = $key; diff --git a/app/Generator/Report/Audit/MonthReportGenerator.php b/app/Generator/Report/Audit/MonthReportGenerator.php index d67e8af911..754485d02f 100644 --- a/app/Generator/Report/Audit/MonthReportGenerator.php +++ b/app/Generator/Report/Audit/MonthReportGenerator.php @@ -42,15 +42,15 @@ use Throwable; class MonthReportGenerator implements ReportGeneratorInterface { private Collection $accounts; - private Carbon $end; - private Carbon $start; + private Carbon $end; + private Carbon $start; /** * Generates the report. * + * @return string * @throws FireflyException * @codeCoverageIgnore - * @return string */ public function generate(): string { @@ -91,78 +91,6 @@ class MonthReportGenerator implements ReportGeneratorInterface return $result; } - /** - * Get the audit report. - * - * @param Account $account - * @param Carbon $date - * - * @throws FireflyException - * @return array - * - */ - public function getAuditReport(Account $account, Carbon $date): array - { - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $accountRepository->setUser($account->user); - - /** @var JournalRepositoryInterface $journalRepository */ - $journalRepository = app(JournalRepositoryInterface::class); - $journalRepository->setUser($account->user); - - /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($this->start, $this->end)->withAccountInformation() - ->withBudgetInformation()->withCategoryInformation()->withBillInformation(); - $journals = $collector->getExtractedJournals(); - $journals = array_reverse($journals, true); - $dayBeforeBalance = app('steam')->balance($account, $date); - $startBalance = $dayBeforeBalance; - $defaultCurrency = app('amount')->getDefaultCurrencyByUser($account->user); - $currency = $accountRepository->getAccountCurrency($account) ?? $defaultCurrency; - - foreach ($journals as $index => $journal) { - $journals[$index]['balance_before'] = $startBalance; - $transactionAmount = $journal['amount']; - - // make sure amount is in the right "direction". - if ($account->id === $journal['destination_account_id']) { - $transactionAmount = app('steam')->positive($journal['amount']); - } - - if ($currency->id === $journal['foreign_currency_id']) { - $transactionAmount = $journal['foreign_amount']; - if ($account->id === $journal['destination_account_id']) { - $transactionAmount = app('steam')->positive($journal['foreign_amount']); - } - } - - $newBalance = bcadd($startBalance, $transactionAmount); - $journals[$index]['balance_after'] = $newBalance; - $startBalance = $newBalance; - - // add meta dates for each journal. - $journals[$index]['interest_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'interest_date'); - $journals[$index]['book_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'book_date'); - $journals[$index]['process_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'process_date'); - $journals[$index]['due_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'due_date'); - $journals[$index]['payment_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'payment_date'); - $journals[$index]['invoice_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'invoice_date'); - - } - $locale = app('steam')->getLocale(); - return [ - 'journals' => $journals, - 'currency' => $currency, - 'exists' => !empty($journals), - 'end' => $this->end->formatLocalized((string) trans('config.month_and_day', [], $locale)), - 'endBalance' => app('steam')->balance($account, $this->end), - 'dayBefore' => $date->formatLocalized((string) trans('config.month_and_day', [], $locale)), - 'dayBeforeBalance' => $dayBeforeBalance, - ]; - } - /** * Account collection setter. * @@ -260,4 +188,77 @@ class MonthReportGenerator implements ReportGeneratorInterface { return $this; } + + /** + * Get the audit report. + * + * @param Account $account + * @param Carbon $date + * + * @return array + * + * @throws FireflyException + */ + public function getAuditReport(Account $account, Carbon $date): array + { + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + $accountRepository->setUser($account->user); + + /** @var JournalRepositoryInterface $journalRepository */ + $journalRepository = app(JournalRepositoryInterface::class); + $journalRepository->setUser($account->user); + + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + $collector->setAccounts(new Collection([$account]))->setRange($this->start, $this->end)->withAccountInformation() + ->withBudgetInformation()->withCategoryInformation()->withBillInformation(); + $journals = $collector->getExtractedJournals(); + $journals = array_reverse($journals, true); + $dayBeforeBalance = app('steam')->balance($account, $date); + $startBalance = $dayBeforeBalance; + $defaultCurrency = app('amount')->getDefaultCurrencyByUser($account->user); + $currency = $accountRepository->getAccountCurrency($account) ?? $defaultCurrency; + + foreach ($journals as $index => $journal) { + $journals[$index]['balance_before'] = $startBalance; + $transactionAmount = $journal['amount']; + + // make sure amount is in the right "direction". + if ($account->id === $journal['destination_account_id']) { + $transactionAmount = app('steam')->positive($journal['amount']); + } + + if ($currency->id === $journal['foreign_currency_id']) { + $transactionAmount = $journal['foreign_amount']; + if ($account->id === $journal['destination_account_id']) { + $transactionAmount = app('steam')->positive($journal['foreign_amount']); + } + } + + $newBalance = bcadd($startBalance, $transactionAmount); + $journals[$index]['balance_after'] = $newBalance; + $startBalance = $newBalance; + + // add meta dates for each journal. + $journals[$index]['interest_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'interest_date'); + $journals[$index]['book_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'book_date'); + $journals[$index]['process_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'process_date'); + $journals[$index]['due_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'due_date'); + $journals[$index]['payment_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'payment_date'); + $journals[$index]['invoice_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'invoice_date'); + + } + $locale = app('steam')->getLocale(); + + return [ + 'journals' => $journals, + 'currency' => $currency, + 'exists' => !empty($journals), + 'end' => $this->end->formatLocalized((string)trans('config.month_and_day', [], $locale)), + 'endBalance' => app('steam')->balance($account, $this->end), + 'dayBefore' => $date->formatLocalized((string)trans('config.month_and_day', [], $locale)), + 'dayBeforeBalance' => $dayBeforeBalance, + ]; + } } diff --git a/app/Generator/Report/Category/MonthReportGenerator.php b/app/Generator/Report/Category/MonthReportGenerator.php index 1bc8be9b89..4836354b38 100644 --- a/app/Generator/Report/Category/MonthReportGenerator.php +++ b/app/Generator/Report/Category/MonthReportGenerator.php @@ -76,7 +76,7 @@ class MonthReportGenerator implements ReportGeneratorInterface // render! try { - return view('reports.category.month', compact('accountIds', 'categoryIds', 'reportType', )) + return view('reports.category.month', compact('accountIds', 'categoryIds', 'reportType',)) ->with('start', $this->start)->with('end', $this->end) ->with('categories', $this->categories) ->with('accounts', $this->accounts) diff --git a/app/Generator/Report/ReportGeneratorFactory.php b/app/Generator/Report/ReportGeneratorFactory.php index 011cf97fc1..ceeb641a0f 100644 --- a/app/Generator/Report/ReportGeneratorFactory.php +++ b/app/Generator/Report/ReportGeneratorFactory.php @@ -39,9 +39,9 @@ class ReportGeneratorFactory * @param Carbon $start * @param Carbon $end * - * @throws FireflyException * @return ReportGeneratorInterface * + * @throws FireflyException */ public static function reportGenerator(string $type, Carbon $start, Carbon $end): ReportGeneratorInterface { diff --git a/app/Generator/Report/Standard/MonthReportGenerator.php b/app/Generator/Report/Standard/MonthReportGenerator.php index 05b01c5a87..4071de53aa 100644 --- a/app/Generator/Report/Standard/MonthReportGenerator.php +++ b/app/Generator/Report/Standard/MonthReportGenerator.php @@ -53,7 +53,7 @@ class MonthReportGenerator implements ReportGeneratorInterface $reportType = 'default'; try { - return view('reports.default.month', compact('accountIds', 'reportType'))->with('start', $this->start)->with('end', $this->end)->render(); + return prefixView('reports.default.month', compact('accountIds', 'reportType'))->with('start', $this->start)->with('end', $this->end)->render(); } catch (Throwable $e) { Log::error(sprintf('Cannot render reports.default.month: %s', $e->getMessage())); $result = 'Could not render report view.'; diff --git a/app/Generator/Webhook/MessageGeneratorInterface.php b/app/Generator/Webhook/MessageGeneratorInterface.php index d86490563d..8d02908203 100644 --- a/app/Generator/Webhook/MessageGeneratorInterface.php +++ b/app/Generator/Webhook/MessageGeneratorInterface.php @@ -52,20 +52,15 @@ use Illuminate\Support\Collection; interface MessageGeneratorInterface { - /** - * @return int - */ - public function getVersion(): int; - /** * */ public function generateMessages(): void; /** - * @param User $user + * @return int */ - public function setUser(User $user): void; + public function getVersion(): int; /** * @param Collection $objects @@ -76,4 +71,9 @@ interface MessageGeneratorInterface * @param int $trigger */ public function setTrigger(int $trigger): void; + + /** + * @param User $user + */ + public function setUser(User $user): void; } diff --git a/app/Generator/Webhook/StandardMessageGenerator.php b/app/Generator/Webhook/StandardMessageGenerator.php index 90174354bc..751dd6260d 100644 --- a/app/Generator/Webhook/StandardMessageGenerator.php +++ b/app/Generator/Webhook/StandardMessageGenerator.php @@ -63,10 +63,10 @@ use Symfony\Component\HttpFoundation\ParameterBag; */ class StandardMessageGenerator implements MessageGeneratorInterface { - private int $version = 0; - private User $user; private Collection $objects; private int $trigger; + private User $user; + private int $version = 0; private Collection $webhooks; /** @@ -86,11 +86,11 @@ class StandardMessageGenerator implements MessageGeneratorInterface } /** - * @param User $user + * @inheritDoc */ - public function setUser(User $user): void + public function getVersion(): int { - $this->user = $user; + return $this->version; } /** @@ -109,6 +109,14 @@ class StandardMessageGenerator implements MessageGeneratorInterface $this->trigger = $trigger; } + /** + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + } + /** * @return Collection */ @@ -246,13 +254,4 @@ class StandardMessageGenerator implements MessageGeneratorInterface return $webhookMessage; } - - - /** - * @inheritDoc - */ - public function getVersion(): int - { - return $this->version; - } } diff --git a/app/Handlers/Events/APIEventHandler.php b/app/Handlers/Events/APIEventHandler.php index ad14ef4a31..b04c80ed5d 100644 --- a/app/Handlers/Events/APIEventHandler.php +++ b/app/Handlers/Events/APIEventHandler.php @@ -49,12 +49,12 @@ class APIEventHandler { /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); - $user = $repository->findNull((int) $event->userId); + $user = $repository->findNull((int)$event->userId); if (null !== $user) { - $email = $user->email; + $email = $user->email; // if user is demo user, send to owner: - if($user->hasRole('demo')) { + if ($user->hasRole('demo')) { $email = config('firefly.site_owner'); } diff --git a/app/Handlers/Events/AdminEventHandler.php b/app/Handlers/Events/AdminEventHandler.php index 7ce138cb3a..1b16371383 100644 --- a/app/Handlers/Events/AdminEventHandler.php +++ b/app/Handlers/Events/AdminEventHandler.php @@ -53,7 +53,7 @@ class AdminEventHandler $ipAddress = $event->ipAddress; // if user is demo user, send to owner: - if($event->user->hasRole('demo')) { + if ($event->user->hasRole('demo')) { $email = config('firefly.site_owner'); } diff --git a/app/Handlers/Events/AutomationHandler.php b/app/Handlers/Events/AutomationHandler.php index 9c513a8794..e65abbb55d 100644 --- a/app/Handlers/Events/AutomationHandler.php +++ b/app/Handlers/Events/AutomationHandler.php @@ -57,7 +57,7 @@ class AutomationHandler $user = $repository->findNull($event->userId); if (null !== $user && 0 !== $event->groups->count()) { - $email = $user->email; + $email = $user->email; // see if user has alternative email address: $pref = app('preferences')->getForUser($user, 'remote_guard_alt_email', null); @@ -66,7 +66,7 @@ class AutomationHandler } // if user is demo user, send to owner: - if($user->hasRole('demo')) { + if ($user->hasRole('demo')) { $email = config('firefly.site_owner'); } diff --git a/app/Handlers/Events/StoredGroupEventHandler.php b/app/Handlers/Events/StoredGroupEventHandler.php index 751a0422bb..3824d6f499 100644 --- a/app/Handlers/Events/StoredGroupEventHandler.php +++ b/app/Handlers/Events/StoredGroupEventHandler.php @@ -27,7 +27,6 @@ use FireflyIII\Events\StoredTransactionGroup; use FireflyIII\Generator\Webhook\MessageGeneratorInterface; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\Webhook; -use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\TransactionRules\Engine\RuleEngineInterface; use Illuminate\Support\Collection; @@ -85,8 +84,8 @@ class StoredGroupEventHandler public function triggerWebhooks(StoredTransactionGroup $storedGroupEvent): void { Log::debug(__METHOD__); - $group = $storedGroupEvent->transactionGroup; - $user = $group->user; + $group = $storedGroupEvent->transactionGroup; + $user = $group->user; /** @var MessageGeneratorInterface $engine */ $engine = app(MessageGeneratorInterface::class); $engine->setUser($user); diff --git a/app/Handlers/Events/UpdatedGroupEventHandler.php b/app/Handlers/Events/UpdatedGroupEventHandler.php index fc281330d9..5cd7cf4619 100644 --- a/app/Handlers/Events/UpdatedGroupEventHandler.php +++ b/app/Handlers/Events/UpdatedGroupEventHandler.php @@ -30,7 +30,6 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Models\Webhook; -use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\TransactionRules\Engine\RuleEngineInterface; use Illuminate\Support\Collection; @@ -41,46 +40,6 @@ use Log; */ class UpdatedGroupEventHandler { - /** - * This method will make sure all source / destination accounts are the same. - * - * @param UpdatedTransactionGroup $updatedGroupEvent - */ - public function unifyAccounts(UpdatedTransactionGroup $updatedGroupEvent): void - { - $group = $updatedGroupEvent->transactionGroup; - if (1 === $group->transactionJournals->count()) { - return; - } - Log::debug(sprintf('Correct inconsistent accounts in group #%d', $group->id)); - // first journal: - /** @var TransactionJournal $first */ - $first = $group->transactionJournals() - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC') - ->orderBy('transaction_journals.description', 'DESC') - ->first(); - $all = $group->transactionJournals()->get()->pluck('id')->toArray(); - /** @var Account $sourceAccount */ - $sourceAccount = $first->transactions()->where('amount', '<', '0')->first()->account; - /** @var Account $destAccount */ - $destAccount = $first->transactions()->where('amount', '>', '0')->first()->account; - - $type = $first->transactionType->type; - if (TransactionType::TRANSFER === $type || TransactionType::WITHDRAWAL === $type) { - // set all source transactions to source account: - Transaction::whereIn('transaction_journal_id', $all) - ->where('amount', '<', 0)->update(['account_id' => $sourceAccount->id]); - } - if (TransactionType::TRANSFER === $type || TransactionType::DEPOSIT === $type) { - // set all destination transactions to destination account: - Transaction::whereIn('transaction_journal_id', $all) - ->where('amount', '>', 0)->update(['account_id' => $destAccount->id]); - } - - } - /** * This method will check all the rules when a journal is updated. * @@ -123,8 +82,8 @@ class UpdatedGroupEventHandler public function triggerWebhooks(UpdatedTransactionGroup $updatedGroupEvent): void { Log::debug('UpdatedGroupEventHandler:triggerWebhooks'); - $group = $updatedGroupEvent->transactionGroup; - $user = $group->user; + $group = $updatedGroupEvent->transactionGroup; + $user = $group->user; /** @var MessageGeneratorInterface $engine */ $engine = app(MessageGeneratorInterface::class); $engine->setUser($user); @@ -134,4 +93,44 @@ class UpdatedGroupEventHandler event(new RequestedSendWebhookMessages); } + + /** + * This method will make sure all source / destination accounts are the same. + * + * @param UpdatedTransactionGroup $updatedGroupEvent + */ + public function unifyAccounts(UpdatedTransactionGroup $updatedGroupEvent): void + { + $group = $updatedGroupEvent->transactionGroup; + if (1 === $group->transactionJournals->count()) { + return; + } + Log::debug(sprintf('Correct inconsistent accounts in group #%d', $group->id)); + // first journal: + /** @var TransactionJournal $first */ + $first = $group->transactionJournals() + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC') + ->orderBy('transaction_journals.description', 'DESC') + ->first(); + $all = $group->transactionJournals()->get()->pluck('id')->toArray(); + /** @var Account $sourceAccount */ + $sourceAccount = $first->transactions()->where('amount', '<', '0')->first()->account; + /** @var Account $destAccount */ + $destAccount = $first->transactions()->where('amount', '>', '0')->first()->account; + + $type = $first->transactionType->type; + if (TransactionType::TRANSFER === $type || TransactionType::WITHDRAWAL === $type) { + // set all source transactions to source account: + Transaction::whereIn('transaction_journal_id', $all) + ->where('amount', '<', 0)->update(['account_id' => $sourceAccount->id]); + } + if (TransactionType::TRANSFER === $type || TransactionType::DEPOSIT === $type) { + // set all destination transactions to destination account: + Transaction::whereIn('transaction_journal_id', $all) + ->where('amount', '>', 0)->update(['account_id' => $destAccount->id]); + } + + } } diff --git a/app/Handlers/Events/UserEventHandler.php b/app/Handlers/Events/UserEventHandler.php index 4931da418c..f2606086a4 100644 --- a/app/Handlers/Events/UserEventHandler.php +++ b/app/Handlers/Events/UserEventHandler.php @@ -128,52 +128,6 @@ class UserEventHandler return true; } - /** - * @param Login $event - */ - public function storeUserIPAddress(Login $event): void - { - /** @var User $user */ - $user = $event->user; - /** @var array $preference */ - $preference = app('preferences')->getForUser($user, 'login_ip_history', [])->data; - $inArray = false; - $ip = request()->ip(); - Log::debug(sprintf('User logging in from IP address %s', $ip)); - - // update array if in array - foreach ($preference as $index => $row) { - if ($row['ip'] === $ip) { - Log::debug('Found IP in array, refresh time.'); - $preference[$index]['time'] = now(config('app.timezone'))->format('Y-m-d H:i:s'); - $inArray = true; - } - // clean up old entries (6 months) - $carbon = Carbon::createFromFormat('Y-m-d H:i:s', $preference[$index]['time']); - if ($carbon->diffInMonths(today()) > 6) { - Log::debug(sprintf('Entry for %s is very old, remove it.', $row['ip'])); - unset($preference[$index]); - } - } - // add to array if not the case: - if (false === $inArray) { - $preference[] = [ - 'ip' => $ip, - 'time' => now(config('app.timezone'))->format('Y-m-d H:i:s'), - 'notified' => false, - ]; - - - } - $preference = array_values($preference); - app('preferences')->setForUser($user, 'login_ip_history', $preference); - - if (false === $inArray && true === config('firefly.warn_new_ip')) { - event(new DetectedNewIPAddress($user, $ip)); - } - - } - /** * @param DetectedNewIPAddress $event */ @@ -183,11 +137,11 @@ class UserEventHandler $email = $user->email; $ipAddress = $event->ipAddress; - if($user->hasRole('demo')) { + if ($user->hasRole('demo')) { return; // do not email demo user. } - $list = app('preferences')->getForUser($user, 'login_ip_history', [])->data; + $list = app('preferences')->getForUser($user, 'login_ip_history', [])->data; // see if user has alternative email address: $pref = app('preferences')->getForUser($user, 'remote_guard_alt_email', null); @@ -252,7 +206,7 @@ class UserEventHandler $user = $event->user; $ipAddress = $event->ipAddress; $token = app('preferences')->getForUser($user, 'email_change_undo_token', 'invalid'); - $hashed = hash('sha256', sprintf('%s%s', (string) config('app.key'), $oldEmail)); + $hashed = hash('sha256', sprintf('%s%s', (string)config('app.key'), $oldEmail)); $uri = route('profile.undo-email-change', [$token->data, $hashed]); try { Mail::to($oldEmail)->send(new UndoEmailChangeMail($newEmail, $oldEmail, $uri, $ipAddress)); @@ -329,4 +283,50 @@ class UserEventHandler return true; } + + /** + * @param Login $event + */ + public function storeUserIPAddress(Login $event): void + { + /** @var User $user */ + $user = $event->user; + /** @var array $preference */ + $preference = app('preferences')->getForUser($user, 'login_ip_history', [])->data; + $inArray = false; + $ip = request()->ip(); + Log::debug(sprintf('User logging in from IP address %s', $ip)); + + // update array if in array + foreach ($preference as $index => $row) { + if ($row['ip'] === $ip) { + Log::debug('Found IP in array, refresh time.'); + $preference[$index]['time'] = now(config('app.timezone'))->format('Y-m-d H:i:s'); + $inArray = true; + } + // clean up old entries (6 months) + $carbon = Carbon::createFromFormat('Y-m-d H:i:s', $preference[$index]['time']); + if ($carbon->diffInMonths(today()) > 6) { + Log::debug(sprintf('Entry for %s is very old, remove it.', $row['ip'])); + unset($preference[$index]); + } + } + // add to array if not the case: + if (false === $inArray) { + $preference[] = [ + 'ip' => $ip, + 'time' => now(config('app.timezone'))->format('Y-m-d H:i:s'), + 'notified' => false, + ]; + + + } + $preference = array_values($preference); + app('preferences')->setForUser($user, 'login_ip_history', $preference); + + if (false === $inArray && true === config('firefly.warn_new_ip')) { + event(new DetectedNewIPAddress($user, $ip)); + } + + } } diff --git a/app/Handlers/Events/VersionCheckEventHandler.php b/app/Handlers/Events/VersionCheckEventHandler.php index 3c068ffade..7399974dc4 100644 --- a/app/Handlers/Events/VersionCheckEventHandler.php +++ b/app/Handlers/Events/VersionCheckEventHandler.php @@ -51,7 +51,7 @@ class VersionCheckEventHandler // should not check for updates: $permission = app('fireflyconfig')->get('permission_update_check', -1); - $value = (int) $permission->data; + $value = (int)$permission->data; if (1 !== $value) { Log::info('Update check is not enabled.'); $this->warnToCheckForUpdates($event); @@ -115,7 +115,7 @@ class VersionCheckEventHandler // last check time was more than a week ago. Log::debug('Have warned about a new version in four weeks!'); - session()->flash('info', (string) trans('firefly.disabled_but_check')); + session()->flash('info', (string)trans('firefly.disabled_but_check')); app('fireflyconfig')->set('last_update_warning', time()); } } diff --git a/app/Helpers/Attachments/AttachmentHelper.php b/app/Helpers/Attachments/AttachmentHelper.php index c20a6413e6..ef89e71efe 100644 --- a/app/Helpers/Attachments/AttachmentHelper.php +++ b/app/Helpers/Attachments/AttachmentHelper.php @@ -64,8 +64,8 @@ class AttachmentHelper implements AttachmentHelperInterface */ public function __construct() { - $this->maxUploadSize = (int) config('firefly.maxUploadSize'); - $this->allowedMimes = (array) config('firefly.allowedMimes'); + $this->maxUploadSize = (int)config('firefly.maxUploadSize'); + $this->allowedMimes = (array)config('firefly.allowedMimes'); $this->errors = new MessageBag; $this->messages = new MessageBag; $this->attachments = new Collection; @@ -92,7 +92,7 @@ class AttachmentHelper implements AttachmentHelperInterface } try { $unencryptedData = Crypt::decrypt($encryptedData); // verified - } catch (DecryptException|FileNotFoundException $e) { + } catch (DecryptException | FileNotFoundException $e) { Log::error(sprintf('Could not decrypt data of attachment #%d: %s', $attachment->id, $e->getMessage())); $unencryptedData = $encryptedData; } @@ -110,7 +110,7 @@ class AttachmentHelper implements AttachmentHelperInterface */ public function getAttachmentLocation(Attachment $attachment): string { - return sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int) $attachment->id); + return sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int)$attachment->id); } /** @@ -200,8 +200,8 @@ class AttachmentHelper implements AttachmentHelperInterface * @param object $model * @param array|null $files * - * @throws FireflyException * @return bool + * @throws FireflyException */ public function saveAttachmentsForModel(object $model, ?array $files): bool { @@ -227,46 +227,15 @@ class AttachmentHelper implements AttachmentHelperInterface return true; } - /** - * Check if a model already has this file attached. - * - * @param UploadedFile $file - * @param Model $model - * - * @return bool - */ - protected function hasFile(UploadedFile $file, Model $model): bool - { - $md5 = md5_file($file->getRealPath()); - $name = $file->getClientOriginalName(); - $class = get_class($model); - $count = 0; - if (PiggyBank::class === $class) { - $count = $model->account->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count(); - } - if (PiggyBank::class !== $class) { - $count = $model->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count(); - } - $result = false; - if ($count > 0) { - $msg = (string) trans('validation.file_already_attached', ['name' => $name]); - $this->errors->add('attachments', $msg); - Log::error($msg); - $result = true; - } - - return $result; - } - /** * Process the upload of a file. * * @param UploadedFile $file * @param Model $model * - * @throws EncryptException - * @throws FireflyException * @return Attachment|null + * @throws FireflyException + * @throws EncryptException */ protected function processFile(UploadedFile $file, Model $model): ?Attachment { @@ -275,7 +244,7 @@ class AttachmentHelper implements AttachmentHelperInterface $attachment = null; if (false !== $validation) { $class = get_class($model); - $user = $model->user; + $user = $model->user; if (PiggyBank::class === $class) { $user = $model->account->user; } @@ -309,65 +278,13 @@ class AttachmentHelper implements AttachmentHelperInterface $this->attachments->push($attachment); $name = e($file->getClientOriginalName()); // add message: - $msg = (string) trans('validation.file_attached', ['name' => $name]); + $msg = (string)trans('validation.file_attached', ['name' => $name]); $this->messages->add('attachments', $msg); } return $attachment; } - /** - * Verify if the mime of a file is valid. - * - * @param UploadedFile $file - * - * @return bool - */ - protected function validMime(UploadedFile $file): bool - { - Log::debug('Now in validMime()'); - $mime = e($file->getMimeType()); - $name = e($file->getClientOriginalName()); - Log::debug(sprintf('Name is %s, and mime is %s', $name, $mime)); - Log::debug('Valid mimes are', $this->allowedMimes); - $result = true; - - if (!in_array($mime, $this->allowedMimes, true)) { - $msg = (string) trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]); - $this->errors->add('attachments', $msg); - Log::error($msg); - - $result = false; - } - - return $result; - } - - /** - * Verify if the size of a file is valid. - * - * @codeCoverageIgnore - * - * @param UploadedFile $file - * - * @return bool - */ - protected function validSize(UploadedFile $file): bool - { - $size = $file->getSize(); - $name = e($file->getClientOriginalName()); - $result = true; - if ($size > $this->maxUploadSize) { - $msg = (string) trans('validation.file_too_large', ['name' => $name]); - $this->errors->add('attachments', $msg); - Log::error($msg); - - $result = false; - } - - return $result; - } - /** * Verify if the file was uploaded correctly. * @@ -400,4 +317,87 @@ class AttachmentHelper implements AttachmentHelperInterface return $result; } + + /** + * Verify if the mime of a file is valid. + * + * @param UploadedFile $file + * + * @return bool + */ + protected function validMime(UploadedFile $file): bool + { + Log::debug('Now in validMime()'); + $mime = e($file->getMimeType()); + $name = e($file->getClientOriginalName()); + Log::debug(sprintf('Name is %s, and mime is %s', $name, $mime)); + Log::debug('Valid mimes are', $this->allowedMimes); + $result = true; + + if (!in_array($mime, $this->allowedMimes, true)) { + $msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]); + $this->errors->add('attachments', $msg); + Log::error($msg); + + $result = false; + } + + return $result; + } + + /** + * Verify if the size of a file is valid. + * + * @codeCoverageIgnore + * + * @param UploadedFile $file + * + * @return bool + */ + protected function validSize(UploadedFile $file): bool + { + $size = $file->getSize(); + $name = e($file->getClientOriginalName()); + $result = true; + if ($size > $this->maxUploadSize) { + $msg = (string)trans('validation.file_too_large', ['name' => $name]); + $this->errors->add('attachments', $msg); + Log::error($msg); + + $result = false; + } + + return $result; + } + + /** + * Check if a model already has this file attached. + * + * @param UploadedFile $file + * @param Model $model + * + * @return bool + */ + protected function hasFile(UploadedFile $file, Model $model): bool + { + $md5 = md5_file($file->getRealPath()); + $name = $file->getClientOriginalName(); + $class = get_class($model); + $count = 0; + if (PiggyBank::class === $class) { + $count = $model->account->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count(); + } + if (PiggyBank::class !== $class) { + $count = $model->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count(); + } + $result = false; + if ($count > 0) { + $msg = (string)trans('validation.file_already_attached', ['name' => $name]); + $this->errors->add('attachments', $msg); + Log::error($msg); + $result = true; + } + + return $result; + } } diff --git a/app/Helpers/Collector/Extensions/CollectorProperties.php b/app/Helpers/Collector/Extensions/CollectorProperties.php index e8cdc2712f..ea497d7391 100644 --- a/app/Helpers/Collector/Extensions/CollectorProperties.php +++ b/app/Helpers/Collector/Extensions/CollectorProperties.php @@ -38,16 +38,17 @@ trait CollectorProperties private $hasAccountInfo; /** @var bool Will be true if query result includes bill information. */ private $hasBillInformation; - /** @var bool */ - private $hasNotesInformation; /** @var bool Will be true if query result contains budget info. */ private $hasBudgetInformation; /** @var bool Will be true if query result contains category info. */ private $hasCatInformation; /** @var bool Will be true for attachments */ private $hasJoinedAttTables; + private bool $hasJoinedMetaTables; /** @var bool Will be true of the query has the tag info tables joined. */ private $hasJoinedTagTables; + /** @var bool */ + private $hasNotesInformation; /** @var array */ private $integerFields; /** @var int The maximum number of results. */ @@ -60,6 +61,4 @@ trait CollectorProperties private $total; /** @var User The user object. */ private $user; - - private bool $hasJoinedMetaTables; } diff --git a/app/Helpers/Collector/Extensions/MetaCollection.php b/app/Helpers/Collector/Extensions/MetaCollection.php index c176fc2687..538050e508 100644 --- a/app/Helpers/Collector/Extensions/MetaCollection.php +++ b/app/Helpers/Collector/Extensions/MetaCollection.php @@ -39,84 +39,60 @@ trait MetaCollection { /** - * @inheritDoc + * Where has no tags. + * + * @return GroupCollectorInterface */ - public function withNotes(): GroupCollectorInterface + public function hasAnyTag(): GroupCollectorInterface { - if (false === $this->hasNotesInformation) { - // join bill table - $this->query->leftJoin( - 'notes', - static function (JoinClause $join) { - $join->on('notes.noteable_id', '=', 'transaction_journals.id'); - $join->where('notes.noteable_type', '=', 'FireflyIII\Models\TransactionJournal'); - } - ); - // add fields - $this->fields[] = 'notes.text as notes'; - $this->hasNotesInformation = true; - } + $this->withTagInformation(); + $this->query->whereNotNull('tag_transaction_journal.tag_id'); return $this; } - /** * @param string $value + * * @return GroupCollectorInterface */ public function notesContain(string $value): GroupCollectorInterface { $this->withNotes(); $this->query->where('notes.text', 'LIKE', sprintf('%%%s%%', $value)); + return $this; } /** * @param string $value + * * @return GroupCollectorInterface */ public function notesEndWith(string $value): GroupCollectorInterface { $this->withNotes(); $this->query->where('notes.text', 'LIKE', sprintf('%%%s', $value)); - return $this; - } - /** - * @return GroupCollectorInterface - */ - public function withoutNotes(): GroupCollectorInterface - { - $this->withNotes(); - $this->query->whereNull('notes.text'); - return $this; - } - - - /** - * @return GroupCollectorInterface - */ - public function withAnyNotes(): GroupCollectorInterface - { - $this->withNotes(); - $this->query->whereNotNull('notes.text'); return $this; } /** * @param string $value + * * @return GroupCollectorInterface */ public function notesExactly(string $value): GroupCollectorInterface { $this->withNotes(); $this->query->where('notes.text', '=', sprintf('%s', $value)); + return $this; } /** * @param string $value + * * @return GroupCollectorInterface */ public function notesStartWith(string $value): GroupCollectorInterface @@ -124,7 +100,7 @@ trait MetaCollection $this->withNotes(); $this->query->where('notes.text', 'LIKE', sprintf('%s%%', $value)); - return $this; + return $this; } /** @@ -221,219 +197,6 @@ trait MetaCollection return $this; } - /** - * Limit results to a specific tag. - * - * @param Tag $tag - * - * @return GroupCollectorInterface - */ - public function setTag(Tag $tag): GroupCollectorInterface - { - $this->withTagInformation(); - $this->query->where('tag_transaction_journal.tag_id', $tag->id); - - return $this; - } - - /** - * Limit results to a specific set of tags. - * - * @param Collection $tags - * - * @return GroupCollectorInterface - */ - public function setTags(Collection $tags): GroupCollectorInterface - { - $this->withTagInformation(); - $this->query->whereIn('tag_transaction_journal.tag_id', $tags->pluck('id')->toArray()); - - return $this; - } - - /** - * Where has no tags. - * - * @return GroupCollectorInterface - */ - public function withoutTags(): GroupCollectorInterface - { - $this->withTagInformation(); - $this->query->whereNull('tag_transaction_journal.tag_id'); - - return $this; - } - - /** - * Where has no tags. - * - * @return GroupCollectorInterface - */ - public function hasAnyTag(): GroupCollectorInterface - { - $this->withTagInformation(); - $this->query->whereNotNull('tag_transaction_journal.tag_id'); - - return $this; - } - - /** - * Will include bill name + ID, if any. - * - * @return GroupCollectorInterface - */ - public function withBillInformation(): GroupCollectorInterface - { - if (false === $this->hasBillInformation) { - // join bill table - $this->query->leftJoin('bills', 'bills.id', '=', 'transaction_journals.bill_id'); - // add fields - $this->fields[] = 'bills.id as bill_id'; - $this->fields[] = 'bills.name as bill_name'; - $this->hasBillInformation = true; - } - - return $this; - } - - /** - * Will include budget ID + name, if any. - * - * @return GroupCollectorInterface - */ - public function withBudgetInformation(): GroupCollectorInterface - { - if (false === $this->hasBudgetInformation) { - // join link table - $this->query->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); - // join cat table - $this->query->leftJoin('budgets', 'budget_transaction_journal.budget_id', '=', 'budgets.id'); - // add fields - $this->fields[] = 'budgets.id as budget_id'; - $this->fields[] = 'budgets.name as budget_name'; - $this->hasBudgetInformation = true; - } - - return $this; - } - - /** - * Will include category ID + name, if any. - * - * @return GroupCollectorInterface - */ - public function withCategoryInformation(): GroupCollectorInterface - { - if (false === $this->hasCatInformation) { - // join link table - $this->query->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); - // join cat table - $this->query->leftJoin('categories', 'category_transaction_journal.category_id', '=', 'categories.id'); - // add fields - $this->fields[] = 'categories.id as category_id'; - $this->fields[] = 'categories.name as category_name'; - $this->hasCatInformation = true; - } - - return $this; - } - - /** - * @return GroupCollectorInterface - */ - public function withTagInformation(): GroupCollectorInterface - { - $this->fields[] = 'tags.id as tag_id'; - $this->fields[] = 'tags.tag as tag_name'; - $this->fields[] = 'tags.date as tag_date'; - $this->fields[] = 'tags.description as tag_description'; - $this->fields[] = 'tags.latitude as tag_latitude'; - $this->fields[] = 'tags.longitude as tag_longitude'; - $this->fields[] = 'tags.zoomLevel as tag_zoom_level'; - - $this->joinTagTables(); - - return $this; - } - - /** - * Limit results to a transactions without a budget.. - * - * @return GroupCollectorInterface - */ - public function withoutBudget(): GroupCollectorInterface - { - $this->withBudgetInformation(); - $this->query->whereNull('budget_transaction_journal.budget_id'); - - return $this; - } - - /** - * Limit results to a transactions without a bill. - * - * @return GroupCollectorInterface - */ - public function withoutBill(): GroupCollectorInterface - { - $this->query->whereNull('transaction_journals.bill_id'); - - return $this; - } - - /** - * Limit results to a transactions without a budget.. - * - * @return GroupCollectorInterface - */ - public function withBudget(): GroupCollectorInterface - { - $this->withBudgetInformation(); - $this->query->whereNotNull('budget_transaction_journal.budget_id'); - - return $this; - } - - /** - * Limit results to a transactions without a category. - * - * @return GroupCollectorInterface - */ - public function withoutCategory(): GroupCollectorInterface - { - $this->withCategoryInformation(); - $this->query->whereNull('category_transaction_journal.category_id'); - - return $this; - } - - /** - * Limit results to a transactions without a category. - * - * @return GroupCollectorInterface - */ - public function withCategory(): GroupCollectorInterface - { - $this->withCategoryInformation(); - $this->query->whereNotNull('category_transaction_journal.category_id'); - - return $this; - } - - /** - * Join table to get tag information. - */ - protected function joinTagTables(): void - { - if (false === $this->hasJoinedTagTables) { - // join some extra tables: - $this->hasJoinedTagTables = true; - $this->query->leftJoin('tag_transaction_journal', 'tag_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); - $this->query->leftJoin('tags', 'tag_transaction_journal.tag_id', '=', 'tags.id'); - } - } - - /** * @inheritDoc */ @@ -465,5 +228,248 @@ trait MetaCollection return $this; } + /** + * Limit results to a specific tag. + * + * @param Tag $tag + * + * @return GroupCollectorInterface + */ + public function setTag(Tag $tag): GroupCollectorInterface + { + $this->withTagInformation(); + $this->query->where('tag_transaction_journal.tag_id', $tag->id); + + return $this; + } + + /** + * Limit results to a specific set of tags. + * + * @param Collection $tags + * + * @return GroupCollectorInterface + */ + public function setTags(Collection $tags): GroupCollectorInterface + { + $this->withTagInformation(); + $this->query->whereIn('tag_transaction_journal.tag_id', $tags->pluck('id')->toArray()); + + return $this; + } + + /** + * @return GroupCollectorInterface + */ + public function withAnyNotes(): GroupCollectorInterface + { + $this->withNotes(); + $this->query->whereNotNull('notes.text'); + + return $this; + } + + /** + * Will include bill name + ID, if any. + * + * @return GroupCollectorInterface + */ + public function withBillInformation(): GroupCollectorInterface + { + if (false === $this->hasBillInformation) { + // join bill table + $this->query->leftJoin('bills', 'bills.id', '=', 'transaction_journals.bill_id'); + // add fields + $this->fields[] = 'bills.id as bill_id'; + $this->fields[] = 'bills.name as bill_name'; + $this->hasBillInformation = true; + } + + return $this; + } + + /** + * Limit results to a transactions without a budget.. + * + * @return GroupCollectorInterface + */ + public function withBudget(): GroupCollectorInterface + { + $this->withBudgetInformation(); + $this->query->whereNotNull('budget_transaction_journal.budget_id'); + + return $this; + } + + /** + * Will include budget ID + name, if any. + * + * @return GroupCollectorInterface + */ + public function withBudgetInformation(): GroupCollectorInterface + { + if (false === $this->hasBudgetInformation) { + // join link table + $this->query->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); + // join cat table + $this->query->leftJoin('budgets', 'budget_transaction_journal.budget_id', '=', 'budgets.id'); + // add fields + $this->fields[] = 'budgets.id as budget_id'; + $this->fields[] = 'budgets.name as budget_name'; + $this->hasBudgetInformation = true; + } + + return $this; + } + + /** + * Limit results to a transactions without a category. + * + * @return GroupCollectorInterface + */ + public function withCategory(): GroupCollectorInterface + { + $this->withCategoryInformation(); + $this->query->whereNotNull('category_transaction_journal.category_id'); + + return $this; + } + + /** + * Will include category ID + name, if any. + * + * @return GroupCollectorInterface + */ + public function withCategoryInformation(): GroupCollectorInterface + { + if (false === $this->hasCatInformation) { + // join link table + $this->query->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); + // join cat table + $this->query->leftJoin('categories', 'category_transaction_journal.category_id', '=', 'categories.id'); + // add fields + $this->fields[] = 'categories.id as category_id'; + $this->fields[] = 'categories.name as category_name'; + $this->hasCatInformation = true; + } + + return $this; + } + + /** + * @inheritDoc + */ + public function withNotes(): GroupCollectorInterface + { + if (false === $this->hasNotesInformation) { + // join bill table + $this->query->leftJoin( + 'notes', + static function (JoinClause $join) { + $join->on('notes.noteable_id', '=', 'transaction_journals.id'); + $join->where('notes.noteable_type', '=', 'FireflyIII\Models\TransactionJournal'); + } + ); + // add fields + $this->fields[] = 'notes.text as notes'; + $this->hasNotesInformation = true; + } + + return $this; + } + + /** + * @return GroupCollectorInterface + */ + public function withTagInformation(): GroupCollectorInterface + { + $this->fields[] = 'tags.id as tag_id'; + $this->fields[] = 'tags.tag as tag_name'; + $this->fields[] = 'tags.date as tag_date'; + $this->fields[] = 'tags.description as tag_description'; + $this->fields[] = 'tags.latitude as tag_latitude'; + $this->fields[] = 'tags.longitude as tag_longitude'; + $this->fields[] = 'tags.zoomLevel as tag_zoom_level'; + + $this->joinTagTables(); + + return $this; + } + + /** + * Limit results to a transactions without a bill. + * + * @return GroupCollectorInterface + */ + public function withoutBill(): GroupCollectorInterface + { + $this->query->whereNull('transaction_journals.bill_id'); + + return $this; + } + + /** + * Limit results to a transactions without a budget.. + * + * @return GroupCollectorInterface + */ + public function withoutBudget(): GroupCollectorInterface + { + $this->withBudgetInformation(); + $this->query->whereNull('budget_transaction_journal.budget_id'); + + return $this; + } + + /** + * Limit results to a transactions without a category. + * + * @return GroupCollectorInterface + */ + public function withoutCategory(): GroupCollectorInterface + { + $this->withCategoryInformation(); + $this->query->whereNull('category_transaction_journal.category_id'); + + return $this; + } + + /** + * @return GroupCollectorInterface + */ + public function withoutNotes(): GroupCollectorInterface + { + $this->withNotes(); + $this->query->whereNull('notes.text'); + + return $this; + } + + /** + * Where has no tags. + * + * @return GroupCollectorInterface + */ + public function withoutTags(): GroupCollectorInterface + { + $this->withTagInformation(); + $this->query->whereNull('tag_transaction_journal.tag_id'); + + return $this; + } + + /** + * Join table to get tag information. + */ + protected function joinTagTables(): void + { + if (false === $this->hasJoinedTagTables) { + // join some extra tables: + $this->hasJoinedTagTables = true; + $this->query->leftJoin('tag_transaction_journal', 'tag_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); + $this->query->leftJoin('tags', 'tag_transaction_journal.tag_id', '=', 'tags.id'); + } + } + } diff --git a/app/Helpers/Collector/GroupCollector.php b/app/Helpers/Collector/GroupCollector.php index f2339850da..c12f3da83b 100644 --- a/app/Helpers/Collector/GroupCollector.php +++ b/app/Helpers/Collector/GroupCollector.php @@ -126,14 +126,76 @@ class GroupCollector implements GroupCollectorInterface } /** - * + * @inheritDoc */ - public function dumpQuery(): void + public function descriptionEnds(array $array): GroupCollectorInterface { - echo $this->query->select($this->fields)->toSql(); - echo '
';
-        print_r($this->query->getBindings());
-        echo '
'; + $this->query->where( + static function (EloquentBuilder $q) use ($array) { + $q->where( + static function (EloquentBuilder $q1) use ($array) { + foreach ($array as $word) { + $keyword = sprintf('%%%s', $word); + $q1->where('transaction_journals.description', 'LIKE', $keyword); + } + } + ); + $q->orWhere( + static function (EloquentBuilder $q2) use ($array) { + foreach ($array as $word) { + $keyword = sprintf('%%%s', $word); + $q2->where('transaction_groups.title', 'LIKE', $keyword); + } + } + ); + } + ); + + return $this; + } + + /** + * @inheritDoc + */ + public function descriptionIs(string $value): GroupCollectorInterface + { + $this->query->where( + static function (EloquentBuilder $q) use ($value) { + $q->where('transaction_journals.description', '=', $value); + $q->orWhere('transaction_groups.title', '=', $value); + } + ); + + return $this; + } + + /** + * @inheritDoc + */ + public function descriptionStarts(array $array): GroupCollectorInterface + { + $this->query->where( + static function (EloquentBuilder $q) use ($array) { + $q->where( + static function (EloquentBuilder $q1) use ($array) { + foreach ($array as $word) { + $keyword = sprintf('%s%%', $word); + $q1->where('transaction_journals.description', 'LIKE', $keyword); + } + } + ); + $q->orWhere( + static function (EloquentBuilder $q2) use ($array) { + foreach ($array as $word) { + $keyword = sprintf('%s%%', $word); + $q2->where('transaction_groups.title', 'LIKE', $keyword); + } + } + ); + } + ); + + return $this; } /** @@ -209,6 +271,19 @@ class GroupCollector implements GroupCollectorInterface return new LengthAwarePaginator($set, $this->total, $this->limit, $this->page); } + /** + * Has attachments + * + * @return GroupCollectorInterface + */ + public function hasAttachments(): GroupCollectorInterface + { + Log::debug('Add filter on attachment ID.'); + $this->joinAttachmentTables(); + $this->query->whereNotNull('attachments.attachable_id'); + + return $this; + } /** * Limit results to a specific currency, either foreign or normal one. @@ -239,6 +314,21 @@ class GroupCollector implements GroupCollectorInterface return $this; } + /** + * Limit the result to a set of specific transaction groups. + * + * @param array $groupIds + * + * @return GroupCollectorInterface + */ + public function setIds(array $groupIds): GroupCollectorInterface + { + + $this->query->whereIn('transaction_groups.id', $groupIds); + + return $this; + } + /** * Limit the result to a set of specific journals. * @@ -255,20 +345,6 @@ class GroupCollector implements GroupCollectorInterface return $this; } - /** - * Limit the result to a set of specific transaction groups. - * - * @param array $groupIds - * - * @return GroupCollectorInterface - */ - public function setIds(array $groupIds): GroupCollectorInterface { - - $this->query->whereIn('transaction_groups.id', $groupIds); - - return $this; - } - /** * Limit the number of returned entries. * @@ -333,80 +409,6 @@ class GroupCollector implements GroupCollectorInterface return $this; } - /** - * @inheritDoc - */ - public function descriptionStarts(array $array): GroupCollectorInterface - { - $this->query->where( - static function (EloquentBuilder $q) use ($array) { - $q->where( - static function (EloquentBuilder $q1) use ($array) { - foreach ($array as $word) { - $keyword = sprintf('%s%%', $word); - $q1->where('transaction_journals.description', 'LIKE', $keyword); - } - } - ); - $q->orWhere( - static function (EloquentBuilder $q2) use ($array) { - foreach ($array as $word) { - $keyword = sprintf('%s%%', $word); - $q2->where('transaction_groups.title', 'LIKE', $keyword); - } - } - ); - } - ); - - return $this; - } - - /** - * @inheritDoc - */ - public function descriptionEnds(array $array): GroupCollectorInterface - { - $this->query->where( - static function (EloquentBuilder $q) use ($array) { - $q->where( - static function (EloquentBuilder $q1) use ($array) { - foreach ($array as $word) { - $keyword = sprintf('%%%s', $word); - $q1->where('transaction_journals.description', 'LIKE', $keyword); - } - } - ); - $q->orWhere( - static function (EloquentBuilder $q2) use ($array) { - foreach ($array as $word) { - $keyword = sprintf('%%%s', $word); - $q2->where('transaction_groups.title', 'LIKE', $keyword); - } - } - ); - } - ); - - return $this; - } - - /** - * @inheritDoc - */ - public function descriptionIs(string $value): GroupCollectorInterface - { - $this->query->where( - static function (EloquentBuilder $q) use ($value) { - $q->where('transaction_journals.description', '=', $value); - $q->orWhere('transaction_groups.title', '=', $value); - } - ); - - return $this; - } - - /** * Limit the search to one specific transaction group. * @@ -483,35 +485,47 @@ class GroupCollector implements GroupCollectorInterface return $this; } - /** - * Convert a selected set of fields to arrays. - * - * @param array $array - * - * @return array + * Build the query. */ - private function convertToInteger(array $array): array + private function startQuery(): void { - foreach ($this->integerFields as $field) { - $array[$field] = array_key_exists($field, $array) ? (int)$array[$field] : null; - } + //app('log')->debug('GroupCollector::startQuery'); + $this->query = $this->user + //->transactionGroups() + //->leftJoin('transaction_journals', 'transaction_journals.transaction_group_id', 'transaction_groups.id') + ->transactionJournals() + ->leftJoin('transaction_groups', 'transaction_journals.transaction_group_id', 'transaction_groups.id') - return $array; - } - - /** - * Has attachments - * - * @return GroupCollectorInterface - */ - public function hasAttachments(): GroupCollectorInterface - { - Log::debug('Add filter on attachment ID.'); - $this->joinAttachmentTables(); - $this->query->whereNotNull('attachments.attachable_id'); - - return $this; + // join source transaction. + ->leftJoin( + 'transactions as source', + function (JoinClause $join) { + $join->on('source.transaction_journal_id', '=', 'transaction_journals.id') + ->where('source.amount', '<', 0); + } + ) + // join destination transaction + ->leftJoin( + 'transactions as destination', + function (JoinClause $join) { + $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id') + ->where('destination.amount', '>', 0); + } + ) + // left join transaction type. + ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->leftJoin('transaction_currencies as currency', 'currency.id', '=', 'source.transaction_currency_id') + ->leftJoin('transaction_currencies as foreign_currency', 'foreign_currency.id', '=', 'source.foreign_currency_id') + ->whereNull('transaction_groups.deleted_at') + ->whereNull('transaction_journals.deleted_at') + ->whereNull('source.deleted_at') + ->whereNull('destination.deleted_at') + ->orderBy('transaction_journals.date', 'DESC') + ->orderBy('transaction_journals.order', 'ASC') + ->orderBy('transaction_journals.id', 'DESC') + ->orderBy('transaction_journals.description', 'DESC') + ->orderBy('source.amount', 'DESC'); } /** @@ -533,6 +547,33 @@ class GroupCollector implements GroupCollectorInterface } } + /** + * + */ + public function dumpQuery(): void + { + echo $this->query->select($this->fields)->toSql(); + echo '
';
+        print_r($this->query->getBindings());
+        echo '
'; + } + + /** + * Convert a selected set of fields to arrays. + * + * @param array $array + * + * @return array + */ + private function convertToInteger(array $array): array + { + foreach ($this->integerFields as $field) { + $array[$field] = array_key_exists($field, $array) ? (int)$array[$field] : null; + } + + return $array; + } + /** * @param array $existingJournal * @param TransactionJournal $newJournal @@ -735,47 +776,4 @@ class GroupCollector implements GroupCollectorInterface return $groups; } - - /** - * Build the query. - */ - private function startQuery(): void - { - //app('log')->debug('GroupCollector::startQuery'); - $this->query = $this->user - //->transactionGroups() - //->leftJoin('transaction_journals', 'transaction_journals.transaction_group_id', 'transaction_groups.id') - ->transactionJournals() - ->leftJoin('transaction_groups', 'transaction_journals.transaction_group_id', 'transaction_groups.id') - - // join source transaction. - ->leftJoin( - 'transactions as source', - function (JoinClause $join) { - $join->on('source.transaction_journal_id', '=', 'transaction_journals.id') - ->where('source.amount', '<', 0); - } - ) - // join destination transaction - ->leftJoin( - 'transactions as destination', - function (JoinClause $join) { - $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id') - ->where('destination.amount', '>', 0); - } - ) - // left join transaction type. - ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') - ->leftJoin('transaction_currencies as currency', 'currency.id', '=', 'source.transaction_currency_id') - ->leftJoin('transaction_currencies as foreign_currency', 'foreign_currency.id', '=', 'source.foreign_currency_id') - ->whereNull('transaction_groups.deleted_at') - ->whereNull('transaction_journals.deleted_at') - ->whereNull('source.deleted_at') - ->whereNull('destination.deleted_at') - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transaction_journals.order', 'ASC') - ->orderBy('transaction_journals.id', 'DESC') - ->orderBy('transaction_journals.description', 'DESC') - ->orderBy('source.amount', 'DESC'); - } } diff --git a/app/Helpers/Collector/GroupCollectorInterface.php b/app/Helpers/Collector/GroupCollectorInterface.php index 43493c59ed..964ad19aa0 100644 --- a/app/Helpers/Collector/GroupCollectorInterface.php +++ b/app/Helpers/Collector/GroupCollectorInterface.php @@ -66,6 +66,33 @@ interface GroupCollectorInterface */ public function amountMore(string $amount): GroupCollectorInterface; + /** + * End of the description must match: + * + * @param array $array + * + * @return GroupCollectorInterface + */ + public function descriptionEnds(array $array): GroupCollectorInterface; + + /** + * Description must be: + * + * @param string $value + * + * @return GroupCollectorInterface + */ + public function descriptionIs(string $value): GroupCollectorInterface; + + /** + * Beginning of the description must match: + * + * @param array $array + * + * @return GroupCollectorInterface + */ + public function descriptionStarts(array $array): GroupCollectorInterface; + /** * Exclude destination accounts. * @@ -105,6 +132,46 @@ interface GroupCollectorInterface */ public function getPaginatedGroups(): LengthAwarePaginator; + /** + * @return GroupCollectorInterface + */ + public function hasAnyTag(): GroupCollectorInterface; + + /** + * Has attachments + * + * @return GroupCollectorInterface + */ + public function hasAttachments(): GroupCollectorInterface; + + /** + * @param string $value + * + * @return GroupCollectorInterface + */ + public function notesContain(string $value): GroupCollectorInterface; + + /** + * @param string $value + * + * @return GroupCollectorInterface + */ + public function notesEndWith(string $value): GroupCollectorInterface; + + /** + * @param string $value + * + * @return GroupCollectorInterface + */ + public function notesExactly(string $value): GroupCollectorInterface; + + /** + * @param string $value + * + * @return GroupCollectorInterface + */ + public function notesStartWith(string $value): GroupCollectorInterface; + /** * Define which accounts can be part of the source and destination transactions. * @@ -213,15 +280,6 @@ interface GroupCollectorInterface */ public function setCurrency(TransactionCurrency $currency): GroupCollectorInterface; - /** - * Limit results to a specific foreign currency. - * - * @param TransactionCurrency $currency - * - * @return GroupCollectorInterface - */ - public function setForeignCurrency(TransactionCurrency $currency): GroupCollectorInterface; - /** * Set destination accounts. * @@ -232,13 +290,22 @@ interface GroupCollectorInterface public function setDestinationAccounts(Collection $accounts): GroupCollectorInterface; /** - * Limit the result to a set of specific transaction journals. + * Look for specific external ID's. * - * @param array $journalIds + * @param string $externalId * * @return GroupCollectorInterface */ - public function setJournalIds(array $journalIds): GroupCollectorInterface; + public function setExternalId(string $externalId): GroupCollectorInterface; + + /** + * Limit results to a specific foreign currency. + * + * @param TransactionCurrency $currency + * + * @return GroupCollectorInterface + */ + public function setForeignCurrency(TransactionCurrency $currency): GroupCollectorInterface; /** * Limit the result to a set of specific transaction groups. @@ -249,6 +316,24 @@ interface GroupCollectorInterface */ public function setIds(array $groupIds): GroupCollectorInterface; + /** + * Look for specific external ID's. + * + * @param string $externalId + * + * @return GroupCollectorInterface + */ + public function setInternalReference(string $externalId): GroupCollectorInterface; + + /** + * Limit the result to a set of specific transaction journals. + * + * @param array $journalIds + * + * @return GroupCollectorInterface + */ + public function setJournalIds(array $journalIds): GroupCollectorInterface; + /** * Limit the number of returned entries. * @@ -286,33 +371,6 @@ interface GroupCollectorInterface */ public function setSearchWords(array $array): GroupCollectorInterface; - /** - * Beginning of the description must match: - * - * @param array $array - * - * @return GroupCollectorInterface - */ - public function descriptionStarts(array $array): GroupCollectorInterface; - - /** - * End of the description must match: - * - * @param array $array - * - * @return GroupCollectorInterface - */ - public function descriptionEnds(array $array): GroupCollectorInterface; - - /** - * Description must be: - * - * @param string $value - * - * @return GroupCollectorInterface - */ - public function descriptionIs(string $value): GroupCollectorInterface; - /** * Set source accounts. * @@ -340,16 +398,6 @@ interface GroupCollectorInterface */ public function setTags(Collection $tags): GroupCollectorInterface; - /** - * @return GroupCollectorInterface - */ - public function withoutTags(): GroupCollectorInterface; - - /** - * @return GroupCollectorInterface - */ - public function hasAnyTag(): GroupCollectorInterface; - /** * Limit the search to one specific transaction group. * @@ -409,6 +457,13 @@ interface GroupCollectorInterface */ public function withAccountInformation(): GroupCollectorInterface; + /** + * Any notes, no matter what. + * + * @return GroupCollectorInterface + */ + public function withAnyNotes(): GroupCollectorInterface; + /** * Add basic info on attachments of transactions. * @@ -416,13 +471,6 @@ interface GroupCollectorInterface */ public function withAttachmentInformation(): GroupCollectorInterface; - /** - * Has attachments - * - * @return GroupCollectorInterface - */ - public function hasAttachments(): GroupCollectorInterface; - /** * Include bill name + ID. * @@ -430,6 +478,13 @@ interface GroupCollectorInterface */ public function withBillInformation(): GroupCollectorInterface; + /** + * Limit results to a transactions with a budget. + * + * @return GroupCollectorInterface + */ + public function withBudget(): GroupCollectorInterface; + /** * Will include budget ID + name, if any. * @@ -437,6 +492,13 @@ interface GroupCollectorInterface */ public function withBudgetInformation(): GroupCollectorInterface; + /** + * Limit results to a transactions with a category. + * + * @return GroupCollectorInterface + */ + public function withCategory(): GroupCollectorInterface; + /** * Will include category ID + name, if any. * @@ -451,42 +513,6 @@ interface GroupCollectorInterface */ public function withNotes(): GroupCollectorInterface; - /** - * Any notes, no matter what. - * - * @return GroupCollectorInterface - */ - public function withAnyNotes(): GroupCollectorInterface; - - /** - * @param string $value - * @return GroupCollectorInterface - */ - public function notesContain(string $value): GroupCollectorInterface; - /** - * @param string $value - * @return GroupCollectorInterface - */ - public function withoutNotes(): GroupCollectorInterface; - - /** - * @param string $value - * @return GroupCollectorInterface - */ - public function notesStartWith(string $value): GroupCollectorInterface; - - /** - * @param string $value - * @return GroupCollectorInterface - */ - public function notesEndWith(string $value): GroupCollectorInterface; - - /** - * @param string $value - * @return GroupCollectorInterface - */ - public function notesExactly(string $value): GroupCollectorInterface; - /** * Add tag info. * @@ -494,13 +520,6 @@ interface GroupCollectorInterface */ public function withTagInformation(): GroupCollectorInterface; - /** - * Limit results to a transactions without a budget. - * - * @return GroupCollectorInterface - */ - public function withoutBudget(): GroupCollectorInterface; - /** * Limit results to a transactions without a bill. * @@ -508,6 +527,13 @@ interface GroupCollectorInterface */ public function withoutBill(): GroupCollectorInterface; + /** + * Limit results to a transactions without a budget. + * + * @return GroupCollectorInterface + */ + public function withoutBudget(): GroupCollectorInterface; + /** * Limit results to a transactions without a category. * @@ -516,35 +542,15 @@ interface GroupCollectorInterface public function withoutCategory(): GroupCollectorInterface; /** - * Limit results to a transactions with a category. + * @param string $value * * @return GroupCollectorInterface */ - public function withCategory(): GroupCollectorInterface; + public function withoutNotes(): GroupCollectorInterface; /** - * Limit results to a transactions with a budget. - * * @return GroupCollectorInterface */ - public function withBudget(): GroupCollectorInterface; - - /** - * Look for specific external ID's. - * - * @param string $externalId - * - * @return GroupCollectorInterface - */ - public function setExternalId(string $externalId): GroupCollectorInterface; - - /** - * Look for specific external ID's. - * - * @param string $externalId - * - * @return GroupCollectorInterface - */ - public function setInternalReference(string $externalId): GroupCollectorInterface; + public function withoutTags(): GroupCollectorInterface; } diff --git a/app/Helpers/Fiscal/FiscalHelper.php b/app/Helpers/Fiscal/FiscalHelper.php index b9dbd6be39..15a92d3c83 100644 --- a/app/Helpers/Fiscal/FiscalHelper.php +++ b/app/Helpers/Fiscal/FiscalHelper.php @@ -75,7 +75,7 @@ class FiscalHelper implements FiscalHelperInterface if (true === $this->useCustomFiscalYear) { $prefStartStr = app('preferences')->get('fiscalYearStart', '01-01')->data; [$mth, $day] = explode('-', $prefStartStr); - $startDate->day((int) $day)->month((int) $mth); + $startDate->day((int)$day)->month((int)$mth); // if start date is after passed date, sub 1 year. if ($startDate > $date) { diff --git a/app/Helpers/Report/NetWorth.php b/app/Helpers/Report/NetWorth.php index 63aa980dae..01303273f9 100644 --- a/app/Helpers/Report/NetWorth.php +++ b/app/Helpers/Report/NetWorth.php @@ -89,7 +89,7 @@ class NetWorth implements NetWorthInterface /** @var Account $account */ foreach ($accounts as $account) { Log::debug(sprintf('Now at account #%d: "%s"', $account->id, $account->name)); - $currencyId = (int) $this->accountRepository->getMetaValue($account, 'currency_id'); + $currencyId = (int)$this->accountRepository->getMetaValue($account, 'currency_id'); $currencyId = 0 === $currencyId ? $default->id : $currencyId; Log::debug(sprintf('Currency ID is #%d', $currencyId)); @@ -100,7 +100,7 @@ class NetWorth implements NetWorthInterface Log::debug(sprintf('Balance is %s', $balance)); // always subtract virtual balance. - $virtualBalance = (string) $account->virtual_balance; + $virtualBalance = (string)$account->virtual_balance; if ('' !== $virtualBalance) { $balance = bcsub($balance, $virtualBalance); } diff --git a/app/Helpers/Report/PopupReport.php b/app/Helpers/Report/PopupReport.php index 36d7ec389b..8230672a3c 100644 --- a/app/Helpers/Report/PopupReport.php +++ b/app/Helpers/Report/PopupReport.php @@ -31,7 +31,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Illuminate\Support\Collection; -use Log; /** * Class PopupReport. @@ -78,7 +77,7 @@ class PopupReport implements PopupReportInterface if (null !== $currencyId) { /** @var CurrencyRepositoryInterface $repos */ $repos = app(CurrencyRepositoryInterface::class); - $currency = $repos->find((int) $currencyId); + $currency = $repos->find((int)$currencyId); } @@ -115,7 +114,7 @@ class PopupReport implements PopupReportInterface if (null !== $currencyId) { /** @var CurrencyRepositoryInterface $repos */ $repos = app(CurrencyRepositoryInterface::class); - $currency = $repos->find((int) $currencyId); + $currency = $repos->find((int)$currencyId); } @@ -157,7 +156,7 @@ class PopupReport implements PopupReportInterface if (null !== $currencyId) { /** @var CurrencyRepositoryInterface $repos */ $repos = app(CurrencyRepositoryInterface::class); - $currency = $repos->find((int) $currencyId); + $currency = $repos->find((int)$currencyId); } /** @var GroupCollectorInterface $collector */ @@ -200,7 +199,7 @@ class PopupReport implements PopupReportInterface if (null !== $currencyId) { /** @var CurrencyRepositoryInterface $repos */ $repos = app(CurrencyRepositoryInterface::class); - $currency = $repos->find((int) $currencyId); + $currency = $repos->find((int)$currencyId); } /** @var JournalRepositoryInterface $repository */ diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index 70745d1a6b..9221359b0a 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -29,7 +29,6 @@ use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use Illuminate\Support\Collection; -use Log; /** * Class ReportHelper. diff --git a/app/Helpers/Webhook/Sha3SignatureGenerator.php b/app/Helpers/Webhook/Sha3SignatureGenerator.php index 8674a2b3bb..8077432f9d 100644 --- a/app/Helpers/Webhook/Sha3SignatureGenerator.php +++ b/app/Helpers/Webhook/Sha3SignatureGenerator.php @@ -53,14 +53,6 @@ class Sha3SignatureGenerator implements SignatureGeneratorInterface { private int $version = 1; - /** - * @inheritDoc - */ - public function getVersion(): int - { - return $this->version; - } - /** * @inheritDoc */ @@ -89,4 +81,12 @@ class Sha3SignatureGenerator implements SignatureGeneratorInterface // Schemes start with v, followed by an integer. Currently, the only valid live signature scheme is v1. return sprintf('t=%s,v%d=%s', $timestamp, $this->getVersion(), $signature); } + + /** + * @inheritDoc + */ + public function getVersion(): int + { + return $this->version; + } } diff --git a/app/Helpers/Webhook/SignatureGeneratorInterface.php b/app/Helpers/Webhook/SignatureGeneratorInterface.php index 1c4506c377..cf27c888b1 100644 --- a/app/Helpers/Webhook/SignatureGeneratorInterface.php +++ b/app/Helpers/Webhook/SignatureGeneratorInterface.php @@ -50,17 +50,17 @@ use FireflyIII\Models\WebhookMessage; */ interface SignatureGeneratorInterface { - /** - * Return the version of this signature generator. - * - * @return int - */ - public function getVersion(): int; - /** * @param WebhookMessage $message * * @return string */ public function generate(WebhookMessage $message): string; + + /** + * Return the version of this signature generator. + * + * @return int + */ + public function getVersion(): int; } diff --git a/app/Http/Controllers/Account/CreateController.php b/app/Http/Controllers/Account/CreateController.php index fa0610fd7f..202afd6cfe 100644 --- a/app/Http/Controllers/Account/CreateController.php +++ b/app/Http/Controllers/Account/CreateController.php @@ -44,11 +44,8 @@ class CreateController extends Controller { use ModelInformation; - /** @var AttachmentHelperInterface Helper for attachments. */ - private $attachments; - - /** @var AccountRepositoryInterface The account repository */ - private $repository; + private AttachmentHelperInterface $attachments; + private AccountRepositoryInterface $repository; /** * CreateController constructor. diff --git a/app/Http/Controllers/Admin/HomeController.php b/app/Http/Controllers/Admin/HomeController.php index c29703af67..fc921db193 100644 --- a/app/Http/Controllers/Admin/HomeController.php +++ b/app/Http/Controllers/Admin/HomeController.php @@ -57,16 +57,16 @@ class HomeController extends Controller public function index() { Log::channel('audit')->info('User visits admin index.'); - $title = (string) trans('firefly.administration'); + $title = (string)trans('firefly.administration'); $mainTitleIcon = 'fa-hand-spock-o'; - $email = auth()->user()->email; - $pref = app('preferences')->get('remote_guard_alt_email', null); - if(null !== $pref && is_string($pref->data)) { + $email = auth()->user()->email; + $pref = app('preferences')->get('remote_guard_alt_email', null); + if (null !== $pref && is_string($pref->data)) { $email = $pref->data; } Log::debug('Email is ', [$email]); - return prefixView('admin.index', compact('title', 'mainTitleIcon','email')); + return prefixView('admin.index', compact('title', 'mainTitleIcon', 'email')); } /** @@ -84,7 +84,7 @@ class HomeController extends Controller $ipAddress = $request->ip(); Log::debug(sprintf('Now in testMessage() controller. IP is %s', $ipAddress)); event(new AdminRequestedTestMessage($user, $ipAddress)); - session()->flash('info', (string) trans('firefly.send_test_triggered')); + session()->flash('info', (string)trans('firefly.send_test_triggered')); return redirect(route('admin.index')); } diff --git a/app/Http/Controllers/Admin/LinkController.php b/app/Http/Controllers/Admin/LinkController.php index e59d2a3b2c..68256d93d6 100644 --- a/app/Http/Controllers/Admin/LinkController.php +++ b/app/Http/Controllers/Admin/LinkController.php @@ -31,6 +31,7 @@ use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Routing\Redirector; +use Illuminate\View\View; use Log; /** @@ -53,7 +54,7 @@ class LinkController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.administration')); + app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); $this->repository = app(LinkTypeRepositoryInterface::class); @@ -66,13 +67,13 @@ class LinkController extends Controller /** * Make a new link form. * - * @return Factory|\Illuminate\View\View + * @return Factory|View */ public function create() { Log::channel('audit')->info('User visits link index.'); - $subTitle = (string) trans('firefly.create_new_link_type'); + $subTitle = (string)trans('firefly.create_new_link_type'); $subTitleIcon = 'fa-link'; // put previous url in session if not redirect from store (not "create another"). @@ -89,22 +90,22 @@ class LinkController extends Controller * @param Request $request * @param LinkType $linkType * - * @return Factory|RedirectResponse|Redirector|\Illuminate\View\View + * @return Factory|RedirectResponse|Redirector|View */ public function delete(Request $request, LinkType $linkType) { if (!$linkType->editable) { - $request->session()->flash('error', (string) trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); + $request->session()->flash('error', (string)trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); return redirect(route('admin.links.index')); } Log::channel('audit')->info(sprintf('User wants to delete link type #%d', $linkType->id)); - $subTitle = (string) trans('firefly.delete_link_type', ['name' => $linkType->name]); + $subTitle = (string)trans('firefly.delete_link_type', ['name' => $linkType->name]); $otherTypes = $this->repository->get(); $count = $this->repository->countJournals($linkType); $moveTo = []; - $moveTo[0] = (string) trans('firefly.do_not_save_connection'); + $moveTo[0] = (string)trans('firefly.do_not_save_connection'); /** @var LinkType $otherType */ foreach ($otherTypes as $otherType) { @@ -131,10 +132,10 @@ class LinkController extends Controller { Log::channel('audit')->info(sprintf('User destroyed link type #%d', $linkType->id)); $name = $linkType->name; - $moveTo = $this->repository->findNull((int) $request->get('move_link_type_before_delete')); + $moveTo = $this->repository->findNull((int)$request->get('move_link_type_before_delete')); $this->repository->destroy($linkType, $moveTo); - $request->session()->flash('success', (string) trans('firefly.deleted_link_type', ['name' => $name])); + $request->session()->flash('success', (string)trans('firefly.deleted_link_type', ['name' => $name])); app('preferences')->mark(); return redirect($this->getPreviousUri('link-types.delete.uri')); @@ -146,16 +147,16 @@ class LinkController extends Controller * @param Request $request * @param LinkType $linkType * - * @return Factory|RedirectResponse|Redirector|\Illuminate\View\View + * @return Factory|RedirectResponse|Redirector|View */ public function edit(Request $request, LinkType $linkType) { if (!$linkType->editable) { - $request->session()->flash('error', (string) trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); + $request->session()->flash('error', (string)trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); return redirect(route('admin.links.index')); } - $subTitle = (string) trans('firefly.edit_link_type', ['name' => $linkType->name]); + $subTitle = (string)trans('firefly.edit_link_type', ['name' => $linkType->name]); $subTitleIcon = 'fa-link'; Log::channel('audit')->info(sprintf('User wants to edit link type #%d', $linkType->id)); @@ -172,11 +173,11 @@ class LinkController extends Controller /** * Show index of all links. * - * @return Factory|\Illuminate\View\View + * @return Factory|View */ public function index() { - $subTitle = (string) trans('firefly.journal_link_configuration'); + $subTitle = (string)trans('firefly.journal_link_configuration'); $subTitleIcon = 'fa-link'; $linkTypes = $this->repository->get(); @@ -195,11 +196,11 @@ class LinkController extends Controller * * @param LinkType $linkType * - * @return Factory|\Illuminate\View\View + * @return Factory|View */ public function show(LinkType $linkType) { - $subTitle = (string) trans('firefly.overview_for_link', ['name' => $linkType->name]); + $subTitle = (string)trans('firefly.overview_for_link', ['name' => $linkType->name]); $subTitleIcon = 'fa-link'; $links = $this->repository->getJournalLinks($linkType); @@ -226,9 +227,9 @@ class LinkController extends Controller Log::channel('audit')->info('User stored new link type.', $linkType->toArray()); - $request->session()->flash('success', (string) trans('firefly.stored_new_link_type', ['name' => $linkType->name])); + $request->session()->flash('success', (string)trans('firefly.stored_new_link_type', ['name' => $linkType->name])); $redirect = redirect($this->getPreviousUri('link-types.create.uri')); - if (1 === (int) $request->get('create_another')) { + if (1 === (int)$request->get('create_another')) { // set value so create routine will not overwrite URL: $request->session()->put('link-types.create.fromStore', true); @@ -250,7 +251,7 @@ class LinkController extends Controller public function update(LinkTypeFormRequest $request, LinkType $linkType) { if (!$linkType->editable) { - $request->session()->flash('error', (string) trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); + $request->session()->flash('error', (string)trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); return redirect(route('admin.links.index')); } @@ -264,10 +265,10 @@ class LinkController extends Controller Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data); - $request->session()->flash('success', (string) trans('firefly.updated_link_type', ['name' => $linkType->name])); + $request->session()->flash('success', (string)trans('firefly.updated_link_type', ['name' => $linkType->name])); app('preferences')->mark(); $redirect = redirect($this->getPreviousUri('link-types.edit.uri')); - if (1 === (int) $request->get('return_to_edit')) { + if (1 === (int)$request->get('return_to_edit')) { // set value so edit routine will not overwrite URL: $request->session()->put('link-types.edit.fromUpdate', true); diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 23d1e4e683..bae9542d46 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -48,7 +48,7 @@ class UserController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.administration')); + app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); $this->repository = app(UserRepositoryInterface::class); @@ -63,6 +63,7 @@ class UserController extends Controller /** * @param User $user + * * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|RedirectResponse|Redirector|\Illuminate\View\View */ public function delete(User $user) @@ -73,7 +74,7 @@ class UserController extends Controller return redirect(route('admin.users')); } - $subTitle = (string) trans('firefly.delete_user', ['email' => $user->email]); + $subTitle = (string)trans('firefly.delete_user', ['email' => $user->email]); return prefixView('admin.users.delete', compact('user', 'subTitle')); } @@ -93,7 +94,7 @@ class UserController extends Controller return redirect(route('admin.users')); } $this->repository->destroy($user); - session()->flash('success', (string) trans('firefly.user_deleted')); + session()->flash('success', (string)trans('firefly.user_deleted')); return redirect(route('admin.users')); } @@ -117,15 +118,15 @@ class UserController extends Controller } session()->forget('users.edit.fromUpdate'); - $subTitle = (string) trans('firefly.edit_user', ['email' => $user->email]); + $subTitle = (string)trans('firefly.edit_user', ['email' => $user->email]); $subTitleIcon = 'fa-user-o'; $currentUser = auth()->user(); $isAdmin = $this->repository->hasRole($user, 'owner'); $codes = [ - '' => (string) trans('firefly.no_block_code'), - 'bounced' => (string) trans('firefly.block_code_bounced'), - 'expired' => (string) trans('firefly.block_code_expired'), - 'email_changed' => (string) trans('firefly.block_code_email_changed'), + '' => (string)trans('firefly.no_block_code'), + 'bounced' => (string)trans('firefly.block_code_bounced'), + 'expired' => (string)trans('firefly.block_code_expired'), + 'email_changed' => (string)trans('firefly.block_code_email_changed'), ]; return prefixView('admin.users.edit', compact('user', 'canEditDetails', 'subTitle', 'subTitleIcon', 'codes', 'currentUser', 'isAdmin')); @@ -138,7 +139,7 @@ class UserController extends Controller */ public function index() { - $subTitle = (string) trans('firefly.user_administration'); + $subTitle = (string)trans('firefly.user_administration'); $subTitleIcon = 'fa-users'; $users = $this->repository->all(); @@ -162,9 +163,9 @@ class UserController extends Controller */ public function show(User $user) { - $title = (string) trans('firefly.administration'); + $title = (string)trans('firefly.administration'); $mainTitleIcon = 'fa-hand-spock-o'; - $subTitle = (string) trans('firefly.single_user_administration', ['email' => $user->email]); + $subTitle = (string)trans('firefly.single_user_administration', ['email' => $user->email]); $subTitleIcon = 'fa-user'; $information = $this->repository->getUserData($user); @@ -194,7 +195,7 @@ class UserController extends Controller Log::debug('Actually here'); $data = $request->getUserData(); - var_dump($data); + //var_dump($data); // update password if (array_key_exists('password', $data) && '' !== $data['password']) { @@ -211,10 +212,10 @@ class UserController extends Controller $this->repository->changeStatus($user, $data['blocked'], $data['blocked_code']); $this->repository->updateEmail($user, $data['email']); - session()->flash('success', (string) trans('firefly.updated_user', ['email' => $user->email])); + session()->flash('success', (string)trans('firefly.updated_user', ['email' => $user->email])); app('preferences')->mark(); $redirect = redirect($this->getPreviousUri('users.edit.uri')); - if (1 === (int) $request->get('return_to_edit')) { + if (1 === (int)$request->get('return_to_edit')) { // @codeCoverageIgnoreStart session()->put('users.edit.fromUpdate', true); diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index 9842a3eaa1..b17e8652a7 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -88,7 +88,7 @@ class ForgotPasswordController extends Controller $user = User::where('email', $request->get('email'))->first(); if (null !== $user && $repository->hasRole($user, 'demo')) { - return back()->withErrors(['email' => (string) trans('firefly.cannot_reset_demo_user')]); + return back()->withErrors(['email' => (string)trans('firefly.cannot_reset_demo_user')]); } // We will send the password reset link to this user. Once we have attempted @@ -125,7 +125,7 @@ class ForgotPasswordController extends Controller $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $userCount = User::count(); $allowRegistration = true; - $pageTitle = (string) trans('firefly.forgot_pw_page_title'); + $pageTitle = (string)trans('firefly.forgot_pw_page_title'); if (true === $singleUserMode && $userCount > 0) { $allowRegistration = false; } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index a77d6a3a88..f5f2c776fd 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -120,6 +120,64 @@ class LoginController extends Controller $this->sendFailedLoginResponse($request); } + /** + * Log the user out of the application. + * + * @param Request $request + * + * @return \Illuminate\Http\Response + */ + public function logout(Request $request) + { + $authGuard = config('firefly.authentication_guard'); + $logoutUri = config('firefly.custom_logout_uri'); + if ('remote_user_guard' === $authGuard && '' !== $logoutUri) { + return redirect($logoutUri); + } + if ('remote_user_guard' === $authGuard && '' === $logoutUri) { + session()->flash('error', trans('firefly.cant_logout_guard')); + } + + // also logout current 2FA tokens. + $cookieName = config('google2fa.cookie_name', 'google2fa_token'); + Cookie::forget($cookieName); + + $this->guard()->logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + if ($response = $this->loggedOut($request)) { + return $response; + } + + return $request->wantsJson() + ? new \Illuminate\Http\Response('', 204) + : redirect('/'); + } + + /** + * Get the failed login response instance. + * + * @param Request $request + * + * @return Response + * + * @throws ValidationException + */ + protected function sendFailedLoginResponse(Request $request) + { + $exception = ValidationException::withMessages( + [ + $this->username() => [trans('auth.failed')], + ] + ); + $exception->redirectTo = route('login'); + + throw $exception; + } + /** * Show the application's login form. * @@ -163,63 +221,4 @@ class LoginController extends Controller return prefixView('auth.login', compact('allowRegistration', 'email', 'remember', 'allowReset', 'title')); } - /** - * Get the failed login response instance. - * - * @param Request $request - * - * @return Response - * - * @throws ValidationException - */ - protected function sendFailedLoginResponse(Request $request) - { - $exception = ValidationException::withMessages( - [ - $this->username() => [trans('auth.failed')], - ] - ); - $exception->redirectTo = route('login'); - - throw $exception; - } - - - /** - * Log the user out of the application. - * - * @param \Illuminate\Http\Request $request - * - * @return \Illuminate\Http\Response - */ - public function logout(Request $request) - { - $authGuard = config('firefly.authentication_guard'); - $logoutUri = config('firefly.custom_logout_uri'); - if ('remote_user_guard' === $authGuard && '' !== $logoutUri) { - return redirect($logoutUri); - } - if ('remote_user_guard' === $authGuard && '' === $logoutUri) { - session()->flash('error', trans('firefly.cant_logout_guard')); - } - - // also logout current 2FA tokens. - $cookieName = config('google2fa.cookie_name', 'google2fa_token'); - Cookie::forget($cookieName); - - $this->guard()->logout(); - - $request->session()->invalidate(); - - $request->session()->regenerateToken(); - - if ($response = $this->loggedOut($request)) { - return $response; - } - - return $request->wantsJson() - ? new \Illuminate\Http\Response('', 204) - : redirect('/'); - } - } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index a7152d0b80..4f669d4c7b 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -108,7 +108,7 @@ class RegisterController extends Controller $this->guard()->login($user); - session()->flash('success', (string) trans('firefly.registered')); + session()->flash('success', (string)trans('firefly.registered')); $this->registered($request, $user); @@ -132,7 +132,7 @@ class RegisterController extends Controller $isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $userCount = User::count(); - $pageTitle = (string) trans('firefly.register_page_title'); + $pageTitle = (string)trans('firefly.register_page_title'); if (true === $isDemoSite) { $allowRegistration = false; diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index fd0b9c0f07..99a4a456b1 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -32,6 +32,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Password; +use Illuminate\Validation\ValidationException; use Illuminate\View\View; /** @@ -76,7 +77,7 @@ class ResetPasswordController extends Controller * @param Request $request * * @return Factory|JsonResponse|RedirectResponse|View - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException * */ public function reset(Request $request) @@ -137,7 +138,7 @@ class ResetPasswordController extends Controller $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $userCount = User::count(); $allowRegistration = true; - $pageTitle = (string) trans('firefly.reset_pw_page_title'); + $pageTitle = (string)trans('firefly.reset_pw_page_title'); if (true === $singleUserMode && $userCount > 0) { $allowRegistration = false; } diff --git a/app/Http/Controllers/Auth/TwoFactorController.php b/app/Http/Controllers/Auth/TwoFactorController.php index 2bf8164b84..753e4aeb3a 100644 --- a/app/Http/Controllers/Auth/TwoFactorController.php +++ b/app/Http/Controllers/Auth/TwoFactorController.php @@ -45,7 +45,7 @@ class TwoFactorController extends Controller /** @var User $user */ $user = auth()->user(); $siteOwner = config('firefly.site_owner'); - $title = (string) trans('firefly.two_factor_forgot_title'); + $title = (string)trans('firefly.two_factor_forgot_title'); return prefixView('auth.lost-two-factor', compact('user', 'siteOwner', 'title')); } @@ -96,20 +96,26 @@ class TwoFactorController extends Controller } /** + * Each MFA history has a timestamp and a code, saving the MFA entries for 5 minutes. So if the + * submitted MFA code has been submitted in the last 5 minutes, it won't work despite being valid. + * * @param string $mfaCode + * @param array $mfaHistory + * + * @return bool */ - private function addToMFAHistory(string $mfaCode): void + private function inMFAHistory(string $mfaCode, array $mfaHistory): bool { - /** @var array $mfaHistory */ - $mfaHistory = Preferences::get('mfa_history', [])->data; - $entry = [ - 'time' => time(), - 'code' => $mfaCode, - ]; - $mfaHistory[] = $entry; + $now = time(); + foreach ($mfaHistory as $entry) { + $time = $entry['time']; + $code = $entry['code']; + if ($code === $mfaCode && $now - $time <= 300) { + return true; + } + } - Preferences::set('mfa_history', $mfaHistory); - $this->filterMFAHistory(); + return false; } /** @@ -135,26 +141,20 @@ class TwoFactorController extends Controller } /** - * Each MFA history has a timestamp and a code, saving the MFA entries for 5 minutes. So if the - * submitted MFA code has been submitted in the last 5 minutes, it won't work despite being valid. - * * @param string $mfaCode - * @param array $mfaHistory - * - * @return bool */ - private function inMFAHistory(string $mfaCode, array $mfaHistory): bool + private function addToMFAHistory(string $mfaCode): void { - $now = time(); - foreach ($mfaHistory as $entry) { - $time = $entry['time']; - $code = $entry['code']; - if ($code === $mfaCode && $now - $time <= 300) { - return true; - } - } + /** @var array $mfaHistory */ + $mfaHistory = Preferences::get('mfa_history', [])->data; + $entry = [ + 'time' => time(), + 'code' => $mfaCode, + ]; + $mfaHistory[] = $entry; - return false; + Preferences::set('mfa_history', $mfaHistory); + $this->filterMFAHistory(); } /** diff --git a/app/Http/Controllers/Bill/CreateController.php b/app/Http/Controllers/Bill/CreateController.php index f39a91c7e7..3b05ee956a 100644 --- a/app/Http/Controllers/Bill/CreateController.php +++ b/app/Http/Controllers/Bill/CreateController.php @@ -30,8 +30,11 @@ use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\BillStoreRequest; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use Illuminate\Contracts\Foundation\Application; +use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\View\View; /** * Class CreateController @@ -52,7 +55,7 @@ class CreateController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.bills')); + app('view')->share('title', (string)trans('firefly.bills')); app('view')->share('mainTitleIcon', 'fa-calendar-o'); $this->attachments = app(AttachmentHelperInterface::class); $this->repository = app(BillRepositoryInterface::class); @@ -67,7 +70,7 @@ class CreateController extends Controller * * @param Request $request * - * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @return Application|Factory|View */ public function create(Request $request) { @@ -75,9 +78,9 @@ class CreateController extends Controller /** @var array $billPeriods */ $billPeriods = config('firefly.bill_periods'); foreach ($billPeriods as $current) { - $periods[$current] = (string) trans('firefly.repeat_freq_' . $current); + $periods[$current] = (string)trans('firefly.repeat_freq_' . $current); } - $subTitle = (string) trans('firefly.create_new_bill'); + $subTitle = (string)trans('firefly.create_new_bill'); $defaultCurrency = app('amount')->getDefaultCurrency(); // put previous url in session if not redirect from store (not "create another"). @@ -105,11 +108,11 @@ class CreateController extends Controller $bill = $this->repository->store($billData); } catch (FireflyException $e) { Log::error($e->getMessage()); - $request->session()->flash('error', (string) trans('firefly.bill_store_error')); + $request->session()->flash('error', (string)trans('firefly.bill_store_error')); return redirect(route('bills.create'))->withInput(); } - $request->session()->flash('success', (string) trans('firefly.stored_new_bill', ['name' => $bill->name])); + $request->session()->flash('success', (string)trans('firefly.stored_new_bill', ['name' => $bill->name])); app('preferences')->mark(); /** @var array $files */ @@ -118,7 +121,7 @@ class CreateController extends Controller $this->attachments->saveAttachmentsForModel($bill, $files); } if (null !== $files && auth()->user()->hasRole('demo')) { - session()->flash('info', (string) trans('firefly.no_att_demo_user')); + session()->flash('info', (string)trans('firefly.no_att_demo_user')); } if (count($this->attachments->getMessages()->get('attachments')) > 0) { diff --git a/app/Http/Controllers/Bill/DeleteController.php b/app/Http/Controllers/Bill/DeleteController.php index ee1ef297fb..634a40cc56 100644 --- a/app/Http/Controllers/Bill/DeleteController.php +++ b/app/Http/Controllers/Bill/DeleteController.php @@ -54,7 +54,7 @@ class DeleteController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.bills')); + app('view')->share('title', (string)trans('firefly.bills')); app('view')->share('mainTitleIcon', 'fa-calendar-o'); $this->repository = app(BillRepositoryInterface::class); @@ -62,6 +62,7 @@ class DeleteController extends Controller } ); } + /** * Delete a bill. * @@ -73,7 +74,7 @@ class DeleteController extends Controller { // put previous url in session $this->rememberPreviousUri('bills.delete.uri'); - $subTitle = (string) trans('firefly.delete_bill', ['name' => $bill->name]); + $subTitle = (string)trans('firefly.delete_bill', ['name' => $bill->name]); return prefixView('bills.delete', compact('bill', 'subTitle')); } @@ -91,7 +92,7 @@ class DeleteController extends Controller $name = $bill->name; $this->repository->destroy($bill); - $request->session()->flash('success', (string) trans('firefly.deleted_bill', ['name' => $name])); + $request->session()->flash('success', (string)trans('firefly.deleted_bill', ['name' => $name])); app('preferences')->mark(); return redirect($this->getPreviousUri('bills.delete.uri')); diff --git a/app/Http/Controllers/Bill/EditController.php b/app/Http/Controllers/Bill/EditController.php index 691d9a7038..37ec000360 100644 --- a/app/Http/Controllers/Bill/EditController.php +++ b/app/Http/Controllers/Bill/EditController.php @@ -30,8 +30,11 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\BillUpdateRequest; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use Illuminate\Contracts\Foundation\Application; +use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\View\View; /** * Class EditController @@ -52,7 +55,7 @@ class EditController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.bills')); + app('view')->share('title', (string)trans('firefly.bills')); app('view')->share('mainTitleIcon', 'fa-calendar-o'); $this->attachments = app(AttachmentHelperInterface::class); $this->repository = app(BillRepositoryInterface::class); @@ -69,7 +72,7 @@ class EditController extends Controller * @param Request $request * @param Bill $bill * - * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @return Application|Factory|View */ public function edit(Request $request, Bill $bill) { @@ -78,10 +81,10 @@ class EditController extends Controller $billPeriods = config('firefly.bill_periods'); foreach ($billPeriods as $current) { - $periods[$current] = (string) trans('firefly.' . $current); + $periods[$current] = (string)trans('firefly.' . $current); } - $subTitle = (string) trans('firefly.edit_bill', ['name' => $bill->name]); + $subTitle = (string)trans('firefly.edit_bill', ['name' => $bill->name]); // put previous url in session if not redirect from store (not "return_to_edit"). if (true !== session('bills.edit.fromUpdate')) { @@ -89,8 +92,8 @@ class EditController extends Controller } $currency = app('amount')->getDefaultCurrency(); - $bill->amount_min = round((float) $bill->amount_min, $currency->decimal_places); - $bill->amount_max = round((float) $bill->amount_max, $currency->decimal_places); + $bill->amount_min = round((float)$bill->amount_min, $currency->decimal_places); + $bill->amount_max = round((float)$bill->amount_max, $currency->decimal_places); $rules = $this->repository->getRulesForBill($bill); $defaultCurrency = app('amount')->getDefaultCurrency(); @@ -100,7 +103,7 @@ class EditController extends Controller $preFilled = [ 'notes' => $this->repository->getNoteText($bill), 'transaction_currency_id' => $bill->transaction_currency_id, - 'active' => $hasOldInput ? (bool) $request->old('active') : $bill->active, + 'active' => $hasOldInput ? (bool)$request->old('active') : $bill->active, 'object_group' => $bill->objectGroups->first() ? $bill->objectGroups->first()->title : '', ]; @@ -115,7 +118,7 @@ class EditController extends Controller * Update a bill. * * @param BillUpdateRequest $request - * @param Bill $bill + * @param Bill $bill * * @return RedirectResponse */ @@ -124,7 +127,7 @@ class EditController extends Controller $billData = $request->getBillData(); $bill = $this->repository->update($bill, $billData); - $request->session()->flash('success', (string) trans('firefly.updated_bill', ['name' => $bill->name])); + $request->session()->flash('success', (string)trans('firefly.updated_bill', ['name' => $bill->name])); app('preferences')->mark(); /** @var array $files */ @@ -133,7 +136,7 @@ class EditController extends Controller $this->attachments->saveAttachmentsForModel($bill, $files); } if (null !== $files && auth()->user()->hasRole('demo')) { - session()->flash('info',(string)trans('firefly.no_att_demo_user')); + session()->flash('info', (string)trans('firefly.no_att_demo_user')); } // flash messages @@ -142,7 +145,7 @@ class EditController extends Controller } $redirect = redirect($this->getPreviousUri('bills.edit.uri')); - if (1 === (int) $request->get('return_to_edit')) { + if (1 === (int)$request->get('return_to_edit')) { // @codeCoverageIgnoreStart $request->session()->put('bills.edit.fromUpdate', true); diff --git a/app/Http/Controllers/Bill/IndexController.php b/app/Http/Controllers/Bill/IndexController.php index ab5c394c71..84b15d9e4f 100644 --- a/app/Http/Controllers/Bill/IndexController.php +++ b/app/Http/Controllers/Bill/IndexController.php @@ -57,7 +57,7 @@ class IndexController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.bills')); + app('view')->share('title', (string)trans('firefly.bills')); app('view')->share('mainTitleIcon', 'fa-calendar-o'); $this->repository = app(BillRepositoryInterface::class); @@ -96,7 +96,7 @@ class IndexController extends Controller $bills = [ 0 => [ // the index is the order, not the ID. 'object_group_id' => 0, - 'object_group_title' => (string) trans('firefly.default_group_title_name'), + 'object_group_title' => (string)trans('firefly.default_group_title_name'), 'bills' => [], ], ]; @@ -105,7 +105,7 @@ class IndexController extends Controller /** @var Bill $bill */ foreach ($collection as $bill) { $array = $transformer->transform($bill); - $groupOrder = (int) $array['object_group_order']; + $groupOrder = (int)$array['object_group_order']; // make group array if necessary: $bills[$groupOrder] = $bills[$groupOrder] ?? [ 'object_group_id' => $array['object_group_id'], @@ -179,8 +179,8 @@ class IndexController extends Controller ]; // only fill in avg when bill is active. if (count($bill['pay_dates']) > 0) { - $avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2'); - $avg = bcmul($avg, (string) count($bill['pay_dates'])); + $avg = bcdiv(bcadd((string)$bill['amount_min'], (string)$bill['amount_max']), '2'); + $avg = bcmul($avg, (string)count($bill['pay_dates'])); $sums[$groupOrder][$currencyId]['avg'] = bcadd($sums[$groupOrder][$currencyId]['avg'], $avg); } // fill in per period regardless: @@ -199,7 +199,7 @@ class IndexController extends Controller */ private function amountPerPeriod(array $bill, string $range): string { - $avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2'); + $avg = bcdiv(bcadd((string)$bill['amount_min'], (string)$bill['amount_max']), '2'); Log::debug(sprintf('Amount per period for bill #%d "%s"', $bill['id'], $bill['name'])); Log::debug(sprintf(sprintf('Average is %s', $avg))); @@ -211,7 +211,7 @@ class IndexController extends Controller 'monthly' => '12', 'weekly' => '52.17', ]; - $yearAmount = bcmul($avg, bcdiv($multiplies[$bill['repeat_freq']], (string)($bill['skip'] + 1))); + $yearAmount = bcmul($avg, bcdiv($multiplies[$bill['repeat_freq']], (string)($bill['skip'] + 1))); Log::debug(sprintf('Amount per year is %s (%s * %s / %s)', $yearAmount, $avg, $multiplies[$bill['repeat_freq']], (string)($bill['skip'] + 1))); // per period: @@ -230,31 +230,9 @@ class IndexController extends Controller return $perPeriod; } - /** - * Set the order of a bill. - * - * @param Request $request - * @param Bill $bill - * - * @return JsonResponse - */ - public function setOrder(Request $request, Bill $bill): JsonResponse - { - $objectGroupTitle = (string) $request->get('objectGroupTitle'); - $newOrder = (int) $request->get('order'); - $this->repository->setOrder($bill, $newOrder); - if ('' !== $objectGroupTitle) { - $this->repository->setObjectGroup($bill, $objectGroupTitle); - } - if ('' === $objectGroupTitle) { - $this->repository->removeObjectGroup($bill); - } - - return response()->json(['data' => 'OK']); - } - /** * @param array $sums + * * @return array */ private function getTotals(array $sums): array @@ -289,4 +267,27 @@ class IndexController extends Controller return $totals; } + + /** + * Set the order of a bill. + * + * @param Request $request + * @param Bill $bill + * + * @return JsonResponse + */ + public function setOrder(Request $request, Bill $bill): JsonResponse + { + $objectGroupTitle = (string)$request->get('objectGroupTitle'); + $newOrder = (int)$request->get('order'); + $this->repository->setOrder($bill, $newOrder); + if ('' !== $objectGroupTitle) { + $this->repository->setObjectGroup($bill, $objectGroupTitle); + } + if ('' === $objectGroupTitle) { + $this->repository->removeObjectGroup($bill); + } + + return response()->json(['data' => 'OK']); + } } diff --git a/app/Http/Controllers/Bill/ShowController.php b/app/Http/Controllers/Bill/ShowController.php index 5197bb6cd4..c8c9484eaf 100644 --- a/app/Http/Controllers/Bill/ShowController.php +++ b/app/Http/Controllers/Bill/ShowController.php @@ -65,7 +65,7 @@ class ShowController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.bills')); + app('view')->share('title', (string)trans('firefly.bills')); app('view')->share('mainTitleIcon', 'fa-calendar-o'); $this->repository = app(BillRepositoryInterface::class); @@ -87,7 +87,7 @@ class ShowController extends Controller { $total = 0; if (false === $bill->active) { - $request->session()->flash('warning', (string) trans('firefly.cannot_scan_inactive_bill')); + $request->session()->flash('warning', (string)trans('firefly.cannot_scan_inactive_bill')); return redirect(route('bills.show', [$bill->id])); } @@ -97,7 +97,7 @@ class ShowController extends Controller $total = 0; } if (0 === $set->count()) { - $request->session()->flash('error', (string) trans('firefly.no_rules_for_bill')); + $request->session()->flash('error', (string)trans('firefly.no_rules_for_bill')); return redirect(route('bills.show', [$bill->id])); } @@ -113,7 +113,7 @@ class ShowController extends Controller // file the rule(s) $ruleEngine->fire(); - $request->session()->flash('success', (string) trans_choice('firefly.rescanned_bill', $total)); + $request->session()->flash('success', (string)trans_choice('firefly.rescanned_bill', $total)); app('preferences')->mark(); return redirect(route('bills.show', [$bill->id])); @@ -138,8 +138,8 @@ class ShowController extends Controller /** @var Carbon $end */ $end = session('end'); $year = $start->year; - $page = (int) $request->get('page'); - $pageSize = (int) app('preferences')->get('listPageSize', 50)->data; + $page = (int)$request->get('page'); + $pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $yearAverage = $this->repository->getYearAverage($bill, $start); $overallAverage = $this->repository->getOverallAverage($bill); $manager = new Manager(); diff --git a/app/Http/Controllers/Budget/AvailableBudgetController.php b/app/Http/Controllers/Budget/AvailableBudgetController.php index 72a6239d7a..e5d8d0f57a 100644 --- a/app/Http/Controllers/Budget/AvailableBudgetController.php +++ b/app/Http/Controllers/Budget/AvailableBudgetController.php @@ -58,7 +58,7 @@ class AvailableBudgetController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.budgets')); + app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('mainTitleIcon', 'fa-pie-chart'); $this->abRepository = app(AvailableBudgetRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class); @@ -95,7 +95,7 @@ class AvailableBudgetController extends Controller return redirect(route('available-budgets.edit', [$first->id])); } - $page = (int) ($request->get('page') ?? 1); + $page = (int)($request->get('page') ?? 1); return prefixView('budgets.available-budgets.create', compact('start', 'end', 'page', 'currency')); } @@ -129,7 +129,7 @@ class AvailableBudgetController extends Controller ); - $page = (int) ($request->get('page') ?? 1); + $page = (int)($request->get('page') ?? 1); return prefixView('budgets.available-budgets.create-alternative', compact('start', 'end', 'page', 'currencies')); } @@ -157,7 +157,8 @@ class AvailableBudgetController extends Controller */ public function edit(AvailableBudget $availableBudget, Carbon $start, Carbon $end) { - $availableBudget->amount = number_format((float) $availableBudget->amount, $availableBudget->transactionCurrency->decimal_places, '.', ''); + $availableBudget->amount = number_format((float)$availableBudget->amount, $availableBudget->transactionCurrency->decimal_places, '.', ''); + return prefixView('budgets.available-budgets.edit', compact('availableBudget', 'start', 'end')); } @@ -179,7 +180,7 @@ class AvailableBudgetController extends Controller } // validate amount - $amount = (string) $request->get('amount'); + $amount = (string)$request->get('amount'); if ('' === $amount) { session()->flash('error', trans('firefly.invalid_amount')); @@ -192,7 +193,7 @@ class AvailableBudgetController extends Controller } // find currency - $currency = $this->currencyRepos->find((int) $request->get('currency_id')); + $currency = $this->currencyRepos->find((int)$request->get('currency_id')); if (null === $currency) { session()->flash('error', trans('firefly.invalid_currency')); @@ -205,10 +206,10 @@ class AvailableBudgetController extends Controller if (null === $existing) { $this->abRepository->store( [ - 'amount' => $amount, - 'currency' => $currency, - 'start' => $start, - 'end' => $end, + 'amount' => $amount, + 'currency_id' => $currency->id, + 'start' => $start, + 'end' => $end, ] ); } @@ -233,7 +234,7 @@ class AvailableBudgetController extends Controller public function update(Request $request, AvailableBudget $availableBudget, Carbon $start, Carbon $end) { // validate amount - $amount = (string) $request->get('amount'); + $amount = (string)$request->get('amount'); if ('' === $amount) { session()->flash('error', trans('firefly.invalid_amount')); diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php index e842a68460..552733d74f 100644 --- a/app/Http/Controllers/Json/AutoCompleteController.php +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -50,7 +50,7 @@ class AutoCompleteController extends Controller */ public function allJournalsWithID(Request $request): JsonResponse { - $search = (string) $request->get('search'); + $search = (string)$request->get('search'); /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepositoryInterface::class); @@ -61,7 +61,7 @@ class AutoCompleteController extends Controller $array = []; if (is_numeric($search)) { // search for group, not journal. - $firstResult = $groupRepos->find((int) $search); + $firstResult = $groupRepos->find((int)$search); if (null !== $firstResult) { // group may contain multiple journals, each a result: foreach ($firstResult->transactionJournals as $journal) { diff --git a/app/Http/Controllers/Json/BoxController.php b/app/Http/Controllers/Json/BoxController.php index 31fd5e9d4b..98df9ede43 100644 --- a/app/Http/Controllers/Json/BoxController.php +++ b/app/Http/Controllers/Json/BoxController.php @@ -69,7 +69,7 @@ class BoxController extends Controller $end = session('end', Carbon::now()->endOfMonth()); $today = today(config('app.timezone')); $display = 2; // see method docs. - $boxTitle = (string) trans('firefly.spent'); + $boxTitle = (string)trans('firefly.spent'); $cache = new CacheProperties; $cache->addProperty($start); @@ -96,21 +96,21 @@ class BoxController extends Controller // spent in this period, in budgets, for default currency. // also calculate spent per day. $spent = $opsRepository->sumExpenses($start, $end, null, null, $currency); - $spentAmount = $spent[(int) $currency->id]['sum'] ?? '0'; + $spentAmount = $spent[(int)$currency->id]['sum'] ?? '0'; - $days = $today->between($start, $end) ? $today->diffInDays($start) + 1 : $end->diffInDays($start) + 1; - $spentPerDay = bcdiv($spentAmount, (string) $days); + $days = $today->between($start, $end) ? $today->diffInDays($start) + 1 : $end->diffInDays($start) + 1; + $spentPerDay = bcdiv($spentAmount, (string)$days); if ($availableBudgets->count() > 0) { $display = 0; // assume user overspent - $boxTitle = (string) trans('firefly.overspent'); - $totalAvailableSum = (string) $availableBudgets->sum('amount'); + $boxTitle = (string)trans('firefly.overspent'); + $totalAvailableSum = (string)$availableBudgets->sum('amount'); // calculate with available budget. $leftToSpendAmount = bcadd($totalAvailableSum, $spentAmount); if (1 === bccomp($leftToSpendAmount, '0')) { - $boxTitle = (string) trans('firefly.left_to_spend'); + $boxTitle = (string)trans('firefly.left_to_spend'); $days = $today->diffInDays($end) + 1; $display = 1; // not overspent - $leftPerDayAmount = bcdiv($leftToSpendAmount, (string) $days); + $leftPerDayAmount = bcdiv($leftToSpendAmount, (string)$days); } } @@ -164,7 +164,7 @@ class BoxController extends Controller $set = $collector->getExtractedJournals(); /** @var array $journal */ foreach ($set as $journal) { - $currencyId = (int) $journal['currency_id']; + $currencyId = (int)$journal['currency_id']; $amount = $journal['amount'] ?? '0'; $incomes[$currencyId] = $incomes[$currencyId] ?? '0'; $incomes[$currencyId] = bcadd($incomes[$currencyId], app('steam')->positive($amount)); @@ -180,7 +180,7 @@ class BoxController extends Controller $set = $collector->getExtractedJournals(); /** @var array $journal */ foreach ($set as $journal) { - $currencyId = (int) $journal['currency_id']; + $currencyId = (int)$journal['currency_id']; $expenses[$currencyId] = $expenses[$currencyId] ?? '0'; $expenses[$currencyId] = bcadd($expenses[$currencyId], $journal['amount'] ?? '0'); $sums[$currencyId] = $sums[$currencyId] ?? '0'; diff --git a/app/Http/Controllers/Json/BudgetController.php b/app/Http/Controllers/Json/BudgetController.php index 93aade6c00..ff5bbc7814 100644 --- a/app/Http/Controllers/Json/BudgetController.php +++ b/app/Http/Controllers/Json/BudgetController.php @@ -42,6 +42,7 @@ use Illuminate\Http\JsonResponse; class BudgetController extends Controller { use DateCalculation; + /** @var AvailableBudgetRepositoryInterface */ private $abRepository; /** @var BudgetLimitRepositoryInterface */ @@ -64,7 +65,7 @@ class BudgetController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.budgets')); + app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('mainTitleIcon', 'fa-pie-chart'); $this->repository = app(BudgetRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class); diff --git a/app/Http/Controllers/Json/IntroController.php b/app/Http/Controllers/Json/IntroController.php index f0c92f55bd..1f28f3a82a 100644 --- a/app/Http/Controllers/Json/IntroController.php +++ b/app/Http/Controllers/Json/IntroController.php @@ -115,7 +115,7 @@ class IntroController app('preferences')->set($key, false); app('preferences')->mark(); - return response()->json(['message' => (string) trans('firefly.intro_boxes_after_refresh')]); + return response()->json(['message' => (string)trans('firefly.intro_boxes_after_refresh')]); } /** diff --git a/app/Http/Controllers/Json/ReconcileController.php b/app/Http/Controllers/Json/ReconcileController.php index 948b5dc720..fdcea33607 100644 --- a/app/Http/Controllers/Json/ReconcileController.php +++ b/app/Http/Controllers/Json/ReconcileController.php @@ -64,7 +64,7 @@ class ReconcileController extends Controller $this->middleware( function ($request, $next) { app('view')->share('mainTitleIcon', 'fa-credit-card'); - app('view')->share('title', (string) trans('firefly.accounts')); + app('view')->share('title', (string)trans('firefly.accounts')); $this->repository = app(JournalRepositoryInterface::class); $this->accountRepos = app(AccountRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class); @@ -172,61 +172,6 @@ class ReconcileController extends Controller return response()->json($return); } - - /** - * Returns a list of transactions in a modal. - * - * @param Account $account - * @param Carbon $start - * @param Carbon $end - * - * @return mixed - * - */ - public function transactions(Account $account, Carbon $start, Carbon $end) - { - if ($end->lt($start)) { - [$end, $start] = [$start, $end]; - } - $startDate = clone $start; - $startDate->subDay(); - - $currency = $this->accountRepos->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency(); - $startBalance = round((float) app('steam')->balance($account, $startDate), $currency->decimal_places); - $endBalance = round((float) app('steam')->balance($account, $end), $currency->decimal_places); - - // get the transactions - $selectionStart = clone $start; - $selectionStart->subDays(3); - $selectionEnd = clone $end; - $selectionEnd->addDays(3); - - // grab transactions: - /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollectorInterface::class); - - $collector->setAccounts(new Collection([$account])) - ->setRange($selectionStart, $selectionEnd) - ->withBudgetInformation()->withCategoryInformation()->withAccountInformation(); - $array = $collector->getExtractedJournals(); - $journals = $this->processTransactions($account, $array); - - try { - $html = prefixView( - 'accounts.reconcile.transactions', - compact('account', 'journals', 'currency', 'start', 'end', 'selectionStart', 'selectionEnd') - )->render(); - // @codeCoverageIgnoreStart - } catch (Throwable $e) { - Log::debug(sprintf('Could not render: %s', $e->getMessage())); - $html = sprintf('Could not render accounts.reconcile.transactions: %s', $e->getMessage()); - } - - // @codeCoverageIgnoreEnd - - return response()->json(['html' => $html, 'startBalance' => $startBalance, 'endBalance' => $endBalance]); - } - /** * @param Account $account * @param TransactionCurrency $currency @@ -267,11 +212,66 @@ class ReconcileController extends Controller return $amount; } + /** + * Returns a list of transactions in a modal. + * + * @param Account $account + * @param Carbon $start + * @param Carbon $end + * + * @return mixed + * + */ + public function transactions(Account $account, Carbon $start, Carbon $end) + { + if ($end->lt($start)) { + [$end, $start] = [$start, $end]; + } + $startDate = clone $start; + $startDate->subDay(); + + $currency = $this->accountRepos->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency(); + $startBalance = round((float)app('steam')->balance($account, $startDate), $currency->decimal_places); + $endBalance = round((float)app('steam')->balance($account, $end), $currency->decimal_places); + + // get the transactions + $selectionStart = clone $start; + $selectionStart->subDays(3); + $selectionEnd = clone $end; + $selectionEnd->addDays(3); + + // grab transactions: + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + + $collector->setAccounts(new Collection([$account])) + ->setRange($selectionStart, $selectionEnd) + ->withBudgetInformation()->withCategoryInformation()->withAccountInformation(); + $array = $collector->getExtractedJournals(); + $journals = $this->processTransactions($account, $array); + + try { + $html = prefixView( + 'accounts.reconcile.transactions', + compact('account', 'journals', 'currency', 'start', 'end', 'selectionStart', 'selectionEnd') + )->render(); + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + Log::debug(sprintf('Could not render: %s', $e->getMessage())); + $html = sprintf('Could not render accounts.reconcile.transactions: %s', $e->getMessage()); + } + + // @codeCoverageIgnoreEnd + + return response()->json(['html' => $html, 'startBalance' => $startBalance, 'endBalance' => $endBalance]); + } + /** * "fix" amounts to make it easier on the reconciliation overview: * * @param Account $account * @param array $array + * * @return array */ private function processTransactions(Account $account, array $array): array @@ -305,6 +305,7 @@ class ReconcileController extends Controller $journals[] = $journal; } + return $journals; } } diff --git a/app/Http/Controllers/Json/RecurrenceController.php b/app/Http/Controllers/Json/RecurrenceController.php index 451c2a7169..3c647a4682 100644 --- a/app/Http/Controllers/Json/RecurrenceController.php +++ b/app/Http/Controllers/Json/RecurrenceController.php @@ -63,9 +63,9 @@ class RecurrenceController extends Controller * * @param Request $request * - * @throws FireflyException * @return JsonResponse * + * @throws FireflyException */ public function events(Request $request): JsonResponse { @@ -73,10 +73,10 @@ class RecurrenceController extends Controller $start = Carbon::createFromFormat('Y-m-d', $request->get('start')); $end = Carbon::createFromFormat('Y-m-d', $request->get('end')); $firstDate = Carbon::createFromFormat('Y-m-d', $request->get('first_date')); - $endDate = '' !== (string) $request->get('end_date') ? Carbon::createFromFormat('Y-m-d', $request->get('end_date')) : null; - $endsAt = (string) $request->get('ends'); + $endDate = '' !== (string)$request->get('end_date') ? Carbon::createFromFormat('Y-m-d', $request->get('end_date')) : null; + $endsAt = (string)$request->get('ends'); $repetitionType = explode(',', $request->get('type'))[0]; - $repetitions = (int) $request->get('reps'); + $repetitions = (int)$request->get('reps'); $repetitionMoment = ''; $start->startOfDay(); @@ -100,8 +100,8 @@ class RecurrenceController extends Controller $repetition = new RecurrenceRepetition; $repetition->repetition_type = $repetitionType; $repetition->repetition_moment = $repetitionMoment; - $repetition->repetition_skip = (int) $request->get('skip'); - $repetition->weekend = (int) $request->get('weekend'); + $repetition->repetition_skip = (int)$request->get('skip'); + $repetition->weekend = (int)$request->get('weekend'); $actualEnd = clone $end; switch ($endsAt) { @@ -151,30 +151,30 @@ class RecurrenceController extends Controller $string = $request->get('date') ?? date('Y-m-d'); $today = Carbon::now()->startOfDay(); $date = Carbon::createFromFormat('Y-m-d', $string)->startOfDay(); - $preSelected = (string) $request->get('pre_select'); - $locale = app('steam')->getLocale(); + $preSelected = (string)$request->get('pre_select'); + $locale = app('steam')->getLocale(); Log::debug(sprintf('date = %s, today = %s. date > today? %s', $date->toAtomString(), $today->toAtomString(), var_export($date > $today, true))); - Log::debug(sprintf('past = true? %s', var_export('true' === (string) $request->get('past'), true))); + Log::debug(sprintf('past = true? %s', var_export('true' === (string)$request->get('past'), true))); $result = []; - if ($date > $today || 'true' === (string) $request->get('past')) { + if ($date > $today || 'true' === (string)$request->get('past')) { Log::debug('Will fill dropdown.'); $weekly = sprintf('weekly,%s', $date->dayOfWeekIso); $monthly = sprintf('monthly,%s', $date->day); - $dayOfWeek = (string) trans(sprintf('config.dow_%s', $date->dayOfWeekIso)); + $dayOfWeek = (string)trans(sprintf('config.dow_%s', $date->dayOfWeekIso)); $ndom = sprintf('ndom,%s,%s', $date->weekOfMonth, $date->dayOfWeekIso); $yearly = sprintf('yearly,%s', $date->format('Y-m-d')); - $yearlyDate = $date->formatLocalized((string) trans('config.month_and_day_no_year', [], $locale)); + $yearlyDate = $date->formatLocalized((string)trans('config.month_and_day_no_year', [], $locale)); $result = [ - 'daily' => ['label' => (string) trans('firefly.recurring_daily'), 'selected' => 0 === strpos($preSelected, 'daily')], - $weekly => ['label' => (string) trans('firefly.recurring_weekly', ['weekday' => $dayOfWeek]), + 'daily' => ['label' => (string)trans('firefly.recurring_daily'), 'selected' => 0 === strpos($preSelected, 'daily')], + $weekly => ['label' => (string)trans('firefly.recurring_weekly', ['weekday' => $dayOfWeek]), 'selected' => 0 === strpos($preSelected, 'weekly')], - $monthly => ['label' => (string) trans('firefly.recurring_monthly', ['dayOfMonth' => $date->day]), + $monthly => ['label' => (string)trans('firefly.recurring_monthly', ['dayOfMonth' => $date->day]), 'selected' => 0 === strpos($preSelected, 'monthly')], - $ndom => ['label' => (string) trans('firefly.recurring_ndom', ['weekday' => $dayOfWeek, 'dayOfMonth' => $date->weekOfMonth]), + $ndom => ['label' => (string)trans('firefly.recurring_ndom', ['weekday' => $dayOfWeek, 'dayOfMonth' => $date->weekOfMonth]), 'selected' => 0 === strpos($preSelected, 'ndom')], - $yearly => ['label' => (string) trans('firefly.recurring_yearly', ['date' => $yearlyDate]), + $yearly => ['label' => (string)trans('firefly.recurring_yearly', ['date' => $yearlyDate]), 'selected' => 0 === strpos($preSelected, 'yearly')], ]; } diff --git a/app/Http/Controllers/Json/RuleController.php b/app/Http/Controllers/Json/RuleController.php index 4d24d91fca..5a070e7b29 100644 --- a/app/Http/Controllers/Json/RuleController.php +++ b/app/Http/Controllers/Json/RuleController.php @@ -44,11 +44,11 @@ class RuleController extends Controller */ public function action(Request $request): JsonResponse { - $count = (int) $request->get('count') > 0 ? (int) $request->get('count') : 1; + $count = (int)$request->get('count') > 0 ? (int)$request->get('count') : 1; $keys = array_keys(config('firefly.rule-actions')); $actions = []; foreach ($keys as $key) { - $actions[$key] = (string) trans('firefly.rule_action_' . $key . '_choice'); + $actions[$key] = (string)trans('firefly.rule_action_' . $key . '_choice'); } try { $view = prefixView('rules.partials.action', compact('actions', 'count'))->render(); @@ -72,13 +72,13 @@ class RuleController extends Controller */ public function trigger(Request $request): JsonResponse { - $count = (int) $request->get('count') > 0 ? (int) $request->get('count') : 1; + $count = (int)$request->get('count') > 0 ? (int)$request->get('count') : 1; $operators = config('firefly.search.operators'); $triggers = []; foreach ($operators as $key => $operator) { if ('user_action' !== $key && false === $operator['alias']) { - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); } } asort($triggers); diff --git a/app/Http/Controllers/Rule/CreateController.php b/app/Http/Controllers/Rule/CreateController.php index 880bcc7838..d993936df4 100644 --- a/app/Http/Controllers/Rule/CreateController.php +++ b/app/Http/Controllers/Rule/CreateController.php @@ -59,7 +59,7 @@ class CreateController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.rules')); + app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('mainTitleIcon', 'fa-random'); $this->ruleRepos = app(RuleRepositoryInterface::class); @@ -88,7 +88,7 @@ class CreateController extends Controller $oldActions = []; // build triggers from query, if present. - $query = (string) $request->get('from_query'); + $query = (string)$request->get('from_query'); if ('' !== $query) { $search = app(SearchInterface::class); $search->parseQuery($query); @@ -112,9 +112,9 @@ class CreateController extends Controller $subTitleIcon = 'fa-clone'; // title depends on whether or not there is a rule group: - $subTitle = (string) trans('firefly.make_new_rule_no_group'); + $subTitle = (string)trans('firefly.make_new_rule_no_group'); if (null !== $ruleGroup) { - $subTitle = (string) trans('firefly.make_new_rule', ['title' => $ruleGroup->title]); + $subTitle = (string)trans('firefly.make_new_rule', ['title' => $ruleGroup->title]); } // flash old data @@ -142,14 +142,14 @@ class CreateController extends Controller */ public function createFromBill(Request $request, Bill $bill) { - $request->session()->flash('info', (string) trans('firefly.instructions_rule_from_bill', ['name' => e($bill->name)])); + $request->session()->flash('info', (string)trans('firefly.instructions_rule_from_bill', ['name' => e($bill->name)])); $this->createDefaultRuleGroup(); $this->createDefaultRule(); $preFilled = [ 'strict' => true, - 'title' => (string) trans('firefly.new_rule_for_bill_title', ['name' => $bill->name]), - 'description' => (string) trans('firefly.new_rule_for_bill_description', ['name' => $bill->name]), + 'title' => (string)trans('firefly.new_rule_for_bill_title', ['name' => $bill->name]), + 'description' => (string)trans('firefly.new_rule_for_bill_description', ['name' => $bill->name]), ]; // make triggers and actions from the bill itself. @@ -169,7 +169,7 @@ class CreateController extends Controller $subTitleIcon = 'fa-clone'; // title depends on whether or not there is a rule group: - $subTitle = (string) trans('firefly.make_new_rule_no_group'); + $subTitle = (string)trans('firefly.make_new_rule_no_group'); // flash old data $request->session()->flash('preFilled', $preFilled); @@ -192,10 +192,10 @@ class CreateController extends Controller */ public function createFromJournal(Request $request, TransactionJournal $journal) { - $request->session()->flash('info', (string) trans('firefly.instructions_rule_from_journal', ['name' => e($journal->name)])); + $request->session()->flash('info', (string)trans('firefly.instructions_rule_from_journal', ['name' => e($journal->name)])); $subTitleIcon = 'fa-clone'; - $subTitle = (string) trans('firefly.make_new_rule_no_group'); + $subTitle = (string)trans('firefly.make_new_rule_no_group'); // get triggers and actions for journal. $oldTriggers = $this->getTriggersForJournal($journal); @@ -207,8 +207,8 @@ class CreateController extends Controller // collect pre-filled information: $preFilled = [ 'strict' => true, - 'title' => (string) trans('firefly.new_rule_for_journal_title', ['description' => $journal->description]), - 'description' => (string) trans('firefly.new_rule_for_journal_description', ['description' => $journal->description]), + 'title' => (string)trans('firefly.new_rule_for_journal_title', ['description' => $journal->description]), + 'description' => (string)trans('firefly.new_rule_for_journal_description', ['description' => $journal->description]), ]; // restore actions and triggers from old input: @@ -262,22 +262,22 @@ class CreateController extends Controller { $data = $request->getRuleData(); $rule = $this->ruleRepos->store($data); - session()->flash('success', (string) trans('firefly.stored_new_rule', ['title' => $rule->title])); + session()->flash('success', (string)trans('firefly.stored_new_rule', ['title' => $rule->title])); app('preferences')->mark(); // redirect to show bill. - if ('true' === $request->get('return_to_bill') && (int) $request->get('bill_id') > 0) { - return redirect(route('bills.show', [(int) $request->get('bill_id')])); // @codeCoverageIgnore + if ('true' === $request->get('return_to_bill') && (int)$request->get('bill_id') > 0) { + return redirect(route('bills.show', [(int)$request->get('bill_id')])); // @codeCoverageIgnore } // redirect to new bill creation. - if ((int) $request->get('bill_id') > 0) { + if ((int)$request->get('bill_id') > 0) { return redirect($this->getPreviousUri('bills.create.uri')); // @codeCoverageIgnore } $redirect = redirect($this->getPreviousUri('rules.create.uri')); - if (1 === (int) $request->get('create_another')) { + if (1 === (int)$request->get('create_another')) { // @codeCoverageIgnoreStart session()->put('rules.create.fromStore', true); $redirect = redirect(route('rules.create', [$data['rule_group_id']]))->withInput(); diff --git a/app/Http/Controllers/Rule/DeleteController.php b/app/Http/Controllers/Rule/DeleteController.php index a80ec188a1..c2b5e6f8b0 100644 --- a/app/Http/Controllers/Rule/DeleteController.php +++ b/app/Http/Controllers/Rule/DeleteController.php @@ -50,7 +50,7 @@ class DeleteController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.rules')); + app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('mainTitleIcon', 'fa-random'); $this->ruleRepos = app(RuleRepositoryInterface::class); @@ -69,7 +69,7 @@ class DeleteController extends Controller */ public function delete(Rule $rule) { - $subTitle = (string) trans('firefly.delete_rule', ['title' => $rule->title]); + $subTitle = (string)trans('firefly.delete_rule', ['title' => $rule->title]); // put previous url in session $this->rememberPreviousUri('rules.delete.uri'); @@ -89,7 +89,7 @@ class DeleteController extends Controller $title = $rule->title; $this->ruleRepos->destroy($rule); - session()->flash('success', (string) trans('firefly.deleted_rule', ['title' => $title])); + session()->flash('success', (string)trans('firefly.deleted_rule', ['title' => $title])); app('preferences')->mark(); return redirect($this->getPreviousUri('rules.delete.uri')); diff --git a/app/Http/Controllers/Rule/EditController.php b/app/Http/Controllers/Rule/EditController.php index bd3ad98ad2..873a040549 100644 --- a/app/Http/Controllers/Rule/EditController.php +++ b/app/Http/Controllers/Rule/EditController.php @@ -37,8 +37,8 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Routing\Redirector; use Illuminate\View\View; -use Throwable; use Log; +use Throwable; /** * Class EditController @@ -60,7 +60,7 @@ class EditController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.rules')); + app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('mainTitleIcon', 'fa-random'); $this->ruleRepos = app(RuleRepositoryInterface::class); @@ -86,7 +86,7 @@ class EditController extends Controller $oldTriggers = []; // build triggers from query, if present. - $query = (string) $request->get('from_query'); + $query = (string)$request->get('from_query'); if ('' !== $query) { $search = app(SearchInterface::class); $search->parseQuery($query); @@ -102,8 +102,8 @@ class EditController extends Controller // has old input? if (count($request->old()) > 0) { - $oldTriggers = $this->getPreviousTriggers($request); - $oldActions = $this->getPreviousActions($request); + $oldTriggers = $this->getPreviousTriggers($request); + $oldActions = $this->getPreviousActions($request); } $triggerCount = count($oldTriggers); $actionCount = count($oldActions); @@ -118,15 +118,15 @@ class EditController extends Controller $hasOldInput = null !== $request->old('_token'); $preFilled = [ - 'active' => $hasOldInput ? (bool) $request->old('active') : $rule->active, - 'stop_processing' => $hasOldInput ? (bool) $request->old('stop_processing') : $rule->stop_processing, - 'strict' => $hasOldInput ? (bool) $request->old('strict') : $rule->strict, + 'active' => $hasOldInput ? (bool)$request->old('active') : $rule->active, + 'stop_processing' => $hasOldInput ? (bool)$request->old('stop_processing') : $rule->stop_processing, + 'strict' => $hasOldInput ? (bool)$request->old('strict') : $rule->strict, ]; // get rule trigger for update / store-journal: $primaryTrigger = $this->ruleRepos->getPrimaryTrigger($rule); - $subTitle = (string) trans('firefly.edit_rule', ['title' => $rule->title]); + $subTitle = (string)trans('firefly.edit_rule', ['title' => $rule->title]); // put previous url in session if not redirect from store (not "return_to_edit"). if (true !== session('rules.edit.fromUpdate')) { @@ -139,35 +139,9 @@ class EditController extends Controller return prefixView('rules.rule.edit', compact('rule', 'subTitle', 'primaryTrigger', 'oldTriggers', 'oldActions', 'triggerCount', 'actionCount')); } - /** - * Update the rule. - * - * @param RuleFormRequest $request - * @param Rule $rule - * - * @return RedirectResponse|Redirector - */ - public function update(RuleFormRequest $request, Rule $rule) - { - $data = $request->getRuleData(); - $this->ruleRepos->update($rule, $data); - - session()->flash('success', (string) trans('firefly.updated_rule', ['title' => $rule->title])); - app('preferences')->mark(); - $redirect = redirect($this->getPreviousUri('rules.edit.uri')); - if (1 === (int) $request->get('return_to_edit')) { - // @codeCoverageIgnoreStart - session()->put('rules.edit.fromUpdate', true); - - $redirect = redirect(route('rules.edit', [$rule->id]))->withInput(['return_to_edit' => 1]); - // @codeCoverageIgnoreEnd - } - - return $redirect; - } - /** * @param array $submittedOperators + * * @return array */ private function parseFromOperators(array $submittedOperators): array @@ -179,7 +153,7 @@ class EditController extends Controller foreach ($operators as $key => $operator) { if ('user_action' !== $key && false === $operator['alias']) { - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); } } asort($triggers); @@ -206,4 +180,31 @@ class EditController extends Controller return $renderedEntries; } + + /** + * Update the rule. + * + * @param RuleFormRequest $request + * @param Rule $rule + * + * @return RedirectResponse|Redirector + */ + public function update(RuleFormRequest $request, Rule $rule) + { + $data = $request->getRuleData(); + $this->ruleRepos->update($rule, $data); + + session()->flash('success', (string)trans('firefly.updated_rule', ['title' => $rule->title])); + app('preferences')->mark(); + $redirect = redirect($this->getPreviousUri('rules.edit.uri')); + if (1 === (int)$request->get('return_to_edit')) { + // @codeCoverageIgnoreStart + session()->put('rules.edit.fromUpdate', true); + + $redirect = redirect(route('rules.edit', [$rule->id]))->withInput(['return_to_edit' => 1]); + // @codeCoverageIgnoreEnd + } + + return $redirect; + } } diff --git a/app/Http/Controllers/Rule/IndexController.php b/app/Http/Controllers/Rule/IndexController.php index 793451ee07..7731fea3f6 100644 --- a/app/Http/Controllers/Rule/IndexController.php +++ b/app/Http/Controllers/Rule/IndexController.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Rule; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; @@ -55,7 +56,7 @@ class IndexController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.rules')); + app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('mainTitleIcon', 'fa-random'); $this->ruleGroupRepos = app(RuleGroupRepositoryInterface::class); $this->ruleRepos = app(RuleRepositoryInterface::class); @@ -76,63 +77,12 @@ class IndexController extends Controller $user = auth()->user(); $this->createDefaultRuleGroup(); $this->createDefaultRule(); - $this->ruleGroupRepos->resetRuleGroupOrder(); + $this->ruleGroupRepos->resetOrder(); $ruleGroups = $this->ruleGroupRepos->getRuleGroupsWithRules(null); return prefixView('rules.index', compact('ruleGroups')); } - /** - * @param Rule $rule - * @return RedirectResponse - * @throws \FireflyIII\Exceptions\FireflyException - */ - public function search(Rule $rule): RedirectResponse - { - $route = route('search.index'); - $query = $this->ruleRepos->getSearchQuery($rule); - $route = sprintf('%s?%s', $route, http_build_query(['search' => $query, 'rule' => $rule->id])); - - return redirect($route); - } - - /** - * Stop action for reordering of rule actions. - * - * @param Request $request - * @param Rule $rule - * - * @return JsonResponse - */ - public function reorderRuleActions(Request $request, Rule $rule): JsonResponse - { - $ids = $request->get('actions'); - if (is_array($ids)) { - $this->ruleRepos->reorderRuleActions($rule, $ids); - } - - return response()->json('true'); - } - - /** - * Stop action for reordering of rule triggers. - * - * @param Request $request - * @param Rule $rule - * - * @return JsonResponse - */ - public function reorderRuleTriggers(Request $request, Rule $rule): JsonResponse - { - $ids = $request->get('triggers'); - if (is_array($ids)) { - $this->ruleRepos->reorderRuleTriggers($rule, $ids); - } - - return response()->json('true'); - } - - /** * @param Request $request * @param Rule $rule @@ -142,10 +92,25 @@ class IndexController extends Controller */ public function moveRule(Request $request, Rule $rule, RuleGroup $ruleGroup): JsonResponse { - $order = (int) $request->get('order'); - $this->ruleRepos->moveRule($rule, $ruleGroup, (int) $order); + $order = (int)$request->get('order'); + $this->ruleRepos->moveRule($rule, $ruleGroup, (int)$order); return response()->json([]); } + /** + * @param Rule $rule + * + * @return RedirectResponse + * @throws FireflyException + */ + public function search(Rule $rule): RedirectResponse + { + $route = route('search.index'); + $query = $this->ruleRepos->getSearchQuery($rule); + $route = sprintf('%s?%s', $route, http_build_query(['search' => $query, 'rule' => $rule->id])); + + return redirect($route); + } + } diff --git a/app/Http/Controllers/RuleGroup/EditController.php b/app/Http/Controllers/RuleGroup/EditController.php index a40f25f2be..6dbe96807a 100644 --- a/app/Http/Controllers/RuleGroup/EditController.php +++ b/app/Http/Controllers/RuleGroup/EditController.php @@ -51,7 +51,7 @@ class EditController extends Controller $this->middleware( function ($request, $next) { - app('view')->share('title', (string) trans('firefly.rules')); + app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('mainTitleIcon', 'fa-random'); $this->repository = app(RuleGroupRepositoryInterface::class); @@ -70,7 +70,12 @@ class EditController extends Controller */ public function down(RuleGroup $ruleGroup) { - $this->repository->moveDown($ruleGroup); + $maxOrder =$this->repository->maxOrder(); + $order = (int)$ruleGroup->order; + if ($order < $maxOrder) { + $newOrder = $order + 1; + $this->repository->setOrder($ruleGroup, $newOrder); + } return redirect(route('rules.index')); } @@ -86,11 +91,11 @@ class EditController extends Controller */ public function edit(Request $request, RuleGroup $ruleGroup) { - $subTitle = (string) trans('firefly.edit_rule_group', ['title' => $ruleGroup->title]); + $subTitle = (string)trans('firefly.edit_rule_group', ['title' => $ruleGroup->title]); $hasOldInput = null !== $request->old('_token'); - $preFilled = [ - 'active' => $hasOldInput ? (bool) $request->old('active') : $ruleGroup->active, + $preFilled = [ + 'active' => $hasOldInput ? (bool)$request->old('active') : $ruleGroup->active, ]; @@ -114,7 +119,11 @@ class EditController extends Controller */ public function up(RuleGroup $ruleGroup) { - $this->repository->moveUp($ruleGroup); + $order = (int)$ruleGroup->order; + if ($order > 1) { + $newOrder = $order - 1; + $this->repository->setOrder($ruleGroup, $newOrder); + } return redirect(route('rules.index')); } @@ -132,15 +141,15 @@ class EditController extends Controller $data = [ 'title' => $request->string('title'), 'description' => $request->nlString('description'), - 'active' => 1 === (int) $request->input('active'), + 'active' => 1 === (int)$request->input('active'), ]; $this->repository->update($ruleGroup, $data); - session()->flash('success', (string) trans('firefly.updated_rule_group', ['title' => $ruleGroup->title])); + session()->flash('success', (string)trans('firefly.updated_rule_group', ['title' => $ruleGroup->title])); app('preferences')->mark(); $redirect = redirect($this->getPreviousUri('rule-groups.edit.uri')); - if (1 === (int) $request->get('return_to_edit')) { + if (1 === (int)$request->get('return_to_edit')) { // @codeCoverageIgnoreStart session()->put('rule-groups.edit.fromUpdate', true); diff --git a/app/Http/Controllers/System/CronController.php b/app/Http/Controllers/System/CronController.php index 9c8a632f06..38ee1b2be0 100644 --- a/app/Http/Controllers/System/CronController.php +++ b/app/Http/Controllers/System/CronController.php @@ -22,26 +22,19 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\System; - -use FireflyIII\Support\Http\Controllers\CronRunner; +use Log; /** * Class CronController */ class CronController { - use CronRunner; - /** * @return string */ - public function cron(): string + public function cron() { - $results = []; - $results[] = $this->runRecurring(); - $results[] = $this->runAutoBudget(); - $results[] = $this->runTelemetry(); - - return implode("
\n", $results); + Log::error('The cron endpoint has moved to GET /api/v1/cron/[token]'); + return response('The cron endpoint has moved to GET /api/v1/cron/[token]', 500); } } diff --git a/app/Http/Controllers/System/InstallController.php b/app/Http/Controllers/System/InstallController.php index e540f432f7..af665d0a21 100644 --- a/app/Http/Controllers/System/InstallController.php +++ b/app/Http/Controllers/System/InstallController.php @@ -35,7 +35,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Arr; use Laravel\Passport\Passport; use Log; -use phpseclib\Crypt\RSA; /** * Class InstallController @@ -134,8 +133,15 @@ class InstallController extends Controller */ public function keys(): void { - $rsa = new RSA(); - $keys = $rsa->createKey(4096); + // switch on PHP version. + // switch on PHP version. + if (7 === PHP_MAJOR_VERSION) { + $rsa = new \phpseclib\Crypt\RSA; + $keys = $rsa->createKey(4096); + } + if (8 === PHP_MAJOR_VERSION) { + $keys = \phpseclib3\Crypt\RSA::createKey(4096); + } [$publicKey, $privateKey] = [ Passport::keyPath('oauth-public.key'), diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 0dcdb13b1c..6bc7fbb51e 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -182,6 +182,9 @@ class Kernel extends HttpKernel //'throttle:60,1', 'bindings', ], + 'apiY' => [ + 'bindings', + ], ]; /** * The priority-sorted list of middleware. diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 87e9e2cc0c..d6bbca217c 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -62,10 +62,10 @@ class Authenticate * @param Closure $next * @param string[] ...$guards * - * @throws AuthenticationException - * @throws FireflyException * @return mixed * + * @throws FireflyException + * @throws AuthenticationException */ public function handle($request, Closure $next, ...$guards) { @@ -81,9 +81,9 @@ class Authenticate * @param $request * @param array $guards * - * @throws AuthenticationException - * @throws FireflyException * @return mixed + * @throws FireflyException + * @throws AuthenticationException */ protected function authenticate($request, array $guards) { @@ -97,10 +97,10 @@ class Authenticate // do an extra check on user object. /** @noinspection PhpUndefinedMethodInspection */ $user = $this->auth->authenticate(); - if (1 === (int) $user->blocked) { - $message = (string) trans('firefly.block_account_logout'); + if (1 === (int)$user->blocked) { + $message = (string)trans('firefly.block_account_logout'); if ('email_changed' === $user->blocked_code) { - $message = (string) trans('firefly.email_changed_logout'); + $message = (string)trans('firefly.email_changed_logout'); } app('session')->flash('logoutMessage', $message); /** @noinspection PhpUndefinedMethodInspection */ diff --git a/app/Http/Middleware/InstallationId.php b/app/Http/Middleware/InstallationId.php index cbcc0e1368..20a8177349 100644 --- a/app/Http/Middleware/InstallationId.php +++ b/app/Http/Middleware/InstallationId.php @@ -27,6 +27,7 @@ namespace FireflyIII\Http\Middleware; use Closure; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Support\System\GeneratesInstallationId; +use Illuminate\Http\Request; /** * @@ -39,7 +40,7 @@ class InstallationId /** * Handle an incoming request. * - * @param \Illuminate\Http\Request $request + * @param Request $request * @param Closure $next * * @return mixed @@ -51,7 +52,6 @@ class InstallationId { - $this->generateInstallationId(); return $next($request); diff --git a/app/Http/Middleware/Installer.php b/app/Http/Middleware/Installer.php index 613af9d41e..ea0b291e23 100644 --- a/app/Http/Middleware/Installer.php +++ b/app/Http/Middleware/Installer.php @@ -44,12 +44,12 @@ class Installer * Handle an incoming request. * * @param Request $request - * @param Closure $next - * - * @throws FireflyException + * @param Closure $next * * @return mixed * + * @throws FireflyException + * */ public function handle($request, Closure $next) { @@ -81,35 +81,11 @@ class Installer return $next($request); } - /** - * Is access denied error. - * - * @param string $message - * - * @return bool - */ - protected function isAccessDenied(string $message): bool - { - return false !== stripos($message, 'Access denied'); - } - - /** - * Is no tables exist error. - * - * @param string $message - * - * @return bool - */ - protected function noTablesExist(string $message): bool - { - return false !== stripos($message, 'Base table or view not found'); - } - /** * Check if the tables are created and accounted for. * - * @throws FireflyException * @return bool + * @throws FireflyException */ private function hasNoTables(): bool { @@ -136,6 +112,30 @@ class Installer return false; } + /** + * Is access denied error. + * + * @param string $message + * + * @return bool + */ + protected function isAccessDenied(string $message): bool + { + return false !== stripos($message, 'Access denied'); + } + + /** + * Is no tables exist error. + * + * @param string $message + * + * @return bool + */ + protected function noTablesExist(string $message): bool + { + return false !== stripos($message, 'Base table or view not found'); + } + /** * Check if the "db_version" variable is correct. * @@ -144,8 +144,8 @@ class Installer private function oldDBVersion(): bool { // older version in config than database? - $configVersion = (int) config('firefly.db_version'); - $dbVersion = (int) app('fireflyconfig')->getFresh('db_version', 1)->data; + $configVersion = (int)config('firefly.db_version'); + $dbVersion = (int)app('fireflyconfig')->getFresh('db_version', 1)->data; if ($configVersion > $dbVersion) { Log::warning( sprintf( @@ -170,8 +170,8 @@ class Installer private function oldVersion(): bool { // version compare thing. - $configVersion = (string) config('firefly.version'); - $dbVersion = (string) app('fireflyconfig')->getFresh('ff3_version', '1.0')->data; + $configVersion = (string)config('firefly.version'); + $dbVersion = (string)app('fireflyconfig')->getFresh('ff3_version', '1.0')->data; if (1 === version_compare($configVersion, $dbVersion)) { Log::warning( sprintf( diff --git a/app/Http/Middleware/InterestingMessage.php b/app/Http/Middleware/InterestingMessage.php index fd49d04d21..f6fafd89c9 100644 --- a/app/Http/Middleware/InterestingMessage.php +++ b/app/Http/Middleware/InterestingMessage.php @@ -58,6 +58,15 @@ class InterestingMessage return $next($request); } + /** + * @return bool + */ + private function testing(): bool + { + // ignore middleware in test environment. + return 'testing' === config('app.env') || !auth()->check(); + } + /** * @param Request $request * @@ -84,7 +93,7 @@ class InterestingMessage // send message about newly created transaction group. /** @var TransactionGroup $group */ - $group = auth()->user()->transactionGroups()->with(['transactionJournals', 'transactionJournals.transactionType'])->find((int) $transactionGroupId); + $group = auth()->user()->transactionGroups()->with(['transactionJournals', 'transactionJournals.transactionType'])->find((int)$transactionGroupId); if (null === $group) { return; @@ -100,21 +109,12 @@ class InterestingMessage $title = $count > 1 ? $group->title : $journal->description; if ('created' === $message) { session()->flash('success_uri', route('transactions.show', [$transactionGroupId])); - session()->flash('success', (string) trans('firefly.stored_journal', ['description' => $title])); + session()->flash('success', (string)trans('firefly.stored_journal', ['description' => $title])); } if ('updated' === $message) { $type = strtolower($journal->transactionType->type); session()->flash('success_uri', route('transactions.show', [$transactionGroupId])); - session()->flash('success', (string) trans(sprintf('firefly.updated_%s', $type), ['description' => $title])); + session()->flash('success', (string)trans(sprintf('firefly.updated_%s', $type), ['description' => $title])); } } - - /** - * @return bool - */ - private function testing(): bool - { - // ignore middleware in test environment. - return 'testing' === config('app.env') || !auth()->check(); - } } diff --git a/app/Http/Middleware/IsDemoUser.php b/app/Http/Middleware/IsDemoUser.php index 8d419b4bc0..1ee13d555b 100644 --- a/app/Http/Middleware/IsDemoUser.php +++ b/app/Http/Middleware/IsDemoUser.php @@ -53,7 +53,7 @@ class IsDemoUser $repository = app(UserRepositoryInterface::class); if ($repository->hasRole($user, 'demo')) { Log::info('User is a demo user.'); - $request->session()->flash('info', (string) trans('firefly.not_available_demo_user')); + $request->session()->flash('info', (string)trans('firefly.not_available_demo_user')); $current = $request->url(); $previous = $request->session()->previousUrl(); if ($current !== $previous) { diff --git a/app/Http/Middleware/Range.php b/app/Http/Middleware/Range.php index d847587b2e..a58d45405c 100644 --- a/app/Http/Middleware/Range.php +++ b/app/Http/Middleware/Range.php @@ -36,6 +36,7 @@ use Log; class Range { use RequestInformation; + /** * Handle an incoming request. * @@ -61,51 +62,6 @@ class Range return $next($request); } - /** - * Configure the list length. - */ - private function configureList(): void - { - $pref = app('preferences')->get('list-length', config('firefly.list_length', 10))->data; - app('view')->share('listLength', $pref); - } - - /** - * Configure the user's view. - */ - private function configureView(): void - { - // get locale preference: - $language = app('steam')->getLanguage(); - $locale = app('steam')->getLocale(); - App::setLocale($language); - Carbon::setLocale(substr($locale, 0, 2)); - - $localeArray = app('steam')->getLocaleArray($locale); - - setlocale(LC_TIME, $localeArray); - $moneyResult = setlocale(LC_MONETARY, $localeArray); - - // send error to view if could not set money format - if (false === $moneyResult) { - Log::error('Could not set locale. The following array doesnt work: ', $localeArray); - app('view')->share('invalidMonetaryLocale', true); // @codeCoverageIgnore - } - - // save some formats: - $monthAndDayFormat = (string) trans('config.month_and_day', [], $locale); - $dateTimeFormat = (string) trans('config.date_time', [], $locale); - $defaultCurrency = app('amount')->getDefaultCurrency(); - - // also format for moment JS: - $madMomentJS = (string) trans('config.month_and_day_moment_js', [], $locale); - - app('view')->share('madMomentJS', $madMomentJS); - app('view')->share('monthAndDayFormat', $monthAndDayFormat); - app('view')->share('dateTimeFormat', $dateTimeFormat); - app('view')->share('defaultCurrency', $defaultCurrency); - } - /** * Set the range for the current view. */ @@ -133,4 +89,49 @@ class Range app('session')->put('first', $first); } } + + /** + * Configure the user's view. + */ + private function configureView(): void + { + // get locale preference: + $language = app('steam')->getLanguage(); + $locale = app('steam')->getLocale(); + App::setLocale($language); + Carbon::setLocale(substr($locale, 0, 2)); + + $localeArray = app('steam')->getLocaleArray($locale); + + setlocale(LC_TIME, $localeArray); + $moneyResult = setlocale(LC_MONETARY, $localeArray); + + // send error to view if could not set money format + if (false === $moneyResult) { + Log::error('Could not set locale. The following array doesnt work: ', $localeArray); + app('view')->share('invalidMonetaryLocale', true); // @codeCoverageIgnore + } + + // save some formats: + $monthAndDayFormat = (string)trans('config.month_and_day', [], $locale); + $dateTimeFormat = (string)trans('config.date_time', [], $locale); + $defaultCurrency = app('amount')->getDefaultCurrency(); + + // also format for moment JS: + $madMomentJS = (string)trans('config.month_and_day_moment_js', [], $locale); + + app('view')->share('madMomentJS', $madMomentJS); + app('view')->share('monthAndDayFormat', $monthAndDayFormat); + app('view')->share('dateTimeFormat', $dateTimeFormat); + app('view')->share('defaultCurrency', $defaultCurrency); + } + + /** + * Configure the list length. + */ + private function configureList(): void + { + $pref = app('preferences')->get('list-length', config('firefly.list_length', 10))->data; + app('view')->share('listLength', $pref); + } } diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index f4725c2abe..f32c81c336 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -39,8 +39,8 @@ class SecureHeaders * @param Request $request * @param Closure $next * - * @throws Exception * @return mixed + * @throws Exception */ public function handle(Request $request, Closure $next) { @@ -48,9 +48,9 @@ class SecureHeaders $nonce = base64_encode(random_bytes(16)); app('view')->share('JS_NONCE', $nonce); - $response = $next($request); + $response = $next($request); $trackingScriptSrc = $this->getTrackingScriptSource(); - $csp = [ + $csp = [ "default-src 'none'", "object-src 'self'", sprintf("script-src 'unsafe-inline' 'nonce-%1s' %2s", $nonce, $trackingScriptSrc), @@ -58,7 +58,10 @@ class SecureHeaders "base-uri 'self'", "font-src 'self' data:", "connect-src 'self'", - sprintf("img-src 'self' data: https://a.tile.openstreetmap.org https://b.tile.openstreetmap.org https://c.tile.openstreetmap.org https://api.tiles.mapbox.com %s", $trackingScriptSrc), + sprintf( + "img-src 'self' data: https://a.tile.openstreetmap.org https://b.tile.openstreetmap.org https://c.tile.openstreetmap.org https://api.tiles.mapbox.com %s", + $trackingScriptSrc + ), "manifest-src 'self'", ]; @@ -106,8 +109,8 @@ class SecureHeaders */ private function getTrackingScriptSource(): string { - if ('' !== (string) config('firefly.tracker_site_id') && '' !== (string) config('firefly.tracker_url')) { - return (string) config('firefly.tracker_url'); + if ('' !== (string)config('firefly.tracker_site_id') && '' !== (string)config('firefly.tracker_url')) { + return (string)config('firefly.tracker_url'); } return ''; diff --git a/app/Http/Middleware/StartFireflySession.php b/app/Http/Middleware/StartFireflySession.php index 7d205367c1..88e1d10ff9 100644 --- a/app/Http/Middleware/StartFireflySession.php +++ b/app/Http/Middleware/StartFireflySession.php @@ -25,7 +25,6 @@ namespace FireflyIII\Http\Middleware; use Illuminate\Contracts\Session\Session; use Illuminate\Http\Request; use Illuminate\Session\Middleware\StartSession; -use Log; /** * Class StartFireflySession. diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 4be207df25..67336284f9 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -43,7 +43,7 @@ class TrustProxies extends Middleware */ public function __construct(Repository $config) { - $trustedProxies = (string) config('firefly.trusted_proxies'); + $trustedProxies = (string)config('firefly.trusted_proxies'); $this->proxies = explode(',', $trustedProxies); if ('**' === $trustedProxies) { $this->proxies = '**'; diff --git a/app/Http/Requests/BillStoreRequest.php b/app/Http/Requests/BillStoreRequest.php index c0cb421ff4..10eb7c88a3 100644 --- a/app/Http/Requests/BillStoreRequest.php +++ b/app/Http/Requests/BillStoreRequest.php @@ -41,17 +41,17 @@ class BillStoreRequest extends FormRequest public function getBillData(): array { return [ - 'name' => $this->string('name'), - 'amount_min' => $this->string('amount_min'), - 'currency_id' => $this->integer('transaction_currency_id'), - 'currency_code' => '', - 'amount_max' => $this->string('amount_max'), - 'date' => $this->date('date'), - 'repeat_freq' => $this->string('repeat_freq'), - 'skip' => $this->integer('skip'), - 'notes' => $this->nlString('notes'), - 'active' => $this->boolean('active'), - 'object_group' => $this->string('object_group'), + 'name' => $this->string('name'), + 'amount_min' => $this->string('amount_min'), + 'currency_id' => $this->integer('transaction_currency_id'), + 'currency_code' => '', + 'amount_max' => $this->string('amount_max'), + 'date' => $this->date('date'), + 'repeat_freq' => $this->string('repeat_freq'), + 'skip' => $this->integer('skip'), + 'notes' => $this->nlString('notes'), + 'active' => $this->boolean('active'), + 'object_group_title' => $this->string('object_group'), ]; } diff --git a/app/Http/Requests/BillUpdateRequest.php b/app/Http/Requests/BillUpdateRequest.php index 36e2ec8a82..6d09666903 100644 --- a/app/Http/Requests/BillUpdateRequest.php +++ b/app/Http/Requests/BillUpdateRequest.php @@ -42,17 +42,17 @@ class BillUpdateRequest extends FormRequest public function getBillData(): array { return [ - 'name' => $this->string('name'), - 'amount_min' => $this->string('amount_min'), - 'currency_id' => $this->integer('transaction_currency_id'), - 'currency_code' => '', - 'amount_max' => $this->string('amount_max'), - 'date' => $this->date('date'), - 'repeat_freq' => $this->string('repeat_freq'), - 'skip' => $this->integer('skip'), - 'notes' => $this->nlString('notes'), - 'active' => $this->boolean('active'), - 'object_group' => $this->string('object_group'), + 'name' => $this->string('name'), + 'amount_min' => $this->string('amount_min'), + 'currency_id' => $this->integer('transaction_currency_id'), + 'currency_code' => '', + 'amount_max' => $this->string('amount_max'), + 'date' => $this->date('date'), + 'repeat_freq' => $this->string('repeat_freq'), + 'skip' => $this->integer('skip'), + 'notes' => $this->nlString('notes'), + 'active' => $this->boolean('active'), + 'object_group_title' => $this->string('object_group'), ]; } diff --git a/app/Http/Requests/BudgetFormStoreRequest.php b/app/Http/Requests/BudgetFormStoreRequest.php index ea3a6c189c..60555fa624 100644 --- a/app/Http/Requests/BudgetFormStoreRequest.php +++ b/app/Http/Requests/BudgetFormStoreRequest.php @@ -44,12 +44,12 @@ class BudgetFormStoreRequest extends FormRequest public function getBudgetData(): array { return [ - 'name' => $this->string('name'), - 'active' => $this->boolean('active'), - 'auto_budget_type' => $this->integer('auto_budget_type'), - 'transaction_currency_id' => $this->integer('auto_budget_currency_id'), - 'auto_budget_amount' => $this->string('auto_budget_amount'), - 'auto_budget_period' => $this->string('auto_budget_period'), + 'name' => $this->string('name'), + 'active' => $this->boolean('active'), + 'auto_budget_type' => $this->integer('auto_budget_type'), + 'currency_id' => $this->integer('auto_budget_currency_id'), + 'auto_budget_amount' => $this->string('auto_budget_amount'), + 'auto_budget_period' => $this->string('auto_budget_period'), ]; } diff --git a/app/Http/Requests/BudgetFormUpdateRequest.php b/app/Http/Requests/BudgetFormUpdateRequest.php index c75534f297..d7728fcd2a 100644 --- a/app/Http/Requests/BudgetFormUpdateRequest.php +++ b/app/Http/Requests/BudgetFormUpdateRequest.php @@ -45,12 +45,12 @@ class BudgetFormUpdateRequest extends FormRequest public function getBudgetData(): array { return [ - 'name' => $this->string('name'), - 'active' => $this->boolean('active'), - 'auto_budget_type' => $this->integer('auto_budget_type'), - 'transaction_currency_id' => $this->integer('auto_budget_currency_id'), - 'auto_budget_amount' => $this->string('auto_budget_amount'), - 'auto_budget_period' => $this->string('auto_budget_period'), + 'name' => $this->string('name'), + 'active' => $this->boolean('active'), + 'auto_budget_type' => $this->integer('auto_budget_type'), + 'currency_id' => $this->integer('auto_budget_currency_id'), + 'auto_budget_amount' => $this->string('auto_budget_amount'), + 'auto_budget_period' => $this->string('auto_budget_period'), ]; } diff --git a/app/Http/Requests/PiggyBankStoreRequest.php b/app/Http/Requests/PiggyBankStoreRequest.php index e933a2fc27..a0014784a2 100644 --- a/app/Http/Requests/PiggyBankStoreRequest.php +++ b/app/Http/Requests/PiggyBankStoreRequest.php @@ -41,13 +41,13 @@ class PiggyBankStoreRequest extends FormRequest public function getPiggyBankData(): array { return [ - 'name' => $this->string('name'), - 'startdate' => $this->date('startdate'), - 'account_id' => $this->integer('account_id'), - 'targetamount' => $this->string('targetamount'), - 'targetdate' => $this->date('targetdate'), - 'notes' => $this->nlString('notes'), - 'object_group' => $this->string('object_group'), + 'name' => $this->string('name'), + 'startdate' => $this->date('startdate'), + 'account_id' => $this->integer('account_id'), + 'targetamount' => $this->string('targetamount'), + 'targetdate' => $this->date('targetdate'), + 'notes' => $this->nlString('notes'), + 'object_group_title' => $this->string('object_group'), ]; } diff --git a/app/Http/Requests/PiggyBankUpdateRequest.php b/app/Http/Requests/PiggyBankUpdateRequest.php index 51161e60d0..9719ba8a32 100644 --- a/app/Http/Requests/PiggyBankUpdateRequest.php +++ b/app/Http/Requests/PiggyBankUpdateRequest.php @@ -42,13 +42,13 @@ class PiggyBankUpdateRequest extends FormRequest public function getPiggyBankData(): array { return [ - 'name' => $this->string('name'), - 'startdate' => $this->date('startdate'), - 'account_id' => $this->integer('account_id'), - 'targetamount' => $this->string('targetamount'), - 'targetdate' => $this->date('targetdate'), - 'notes' => $this->nlString('notes'), - 'object_group' => $this->string('object_group'), + 'name' => $this->string('name'), + 'startdate' => $this->date('startdate'), + 'account_id' => $this->integer('account_id'), + 'targetamount' => $this->string('targetamount'), + 'targetdate' => $this->date('targetdate'), + 'notes' => $this->nlString('notes'), + 'object_group_title' => $this->string('object_group'), ]; } diff --git a/app/Http/Requests/RecurrenceFormRequest.php b/app/Http/Requests/RecurrenceFormRequest.php index 7217cc527f..61f07ec599 100644 --- a/app/Http/Requests/RecurrenceFormRequest.php +++ b/app/Http/Requests/RecurrenceFormRequest.php @@ -25,6 +25,7 @@ namespace FireflyIII\Http\Requests; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Factory\CategoryFactory; use FireflyIII\Models\Recurrence; use FireflyIII\Models\TransactionType; use FireflyIII\Rules\ValidRecurrenceRepetitionType; @@ -123,6 +124,19 @@ class RecurrenceFormRequest extends FormRequest break; } + // replace category name with a new category: + $factory = app(CategoryFactory::class); + $factory->setUser(auth()->user()); + foreach ($return['transactions'] as $index => $transaction) { + $categoryName = $transaction['category_name'] ?? null; + if (null !== $categoryName) { + $category = $factory->findOrCreate(null, $categoryName); + if (null !== $category) { + $return['transactions'][$index]['category_id'] = $category->id; + } + } + } + return $return; } diff --git a/app/Jobs/CreateAutoBudgetLimits.php b/app/Jobs/CreateAutoBudgetLimits.php index 4d216f0e01..e0bf7515f4 100644 --- a/app/Jobs/CreateAutoBudgetLimits.php +++ b/app/Jobs/CreateAutoBudgetLimits.php @@ -78,122 +78,6 @@ class CreateAutoBudgetLimits implements ShouldQueue } } - /** - * @param Carbon $date - */ - public function setDate(Carbon $date): void - { - $date->startOfDay(); - $this->date = $date; - } - - /** - * @param AutoBudget $autoBudget - * @param Carbon $start - * @param Carbon $end - * @param string|null $amount - */ - private function createBudgetLimit(AutoBudget $autoBudget, Carbon $start, Carbon $end, ?string $amount = null) - { - Log::debug(sprintf('No budget limit exist. Must create one for auto-budget #%d', $autoBudget->id)); - if (null !== $amount) { - Log::debug(sprintf('Amount is overruled and will be set to %s', $amount)); - } - $budgetLimit = new BudgetLimit; - $budgetLimit->budget()->associate($autoBudget->budget); - $budgetLimit->transactionCurrency()->associate($autoBudget->transactionCurrency); - $budgetLimit->start_date = $start; - $budgetLimit->end_date = $end; - $budgetLimit->amount = $amount ?? $autoBudget->amount; - $budgetLimit->period = $autoBudget->period; - $budgetLimit->generated = true; - $budgetLimit->save(); - - Log::debug(sprintf('Created budget limit #%d.', $budgetLimit->id)); - } - - /** - * @param AutoBudget $autoBudget - */ - private function createRollover(AutoBudget $autoBudget): void - { - Log::debug(sprintf('Will now manage rollover for auto budget #%d', $autoBudget->id)); - // current period: - $start = app('navigation')->startOfPeriod($this->date, $autoBudget->period); - $end = app('navigation')->endOfPeriod($start, $autoBudget->period); - - // which means previous period: - $previousStart = app('navigation')->subtractPeriod($start, $autoBudget->period); - $previousEnd = app('navigation')->endOfPeriod($previousStart, $autoBudget->period); - - Log::debug( - sprintf( - 'Current period is %s-%s, so previous period is %s-%s', - $start->format('Y-m-d'), - $end->format('Y-m-d'), - $previousStart->format('Y-m-d'), - $previousEnd->format('Y-m-d') - ) - ); - - // has budget limit in previous period? - $budgetLimit = $this->findBudgetLimit($autoBudget->budget, $previousStart, $previousEnd); - - if (null === $budgetLimit) { - Log::debug('No budget limit exists in previous period, so create one.'); - // if not, create it and we're done. - $this->createBudgetLimit($autoBudget, $start, $end); - Log::debug(sprintf('Done with auto budget #%d', $autoBudget->id)); - - return; - } - Log::debug('Budget limit exists for previous period.'); - // if has one, calculate expenses and use that as a base. - $repository = app(OperationsRepositoryInterface::class); - $repository->setUser($autoBudget->budget->user); - $spent = $repository->sumExpenses($previousStart, $previousEnd, null, new Collection([$autoBudget->budget]), $autoBudget->transactionCurrency); - $currencyId = (int)$autoBudget->transaction_currency_id; - $spentAmount = $spent[$currencyId]['sum'] ?? '0'; - Log::debug(sprintf('Spent in previous budget period (%s-%s) is %s', $previousStart->format('Y-m-d'), $previousEnd->format('Y-m-d'), $spentAmount)); - - // previous budget limit + this period + spent - $totalAmount = bcadd(bcadd($budgetLimit->amount, $autoBudget->amount), $spentAmount); - Log::debug(sprintf('Total amount for current budget period will be %s', $totalAmount)); - - if (1 !== bccomp($totalAmount, '0')) { - Log::info(sprintf('The total amount is negative, so it will be reset to %s.', $totalAmount)); - $totalAmount = $autoBudget->amount; - } - - // create budget limit: - $this->createBudgetLimit($autoBudget, $start, $end, $totalAmount); - Log::debug(sprintf('Done with auto budget #%d', $autoBudget->id)); - } - - /** - * @param Budget $budget - * @param Carbon $start - * @param Carbon $end - * - * @return BudgetLimit|null - */ - private function findBudgetLimit(Budget $budget, Carbon $start, Carbon $end): ?BudgetLimit - { - Log::debug( - sprintf( - 'Going to find a budget limit for budget #%d ("%s") between %s and %s', - $budget->id, - $budget->name, - $start->format('Y-m-d'), - $end->format('Y-m-d') - ) - ); - - return $budget->budgetlimits() - ->where('start_date', $start->format('Y-m-d')) - ->where('end_date', $end->format('Y-m-d'))->first(); - } - /** * @param AutoBudget $autoBudget * @@ -296,4 +180,120 @@ class CreateAutoBudgetLimits implements ShouldQueue return '01-01' === $value; } } + + /** + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return BudgetLimit|null + */ + private function findBudgetLimit(Budget $budget, Carbon $start, Carbon $end): ?BudgetLimit + { + Log::debug( + sprintf( + 'Going to find a budget limit for budget #%d ("%s") between %s and %s', + $budget->id, + $budget->name, + $start->format('Y-m-d'), + $end->format('Y-m-d') + ) + ); + + return $budget->budgetlimits() + ->where('start_date', $start->format('Y-m-d')) + ->where('end_date', $end->format('Y-m-d'))->first(); + } + + /** + * @param AutoBudget $autoBudget + * @param Carbon $start + * @param Carbon $end + * @param string|null $amount + */ + private function createBudgetLimit(AutoBudget $autoBudget, Carbon $start, Carbon $end, ?string $amount = null) + { + Log::debug(sprintf('No budget limit exist. Must create one for auto-budget #%d', $autoBudget->id)); + if (null !== $amount) { + Log::debug(sprintf('Amount is overruled and will be set to %s', $amount)); + } + $budgetLimit = new BudgetLimit; + $budgetLimit->budget()->associate($autoBudget->budget); + $budgetLimit->transactionCurrency()->associate($autoBudget->transactionCurrency); + $budgetLimit->start_date = $start; + $budgetLimit->end_date = $end; + $budgetLimit->amount = $amount ?? $autoBudget->amount; + $budgetLimit->period = $autoBudget->period; + $budgetLimit->generated = true; + $budgetLimit->save(); + + Log::debug(sprintf('Created budget limit #%d.', $budgetLimit->id)); + } + + /** + * @param AutoBudget $autoBudget + */ + private function createRollover(AutoBudget $autoBudget): void + { + Log::debug(sprintf('Will now manage rollover for auto budget #%d', $autoBudget->id)); + // current period: + $start = app('navigation')->startOfPeriod($this->date, $autoBudget->period); + $end = app('navigation')->endOfPeriod($start, $autoBudget->period); + + // which means previous period: + $previousStart = app('navigation')->subtractPeriod($start, $autoBudget->period); + $previousEnd = app('navigation')->endOfPeriod($previousStart, $autoBudget->period); + + Log::debug( + sprintf( + 'Current period is %s-%s, so previous period is %s-%s', + $start->format('Y-m-d'), + $end->format('Y-m-d'), + $previousStart->format('Y-m-d'), + $previousEnd->format('Y-m-d') + ) + ); + + // has budget limit in previous period? + $budgetLimit = $this->findBudgetLimit($autoBudget->budget, $previousStart, $previousEnd); + + if (null === $budgetLimit) { + Log::debug('No budget limit exists in previous period, so create one.'); + // if not, create it and we're done. + $this->createBudgetLimit($autoBudget, $start, $end); + Log::debug(sprintf('Done with auto budget #%d', $autoBudget->id)); + + return; + } + Log::debug('Budget limit exists for previous period.'); + // if has one, calculate expenses and use that as a base. + $repository = app(OperationsRepositoryInterface::class); + $repository->setUser($autoBudget->budget->user); + $spent = $repository->sumExpenses($previousStart, $previousEnd, null, new Collection([$autoBudget->budget]), $autoBudget->transactionCurrency); + $currencyId = (int)$autoBudget->transaction_currency_id; + $spentAmount = $spent[$currencyId]['sum'] ?? '0'; + Log::debug(sprintf('Spent in previous budget period (%s-%s) is %s', $previousStart->format('Y-m-d'), $previousEnd->format('Y-m-d'), $spentAmount)); + + // previous budget limit + this period + spent + $totalAmount = bcadd(bcadd($budgetLimit->amount, $autoBudget->amount), $spentAmount); + Log::debug(sprintf('Total amount for current budget period will be %s', $totalAmount)); + + if (1 !== bccomp($totalAmount, '0')) { + Log::info(sprintf('The total amount is negative, so it will be reset to %s.', $totalAmount)); + $totalAmount = $autoBudget->amount; + } + + // create budget limit: + $this->createBudgetLimit($autoBudget, $start, $end, $totalAmount); + Log::debug(sprintf('Done with auto budget #%d', $autoBudget->id)); + } + + /** + * @param Carbon $date + */ + public function setDate(Carbon $date): void + { + $date->startOfDay(); + $this->date = $date; + } } diff --git a/app/Jobs/CreateRecurringTransactions.php b/app/Jobs/CreateRecurringTransactions.php index c982deb974..c1360d1633 100644 --- a/app/Jobs/CreateRecurringTransactions.php +++ b/app/Jobs/CreateRecurringTransactions.php @@ -110,7 +110,7 @@ class CreateRecurringTransactions implements ShouldQueue // clear cache for user app('preferences')->setForUser($recurrence->user, 'lastActivity', microtime()); - Log::debug(sprintf('Now at recurrence #%d', $recurrence->id)); + Log::debug(sprintf('Now at recurrence #%d of user #%d', $recurrence->id, $recurrence->user_id)); $createdReps = $this->handleRepetitions($recurrence); Log::debug(sprintf('Done with recurrence #%d', $recurrence->id)); $result[$recurrence->user_id] = $result[$recurrence->user_id]->merge($createdReps); @@ -130,20 +130,83 @@ class CreateRecurringTransactions implements ShouldQueue } /** - * @param Carbon $date + * @param Collection $recurrences + * + * @return Collection */ - public function setDate(Carbon $date): void + private function filterRecurrences(Collection $recurrences): Collection { - $date->startOfDay(); - $this->date = $date; + return $recurrences->filter( + function (Recurrence $recurrence) { + return $this->validRecurrence($recurrence); + } + ); } /** - * @param bool $force + * Is the info in the recurrence valid? + * + * @param Recurrence $recurrence + * + * @return bool + * */ - public function setForce(bool $force): void + private function validRecurrence(Recurrence $recurrence): bool { - $this->force = $force; + Log::debug(sprintf('Now filtering recurrence #%d, owned by user #%d', $recurrence->id, $recurrence->user_id)); + // is not active. + if (!$this->active($recurrence)) { + Log::info(sprintf('Recurrence #%d is not active. Skipped.', $recurrence->id)); + + return false; + } + + // has repeated X times. + $journalCount = $this->repository->getJournalCount($recurrence); + if (0 !== $recurrence->repetitions && $journalCount >= $recurrence->repetitions && false === $this->force) { + Log::info(sprintf('Recurrence #%d has run %d times, so will run no longer.', $recurrence->id, $recurrence->repetitions)); + + return false; + } + + + // is no longer running + if ($this->repeatUntilHasPassed($recurrence)) { + Log::info( + sprintf( + 'Recurrence #%d was set to run until %s, and today\'s date is %s. Skipped.', + $recurrence->id, + $recurrence->repeat_until->format('Y-m-d'), + $this->date->format('Y-m-d') + ) + ); + + return false; + } + + // first_date is in the future + if ($this->hasNotStartedYet($recurrence)) { + Log::info( + sprintf( + 'Recurrence #%d is set to run on %s, and today\'s date is %s. Skipped.', + $recurrence->id, + $recurrence->first_date->format('Y-m-d'), + $this->date->format('Y-m-d') + ) + ); + + return false; + } + + // already fired today (with success): + if (false === $this->force && $this->hasFiredToday($recurrence)) { + Log::info(sprintf('Recurrence #%d has already fired today. Skipped.', $recurrence->id)); + + return false; + } + Log::debug('Will be included.'); + + return true; } /** @@ -159,17 +222,30 @@ class CreateRecurringTransactions implements ShouldQueue } /** - * @param Collection $recurrences + * Return true if the $repeat_until date is in the past. * - * @return Collection + * @param Recurrence $recurrence + * + * @return bool */ - private function filterRecurrences(Collection $recurrences): Collection + private function repeatUntilHasPassed(Recurrence $recurrence): bool { - return $recurrences->filter( - function (Recurrence $recurrence) { - return $this->validRecurrence($recurrence); - } - ); + // date has passed + return null !== $recurrence->repeat_until && $recurrence->repeat_until->lt($this->date); + } + + /** + * Has the reuccrence started yet. + * + * @param $recurrence + * + * @return bool + */ + private function hasNotStartedYet(Recurrence $recurrence): bool + { + $startDate = $this->getStartDate($recurrence); + + return $startDate->gt($this->date); } /** @@ -190,60 +266,75 @@ class CreateRecurringTransactions implements ShouldQueue } /** - * Get transaction information from a recurring transaction. + * Has the recurrence fired today. + * + * @param Recurrence $recurrence + * + * @return bool + */ + private function hasFiredToday(Recurrence $recurrence): bool + { + return null !== $recurrence->latest_date && $recurrence->latest_date->eq($this->date); + } + + /** + * Separate method that will loop all repetitions and do something with it. Will return + * all created transaction journals. + * + * @param Recurrence $recurrence + * + * @return Collection + */ + private function handleRepetitions(Recurrence $recurrence): Collection + { + $collection = new Collection; + /** @var RecurrenceRepetition $repetition */ + foreach ($recurrence->recurrenceRepetitions as $repetition) { + Log::debug( + sprintf( + 'Now repeating %s with value "%s", skips every %d time(s)', + $repetition->repetition_type, + $repetition->repetition_moment, + $repetition->repetition_skip + ) + ); + + // start looping from $startDate to today perhaps we have a hit? + // add two days to $this->date so we always include the weekend. + $includeWeekend = clone $this->date; + $includeWeekend->addDays(2); + $occurrences = $this->repository->getOccurrencesInRange($repetition, $recurrence->first_date, $includeWeekend); + + unset($includeWeekend); + + $result = $this->handleOccurrences($recurrence, $repetition, $occurrences); + $collection = $collection->merge($result); + } + + return $collection; + } + + /** + * Check if the occurences should be executed. * * @param Recurrence $recurrence * @param RecurrenceRepetition $repetition - * @param Carbon $date - * - * @return array + * @param array $occurrences * + * @return Collection */ - private function getTransactionData(Recurrence $recurrence, RecurrenceRepetition $repetition, Carbon $date): array + private function handleOccurrences(Recurrence $recurrence, RecurrenceRepetition $repetition, array $occurrences): Collection { - // total transactions expected for this recurrence: - $total = $this->repository->totalTransactions($recurrence, $repetition); - $count = $this->repository->getJournalCount($recurrence) + 1; - $transactions = $recurrence->recurrenceTransactions()->get(); - $return = []; - /** @var RecurrenceTransaction $transaction */ - foreach ($transactions as $index => $transaction) { - $single = [ - 'type' => strtolower($recurrence->transactionType->type), - 'date' => $date, - 'user' => $recurrence->user_id, - 'currency_id' => (int)$transaction->transaction_currency_id, - 'currency_code' => null, - 'description' => $recurrence->recurrenceTransactions()->first()->description, - 'amount' => $transaction->amount, - 'budget_id' => $this->repository->getBudget($transaction), - 'budget_name' => null, - 'category_id' => null, - 'category_name' => $this->repository->getCategory($transaction), - 'source_id' => $transaction->source_id, - 'source_name' => null, - 'destination_id' => $transaction->destination_id, - 'destination_name' => null, - 'foreign_currency_id' => $transaction->foreign_currency_id, - 'foreign_currency_code' => null, - 'foreign_amount' => $transaction->foreign_amount, - 'reconciled' => false, - 'identifier' => $index, - 'recurrence_id' => (int)$recurrence->id, - 'order' => $index, - 'notes' => (string)trans('firefly.created_from_recurrence', ['id' => $recurrence->id, 'title' => $recurrence->title]), - 'tags' => $this->repository->getTags($transaction), - 'piggy_bank_id' => $this->repository->getPiggyBank($transaction), - 'piggy_bank_name' => null, - 'bill_id' => null, - 'bill_name' => null, - 'recurrence_total' => $total, - 'recurrence_count' => $count, - ]; - $return[] = $single; + $collection = new Collection; + /** @var Carbon $date */ + foreach ($occurrences as $date) { + $result = $this->handleOccurrence($recurrence, $repetition, $date); + if (null !== $result) { + $collection->push($result); + } } - return $return; + return $collection; } /** @@ -305,166 +396,76 @@ class CreateRecurringTransactions implements ShouldQueue } /** - * Check if the occurences should be executed. + * Get transaction information from a recurring transaction. * * @param Recurrence $recurrence * @param RecurrenceRepetition $repetition - * @param array $occurrences + * @param Carbon $date + * + * @return array * - * @return Collection */ - private function handleOccurrences(Recurrence $recurrence, RecurrenceRepetition $repetition, array $occurrences): Collection + private function getTransactionData(Recurrence $recurrence, RecurrenceRepetition $repetition, Carbon $date): array { - $collection = new Collection; - /** @var Carbon $date */ - foreach ($occurrences as $date) { - $result = $this->handleOccurrence($recurrence, $repetition, $date); - if (null !== $result) { - $collection->push($result); - } + // total transactions expected for this recurrence: + $total = $this->repository->totalTransactions($recurrence, $repetition); + $count = $this->repository->getJournalCount($recurrence) + 1; + $transactions = $recurrence->recurrenceTransactions()->get(); + $return = []; + /** @var RecurrenceTransaction $transaction */ + foreach ($transactions as $index => $transaction) { + $single = [ + 'type' => strtolower($recurrence->transactionType->type), + 'date' => $date, + 'user' => $recurrence->user_id, + 'currency_id' => (int)$transaction->transaction_currency_id, + 'currency_code' => null, + 'description' => $recurrence->recurrenceTransactions()->first()->description, + 'amount' => $transaction->amount, + 'budget_id' => $this->repository->getBudget($transaction), + 'budget_name' => null, + 'category_id' => null, + 'category_name' => $this->repository->getCategory($transaction), + 'source_id' => $transaction->source_id, + 'source_name' => null, + 'destination_id' => $transaction->destination_id, + 'destination_name' => null, + 'foreign_currency_id' => $transaction->foreign_currency_id, + 'foreign_currency_code' => null, + 'foreign_amount' => $transaction->foreign_amount, + 'reconciled' => false, + 'identifier' => $index, + 'recurrence_id' => (int)$recurrence->id, + 'order' => $index, + 'notes' => (string)trans('firefly.created_from_recurrence', ['id' => $recurrence->id, 'title' => $recurrence->title]), + 'tags' => $this->repository->getTags($transaction), + 'piggy_bank_id' => $this->repository->getPiggyBank($transaction), + 'piggy_bank_name' => null, + 'bill_id' => null, + 'bill_name' => null, + 'recurrence_total' => $total, + 'recurrence_count' => $count, + ]; + $return[] = $single; } - return $collection; + return $return; } /** - * Separate method that will loop all repetitions and do something with it. Will return - * all created transaction journals. - * - * @param Recurrence $recurrence - * - * @return Collection + * @param Carbon $date */ - private function handleRepetitions(Recurrence $recurrence): Collection + public function setDate(Carbon $date): void { - $collection = new Collection; - /** @var RecurrenceRepetition $repetition */ - foreach ($recurrence->recurrenceRepetitions as $repetition) { - Log::debug( - sprintf( - 'Now repeating %s with value "%s", skips every %d time(s)', - $repetition->repetition_type, - $repetition->repetition_moment, - $repetition->repetition_skip - ) - ); - - // start looping from $startDate to today perhaps we have a hit? - // add two days to $this->date so we always include the weekend. - $includeWeekend = clone $this->date; - $includeWeekend->addDays(2); - $occurrences = $this->repository->getOccurrencesInRange($repetition, $recurrence->first_date, $includeWeekend); - - unset($includeWeekend); - - $result = $this->handleOccurrences($recurrence, $repetition, $occurrences); - $collection = $collection->merge($result); - } - - return $collection; + $date->startOfDay(); + $this->date = $date; } /** - * Has the recurrence fired today. - * - * @param Recurrence $recurrence - * - * @return bool + * @param bool $force */ - private function hasFiredToday(Recurrence $recurrence): bool + public function setForce(bool $force): void { - return null !== $recurrence->latest_date && $recurrence->latest_date->eq($this->date); - } - - /** - * Has the reuccrence started yet. - * - * @param $recurrence - * - * @return bool - */ - private function hasNotStartedYet(Recurrence $recurrence): bool - { - $startDate = $this->getStartDate($recurrence); - - return $startDate->gt($this->date); - } - - - /** - * Return true if the $repeat_until date is in the past. - * - * @param Recurrence $recurrence - * - * @return bool - */ - private function repeatUntilHasPassed(Recurrence $recurrence): bool - { - // date has passed - return null !== $recurrence->repeat_until && $recurrence->repeat_until->lt($this->date); - } - - /** - * Is the info in the recurrence valid? - * - * @param Recurrence $recurrence - * - * @return bool - * - */ - private function validRecurrence(Recurrence $recurrence): bool - { - // is not active. - if (!$this->active($recurrence)) { - Log::info(sprintf('Recurrence #%d is not active. Skipped.', $recurrence->id)); - - return false; - } - - // has repeated X times. - $journalCount = $this->repository->getJournalCount($recurrence); - if (0 !== $recurrence->repetitions && $journalCount >= $recurrence->repetitions && false === $this->force) { - Log::info(sprintf('Recurrence #%d has run %d times, so will run no longer.', $recurrence->id, $recurrence->repetitions)); - - return false; - } - - - // is no longer running - if ($this->repeatUntilHasPassed($recurrence)) { - Log::info( - sprintf( - 'Recurrence #%d was set to run until %s, and today\'s date is %s. Skipped.', - $recurrence->id, - $recurrence->repeat_until->format('Y-m-d'), - $this->date->format('Y-m-d') - ) - ); - - return false; - } - - // first_date is in the future - if ($this->hasNotStartedYet($recurrence)) { - Log::info( - sprintf( - 'Recurrence #%d is set to run on %s, and today\'s date is %s. Skipped.', - $recurrence->id, - $recurrence->first_date->format('Y-m-d'), - $this->date->format('Y-m-d') - ) - ); - - return false; - } - - // already fired today (with success): - if (false === $this->force && $this->hasFiredToday($recurrence)) { - Log::info(sprintf('Recurrence #%d has already fired today. Skipped.', $recurrence->id)); - - return false; - } - - return true; + $this->force = $force; } } diff --git a/app/Jobs/SendWebhookMessage.php b/app/Jobs/SendWebhookMessage.php index e0e9b94f41..408345a367 100644 --- a/app/Jobs/SendWebhookMessage.php +++ b/app/Jobs/SendWebhookMessage.php @@ -39,7 +39,7 @@ class SendWebhookMessage implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - private WebhookMessage $message; + private WebhookMessage $message; /** * Create a new job instance. diff --git a/app/Jobs/SubmitTelemetryData.php b/app/Jobs/SubmitTelemetryData.php index 71ac5fe04c..c29623bdae 100644 --- a/app/Jobs/SubmitTelemetryData.php +++ b/app/Jobs/SubmitTelemetryData.php @@ -26,6 +26,7 @@ namespace FireflyIII\Jobs; use Carbon\Carbon; +use Exception; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Telemetry; use GuzzleHttp\Client; @@ -38,7 +39,6 @@ use Illuminate\Queue\SerializesModels; use Illuminate\Support\Collection; use JsonException; use Log; -use Exception; /** * Class SubmitTelemetryData @@ -102,13 +102,13 @@ class SubmitTelemetryData implements ShouldQueue ]; try { $result = $client->post($url, $options); - } catch (GuzzleException|Exception $e) { + } catch (GuzzleException | Exception $e) { Log::error($e->getMessage()); Log::error($e->getTraceAsString()); Log::error('Could not submit telemetry.'); throw new FireflyException(sprintf('Could not submit telemetry: %s', $e->getMessage())); } - $body = (string) $result->getBody(); + $body = (string)$result->getBody(); $statusCode = $result->getStatusCode(); Log::info(sprintf('Result of submission [%d]: %s', $statusCode, $body)); if (200 === $statusCode) { @@ -117,22 +117,6 @@ class SubmitTelemetryData implements ShouldQueue } } - /** - * @param Carbon $date - */ - public function setDate(Carbon $date): void - { - $this->date = $date; - } - - /** - * @param bool $force - */ - public function setForce(bool $force): void - { - $this->force = $force; - } - /** * @return Collection */ @@ -144,19 +128,6 @@ class SubmitTelemetryData implements ShouldQueue return $collection; } - /** - * @param Collection $telemetry - */ - private function markAsSubmitted(Collection $telemetry): void - { - $telemetry->each( - static function (Telemetry $entry) { - $entry->submitted = today(config('app.timezone')); - $entry->save(); - } - ); - } - /** * @param Collection $telemetry * @@ -179,4 +150,33 @@ class SubmitTelemetryData implements ShouldQueue return $array; } + /** + * @param Collection $telemetry + */ + private function markAsSubmitted(Collection $telemetry): void + { + $telemetry->each( + static function (Telemetry $entry) { + $entry->submitted = today(config('app.timezone')); + $entry->save(); + } + ); + } + + /** + * @param Carbon $date + */ + public function setDate(Carbon $date): void + { + $this->date = $date; + } + + /** + * @param bool $force + */ + public function setForce(bool $force): void + { + $this->force = $force; + } + } diff --git a/app/Mail/AccessTokenCreatedMail.php b/app/Mail/AccessTokenCreatedMail.php index abc626f4ae..848dfbac58 100644 --- a/app/Mail/AccessTokenCreatedMail.php +++ b/app/Mail/AccessTokenCreatedMail.php @@ -63,6 +63,6 @@ class AccessTokenCreatedMail extends Mailable public function build(): self { return $this->view('v1.emails.access-token-created-html')->text('v1.emails.access-token-created-text') - ->subject((string) trans('email.access_token_created_subject')); + ->subject((string)trans('email.access_token_created_subject')); } } diff --git a/app/Mail/AdminTestMail.php b/app/Mail/AdminTestMail.php index 406e4cb88d..d9f0e06b75 100644 --- a/app/Mail/AdminTestMail.php +++ b/app/Mail/AdminTestMail.php @@ -62,6 +62,6 @@ class AdminTestMail extends Mailable public function build(): self { return $this->view('v1.emails.admin-test-html')->text('v1.emails.admin-test-text') - ->subject((string) trans('email.admin_test_subject')); + ->subject((string)trans('email.admin_test_subject')); } } diff --git a/app/Mail/ConfirmEmailChangeMail.php b/app/Mail/ConfirmEmailChangeMail.php index 7f8694da23..ae3a613494 100644 --- a/app/Mail/ConfirmEmailChangeMail.php +++ b/app/Mail/ConfirmEmailChangeMail.php @@ -70,6 +70,6 @@ class ConfirmEmailChangeMail extends Mailable public function build(): self { return $this->view('v1.emails.confirm-email-change-html')->text('v1.emails.confirm-email-change-text') - ->subject((string) trans('email.email_change_subject')); + ->subject((string)trans('email.email_change_subject')); } } diff --git a/app/Mail/NewIPAddressWarningMail.php b/app/Mail/NewIPAddressWarningMail.php index 58cf46620e..855b97076b 100644 --- a/app/Mail/NewIPAddressWarningMail.php +++ b/app/Mail/NewIPAddressWarningMail.php @@ -55,9 +55,10 @@ class NewIPAddressWarningMail extends Mailable { use Queueable, SerializesModels; + public string $host; public string $ipAddress; public string $time; - public string $host; + /** * OAuthTokenCreatedMail constructor. * @@ -78,12 +79,12 @@ class NewIPAddressWarningMail extends Mailable // time $this->time = now()->formatLocalized((string)trans('config.date_time')); $this->host = ''; - $hostName = gethostbyaddr($this->ipAddress); - if($hostName !== $this->ipAddress) { + $hostName = gethostbyaddr($this->ipAddress); + if ($hostName !== $this->ipAddress) { $this->host = $hostName; } return $this->view('v1.emails.new-ip-html')->text('v1.emails.new-ip-text') - ->subject((string) trans('email.login_from_new_ip')); + ->subject((string)trans('email.login_from_new_ip')); } } diff --git a/app/Mail/OAuthTokenCreatedMail.php b/app/Mail/OAuthTokenCreatedMail.php index dd7b169574..2e2e8e2d7e 100644 --- a/app/Mail/OAuthTokenCreatedMail.php +++ b/app/Mail/OAuthTokenCreatedMail.php @@ -67,6 +67,6 @@ class OAuthTokenCreatedMail extends Mailable public function build(): self { return $this->view('v1.emails.oauth-client-created-html')->text('v1.emails.oauth-client-created-text') - ->subject((string) trans('email.oauth_created_subject')); + ->subject((string)trans('email.oauth_created_subject')); } } diff --git a/app/Mail/RegisteredUser.php b/app/Mail/RegisteredUser.php index d56180f336..c0c8a051e4 100644 --- a/app/Mail/RegisteredUser.php +++ b/app/Mail/RegisteredUser.php @@ -37,6 +37,7 @@ use Illuminate\Queue\SerializesModels; class RegisteredUser extends Mailable { use Queueable, SerializesModels; + /** @var string Email address of user */ public $address; /** @var string IP address of user */ @@ -61,6 +62,6 @@ class RegisteredUser extends Mailable */ public function build(): self { - return $this->view('v1.emails.registered-html')->text('v1.emails.registered-text')->subject((string) trans('email.registered_subject')); + return $this->view('v1.emails.registered-html')->text('v1.emails.registered-text')->subject((string)trans('email.registered_subject')); } } diff --git a/app/Mail/ReportNewJournalsMail.php b/app/Mail/ReportNewJournalsMail.php index 36b1c3fe1c..244d380f80 100644 --- a/app/Mail/ReportNewJournalsMail.php +++ b/app/Mail/ReportNewJournalsMail.php @@ -40,10 +40,10 @@ class ReportNewJournalsMail extends Mailable { use Queueable, SerializesModels; - public string $email; + public string $email; public Collection $groups; - public string $ipAddress; - public array $transformed; + public string $ipAddress; + public array $transformed; /** * ConfirmEmailChangeMail constructor. @@ -69,7 +69,7 @@ class ReportNewJournalsMail extends Mailable $this->transform(); return $this->view('v1.emails.report-new-journals-html')->text('v1.emails.report-new-journals-text') - ->subject((string) trans_choice('email.new_journals_subject', $this->groups->count())); + ->subject((string)trans_choice('email.new_journals_subject', $this->groups->count())); } private function transform(): void diff --git a/app/Mail/RequestedNewPassword.php b/app/Mail/RequestedNewPassword.php index 19833e195d..f7d3a51db1 100644 --- a/app/Mail/RequestedNewPassword.php +++ b/app/Mail/RequestedNewPassword.php @@ -36,6 +36,7 @@ use Illuminate\Queue\SerializesModels; class RequestedNewPassword extends Mailable { use Queueable, SerializesModels; + /** @var string IP address of user */ public $ipAddress; /** @var string URI of password change link */ @@ -60,6 +61,6 @@ class RequestedNewPassword extends Mailable */ public function build(): self { - return $this->view('v1.emails.password-html')->text('v1.emails.password-text')->subject((string) trans('email.reset_pw_subject')); + return $this->view('v1.emails.password-html')->text('v1.emails.password-text')->subject((string)trans('email.reset_pw_subject')); } } diff --git a/app/Mail/UndoEmailChangeMail.php b/app/Mail/UndoEmailChangeMail.php index 3cdfdca396..c5e8a33b0a 100644 --- a/app/Mail/UndoEmailChangeMail.php +++ b/app/Mail/UndoEmailChangeMail.php @@ -68,6 +68,6 @@ class UndoEmailChangeMail extends Mailable public function build(): self { return $this->view('v1.emails.undo-email-change-html')->text('v1.emails.undo-email-change-text') - ->subject((string) trans('email.email_change_subject')); + ->subject((string)trans('email.email_change_subject')); } } diff --git a/app/Models/Bill.php b/app/Models/Bill.php index 972c30938b..ee6c10be43 100644 --- a/app/Models/Bill.php +++ b/app/Models/Bill.php @@ -37,36 +37,36 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * FireflyIII\Models\Bill * - * @property int $id - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property \Illuminate\Support\Carbon|null $deleted_at - * @property int $user_id - * @property int|null $transaction_currency_id - * @property string $name - * @property string $match - * @property string $amount_min - * @property string $amount_max - * @property \Illuminate\Support\Carbon $date - * @property string|null $end_date - * @property string|null $extension_date - * @property string $repeat_freq - * @property int $skip - * @property bool $automatch - * @property bool $active - * @property bool $name_encrypted - * @property bool $match_encrypted - * @property int $order - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Attachment[] $attachments - * @property-read int|null $attachments_count - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Note[] $notes - * @property-read int|null $notes_count - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\ObjectGroup[] $objectGroups - * @property-read int|null $object_groups_count - * @property-read \FireflyIII\Models\TransactionCurrency|null $transactionCurrency + * @property int $id + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property \Illuminate\Support\Carbon|null $deleted_at + * @property int $user_id + * @property int|null $transaction_currency_id + * @property string $name + * @property string $match + * @property string $amount_min + * @property string $amount_max + * @property \Illuminate\Support\Carbon $date + * @property string|null $end_date + * @property string|null $extension_date + * @property string $repeat_freq + * @property int $skip + * @property bool $automatch + * @property bool $active + * @property bool $name_encrypted + * @property bool $match_encrypted + * @property int $order + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Attachment[] $attachments + * @property-read int|null $attachments_count + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Note[] $notes + * @property-read int|null $notes_count + * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\ObjectGroup[] $objectGroups + * @property-read int|null $object_groups_count + * @property-read \FireflyIII\Models\TransactionCurrency|null $transactionCurrency * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionJournals - * @property-read int|null $transaction_journals_count - * @property-read User $user + * @property-read int|null $transaction_journals_count + * @property-read User $user * @method static \Illuminate\Database\Eloquent\Builder|Bill newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Bill newQuery() * @method static Builder|Bill onlyTrashed() @@ -98,6 +98,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class Bill extends Model { use SoftDeletes; + /** * The attributes that should be casted to native types. * @@ -128,13 +129,13 @@ class Bill extends Model * * @param string $value * - * @throws NotFoundHttpException * @return Bill + * @throws NotFoundHttpException */ public static function routeBinder(string $value): Bill { if (auth()->check()) { - $billId = (int) $value; + $billId = (int)$value; /** @var User $user */ $user = auth()->user(); /** @var Bill $bill */ @@ -179,7 +180,7 @@ class Bill extends Model */ public function setAmountMaxAttribute($value): void { - $this->attributes['amount_max'] = (string) $value; + $this->attributes['amount_max'] = (string)$value; } /** @@ -189,7 +190,7 @@ class Bill extends Model */ public function setAmountMinAttribute($value): void { - $this->attributes['amount_min'] = (string) $value; + $this->attributes['amount_min'] = (string)$value; } /** diff --git a/app/Models/RecurrenceTransaction.php b/app/Models/RecurrenceTransaction.php index dcb1c804b0..137d59ef73 100644 --- a/app/Models/RecurrenceTransaction.php +++ b/app/Models/RecurrenceTransaction.php @@ -76,6 +76,7 @@ use Illuminate\Support\Collection; * @mixin Eloquent * @property int|null $transaction_type_id * @method static \Illuminate\Database\Eloquent\Builder|RecurrenceTransaction whereTransactionTypeId($value) + * @property-read \FireflyIII\Models\TransactionType|null $transactionType */ class RecurrenceTransaction extends Model { @@ -154,4 +155,12 @@ class RecurrenceTransaction extends Model { return $this->belongsTo(TransactionCurrency::class); } + /** + * @codeCoverageIgnore + * @return BelongsTo + */ + public function transactionType(): BelongsTo + { + return $this->belongsTo(TransactionType::class); + } } diff --git a/app/Models/Tag.php b/app/Models/Tag.php index 22cc77723f..fda812145d 100644 --- a/app/Models/Tag.php +++ b/app/Models/Tag.php @@ -22,40 +22,40 @@ declare(strict_types=1); namespace FireflyIII\Models; -use Carbon\Carbon; use Eloquent; use FireflyIII\User; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Query\Builder; -use Illuminate\Support\Collection; +use Illuminate\Support\Carbon; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * FireflyIII\Models\Tag * - * @property int $id - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property \Illuminate\Support\Carbon|null $deleted_at - * @property int $user_id - * @property string $tag - * @property string $tagMode - * @property \Illuminate\Support\Carbon|null $date - * @property string|null $description - * @property float|null $latitude - * @property float|null $longitude - * @property int|null $zoomLevel - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Attachment[] $attachments - * @property-read int|null $attachments_count - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\Location[] $locations - * @property-read int|null $locations_count - * @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\TransactionJournal[] $transactionJournals - * @property-read int|null $transaction_journals_count - * @property-read User $user + * @property int $id + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property Carbon|null $deleted_at + * @property int $user_id + * @property string $tag + * @property string $tagMode + * @property Carbon|null $date + * @property string|null $description + * @property float|null $latitude + * @property float|null $longitude + * @property int|null $zoomLevel + * @property-read Collection|Attachment[] $attachments + * @property-read int|null $attachments_count + * @property-read Collection|Location[] $locations + * @property-read int|null $locations_count + * @property-read Collection|TransactionJournal[] $transactionJournals + * @property-read int|null $transaction_journals_count + * @property-read User $user * @method static \Illuminate\Database\Eloquent\Builder|Tag newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Tag newQuery() * @method static Builder|Tag onlyTrashed() @@ -105,13 +105,13 @@ class Tag extends Model * * @param string $value * - * @throws NotFoundHttpException * @return Tag + * @throws NotFoundHttpException */ public static function routeBinder(string $value): Tag { if (auth()->check()) { - $tagId = (int) $value; + $tagId = (int)$value; /** @var User $user */ $user = auth()->user(); /** @var Tag $tag */ @@ -127,18 +127,18 @@ class Tag extends Model * @codeCoverageIgnore * @return MorphMany */ - public function locations(): MorphMany + public function attachments(): MorphMany { - return $this->morphMany(Location::class, 'locatable'); + return $this->morphMany(Attachment::class, 'attachable'); } /** * @codeCoverageIgnore * @return MorphMany */ - public function attachments(): MorphMany + public function locations(): MorphMany { - return $this->morphMany(Attachment::class, 'attachable'); + return $this->morphMany(Location::class, 'locatable'); } /** diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3a66b72d3c..7548e10fc9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -22,11 +22,11 @@ declare(strict_types=1); namespace FireflyIII\Providers; +use Adldap\Laravel\Middleware\WindowsAuthenticate; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; use Laravel\Passport\Passport; use URL; -use Adldap\Laravel\Middleware\WindowsAuthenticate; /** * @codeCoverageIgnore diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index e1e2fd2456..0a3d376d66 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -49,6 +49,7 @@ use Session; /** * Class EventServiceProvider. + * * @codeCoverageIgnore */ class EventServiceProvider extends ServiceProvider @@ -61,55 +62,55 @@ class EventServiceProvider extends ServiceProvider protected $listen = [ // is a User related event. - RegisteredUser::class => [ + RegisteredUser::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendRegistrationMail', 'FireflyIII\Handlers\Events\UserEventHandler@attachUserRole', ], // is a User related event. - Login::class => [ + Login::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@checkSingleUserIsAdmin', 'FireflyIII\Handlers\Events\UserEventHandler@demoUserBackToEnglish', 'FireflyIII\Handlers\Events\UserEventHandler@storeUserIPAddress', ], - DetectedNewIPAddress::class => [ + DetectedNewIPAddress::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@notifyNewIPAddress', ], - RequestedVersionCheckStatus::class => [ + RequestedVersionCheckStatus::class => [ 'FireflyIII\Handlers\Events\VersionCheckEventHandler@checkForUpdates', ], - RequestedReportOnJournals::class => [ + RequestedReportOnJournals::class => [ 'FireflyIII\Handlers\Events\AutomationHandler@reportJournals', ], // is a User related event. - RequestedNewPassword::class => [ + RequestedNewPassword::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendNewPassword', ], // is a User related event. - UserChangedEmail::class => [ + UserChangedEmail::class => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendEmailChangeConfirmMail', 'FireflyIII\Handlers\Events\UserEventHandler@sendEmailChangeUndoMail', ], // admin related - AdminRequestedTestMessage::class => [ + AdminRequestedTestMessage::class => [ 'FireflyIII\Handlers\Events\AdminEventHandler@sendTestMessage', ], // is a Transaction Journal related event. - StoredTransactionGroup::class => [ + StoredTransactionGroup::class => [ 'FireflyIII\Handlers\Events\StoredGroupEventHandler@processRules', 'FireflyIII\Handlers\Events\StoredGroupEventHandler@triggerWebhooks', ], // is a Transaction Journal related event. - UpdatedTransactionGroup::class => [ + UpdatedTransactionGroup::class => [ 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@unifyAccounts', 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@processRules', 'FireflyIII\Handlers\Events\UpdatedGroupEventHandler@triggerWebhooks', ], - DestroyedTransactionGroup::class => [ + DestroyedTransactionGroup::class => [ 'FireflyIII\Handlers\Events\DestroyedGroupEventHandler@triggerWebhooks', ], // API related events: - AccessTokenCreated::class => [ + AccessTokenCreated::class => [ 'FireflyIII\Handlers\Events\APIEventHandler@accessTokenCreated', ], diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index e62983bae9..2707e8f906 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -234,7 +234,7 @@ class FireflyServiceProvider extends ServiceProvider // webhooks: $this->app->bind(MessageGeneratorInterface::class, StandardMessageGenerator::class); - $this->app->bind(SignatureGeneratorInterface::class,Sha3SignatureGenerator::class); + $this->app->bind(SignatureGeneratorInterface::class, Sha3SignatureGenerator::class); $this->app->bind(WebhookSenderInterface::class, StandardWebhookSender::class); // password verifier thing diff --git a/app/Providers/FireflySessionProvider.php b/app/Providers/FireflySessionProvider.php index 0e5379339d..6021e5d9ba 100644 --- a/app/Providers/FireflySessionProvider.php +++ b/app/Providers/FireflySessionProvider.php @@ -44,6 +44,19 @@ class FireflySessionProvider extends ServiceProvider $this->app->singleton(StartFireflySession::class); } + /** + * Register the session manager instance. + */ + protected function registerSessionManager(): void + { + $this->app->singleton( + 'session', + function ($app) { + return new SessionManager($app); + } + ); + } + /** * Register the session driver instance. */ @@ -59,17 +72,4 @@ class FireflySessionProvider extends ServiceProvider } ); } - - /** - * Register the session manager instance. - */ - protected function registerSessionManager(): void - { - $this->app->singleton( - 'session', - function ($app) { - return new SessionManager($app); - } - ); - } } diff --git a/app/Providers/JournalServiceProvider.php b/app/Providers/JournalServiceProvider.php index 183e63f524..cf8eb35024 100644 --- a/app/Providers/JournalServiceProvider.php +++ b/app/Providers/JournalServiceProvider.php @@ -58,44 +58,6 @@ class JournalServiceProvider extends ServiceProvider $this->registerGroupCollector(); } - /** - * - */ - private function registerGroupCollector(): void - { - $this->app->bind( - GroupCollectorInterface::class, - static function (Application $app) { - /** @var GroupCollectorInterface $collector */ - $collector = app(GroupCollector::class); - if ($app->auth->check()) { - $collector->setUser(auth()->user()); - } - - return $collector; - } - ); - } - - /** - * Register group repos. - */ - private function registerGroupRepository(): void - { - $this->app->bind( - TransactionGroupRepositoryInterface::class, - static function (Application $app) { - /** @var TransactionGroupRepositoryInterface $repository */ - $repository = app(TransactionGroupRepository::class); - if ($app->auth->check()) { - $repository->setUser(auth()->user()); - } - - return $repository; - } - ); - } - /** * Register repository. */ @@ -142,4 +104,42 @@ class JournalServiceProvider extends ServiceProvider } ); } + + /** + * Register group repos. + */ + private function registerGroupRepository(): void + { + $this->app->bind( + TransactionGroupRepositoryInterface::class, + static function (Application $app) { + /** @var TransactionGroupRepositoryInterface $repository */ + $repository = app(TransactionGroupRepository::class); + if ($app->auth->check()) { + $repository->setUser(auth()->user()); + } + + return $repository; + } + ); + } + + /** + * + */ + private function registerGroupCollector(): void + { + $this->app->bind( + GroupCollectorInterface::class, + static function (Application $app) { + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollector::class); + if ($app->auth->check()) { + $collector->setUser(auth()->user()); + } + + return $collector; + } + ); + } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 3e79b55f58..92a4e98af2 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -54,7 +54,7 @@ class RouteServiceProvider extends ServiceProvider public function map(): void { $this->mapApiRoutes(); - + $this->mapCronApiRoutes(); $this->mapWebRoutes(); } @@ -71,6 +71,19 @@ class RouteServiceProvider extends ServiceProvider ->group(base_path('routes/api.php')); } + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + */ + protected function mapCronApiRoutes(): void + { + Route::prefix('api/v1/cron') + ->middleware('apiY') + ->namespace($this->namespace) + ->group(base_path('routes/api-noauth.php')); + } + /** * Define the "web" routes for the application. * diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index e3e7741cc4..0e0529f081 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -545,6 +545,33 @@ class AccountRepository implements AccountRepositoryInterface return in_array($account->accountType->type, [AccountType::CREDITCARD, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE], true); } + /** + * @inheritDoc + */ + public function maxOrder(string $type): int + { + $sets = [ + AccountType::ASSET => [AccountType::DEFAULT, AccountType::ASSET], + AccountType::EXPENSE => [AccountType::EXPENSE, AccountType::BENEFICIARY], + AccountType::REVENUE => [AccountType::REVENUE], + AccountType::LOAN => [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], + AccountType::DEBT => [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], + AccountType::MORTGAGE => [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], + ]; + if (array_key_exists(ucfirst($type), $sets)) { + $order = (int)$this->getAccountsByType($sets[ucfirst($type)])->max('order'); + Log::debug(sprintf('Return max order of "%s" set: %d', $type, $order)); + + return $order; + } + $specials = [AccountType::CASH, AccountType::INITIAL_BALANCE, AccountType::IMPORT, AccountType::RECONCILIATION]; + + $order = (int)$this->getAccountsByType($specials)->max('order'); + Log::debug(sprintf('Return max order of "%s" set (specials!): %d', $type, $order)); + + return $order; + } + /** * Returns the date of the very first transaction in this account. * @@ -720,31 +747,4 @@ class AccountRepository implements AccountRepositoryInterface return $service->update($account, $data); } - - /** - * @inheritDoc - */ - public function maxOrder(string $type): int - { - $sets = [ - AccountType::ASSET => [AccountType::DEFAULT, AccountType::ASSET], - AccountType::EXPENSE => [AccountType::EXPENSE, AccountType::BENEFICIARY], - AccountType::REVENUE => [AccountType::REVENUE], - AccountType::LOAN => [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], - AccountType::DEBT => [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], - AccountType::MORTGAGE => [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], - ]; - if (array_key_exists(ucfirst($type), $sets)) { - $order = (int)$this->getAccountsByType($sets[ucfirst($type)])->max('order'); - Log::debug(sprintf('Return max order of "%s" set: %d', $type, $order)); - - return $order; - } - $specials = [AccountType::CASH, AccountType::INITIAL_BALANCE, AccountType::IMPORT, AccountType::RECONCILIATION]; - - $order = (int)$this->getAccountsByType($specials)->max('order'); - Log::debug(sprintf('Return max order of "%s" set (specials!): %d', $type, $order)); - - return $order; - } } diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index a26e9a1afe..b4e973d808 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -47,13 +47,6 @@ interface AccountRepositoryInterface */ public function count(array $types): int; - /** - * @param string $type - * - * @return int - */ - public function maxOrder(string $type): int; - /** * Moved here from account CRUD. * @@ -243,6 +236,13 @@ interface AccountRepositoryInterface */ public function isLiability(Account $account): bool; + /** + * @param string $type + * + * @return int + */ + public function maxOrder(string $type): int; + /** * Returns the date of the very first transaction in this account. * diff --git a/app/Repositories/Attachment/AttachmentRepository.php b/app/Repositories/Attachment/AttachmentRepository.php index 5b791637ed..6a51a73345 100644 --- a/app/Repositories/Attachment/AttachmentRepository.php +++ b/app/Repositories/Attachment/AttachmentRepository.php @@ -179,7 +179,15 @@ class AttachmentRepository implements AttachmentRepositoryInterface $attachment->filename = $data['filename']; } } + // update model (move attachment) + // should be validated already: + if (array_key_exists('attachable_type', $data) && array_key_exists('attachable_id', $data)) { + $attachment->attachable_id = (int)$data['attachable_id']; + $attachment->attachable_type = sprintf('FireflyIII\\Models\\%s', $data['attachable_type']); + } + $attachment->save(); + $attachment->refresh(); if (array_key_exists('notes', $data)) { $this->updateNote($attachment, (string)$data['notes']); } diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index ea0d2675c5..3ce432a28a 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -335,6 +335,9 @@ class BudgetRepository implements BudgetRepositoryInterface if ('none' === $type) { return $newBudget; } + if (0 === $type) { + return $newBudget; + } if ('reset' === $type) { $type = AutoBudget::AUTO_BUDGET_RESET; @@ -343,7 +346,8 @@ class BudgetRepository implements BudgetRepositoryInterface $type = AutoBudget::AUTO_BUDGET_ROLLOVER; } - $repos = app(CurrencyRepositoryInterface::class); + $repos = app(CurrencyRepositoryInterface::class); + $currency = null; if (array_key_exists('currency_id', $data)) { $currency = $repos->findNull((int)$data['currency_id']); } @@ -390,6 +394,8 @@ class BudgetRepository implements BudgetRepositoryInterface */ public function update(Budget $budget, array $data): Budget { + Log::debug('Now in update()'); + // TODO update rules $oldName = $budget->name; if (array_key_exists('name', $data)) { $budget->name = $data['name']; @@ -417,18 +423,24 @@ class BudgetRepository implements BudgetRepositoryInterface $currency = app('amount')->getDefaultCurrencyByUser($this->user); } + if (null === $autoBudget && array_key_exists('auto_budget_type', $data) && array_key_exists('auto_budget_amount', $data) + && 0 !== $data['auto_budget_type'] + && 'none' !== $data['auto_budget_type'] ) { // only create if all are here: $autoBudget = new AutoBudget; $autoBudget->budget_id = $budget->id; $autoBudget->transaction_currency_id = $currency->id; } + if (null !== $autoBudget && null !== $currency) { + $autoBudget->transaction_currency_id = $currency->id; + } // update existing type - if (array_key_exists('auto_budget_type', $data)) { + if (array_key_exists('auto_budget_type', $data) && 0 !== $data['auto_budget_type']) { $autoBudgetType = $data['auto_budget_type']; if ('reset' === $autoBudgetType) { $autoBudget->auto_budget_type = AutoBudget::AUTO_BUDGET_RESET; @@ -436,16 +448,16 @@ class BudgetRepository implements BudgetRepositoryInterface if ('rollover' === $autoBudgetType) { $autoBudget->auto_budget_type = AutoBudget::AUTO_BUDGET_ROLLOVER; } - if ('none' === $autoBudgetType && null !== $autoBudget->id) { + if ('none' === $autoBudgetType && null !== $autoBudget) { $autoBudget->delete(); return $budget; } } - if (array_key_exists('auto_budget_amount', $data)) { + if (array_key_exists('auto_budget_amount', $data) && null !== $autoBudget) { $autoBudget->amount = $data['auto_budget_amount']; } - if (array_key_exists('auto_budget_period', $data)) { + if (array_key_exists('auto_budget_period', $data) && null !== $autoBudget) { $autoBudget->period = $data['auto_budget_period']; } if (null !== $autoBudget) { @@ -456,27 +468,6 @@ class BudgetRepository implements BudgetRepositoryInterface return $budget; } - /** - * @param string $oldName - * @param string $newName - */ - private function updateRuleTriggers(string $oldName, string $newName): void - { - $types = ['budget_is',]; - $triggers = RuleTrigger::leftJoin('rules', 'rules.id', '=', 'rule_triggers.rule_id') - ->where('rules.user_id', $this->user->id) - ->whereIn('rule_triggers.trigger_type', $types) - ->where('rule_triggers.trigger_value', $oldName) - ->get(['rule_triggers.*']); - Log::debug(sprintf('Found %d triggers to update.', $triggers->count())); - /** @var RuleTrigger $trigger */ - foreach ($triggers as $trigger) { - $trigger->trigger_value = $newName; - $trigger->save(); - Log::debug(sprintf('Updated trigger %d: %s', $trigger->id, $trigger->trigger_value)); - } - } - /** * @param string $oldName * @param string $newName @@ -497,4 +488,25 @@ class BudgetRepository implements BudgetRepositoryInterface Log::debug(sprintf('Updated action %d: %s', $action->id, $action->action_value)); } } + + /** + * @param string $oldName + * @param string $newName + */ + private function updateRuleTriggers(string $oldName, string $newName): void + { + $types = ['budget_is',]; + $triggers = RuleTrigger::leftJoin('rules', 'rules.id', '=', 'rule_triggers.rule_id') + ->where('rules.user_id', $this->user->id) + ->whereIn('rule_triggers.trigger_type', $types) + ->where('rule_triggers.trigger_value', $oldName) + ->get(['rule_triggers.*']); + Log::debug(sprintf('Found %d triggers to update.', $triggers->count())); + /** @var RuleTrigger $trigger */ + foreach ($triggers as $trigger) { + $trigger->trigger_value = $newName; + $trigger->save(); + Log::debug(sprintf('Updated trigger %d: %s', $trigger->id, $trigger->trigger_value)); + } + } } diff --git a/app/Repositories/ObjectGroup/ObjectGroupRepository.php b/app/Repositories/ObjectGroup/ObjectGroupRepository.php index ef16cff48e..75c00e1ac2 100644 --- a/app/Repositories/ObjectGroup/ObjectGroupRepository.php +++ b/app/Repositories/ObjectGroup/ObjectGroupRepository.php @@ -108,6 +108,27 @@ class ObjectGroupRepository implements ObjectGroupRepositoryInterface return $objectGroup->piggyBanks; } + /** + * @inheritDoc + */ + public function resetOrder(): void + { + Log::debug('Now in resetOrder'); + $list = $this->get(); + $index = 1; + /** @var ObjectGroup $objectGroup */ + foreach ($list as $objectGroup) { + if ($index !== (int)$objectGroup->order) { + Log::debug( + sprintf('objectGroup #%d ("%s"): order should %d be but is %d.', $objectGroup->id, $objectGroup->title, $index, $objectGroup->order) + ); + $objectGroup->order = $index; + $objectGroup->save(); + } + $index++; + } + } + /** * @param string $query * @param int $limit @@ -164,11 +185,11 @@ class ObjectGroupRepository implements ObjectGroupRepositoryInterface */ public function update(ObjectGroup $objectGroup, array $data): ObjectGroup { - if(array_key_exists('title', $data)) { + if (array_key_exists('title', $data)) { $objectGroup->title = $data['title']; } - if(array_key_exists('order', $data)) { + if (array_key_exists('order', $data)) { $this->setOrder($objectGroup, (int)$data['order']); } @@ -184,25 +205,4 @@ class ObjectGroupRepository implements ObjectGroupRepositoryInterface { $this->user = $user; } - - /** - * @inheritDoc - */ - public function resetOrder(): void - { - Log::debug('Now in resetOrder'); - $list = $this->get(); - $index = 1; - /** @var ObjectGroup $objectGroup */ - foreach ($list as $objectGroup) { - if ($index !== (int)$objectGroup->order) { - Log::debug( - sprintf('objectGroup #%d ("%s"): order should %d be but is %d.', $objectGroup->id, $objectGroup->title, $index, $objectGroup->order) - ); - $objectGroup->order = $index; - $objectGroup->save(); - } - $index++; - } - } } diff --git a/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php b/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php index be3c9a84a4..fce3a6bb68 100644 --- a/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php +++ b/app/Repositories/ObjectGroup/ObjectGroupRepositoryInterface.php @@ -37,11 +37,6 @@ interface ObjectGroupRepositoryInterface */ public function deleteAll(): void; - /** - * Delete all. - */ - public function resetOrder(): void; - /** * Delete empty ones. */ @@ -71,6 +66,11 @@ interface ObjectGroupRepositoryInterface */ public function getPiggyBanks(ObjectGroup $objectGroup): Collection; + /** + * Delete all. + */ + public function resetOrder(): void; + /** * @param string $query * @param int $limit diff --git a/app/Repositories/PiggyBank/ModifiesPiggyBanks.php b/app/Repositories/PiggyBank/ModifiesPiggyBanks.php index 5aad8ddb3f..76eba29447 100644 --- a/app/Repositories/PiggyBank/ModifiesPiggyBanks.php +++ b/app/Repositories/PiggyBank/ModifiesPiggyBanks.php @@ -122,23 +122,6 @@ trait ModifiesPiggyBanks return bccomp($amount, $savedSoFar) <= 0; } - /** - * Correct order of piggies in case of issues. - */ - public function resetOrder(): void - { - $set = $this->user->piggyBanks()->orderBy('piggy_banks.order', 'ASC')->get(['piggy_banks.*']); - $current = 1; - foreach ($set as $piggyBank) { - if ((int)$piggyBank->order !== $current) { - Log::debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current)); - $piggyBank->order = $current; - $piggyBank->save(); - } - $current++; - } - } - /** * @param PiggyBank $piggyBank * @param string $amount @@ -217,6 +200,23 @@ trait ModifiesPiggyBanks return $piggyBank; } + /** + * Correct order of piggies in case of issues. + */ + public function resetOrder(): void + { + $set = $this->user->piggyBanks()->orderBy('piggy_banks.order', 'ASC')->get(['piggy_banks.*']); + $current = 1; + foreach ($set as $piggyBank) { + if ((int)$piggyBank->order !== $current) { + Log::debug(sprintf('Piggy bank #%d ("%s") was at place %d but should be on %d', $piggyBank->id, $piggyBank->name, $piggyBank->order, $current)); + $piggyBank->order = $current; + $piggyBank->save(); + } + $current++; + } + } + /** * @param PiggyBank $piggyBank * @param string $amount diff --git a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php index 3f891f2c94..9e16a57b6f 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php +++ b/app/Repositories/PiggyBank/PiggyBankRepositoryInterface.php @@ -68,11 +68,6 @@ interface PiggyBankRepositoryInterface */ public function canRemoveAmount(PiggyBank $piggyBank, string $amount): bool; - /** - * Correct order of piggies in case of issues. - */ - public function resetOrder(): void; - /** * Create a new event. * @@ -237,6 +232,11 @@ interface PiggyBankRepositoryInterface */ public function removeObjectGroup(PiggyBank $piggyBank): PiggyBank; + /** + * Correct order of piggies in case of issues. + */ + public function resetOrder(): void; + /** * Search for piggy banks. * diff --git a/app/Repositories/Recurring/RecurringRepository.php b/app/Repositories/Recurring/RecurringRepository.php index 80ba813e26..05780c8bbe 100644 --- a/app/Repositories/Recurring/RecurringRepository.php +++ b/app/Repositories/Recurring/RecurringRepository.php @@ -570,6 +570,7 @@ class RecurringRepository implements RecurringRepositoryInterface { /** @var RecurrenceUpdateService $service */ $service = app(RecurrenceUpdateService::class); + return $service->update($recurrence, $data); } diff --git a/app/Repositories/Rule/RuleRepository.php b/app/Repositories/Rule/RuleRepository.php index 8c83111d22..9cb50e7af9 100644 --- a/app/Repositories/Rule/RuleRepository.php +++ b/app/Repositories/Rule/RuleRepository.php @@ -259,26 +259,11 @@ class RuleRepository implements RuleRepositoryInterface } /** - * @param Rule $rule - * - * @return bool + * @inheritDoc */ - public function moveDown(Rule $rule): bool + public function maxOrder(RuleGroup $ruleGroup): int { - $order = $rule->order; - - // find the rule with order+1 and give it order-1 - $other = $rule->ruleGroup->rules()->where('order', $order + 1)->first(); - if ($other) { - --$other->order; - $other->save(); - } - - ++$rule->order; - $rule->save(); - $this->resetRuleOrder($rule->ruleGroup); - - return true; + return (int)$ruleGroup->rules()->max('order'); } /** @@ -286,82 +271,16 @@ class RuleRepository implements RuleRepositoryInterface */ public function moveRule(Rule $rule, RuleGroup $ruleGroup, int $order): Rule { - $rule->order = $order; if ($rule->rule_group_id !== $ruleGroup->id) { $rule->rule_group_id = $ruleGroup->id; } $rule->save(); + $rule->refresh(); + $this->setOrder($rule, $order); return $rule; } - /** - * @param Rule $rule - * - * @return bool - */ - public function moveUp(Rule $rule): bool - { - $order = $rule->order; - - // find the rule with order-1 and give it order+1 - $other = $rule->ruleGroup->rules()->where('order', $order - 1)->first(); - if ($other) { - ++$other->order; - $other->save(); - } - - --$rule->order; - $rule->save(); - $this->resetRuleOrder($rule->ruleGroup); - - return true; - } - - /** - * @param Rule $rule - * @param array $ids - * - * @return bool - */ - public function reorderRuleActions(Rule $rule, array $ids): bool - { - $order = 1; - foreach ($ids as $actionId) { - /** @var RuleTrigger $trigger */ - $action = $rule->ruleActions()->find($actionId); - if (null !== $action) { - $action->order = $order; - $action->save(); - ++$order; - } - } - - return true; - } - - /** - * @param Rule $rule - * @param array $ids - * - * @return bool - */ - public function reorderRuleTriggers(Rule $rule, array $ids): bool - { - $order = 1; - foreach ($ids as $triggerId) { - /** @var RuleTrigger $trigger */ - $trigger = $rule->ruleTriggers()->find($triggerId); - if (null !== $trigger) { - $trigger->order = $order; - $trigger->save(); - ++$order; - } - } - - return true; - } - /** * @param RuleGroup $ruleGroup * @@ -391,15 +310,6 @@ class RuleRepository implements RuleRepositoryInterface return $search->take($limit)->get(['id', 'title', 'description']); } - /** - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - } - - /** * @inheritDoc */ @@ -436,6 +346,14 @@ class RuleRepository implements RuleRepositoryInterface $rule->save(); } + /** + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + } + /** * @param array $data * @@ -578,6 +496,30 @@ class RuleRepository implements RuleRepositoryInterface return $rule; } + /** + * @param string $moment + * @param Rule $rule + */ + private function setRuleTrigger(string $moment, Rule $rule): void + { + /** @var RuleTrigger $trigger */ + $trigger = $rule->ruleTriggers()->where('trigger_type', 'user_action')->first(); + if (null !== $trigger) { + $trigger->trigger_value = $moment; + $trigger->save(); + + return; + } + $trigger = new RuleTrigger; + $trigger->order = 0; + $trigger->trigger_type = 'user_action'; + $trigger->trigger_value = $moment; + $trigger->rule_id = $rule->id; + $trigger->active = true; + $trigger->stop_processing = false; + $trigger->save(); + } + /** * @param Rule $rule * @param array $data @@ -636,36 +578,4 @@ class RuleRepository implements RuleRepositoryInterface return true; } - - /** - * @param string $moment - * @param Rule $rule - */ - private function setRuleTrigger(string $moment, Rule $rule): void - { - /** @var RuleTrigger $trigger */ - $trigger = $rule->ruleTriggers()->where('trigger_type', 'user_action')->first(); - if (null !== $trigger) { - $trigger->trigger_value = $moment; - $trigger->save(); - - return; - } - $trigger = new RuleTrigger; - $trigger->order = 0; - $trigger->trigger_type = 'user_action'; - $trigger->trigger_value = $moment; - $trigger->rule_id = $rule->id; - $trigger->active = true; - $trigger->stop_processing = false; - $trigger->save(); - } - - /** - * @inheritDoc - */ - public function maxOrder(RuleGroup $ruleGroup): int - { - return (int)$ruleGroup->rules()->max('order'); - } } diff --git a/app/Repositories/Rule/RuleRepositoryInterface.php b/app/Repositories/Rule/RuleRepositoryInterface.php index 1e25e11541..0fc7c4bf5e 100644 --- a/app/Repositories/Rule/RuleRepositoryInterface.php +++ b/app/Repositories/Rule/RuleRepositoryInterface.php @@ -124,11 +124,11 @@ interface RuleRepositoryInterface public function getUpdateRules(): Collection; /** - * @param Rule $rule + * @param RuleGroup $ruleGroup * - * @return bool + * @return int */ - public function moveDown(Rule $rule): bool; + public function maxOrder(RuleGroup $ruleGroup): int; /** * @param Rule $rule @@ -139,29 +139,6 @@ interface RuleRepositoryInterface */ public function moveRule(Rule $rule, RuleGroup $ruleGroup, int $order): Rule; - /** - * @param Rule $rule - * - * @return bool - */ - public function moveUp(Rule $rule): bool; - - /** - * @param Rule $rule - * @param array $ids - * - * @return bool - */ - public function reorderRuleActions(Rule $rule, array $ids): bool; - - /** - * @param Rule $rule - * @param array $ids - * - * @return bool - */ - public function reorderRuleTriggers(Rule $rule, array $ids): bool; - /** * @param RuleGroup $ruleGroup * @@ -177,6 +154,12 @@ interface RuleRepositoryInterface */ public function searchRule(string $query, int $limit): Collection; + /** + * @param Rule $rule + * @param int $newOrder + */ + public function setOrder(Rule $rule, int $newOrder): void; + /** * @param User $user */ @@ -189,19 +172,6 @@ interface RuleRepositoryInterface */ public function store(array $data): Rule; - /** - * @param Rule $rule - * @param int $newOrder - */ - public function setOrder(Rule $rule, int $newOrder): void; - - /** - * @param RuleGroup $ruleGroup - * - * @return int - */ - public function maxOrder(RuleGroup $ruleGroup): int; - /** * @param Rule $rule * @param array $values diff --git a/app/Repositories/RuleGroup/RuleGroupRepository.php b/app/Repositories/RuleGroup/RuleGroupRepository.php index 6981d3cb7d..c6747145ca 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepository.php +++ b/app/Repositories/RuleGroup/RuleGroupRepository.php @@ -274,53 +274,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface */ public function maxOrder(): int { - return (int)$this->user->ruleGroups()->max('order'); - } - - /** - * @param RuleGroup $ruleGroup - * - * @return bool - */ - public function moveDown(RuleGroup $ruleGroup): bool - { - $order = $ruleGroup->order; - - // find the rule with order+1 and give it order-1 - $other = $this->user->ruleGroups()->where('order', $order + 1)->first(); - if ($other) { - --$other->order; - $other->save(); - } - - ++$ruleGroup->order; - $ruleGroup->save(); - $this->resetRuleGroupOrder(); - - return true; - } - - /** - * @param RuleGroup $ruleGroup - * - * @return bool - */ - public function moveUp(RuleGroup $ruleGroup): bool - { - $order = $ruleGroup->order; - - // find the rule with order-1 and give it order+1 - $other = $this->user->ruleGroups()->where('order', $order - 1)->first(); - if ($other) { - ++$other->order; - $other->save(); - } - - --$ruleGroup->order; - $ruleGroup->save(); - $this->resetRuleGroupOrder(); - - return true; + return (int)$this->user->ruleGroups()->where('active', 1)->max('order'); } /** @@ -328,10 +282,11 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface */ public function resetOrder(): bool { - $this->user->ruleGroups()->whereNotNull('deleted_at'); - + $this->user->ruleGroups()->where('active', false)->update(['order' => 0]); $set = $this->user ->ruleGroups() + ->where('active', 1) + ->whereNull('deleted_at') ->orderBy('order', 'ASC') ->orderBy('title', 'DESC') ->get(); @@ -361,6 +316,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface { $set = $ruleGroup->rules() ->orderBy('order', 'ASC') + ->where('active', true) ->orderBy('title', 'DESC') ->orderBy('updated_at', 'DESC') ->get(['rules.*']); @@ -381,51 +337,6 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface return true; } - /** - * @param Rule $rule - */ - private function resetRuleActionOrder(Rule $rule): void - { - $actions = $rule->ruleActions() - ->orderBy('order', 'ASC') - ->orderBy('active', 'DESC') - ->orderBy('action_type', 'ASC') - ->get(); - $index = 1; - /** @var RuleAction $action */ - foreach ($actions as $action) { - if ((int)$action->order !== $index) { - $action->order = $index; - $action->save(); - Log::debug(sprintf('Rule action #%d was on spot %d but must be on spot %d', $action->id, $action->order, $index)); - } - $index++; - } - } - - /** - * @param Rule $rule - */ - private function resetRuleTriggerOrder(Rule $rule): void - { - $triggers = $rule->ruleTriggers() - ->orderBy('order', 'ASC') - ->orderBy('active', 'DESC') - ->orderBy('trigger_type', 'ASC') - ->get(); - $index = 1; - /** @var RuleTrigger $trigger */ - foreach ($triggers as $trigger) { - $order = (int) $trigger->order; - if ($order !== $index) { - $trigger->order = $index; - $trigger->save(); - Log::debug(sprintf('Rule trigger #%d was on spot %d but must be on spot %d', $trigger->id, $order, $index)); - } - $index++; - } - } - /** * @inheritDoc */ @@ -441,6 +352,32 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface return $search->take($limit)->get(['id', 'title', 'description']); } + /** + * @inheritDoc + */ + public function setOrder(RuleGroup $ruleGroup, int $newOrder): void + { + $oldOrder = (int)$ruleGroup->order; + + if ($newOrder > $oldOrder) { + $this->user->ruleGroups()->where('rule_groups.order', '<=', $newOrder)->where('rule_groups.order', '>', $oldOrder) + ->where('rule_groups.id', '!=', $ruleGroup->id) + ->decrement('order', 1); + $ruleGroup->order = $newOrder; + Log::debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); + $ruleGroup->save(); + + return; + } + + $this->user->ruleGroups()->where('rule_groups.order', '>=', $newOrder)->where('rule_groups.order', '<', $oldOrder) + ->where('rule_groups.id', '!=', $ruleGroup->id) + ->increment('order', 1); + $ruleGroup->order = $newOrder; + Log::debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); + $ruleGroup->save(); + } + /** * @param User $user */ @@ -503,30 +440,48 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface return $ruleGroup; } + /** + * @param Rule $rule + */ + private function resetRuleActionOrder(Rule $rule): void + { + $actions = $rule->ruleActions() + ->orderBy('order', 'ASC') + ->orderBy('active', 'DESC') + ->orderBy('action_type', 'ASC') + ->get(); + $index = 1; + /** @var RuleAction $action */ + foreach ($actions as $action) { + if ((int)$action->order !== $index) { + $action->order = $index; + $action->save(); + Log::debug(sprintf('Rule action #%d was on spot %d but must be on spot %d', $action->id, $action->order, $index)); + } + $index++; + } + } /** - * @inheritDoc + * @param Rule $rule */ - public function setOrder(RuleGroup $ruleGroup, int $newOrder): void + private function resetRuleTriggerOrder(Rule $rule): void { - $oldOrder = (int)$ruleGroup->order; - - if ($newOrder > $oldOrder) { - $this->user->ruleGroups()->where('rule_groups.order', '<=', $newOrder)->where('rule_groups.order', '>', $oldOrder) - ->where('rule_groups.id', '!=', $ruleGroup->id) - ->decrement('order', 1); - $ruleGroup->order = $newOrder; - Log::debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); - $ruleGroup->save(); - - return; + $triggers = $rule->ruleTriggers() + ->orderBy('order', 'ASC') + ->orderBy('active', 'DESC') + ->orderBy('trigger_type', 'ASC') + ->get(); + $index = 1; + /** @var RuleTrigger $trigger */ + foreach ($triggers as $trigger) { + $order = (int)$trigger->order; + if ($order !== $index) { + $trigger->order = $index; + $trigger->save(); + Log::debug(sprintf('Rule trigger #%d was on spot %d but must be on spot %d', $trigger->id, $order, $index)); + } + $index++; } - - $this->user->ruleGroups()->where('rule_groups.order', '>=', $newOrder)->where('rule_groups.order', '<', $oldOrder) - ->where('rule_groups.id', '!=', $ruleGroup->id) - ->increment('order', 1); - $ruleGroup->order = $newOrder; - Log::debug(sprintf('Order of group #%d ("%s") is now %d', $ruleGroup->id, $ruleGroup->title, $newOrder)); - $ruleGroup->save(); } } diff --git a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php index 84f8fbc436..7d4f7a64de 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php +++ b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php @@ -128,20 +128,6 @@ interface RuleGroupRepositoryInterface */ public function maxOrder(): int; - /** - * @param RuleGroup $ruleGroup - * - * @return bool - */ - public function moveDown(RuleGroup $ruleGroup): bool; - - /** - * @param RuleGroup $ruleGroup - * - * @return bool - */ - public function moveUp(RuleGroup $ruleGroup): bool; - /** * @return bool */ @@ -154,12 +140,6 @@ interface RuleGroupRepositoryInterface */ public function resetRuleOrder(RuleGroup $ruleGroup): bool; - /** - * @param RuleGroup $ruleGroup - * @param int $newOrder - */ - public function setOrder(RuleGroup $ruleGroup, int $newOrder): void; - /** * @param string $query * @param int $limit @@ -168,6 +148,12 @@ interface RuleGroupRepositoryInterface */ public function searchRuleGroup(string $query, int $limit): Collection; + /** + * @param RuleGroup $ruleGroup + * @param int $newOrder + */ + public function setOrder(RuleGroup $ruleGroup, int $newOrder): void; + /** * @param User $user */ diff --git a/app/Repositories/TransactionGroup/TransactionGroupRepository.php b/app/Repositories/TransactionGroup/TransactionGroupRepository.php index 1abeb637a4..bc5ea3ff35 100644 --- a/app/Repositories/TransactionGroup/TransactionGroupRepository.php +++ b/app/Repositories/TransactionGroup/TransactionGroupRepository.php @@ -329,6 +329,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface ::table('tag_transaction_journal') ->leftJoin('tags', 'tag_transaction_journal.tag_id', '=', 'tags.id') ->where('tag_transaction_journal.transaction_journal_id', $journalId) + ->orderBy('tags.tag', 'ASC') ->get(['tags.tag']); return $result->pluck('tag')->toArray(); diff --git a/app/Rules/BelongsUser.php b/app/Rules/BelongsUser.php index f8e85d6b6e..7140206e60 100644 --- a/app/Rules/BelongsUser.php +++ b/app/Rules/BelongsUser.php @@ -101,6 +101,50 @@ class BelongsUser implements Rule } } + /** + * @param string $attribute + * + * @return string + */ + private function parseAttribute(string $attribute): string + { + $parts = explode('.', $attribute); + if (1 === count($parts)) { + return $attribute; + } + if (3 === count($parts)) { + return $parts[2]; + } + + return $attribute; // @codeCoverageIgnore + } + + /** + * @param int $value + * + * @return bool + */ + private function validatePiggyBankId(int $value): bool + { + $count = PiggyBank::leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id') + ->where('piggy_banks.id', '=', $value) + ->where('accounts.user_id', '=', auth()->user()->id)->count(); + + return 1 === $count; + } + + /** + * @param string $value + * + * @return bool + */ + private function validatePiggyBankName(string $value): bool + { + $count = $this->countField(PiggyBank::class, 'name', $value); + + return 1 === $count; + } + /** * @param string $class * @param string $field @@ -135,40 +179,6 @@ class BelongsUser implements Rule return $count; } - /** - * @param string $attribute - * - * @return string - */ - private function parseAttribute(string $attribute): string - { - $parts = explode('.', $attribute); - if (1 === count($parts)) { - return $attribute; - } - if (3 === count($parts)) { - return $parts[2]; - } - - return $attribute; // @codeCoverageIgnore - } - - /** - * @param int $value - * - * @return bool - */ - private function validateAccountId(int $value): bool - { - if (0 === $value) { - // its ok to submit 0. other checks will fail. - return true; - } - $count = Account::where('id', '=', $value)->where('user_id', '=', auth()->user()->id)->count(); - - return 1 === $count; - } - /** * @param int $value * @@ -209,6 +219,18 @@ class BelongsUser implements Rule return 1 === $count; } + /** + * @param int $value + * + * @return bool + */ + private function validateCategoryId(int $value): bool + { + $count = Category::where('id', '=', $value)->where('user_id', '=', auth()->user()->id)->count(); + + return 1 === $count; + } + /** * @param string $value * @@ -226,35 +248,13 @@ class BelongsUser implements Rule * * @return bool */ - private function validateCategoryId(int $value): bool + private function validateAccountId(int $value): bool { - $count = Category::where('id', '=', $value)->where('user_id', '=', auth()->user()->id)->count(); - - return 1 === $count; - } - - /** - * @param int $value - * - * @return bool - */ - private function validatePiggyBankId(int $value): bool - { - $count = PiggyBank::leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id') - ->where('piggy_banks.id', '=', $value) - ->where('accounts.user_id', '=', auth()->user()->id)->count(); - - return 1 === $count; - } - - /** - * @param string $value - * - * @return bool - */ - private function validatePiggyBankName(string $value): bool - { - $count = $this->countField(PiggyBank::class, 'name', $value); + if (0 === $value) { + // its ok to submit 0. other checks will fail. + return true; + } + $count = Account::where('id', '=', $value)->where('user_id', '=', auth()->user()->id)->count(); return 1 === $count; } diff --git a/app/Rules/IsAssetAccountId.php b/app/Rules/IsAssetAccountId.php index e52562fffb..ebf1659cd3 100644 --- a/app/Rules/IsAssetAccountId.php +++ b/app/Rules/IsAssetAccountId.php @@ -46,8 +46,8 @@ class IsAssetAccountId implements Rule /** * Determine if the validation rule passes. * - * @param string $attribute - * @param mixed $value + * @param string $attribute + * @param mixed $value * * @return bool */ diff --git a/app/Rules/IsBoolean.php b/app/Rules/IsBoolean.php index f75a27b05f..f2157f1abd 100644 --- a/app/Rules/IsBoolean.php +++ b/app/Rules/IsBoolean.php @@ -33,6 +33,7 @@ class IsBoolean implements Rule { /** * Get the validation error message. + * * @codeCoverageIgnore * @return string */ @@ -44,8 +45,8 @@ class IsBoolean implements Rule /** * Determine if the validation rule passes. * - * @param string $attribute - * @param mixed $value + * @param string $attribute + * @param mixed $value * * @return bool */ diff --git a/app/Rules/IsDateOrTime.php b/app/Rules/IsDateOrTime.php index 8aab4eba20..7247f8db84 100644 --- a/app/Rules/IsDateOrTime.php +++ b/app/Rules/IsDateOrTime.php @@ -50,8 +50,8 @@ class IsDateOrTime implements Rule /** * Determine if the validation rule passes. * - * @param string $attribute - * @param mixed $value + * @param string $attribute + * @param mixed $value * * @return bool */ @@ -65,7 +65,7 @@ class IsDateOrTime implements Rule // probably a date format. try { Carbon::createFromFormat('Y-m-d', $value); - } catch (InvalidDateException|Exception $e) { + } catch (InvalidDateException | Exception $e) { Log::error(sprintf('"%s" is not a valid date: %s', $value, $e->getMessage())); return false; @@ -76,7 +76,7 @@ class IsDateOrTime implements Rule // is an atom string, I hope? try { Carbon::parse($value); - } catch (InvalidDateException|Exception $e) { + } catch (InvalidDateException | Exception $e) { Log::error(sprintf('"%s" is not a valid date or time: %s', $value, $e->getMessage())); return false; diff --git a/app/Rules/IsDuplicateTransaction.php b/app/Rules/IsDuplicateTransaction.php index d5dc158697..e47ab72012 100644 --- a/app/Rules/IsDuplicateTransaction.php +++ b/app/Rules/IsDuplicateTransaction.php @@ -56,17 +56,18 @@ class IsDuplicateTransaction implements Rule /** * @inheritDoc */ - public function passes($attribute, $value) + public function message() { - $this->value = $value; - return false; + return $this->value; } /** * @inheritDoc */ - public function message() + public function passes($attribute, $value) { - return $this->value; + $this->value = $value; + + return false; } } diff --git a/app/Rules/IsValidAttachmentModel.php b/app/Rules/IsValidAttachmentModel.php index 90560a3779..d75ecb9074 100644 --- a/app/Rules/IsValidAttachmentModel.php +++ b/app/Rules/IsValidAttachmentModel.php @@ -64,8 +64,23 @@ class IsValidAttachmentModel implements Rule $this->model = $model; } + /** + * @param string $model + * + * @return string + */ + private function normalizeModel(string $model): string + { + $search = ['FireflyIII\Models\\']; + $replace = ''; + $model = str_replace($search, $replace, $model); + + return sprintf('FireflyIII\Models\%s', $model); + } + /** * Get the validation error message. + * * @codeCoverageIgnore * @return string */ @@ -77,8 +92,8 @@ class IsValidAttachmentModel implements Rule /** * Determine if the validation rule passes. * - * @param string $attribute - * @param mixed $value + * @param string $attribute + * @param mixed $value * * @return bool */ @@ -104,7 +119,7 @@ class IsValidAttachmentModel implements Rule } $method = $methods[$this->model]; - return $this->$method((int) $value); + return $this->$method((int)$value); } /** @@ -112,10 +127,10 @@ class IsValidAttachmentModel implements Rule * * @return bool */ - private function validateTag(int $value): bool + private function validateAccount(int $value): bool { - /** @var TagRepositoryInterface $repository */ - $repository = app(TagRepositoryInterface::class); + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); $repository->setUser(auth()->user()); return null !== $repository->findNull($value); @@ -126,13 +141,13 @@ class IsValidAttachmentModel implements Rule * * @return bool */ - private function validatePiggyBank(int $value): bool + private function validateBill(int $value): bool { - /** @var PiggyBankRepositoryInterface $repository */ - $repository = app(PiggyBankRepositoryInterface::class); + /** @var BillRepositoryInterface $repository */ + $repository = app(BillRepositoryInterface::class); $repository->setUser(auth()->user()); - return null !== $repository->findNull($value); + return null !== $repository->find($value); } /** @@ -168,10 +183,9 @@ class IsValidAttachmentModel implements Rule * * @return bool */ - private function validateAccount(int $value): bool + private function validateJournal(int $value): bool { - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); + $repository = app(JournalRepositoryInterface::class); $repository->setUser(auth()->user()); return null !== $repository->findNull($value); @@ -182,9 +196,24 @@ class IsValidAttachmentModel implements Rule * * @return bool */ - private function validateJournal(int $value): bool + private function validatePiggyBank(int $value): bool { - $repository = app(JournalRepositoryInterface::class); + /** @var PiggyBankRepositoryInterface $repository */ + $repository = app(PiggyBankRepositoryInterface::class); + $repository->setUser(auth()->user()); + + return null !== $repository->findNull($value); + } + + /** + * @param int $value + * + * @return bool + */ + private function validateTag(int $value): bool + { + /** @var TagRepositoryInterface $repository */ + $repository = app(TagRepositoryInterface::class); $repository->setUser(auth()->user()); return null !== $repository->findNull($value); @@ -201,34 +230,6 @@ class IsValidAttachmentModel implements Rule $repository = app(JournalAPIRepositoryInterface::class); $repository->setUser(auth()->user()); - return null !== $repository->findTransaction((int) $value); - } - - /** - * @param int $value - * - * @return bool - */ - private function validateBill(int $value): bool - { - /** @var BillRepositoryInterface $repository */ - $repository = app(BillRepositoryInterface::class); - $repository->setUser(auth()->user()); - - return null !== $repository->find($value); - } - - /** - * @param string $model - * - * @return string - */ - private function normalizeModel(string $model): string - { - $search = ['FireflyIII\Models\\']; - $replace = ''; - $model = str_replace($search, $replace, $model); - - return sprintf('FireflyIII\Models\%s', $model); + return null !== $repository->findTransaction((int)$value); } } diff --git a/app/Rules/UniqueAccountNumber.php b/app/Rules/UniqueAccountNumber.php index 2051b65ff3..62cc70010c 100644 --- a/app/Rules/UniqueAccountNumber.php +++ b/app/Rules/UniqueAccountNumber.php @@ -35,7 +35,7 @@ use Log; class UniqueAccountNumber implements Rule { private ?Account $account; - private ?string $expectedType; + private ?string $expectedType; /** * Create a new rule instance. @@ -109,32 +109,10 @@ class UniqueAccountNumber implements Rule } } Log::debug('Account number is valid.'); + return true; } - /** - * @param string $type - * @param string $accountNumber - * - * @return int - */ - private function countHits(string $type, string $accountNumber): int - { - $query = AccountMeta - ::leftJoin('accounts','accounts.id','=','account_meta.account_id') - ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') - ->where('accounts.user_id', auth()->user()->id) - ->where('account_types.type', $type) - ->where('account_meta.name','=','account_number') - ->where('account_meta.data',json_encode($accountNumber)); - - if (null !== $this->account) { - $query->where('accounts.id', '!=', $this->account->id); - } - - return $query->count(); - } - /** * @return array * @@ -160,4 +138,27 @@ class UniqueAccountNumber implements Rule return $maxCounts; } + + /** + * @param string $type + * @param string $accountNumber + * + * @return int + */ + private function countHits(string $type, string $accountNumber): int + { + $query = AccountMeta + ::leftJoin('accounts', 'accounts.id', '=', 'account_meta.account_id') + ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + ->where('accounts.user_id', auth()->user()->id) + ->where('account_types.type', $type) + ->where('account_meta.name', '=', 'account_number') + ->where('account_meta.data', json_encode($accountNumber)); + + if (null !== $this->account) { + $query->where('accounts.id', '!=', $this->account->id); + } + + return $query->count(); + } } diff --git a/app/Rules/UniqueIban.php b/app/Rules/UniqueIban.php index 6afb487518..325a6ef689 100644 --- a/app/Rules/UniqueIban.php +++ b/app/Rules/UniqueIban.php @@ -34,7 +34,7 @@ use Log; class UniqueIban implements Rule { private ?Account $account; - private ?string $expectedType; + private ?string $expectedType; /** * Create a new rule instance. @@ -109,28 +109,6 @@ class UniqueIban implements Rule return true; } - /** - * @param string $type - * @param string $iban - * - * @return int - */ - private function countHits(string $type, string $iban): int - { - $query - = auth()->user() - ->accounts() - ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') - ->where('accounts.iban', $iban) - ->where('account_types.type', $type); - - if (null !== $this->account) { - $query->where('accounts.id', '!=', $this->account->id); - } - - return $query->count(); - } - /** * @return array * @@ -156,4 +134,26 @@ class UniqueIban implements Rule return $maxCounts; } + + /** + * @param string $type + * @param string $iban + * + * @return int + */ + private function countHits(string $type, string $iban): int + { + $query + = auth()->user() + ->accounts() + ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + ->where('accounts.iban', $iban) + ->where('account_types.type', $type); + + if (null !== $this->account) { + $query->where('accounts.id', '!=', $this->account->id); + } + + return $query->count(); + } } diff --git a/app/Rules/ValidJournals.php b/app/Rules/ValidJournals.php index 7568987cf5..4ad6509e5b 100644 --- a/app/Rules/ValidJournals.php +++ b/app/Rules/ValidJournals.php @@ -31,6 +31,7 @@ use Log; /** * Class ValidJournals + * * @codeCoverageIgnore */ class ValidJournals implements Rule @@ -49,7 +50,7 @@ class ValidJournals implements Rule * Determine if the validation rule passes. * * @param string $attribute - * @param mixed $value + * @param mixed $value * * @return bool * diff --git a/app/Rules/ValidRecurrenceRepetitionType.php b/app/Rules/ValidRecurrenceRepetitionType.php index 47b23ce29e..e7211060ae 100644 --- a/app/Rules/ValidRecurrenceRepetitionType.php +++ b/app/Rules/ValidRecurrenceRepetitionType.php @@ -27,6 +27,7 @@ use Illuminate\Contracts\Validation\Rule; /** * Class ValidRecurrenceRepetitionType + * * @codeCoverageIgnore */ class ValidRecurrenceRepetitionType implements Rule @@ -45,8 +46,8 @@ class ValidRecurrenceRepetitionType implements Rule /** * Determine if the validation rule passes. * - * @param string $attribute - * @param mixed $value + * @param string $attribute + * @param mixed $value * * @return bool * diff --git a/app/Rules/ValidRecurrenceRepetitionValue.php b/app/Rules/ValidRecurrenceRepetitionValue.php index 91d830af37..06d2e4c0c1 100644 --- a/app/Rules/ValidRecurrenceRepetitionValue.php +++ b/app/Rules/ValidRecurrenceRepetitionValue.php @@ -31,6 +31,7 @@ use Log; /** * Class ValidRecurrenceRepetitionValue + * * @codeCoverageIgnore */ class ValidRecurrenceRepetitionValue implements Rule @@ -49,8 +50,8 @@ class ValidRecurrenceRepetitionValue implements Rule /** * Determine if the validation rule passes. * - * @param string $attribute - * @param mixed $value + * @param string $attribute + * @param mixed $value * * @return bool * diff --git a/app/Scopes/LdapFilterScope.php b/app/Scopes/LdapFilterScope.php index 5b9fa51b6a..38ba147852 100644 --- a/app/Scopes/LdapFilterScope.php +++ b/app/Scopes/LdapFilterScope.php @@ -24,19 +24,22 @@ declare(strict_types=1); namespace FireflyIII\Scopes; -use Adldap\Query\Builder; use Adldap\Laravel\Scopes\ScopeInterface; +use Adldap\Query\Builder; -class LdapFilterScope implements ScopeInterface { +class LdapFilterScope implements ScopeInterface +{ /** * If the ADLDAP_AUTH_FILTER is provided, apply the filter to the LDAP query. + * * @param Builder $query + * * @return void */ public function apply(Builder $query) { - $filter = (string) config('ldap_auth.custom_filter'); - if ( '' !== $filter ) { + $filter = (string)config('ldap_auth.custom_filter'); + if ('' !== $filter) { $query->rawFilter($filter); } } diff --git a/app/Services/FireflyIIIOrg/Update/UpdateRequest.php b/app/Services/FireflyIIIOrg/Update/UpdateRequest.php index a675421892..2f2d4d2866 100644 --- a/app/Services/FireflyIIIOrg/Update/UpdateRequest.php +++ b/app/Services/FireflyIIIOrg/Update/UpdateRequest.php @@ -64,6 +64,77 @@ class UpdateRequest implements UpdateRequestInterface return $this->parseResult($updateInfo); } + /** + * @param string $channel + * + * @return array + */ + private function contactServer(string $channel): array + { + Log::debug(sprintf('Now in contactServer(%s)', $channel)); + // always fall back to current version: + $return = [ + 'version' => config('firefly.version'), + 'date' => Carbon::today()->startOfDay(), + 'level' => 'error', + 'message' => (string)trans('firefly.unknown_error'), + ]; + + $uri = config('firefly.update_endpoint'); + Log::debug(sprintf('Going to call %s', $uri)); + try { + $client = new Client; + $options = [ + 'headers' => [ + 'User-Agent' => sprintf('FireflyIII/%s/%s', config('firefly.version'), $channel), + ], + 'timeout' => 3.1415, + ]; + $res = $client->request('GET', $uri, $options); + } catch (GuzzleException | Exception $e) { + Log::error('Ran into Guzzle error.'); + Log::error($e->getMessage()); + Log::error($e->getTraceAsString()); + $return['message'] = sprintf('Guzzle: %s', strip_tags($e->getMessage())); + + return $return; + } + + if (200 !== $res->getStatusCode()) { + Log::error(sprintf('Response status from server is %d.', $res->getStatusCode())); + Log::error((string)$res->getBody()); + $return['message'] = sprintf('Error: %d', $res->getStatusCode()); + + return $return; + } + $body = (string)$res->getBody(); + try { + $json = json_decode($body, true, 512, JSON_THROW_ON_ERROR); + + } catch (JsonException | Exception $e) { + Log::error('Body is not valid JSON'); + Log::error($body); + $return['message'] = 'Invalid JSON :('; + + return $return; + } + + if (!isset($json['firefly_iii'][$channel])) { + Log::error(sprintf('No valid update channel "%s"', $channel)); + Log::error($body); + $return['message'] = sprintf('Unknown update channel "%s" :(', $channel); + } + + // parse response a bit. No message yet. + $response = $json['firefly_iii'][$channel]; + $return['version'] = $response['version']; + $return['level'] = 'success'; + $return['date'] = Carbon::createFromFormat('Y-m-d', $response['date'])->startOfDay(); + Log::info('Response from update server', $response); + + return $return; + } + /** * @param array $information * @@ -149,75 +220,4 @@ class UpdateRequest implements UpdateRequestInterface return $return; } - - /** - * @param string $channel - * - * @return array - */ - private function contactServer(string $channel): array - { - Log::debug(sprintf('Now in contactServer(%s)', $channel)); - // always fall back to current version: - $return = [ - 'version' => config('firefly.version'), - 'date' => Carbon::today()->startOfDay(), - 'level' => 'error', - 'message' => (string)trans('firefly.unknown_error'), - ]; - - $uri = config('firefly.update_endpoint'); - Log::debug(sprintf('Going to call %s', $uri)); - try { - $client = new Client; - $options = [ - 'headers' => [ - 'User-Agent' => sprintf('FireflyIII/%s/%s', config('firefly.version'), $channel), - ], - 'timeout' => 3.1415 - ]; - $res = $client->request('GET', $uri, $options); - } catch (GuzzleException|Exception $e) { - Log::error('Ran into Guzzle error.'); - Log::error($e->getMessage()); - Log::error($e->getTraceAsString()); - $return['message'] = sprintf('Guzzle: %s', strip_tags($e->getMessage())); - - return $return; - } - - if (200 !== $res->getStatusCode()) { - Log::error(sprintf('Response status from server is %d.', $res->getStatusCode())); - Log::error((string)$res->getBody()); - $return['message'] = sprintf('Error: %d', $res->getStatusCode()); - - return $return; - } - $body = (string)$res->getBody(); - try { - $json = json_decode($body, true, 512, JSON_THROW_ON_ERROR); - - } catch (JsonException|Exception $e) { - Log::error('Body is not valid JSON'); - Log::error($body); - $return['message'] = 'Invalid JSON :('; - - return $return; - } - - if (!isset($json['firefly_iii'][$channel])) { - Log::error(sprintf('No valid update channel "%s"', $channel)); - Log::error($body); - $return['message'] = sprintf('Unknown update channel "%s" :(', $channel); - } - - // parse response a bit. No message yet. - $response = $json['firefly_iii'][$channel]; - $return['version'] = $response['version']; - $return['level'] = 'success'; - $return['date'] = Carbon::createFromFormat('Y-m-d', $response['date'])->startOfDay(); - Log::info('Response from update server', $response); - - return $return; - } } diff --git a/app/Services/Internal/Destroy/AccountDestroyService.php b/app/Services/Internal/Destroy/AccountDestroyService.php index 80c8b1d301..b54bc98ded 100644 --- a/app/Services/Internal/Destroy/AccountDestroyService.php +++ b/app/Services/Internal/Destroy/AccountDestroyService.php @@ -76,28 +76,6 @@ class AccountDestroyService } } - /** - * @param Account $account - */ - private function destroyJournals(Account $account): void - { - - /** @var JournalDestroyService $service */ - $service = app(JournalDestroyService::class); - - Log::debug('Now trigger account delete response #' . $account->id); - /** @var Transaction $transaction */ - foreach ($account->transactions()->get() as $transaction) { - Log::debug('Now at transaction #' . $transaction->id); - /** @var TransactionJournal $journal */ - $journal = $transaction->transactionJournal()->first(); - if (null !== $journal) { - Log::debug('Call for deletion of journal #' . $journal->id); - $service->destroy($journal); - } - } - } - /** * @param Account $account */ @@ -135,6 +113,47 @@ class AccountDestroyService } } + /** + * @param Account $account + * @param Account $moveTo + */ + private function moveTransactions(Account $account, Account $moveTo): void + { + DB::table('transactions')->where('account_id', $account->id)->update(['account_id' => $moveTo->id]); + } + + /** + * @param Account $account + * @param Account $moveTo + */ + private function updateRecurrences(Account $account, Account $moveTo): void + { + DB::table('recurrences_transactions')->where('source_id', $account->id)->update(['source_id' => $moveTo->id]); + DB::table('recurrences_transactions')->where('destination_id', $account->id)->update(['destination_id' => $moveTo->id]); + } + + /** + * @param Account $account + */ + private function destroyJournals(Account $account): void + { + + /** @var JournalDestroyService $service */ + $service = app(JournalDestroyService::class); + + Log::debug('Now trigger account delete response #' . $account->id); + /** @var Transaction $transaction */ + foreach ($account->transactions()->get() as $transaction) { + Log::debug('Now at transaction #' . $transaction->id); + /** @var TransactionJournal $journal */ + $journal = $transaction->transactionJournal()->first(); + if (null !== $journal) { + Log::debug('Call for deletion of journal #' . $journal->id); + $service->destroy($journal); + } + } + } + /** * @param Account $account */ @@ -155,24 +174,4 @@ class AccountDestroyService } } - - /** - * @param Account $account - * @param Account $moveTo - */ - private function moveTransactions(Account $account, Account $moveTo): void - { - DB::table('transactions')->where('account_id', $account->id)->update(['account_id' => $moveTo->id]); - } - - /** - * @param Account $account - * @param Account $moveTo - */ - private function updateRecurrences(Account $account, Account $moveTo): void - { - DB::table('recurrences_transactions')->where('source_id', $account->id)->update(['source_id' => $moveTo->id]); - DB::table('recurrences_transactions')->where('destination_id', $account->id)->update(['destination_id' => $moveTo->id]); - } - } diff --git a/app/Services/Internal/Destroy/BudgetDestroyService.php b/app/Services/Internal/Destroy/BudgetDestroyService.php index 41280b83fb..3fb5897e05 100644 --- a/app/Services/Internal/Destroy/BudgetDestroyService.php +++ b/app/Services/Internal/Destroy/BudgetDestroyService.php @@ -30,6 +30,7 @@ use Log; /** * Class BudgetDestroyService + * * @codeCoverageIgnore */ class BudgetDestroyService diff --git a/app/Services/Internal/Destroy/CategoryDestroyService.php b/app/Services/Internal/Destroy/CategoryDestroyService.php index 75ae8e5010..a161b16770 100644 --- a/app/Services/Internal/Destroy/CategoryDestroyService.php +++ b/app/Services/Internal/Destroy/CategoryDestroyService.php @@ -30,6 +30,7 @@ use Log; /** * Class CategoryDestroyService + * * @codeCoverageIgnore */ class CategoryDestroyService diff --git a/app/Services/Internal/Destroy/CurrencyDestroyService.php b/app/Services/Internal/Destroy/CurrencyDestroyService.php index bdec425c5d..358f223246 100644 --- a/app/Services/Internal/Destroy/CurrencyDestroyService.php +++ b/app/Services/Internal/Destroy/CurrencyDestroyService.php @@ -29,6 +29,7 @@ use Log; /** * Class CurrencyDestroyService + * * @codeCoverageIgnore */ class CurrencyDestroyService diff --git a/app/Services/Internal/Destroy/RecurrenceDestroyService.php b/app/Services/Internal/Destroy/RecurrenceDestroyService.php index 6e704bbb2b..3f7ce76bc7 100644 --- a/app/Services/Internal/Destroy/RecurrenceDestroyService.php +++ b/app/Services/Internal/Destroy/RecurrenceDestroyService.php @@ -34,6 +34,21 @@ use Log; */ class RecurrenceDestroyService { + /** + * Delete recurrence by ID + * + * @param int $recurrenceId + */ + public function destroyById(int $recurrenceId): void + { + $recurrence = Recurrence::find($recurrenceId); + if (null === $recurrence) { + return; + } + $this->destroy($recurrence); + + } + /** * Delete recurrence. * @@ -69,19 +84,4 @@ class RecurrenceDestroyService } } - /** - * Delete recurrence by ID - * - * @param int $recurrenceId - */ - public function destroyById(int $recurrenceId): void - { - $recurrence = Recurrence::find($recurrenceId); - if (null === $recurrence) { - return; - } - $this->destroy($recurrence); - - } - } diff --git a/app/Services/Internal/Destroy/TransactionGroupDestroyService.php b/app/Services/Internal/Destroy/TransactionGroupDestroyService.php index f39269d43a..e04736266a 100644 --- a/app/Services/Internal/Destroy/TransactionGroupDestroyService.php +++ b/app/Services/Internal/Destroy/TransactionGroupDestroyService.php @@ -28,6 +28,7 @@ use FireflyIII\Models\TransactionGroup; /** * Class TransactionGroupDestroyService + * * @codeCoverageIgnore */ class TransactionGroupDestroyService diff --git a/app/Services/Internal/Support/AccountServiceTrait.php b/app/Services/Internal/Support/AccountServiceTrait.php index 563d2b89aa..06a75ef635 100644 --- a/app/Services/Internal/Support/AccountServiceTrait.php +++ b/app/Services/Internal/Support/AccountServiceTrait.php @@ -71,6 +71,32 @@ trait AccountServiceTrait return $iban; } + /** + * Returns true if the data in the array is submitted but empty. + * + * @param array $data + * + * @return bool + */ + public function isEmptyOBData(array $data): bool + { + if (!array_key_exists('opening_balance', $data) + && !array_key_exists('opening_balance_date', $data) + ) { + // not set, so false. + return false; + } + // if isset, but is empty: + if ( + (array_key_exists('opening_balance', $data) && '' === $data['opening_balance']) + || (array_key_exists('opening_balance_date', $data) && '' === $data['opening_balance_date']) + ) { + return true; + } + + return false; + } + /** * Update meta data for account. Depends on type which fields are valid. * @@ -94,7 +120,13 @@ trait AccountServiceTrait if (null === $data['account_role']) { $data['account_role'] = $this->accountRepository->getMetaValue($account, 'account_role'); } - if ($account->accountType->type === AccountType::ASSET && isset($data['account_role']) && 'ccAsset' === $data['account_role']) { + + // only asset account may have a role: + if ($account->accountType->type !== AccountType::ASSET) { + $data['account_role'] = ''; + } + + if ($account->accountType->type === AccountType::ASSET && array_key_exists('account_role', $data) && 'ccAsset' === $data['account_role']) { $fields = $this->validCCFields; // @codeCoverageIgnore } /** @var AccountMetaFactory $factory */ @@ -173,29 +205,122 @@ trait AccountServiceTrait } /** - * Returns true if the data in the array is submitted but empty. + * Delete TransactionGroup with opening balance in it. * - * @param array $data - * - * @return bool + * @param Account $account */ - public function isEmptyOBData(array $data): bool + protected function deleteOBGroup(Account $account): void { - if (!array_key_exists('opening_balance', $data) - && !array_key_exists('opening_balance_date', $data) - ) { - // not set, so false. - return false; + Log::debug(sprintf('deleteOB() for account #%d', $account->id)); + $openingBalanceGroup = $this->getOBGroup($account); + + // opening balance data? update it! + if (null !== $openingBalanceGroup) { + Log::debug('Opening balance journal found, delete journal.'); + /** @var TransactionGroupDestroyService $service */ + $service = app(TransactionGroupDestroyService::class); + $service->destroy($openingBalanceGroup); } - // if isset, but is empty: - if ( - (array_key_exists('opening_balance', $data) && '' === $data['opening_balance']) - || (array_key_exists('opening_balance_date', $data) && '' === $data['opening_balance_date']) - ) { - return true; + } + + /** + * Returns the opening balance group, or NULL if it does not exist. + * + * @param Account $account + * + * @return TransactionGroup|null + */ + protected function getOBGroup(Account $account): ?TransactionGroup + { + return $this->accountRepository->getOpeningBalanceGroup($account); + } + + /** + * @param int $currencyId + * @param string $currencyCode + * + * @return TransactionCurrency + */ + protected function getCurrency(int $currencyId, string $currencyCode): TransactionCurrency + { + // find currency, or use default currency instead. + /** @var TransactionCurrencyFactory $factory */ + $factory = app(TransactionCurrencyFactory::class); + /** @var TransactionCurrency $currency */ + $currency = $factory->find($currencyId, $currencyCode); + + if (null === $currency) { + // use default currency: + $currency = app('amount')->getDefaultCurrencyByUser($this->user); + } + $currency->enabled = true; + $currency->save(); + + return $currency; + } + + /** + * Update or create the opening balance group. Assumes valid data in $data. + * + * Returns null if this fails. + * + * @param Account $account + * @param array $data + * + * @return TransactionGroup|null + */ + protected function updateOBGroup(Account $account, array $data): ?TransactionGroup + { + $obGroup = $this->getOBGroup($account); + if (null === $obGroup) { + return $this->createOBGroup($account, $data); } - return false; + // $data['currency_id'] is empty so creating a new journal may break. + if (!array_key_exists('currency_id', $data)) { + $currency = $this->accountRepository->getAccountCurrency($account); + if (null === $currency) { + $currency = app('default')->getDefaultCurrencyByUser($account->user); + } + $data['currency_id'] = $currency->id; + } + + /** @var TransactionJournal $journal */ + $journal = $obGroup->transactionJournals()->first(); + $journal->date = $data['opening_balance_date'] ?? $journal->date; + $journal->transaction_currency_id = $data['currency_id']; + + /** @var Transaction $obTransaction */ + $obTransaction = $journal->transactions()->where('account_id', '!=', $account->id)->first(); + /** @var Transaction $accountTransaction */ + $accountTransaction = $journal->transactions()->where('account_id', $account->id)->first(); + + // if amount is negative: + if (1 === bccomp('0', $data['opening_balance'])) { + // account transaction loses money: + $accountTransaction->amount = app('steam')->negative($data['opening_balance']); + $accountTransaction->transaction_currency_id = $data['currency_id']; + + // OB account transaction gains money + $obTransaction->amount = app('steam')->positive($data['opening_balance']); + $obTransaction->transaction_currency_id = $data['currency_id']; + } + if (-1 === bccomp('0', $data['opening_balance'])) { + // account gains money: + $accountTransaction->amount = app('steam')->positive($data['opening_balance']); + $accountTransaction->transaction_currency_id = $data['currency_id']; + + // OB account loses money: + $obTransaction->amount = app('steam')->negative($data['opening_balance']); + $obTransaction->transaction_currency_id = $data['currency_id']; + } + // save both + $accountTransaction->save(); + $obTransaction->save(); + $journal->save(); + $obGroup->refresh(); + + return $obGroup; } /** @@ -288,123 +413,4 @@ trait AccountServiceTrait return $group; } - - /** - * Delete TransactionGroup with opening balance in it. - * - * @param Account $account - */ - protected function deleteOBGroup(Account $account): void - { - Log::debug(sprintf('deleteOB() for account #%d', $account->id)); - $openingBalanceGroup = $this->getOBGroup($account); - - // opening balance data? update it! - if (null !== $openingBalanceGroup) { - Log::debug('Opening balance journal found, delete journal.'); - /** @var TransactionGroupDestroyService $service */ - $service = app(TransactionGroupDestroyService::class); - $service->destroy($openingBalanceGroup); - } - } - - /** - * @param int $currencyId - * @param string $currencyCode - * - * @return TransactionCurrency - */ - protected function getCurrency(int $currencyId, string $currencyCode): TransactionCurrency - { - // find currency, or use default currency instead. - /** @var TransactionCurrencyFactory $factory */ - $factory = app(TransactionCurrencyFactory::class); - /** @var TransactionCurrency $currency */ - $currency = $factory->find($currencyId, $currencyCode); - - if (null === $currency) { - // use default currency: - $currency = app('amount')->getDefaultCurrencyByUser($this->user); - } - $currency->enabled = true; - $currency->save(); - - return $currency; - } - - /** - * Returns the opening balance group, or NULL if it does not exist. - * - * @param Account $account - * - * @return TransactionGroup|null - */ - protected function getOBGroup(Account $account): ?TransactionGroup - { - return $this->accountRepository->getOpeningBalanceGroup($account); - } - - /** - * Update or create the opening balance group. Assumes valid data in $data. - * - * Returns null if this fails. - * - * @param Account $account - * @param array $data - * - * @return TransactionGroup|null - */ - protected function updateOBGroup(Account $account, array $data): ?TransactionGroup - { - $obGroup = $this->getOBGroup($account); - if (null === $obGroup) { - return $this->createOBGroup($account, $data); - } - - // $data['currency_id'] is empty so creating a new journal may break. - if (!array_key_exists('currency_id', $data)) { - $currency = $this->accountRepository->getAccountCurrency($account); - if (null === $currency) { - $currency = app('default')->getDefaultCurrencyByUser($account->user); - } - $data['currency_id'] = $currency->id; - } - - /** @var TransactionJournal $journal */ - $journal = $obGroup->transactionJournals()->first(); - $journal->date = $data['opening_balance_date'] ?? $journal->date; - $journal->transaction_currency_id = $data['currency_id']; - - /** @var Transaction $obTransaction */ - $obTransaction = $journal->transactions()->where('account_id', '!=', $account->id)->first(); - /** @var Transaction $accountTransaction */ - $accountTransaction = $journal->transactions()->where('account_id', $account->id)->first(); - - // if amount is negative: - if (1 === bccomp('0', $data['opening_balance'])) { - // account transaction loses money: - $accountTransaction->amount = app('steam')->negative($data['opening_balance']); - $accountTransaction->transaction_currency_id = $data['currency_id']; - - // OB account transaction gains money - $obTransaction->amount = app('steam')->positive($data['opening_balance']); - $obTransaction->transaction_currency_id = $data['currency_id']; - } - if (-1 === bccomp('0', $data['opening_balance'])) { - // account gains money: - $accountTransaction->amount = app('steam')->positive($data['opening_balance']); - $accountTransaction->transaction_currency_id = $data['currency_id']; - - // OB account loses money: - $obTransaction->amount = app('steam')->negative($data['opening_balance']); - $obTransaction->transaction_currency_id = $data['currency_id']; - } - // save both - $accountTransaction->save(); - $obTransaction->save(); - $journal->save(); - $obGroup->refresh(); - - return $obGroup; - } } diff --git a/app/Services/Internal/Support/BillServiceTrait.php b/app/Services/Internal/Support/BillServiceTrait.php index b5b32ecbca..652fe9117d 100644 --- a/app/Services/Internal/Support/BillServiceTrait.php +++ b/app/Services/Internal/Support/BillServiceTrait.php @@ -32,6 +32,7 @@ use Log; /** * Trait BillServiceTrait + * * @codeCoverageIgnore */ trait BillServiceTrait diff --git a/app/Services/Internal/Support/JournalServiceTrait.php b/app/Services/Internal/Support/JournalServiceTrait.php index 7269164502..c7387435bc 100644 --- a/app/Services/Internal/Support/JournalServiceTrait.php +++ b/app/Services/Internal/Support/JournalServiceTrait.php @@ -49,35 +49,6 @@ trait JournalServiceTrait private CategoryRepositoryInterface $categoryRepository; private TagFactory $tagFactory; - - /** - * @param string|null $amount - * - * @return string - * @codeCoverageIgnore - */ - protected function getForeignAmount(?string $amount): ?string - { - if (null === $amount) { - Log::debug('No foreign amount info in array. Return NULL'); - - return null; - } - if ('' === $amount) { - Log::debug('Foreign amount is empty string, return NULL.'); - - return null; - } - if (0 === bccomp('0', $amount)) { - Log::debug('Foreign amount is 0.0, return NULL.'); - - return null; - } - Log::debug(sprintf('Foreign amount is %s', $amount)); - - return $amount; - } - /** * @param string $transactionType * @param string $direction @@ -113,6 +84,165 @@ trait JournalServiceTrait return $this->getCashAccount($result, $data, $expectedTypes[$transactionType]); } + /** + * @param array $data + * @param array $types + * + * @return Account|null + */ + private function findAccountById(array $data, array $types): ?Account + { + $search = null; + // first attempt, find by ID. + if (null !== $data['id']) { + $search = $this->accountRepository->findNull($data['id']); + if (null !== $search && in_array($search->accountType->type, $types, true)) { + Log::debug( + sprintf('Found "account_id" object: #%d, "%s" of type %s', $search->id, $search->name, $search->accountType->type) + ); + } + } + + return $search; + } + + /** + * @param Account|null $account + * @param array $data + * @param array $types + * + * @return Account|null + */ + private function findAccountByName(?Account $account, array $data, array $types): ?Account + { + // second attempt, find by name. + if (null === $account && null !== $data['name']) { + Log::debug('Found nothing by account ID.'); + // find by preferred type. + $source = $this->accountRepository->findByName($data['name'], [$types[0]]); + // or any expected type. + $source = $source ?? $this->accountRepository->findByName($data['name'], $types); + + if (null !== $source) { + Log::debug(sprintf('Found "account_name" object: #%d, %s', $source->id, $source->name)); + + $account = $source; + } + } + + return $account; + } + + /** + * @param Account|null $account + * @param array $data + * @param array $types + * + * @return Account|null + */ + private function findAccountByIban(?Account $account, array $data, array $types): ?Account + { + // third attempt, find by IBAN + if (null === $account && null !== $data['iban']) { + Log::debug(sprintf('Found nothing by account iban "%s".', $data['iban'])); + // find by preferred type. + $source = $this->accountRepository->findByIbanNull($data['iban'], [$types[0]]); + // or any expected type. + $source = $source ?? $this->accountRepository->findByIbanNull($data['iban'], $types); + + if (null !== $source) { + Log::debug(sprintf('Found "account_iban" object: #%d, %s', $source->id, $source->name)); + + $account = $source; + } + } + + return $account; + } + + /** + * @param Account|null $account + * @param array $data + * @param string $preferredType + * + * @return Account + * @throws FireflyException + */ + private function createAccount(?Account $account, array $data, string $preferredType): Account + { + Log::debug('Now in createAccount()', $data); + // return new account. + if (null !== $account) { + Log::debug( + sprintf( + 'Was also given %s account #%d ("%s") so will simply return that.', + $account->accountType->type, $account->id, $account->name + + ) + ); + } + if (null === $account) { + + // final attempt, create it. + if (AccountType::ASSET === $preferredType) { + throw new FireflyException('TransactionFactory: Cannot create asset account with these values', $data); + } + // fix name of account if only IBAN is given: + if ('' === (string)$data['name'] && '' !== (string)$data['iban']) { + Log::debug(sprintf('Account name is now IBAN ("%s")', $data['iban'])); + $data['name'] = $data['iban']; + } + + $data['name'] = $data['name'] ?? '(no name)'; + + $account = $this->accountRepository->store( + [ + 'account_type_id' => null, + 'account_type' => $preferredType, + 'name' => $data['name'], + 'virtual_balance' => null, + 'active' => true, + 'iban' => $data['iban'], + 'currency_id' => $data['currency_id'] ?? null, + 'order' => $this->accountRepository->maxOrder($preferredType), + ] + ); + // store BIC + if (null !== $data['bic']) { + /** @var AccountMetaFactory $metaFactory */ + $metaFactory = app(AccountMetaFactory::class); + $metaFactory->create(['account_id' => $account->id, 'name' => 'BIC', 'data' => $data['bic']]); + } + // store account number + if (null !== $data['number']) { + /** @var AccountMetaFactory $metaFactory */ + $metaFactory = app(AccountMetaFactory::class); + $metaFactory->create(['account_id' => $account->id, 'name' => 'account_number', 'data' => $data['bic']]); + } + + } + + return $account; + } + + /** + * @param Account|null $account + * @param array $data + * @param array $types + * + * @return Account|null + */ + private function getCashAccount(?Account $account, array $data, array $types): ?Account + { + // return cash account. + if (null === $account && null === $data['name'] + && in_array(AccountType::CASH, $types, true)) { + $account = $this->accountRepository->getCashAccount(); + } + + return $account; + } + /** * @param string $amount * @@ -132,6 +262,34 @@ trait JournalServiceTrait return $amount; } + /** + * @param string|null $amount + * + * @return string + * @codeCoverageIgnore + */ + protected function getForeignAmount(?string $amount): ?string + { + if (null === $amount) { + Log::debug('No foreign amount info in array. Return NULL'); + + return null; + } + if ('' === $amount) { + Log::debug('Foreign amount is empty string, return NULL.'); + + return null; + } + if (0 === bccomp('0', $amount)) { + Log::debug('Foreign amount is 0.0, return NULL.'); + + return null; + } + Log::debug(sprintf('Foreign amount is %s', $amount)); + + return $amount; + } + /** * @param TransactionJournal $journal * @param NullArrayObject $data @@ -242,163 +400,4 @@ trait JournalServiceTrait $journal->tags()->sync($set); Log::debug('Done!'); } - - /** - * @param array $data - * @param array $types - * - * @return Account|null - */ - private function findAccountById(array $data, array $types): ?Account - { - $search = null; - // first attempt, find by ID. - if (null !== $data['id']) { - $search = $this->accountRepository->findNull($data['id']); - if (null !== $search && in_array($search->accountType->type, $types, true)) { - Log::debug( - sprintf('Found "account_id" object: #%d, "%s" of type %s', $search->id, $search->name, $search->accountType->type) - ); - } - } - - return $search; - } - - /** - * @param Account|null $account - * @param array $data - * @param array $types - * - * @return Account|null - */ - private function findAccountByName(?Account $account, array $data, array $types): ?Account - { - // second attempt, find by name. - if (null === $account && null !== $data['name']) { - Log::debug('Found nothing by account ID.'); - // find by preferred type. - $source = $this->accountRepository->findByName($data['name'], [$types[0]]); - // or any expected type. - $source = $source ?? $this->accountRepository->findByName($data['name'], $types); - - if (null !== $source) { - Log::debug(sprintf('Found "account_name" object: #%d, %s', $source->id, $source->name)); - - $account = $source; - } - } - - return $account; - } - - /** - * @param Account|null $account - * @param array $data - * @param array $types - * - * @return Account|null - */ - private function findAccountByIban(?Account $account, array $data, array $types): ?Account - { - // third attempt, find by IBAN - if (null === $account && null !== $data['iban']) { - Log::debug(sprintf('Found nothing by account iban "%s".', $data['iban'])); - // find by preferred type. - $source = $this->accountRepository->findByIbanNull($data['iban'], [$types[0]]); - // or any expected type. - $source = $source ?? $this->accountRepository->findByIbanNull($data['iban'], $types); - - if (null !== $source) { - Log::debug(sprintf('Found "account_iban" object: #%d, %s', $source->id, $source->name)); - - $account = $source; - } - } - - return $account; - } - - /** - * @param Account|null $account - * @param array $data - * @param array $types - * - * @return Account|null - */ - private function getCashAccount(?Account $account, array $data, array $types): ?Account - { - // return cash account. - if (null === $account && null === $data['name'] - && in_array(AccountType::CASH, $types, true)) { - $account = $this->accountRepository->getCashAccount(); - } - - return $account; - } - - /** - * @param Account|null $account - * @param array $data - * @param string $preferredType - * - * @return Account - * @throws FireflyException - */ - private function createAccount(?Account $account, array $data, string $preferredType): Account - { - Log::debug('Now in createAccount()', $data); - // return new account. - if (null !== $account) { - Log::debug( - sprintf( - 'Was also given %s account #%d ("%s") so will simply return that.', - $account->accountType->type, $account->id, $account->name - - ) - ); - } - if (null === $account) { - - // final attempt, create it. - if (AccountType::ASSET === $preferredType) { - throw new FireflyException('TransactionFactory: Cannot create asset account with these values', $data); - } - // fix name of account if only IBAN is given: - if ('' === (string)$data['name'] && '' !== (string)$data['iban']) { - Log::debug(sprintf('Account name is now IBAN ("%s")', $data['iban'])); - $data['name'] = $data['iban']; - } - - $data['name'] = $data['name'] ?? '(no name)'; - - $account = $this->accountRepository->store( - [ - 'account_type_id' => null, - 'account_type' => $preferredType, - 'name' => $data['name'], - 'virtual_balance' => null, - 'active' => true, - 'iban' => $data['iban'], - 'currency_id' => $data['currency_id'] ?? null, - 'order' => $this->accountRepository->maxOrder($preferredType), - ] - ); - // store BIC - if (null !== $data['bic']) { - /** @var AccountMetaFactory $metaFactory */ - $metaFactory = app(AccountMetaFactory::class); - $metaFactory->create(['account_id' => $account->id, 'name' => 'BIC', 'data' => $data['bic']]); - } - // store account number - if (null !== $data['number']) { - /** @var AccountMetaFactory $metaFactory */ - $metaFactory = app(AccountMetaFactory::class); - $metaFactory->create(['account_id' => $account->id, 'name' => 'account_number', 'data' => $data['bic']]); - } - - } - - return $account; - } } diff --git a/app/Services/Internal/Support/RecurringTransactionTrait.php b/app/Services/Internal/Support/RecurringTransactionTrait.php index e58312b75b..b0787c3e05 100644 --- a/app/Services/Internal/Support/RecurringTransactionTrait.php +++ b/app/Services/Internal/Support/RecurringTransactionTrait.php @@ -51,29 +51,7 @@ trait RecurringTransactionTrait { /** * @param Recurrence $recurrence - * @param array $repetitions - */ - protected function createRepetitions(Recurrence $recurrence, array $repetitions): void - { - /** @var array $array */ - foreach ($repetitions as $array) { - RecurrenceRepetition::create( - [ - 'recurrence_id' => $recurrence->id, - 'repetition_type' => $array['type'], - 'repetition_moment' => $array['moment'] ?? '', - 'repetition_skip' => $array['skip'] ?? 0, - 'weekend' => $array['weekend'] ?? 1, - ] - ); - - } - } - - - /** - * @param Recurrence $recurrence - * @param string $note + * @param string $note * * @return bool */ @@ -102,6 +80,27 @@ trait RecurringTransactionTrait return true; } + /** + * @param Recurrence $recurrence + * @param array $repetitions + */ + protected function createRepetitions(Recurrence $recurrence, array $repetitions): void + { + /** @var array $array */ + foreach ($repetitions as $array) { + RecurrenceRepetition::create( + [ + 'recurrence_id' => $recurrence->id, + 'repetition_type' => $array['type'], + 'repetition_moment' => $array['moment'] ?? '', + 'repetition_skip' => $array['skip'] ?? 0, + 'weekend' => $array['weekend'] ?? 1, + ] + ); + + } + } + /** * Store transactions of a recurring transactions. It's complex but readable. * @@ -112,7 +111,9 @@ trait RecurringTransactionTrait */ protected function createTransactions(Recurrence $recurrence, array $transactions): void { - foreach ($transactions as $array) { + Log::debug('Now in createTransactions()'); + foreach ($transactions as $index => $array) { + Log::debug(sprintf('Now at transaction #%d', $index)); $sourceTypes = config(sprintf('firefly.expected_source_types.source.%s', $recurrence->transactionType->type)); $destTypes = config(sprintf('firefly.expected_source_types.destination.%s', $recurrence->transactionType->type)); $source = $this->findAccount($sourceTypes, $array['source_id'], null); @@ -126,11 +127,17 @@ trait RecurringTransactionTrait $currency = app('amount')->getDefaultCurrencyByUser($recurrence->user); } + Log::debug( + sprintf('Will set the validator type to %s based on the type of the recurrence (#%d).', $recurrence->transactionType->type, $recurrence->id) + ); + // once the accounts have been determined, we still verify their validity: /** @var AccountValidator $validator */ $validator = app(AccountValidator::class); $validator->setUser($recurrence->user); $validator->setTransactionType($recurrence->transactionType->type); + + if (!$validator->validateSource($source->id, null, null)) { throw new FireflyException(sprintf('Source invalid: %s', $validator->sourceError)); // @codeCoverageIgnore } @@ -138,7 +145,9 @@ trait RecurringTransactionTrait if (!$validator->validateDestination($destination->id, null, null)) { throw new FireflyException(sprintf('Destination invalid: %s', $validator->destError)); // @codeCoverageIgnore } - + if (array_key_exists('foreign_amount', $array) && '' === (string)$array['foreign_amount']) { + unset($array['foreign_amount']); + } // TODO typeOverrule: the account validator may have another opinion on the transaction type. $transaction = new RecurrenceTransaction( [ @@ -154,20 +163,11 @@ trait RecurringTransactionTrait ); $transaction->save(); - $budget = null; if (array_key_exists('budget_id', $array)) { - /** @var BudgetFactory $budgetFactory */ - $budgetFactory = app(BudgetFactory::class); - $budgetFactory->setUser($recurrence->user); - $budget = $budgetFactory->find($array['budget_id'], null); + $this->setBudget($transaction, (int)$array['budget_id']); } - - $category = null; if (array_key_exists('category_id', $array)) { - /** @var CategoryFactory $categoryFactory */ - $categoryFactory = app(CategoryFactory::class); - $categoryFactory->setUser($recurrence->user); - $category = $categoryFactory->findOrCreate($array['category_id'], null); + $this->setCategory($transaction, (int)$array['category_id']); } // same for piggy bank @@ -175,57 +175,10 @@ trait RecurringTransactionTrait $this->updatePiggyBank($transaction, (int)$array['piggy_bank_id']); } - if(array_key_exists('tags', $array)) { + if (array_key_exists('tags', $array)) { $this->updateTags($transaction, $array['tags']); } - // create recurrence transaction meta: - if (null !== $budget) { - RecurrenceTransactionMeta::create( - [ - 'rt_id' => $transaction->id, - 'name' => 'budget_id', - 'value' => $budget->id, - ] - ); - } - if (null !== $category) { - RecurrenceTransactionMeta::create( - [ - 'rt_id' => $transaction->id, - 'name' => 'category_name', - 'value' => $category->name, - ] - ); - } - } - } - - /** - * @param Recurrence $recurrence - * - * @codeCoverageIgnore - */ - protected function deleteRepetitions(Recurrence $recurrence): void - { - $recurrence->recurrenceRepetitions()->delete(); - } - - /** - * @param Recurrence $recurrence - * - * @codeCoverageIgnore - */ - protected function deleteTransactions(Recurrence $recurrence): void - { - /** @var RecurrenceTransaction $transaction */ - foreach ($recurrence->recurrenceTransactions as $transaction) { - $transaction->recurrenceTransactionMeta()->delete(); - try { - $transaction->delete(); - } catch (Exception $e) { - Log::debug($e->getMessage()); - } } } @@ -281,6 +234,52 @@ trait RecurringTransactionTrait return $result ?? $repository->getCashAccount(); } + /** + * @param RecurrenceTransaction $transaction + * @param int $budgetId + */ + private function setBudget(RecurrenceTransaction $transaction, int $budgetId): void + { + $budgetFactory = app(BudgetFactory::class); + $budgetFactory->setUser($transaction->recurrence->user); + $budget = $budgetFactory->find($budgetId, null); + if (null === $budget) { + return; + } + + $meta = $transaction->recurrenceTransactionMeta()->where('name', 'budget_id')->first(); + if (null === $meta) { + $meta = new RecurrenceTransactionMeta; + $meta->rt_id = $transaction->id; + $meta->name = 'budget_id'; + } + $meta->value = $budget->id; + $meta->save(); + } + + /** + * @param RecurrenceTransaction $transaction + * @param int $categoryId + */ + private function setCategory(RecurrenceTransaction $transaction, int $categoryId): void + { + $categoryFactory = app(CategoryFactory::class); + $categoryFactory->setUser($transaction->recurrence->user); + $category = $categoryFactory->findOrCreate($categoryId, null); + if (null === $category) { + return; + } + + $meta = $transaction->recurrenceTransactionMeta()->where('name', 'category_id')->first(); + if (null === $meta) { + $meta = new RecurrenceTransactionMeta; + $meta->rt_id = $transaction->id; + $meta->name = 'category_id'; + } + $meta->value = $category->id; + $meta->save(); + } + /** * @param RecurrenceTransaction $transaction * @param int $piggyId @@ -326,4 +325,33 @@ trait RecurringTransactionTrait $transaction->recurrenceTransactionMeta()->where('name', 'tags')->delete(); } } + + /** + * @param Recurrence $recurrence + * + * @codeCoverageIgnore + */ + protected function deleteRepetitions(Recurrence $recurrence): void + { + $recurrence->recurrenceRepetitions()->delete(); + } + + /** + * @param Recurrence $recurrence + * + * @codeCoverageIgnore + */ + protected function deleteTransactions(Recurrence $recurrence): void + { + Log::debug('deleteTransactions()'); + /** @var RecurrenceTransaction $transaction */ + foreach ($recurrence->recurrenceTransactions as $transaction) { + $transaction->recurrenceTransactionMeta()->delete(); + try { + $transaction->delete(); + } catch (Exception $e) { + Log::debug($e->getMessage()); + } + } + } } diff --git a/app/Services/Internal/Update/AccountUpdateService.php b/app/Services/Internal/Update/AccountUpdateService.php index acbd59960b..2226e5ff77 100644 --- a/app/Services/Internal/Update/AccountUpdateService.php +++ b/app/Services/Internal/Update/AccountUpdateService.php @@ -119,15 +119,23 @@ class AccountUpdateService private function updateAccount(Account $account, array $data): Account { // update the account itself: - $account->name = $data['name'] ?? $account->name; - $account->active = $data['active'] ?? $account->active; - $account->iban = $data['iban'] ?? $account->iban; + if (array_key_exists('name', $data)) { + $account->name = $data['name']; + } + if (array_key_exists('active', $data)) { + $account->active = $data['active']; + } + if (array_key_exists('iban', $data)) { + $account->iban = $data['iban']; + } - // liability stuff: - $liabilityType = $data['liability_type'] ?? ''; - if ($this->isLiability($account) && $this->isLiabilityType($liabilityType)) { - $type = $this->getAccountType($liabilityType); - $account->account_type_id = $type->id; + // set liability, but account must already be a liability. + //$liabilityType = $data['liability_type'] ?? ''; + if ($this->isLiability($account) && array_key_exists('liability_type', $data)) { + $type = $this->getAccountType($data['liability_type']); + if (null !== $type) { + $account->account_type_id = $type->id; + } } // update virtual balance (could be set to zero if empty string). @@ -152,20 +160,6 @@ class AccountUpdateService return in_array($type, [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE], true); } - /** - * @param string $type - * - * @return bool - */ - private function isLiabilityType(string $type): bool - { - if ('' === $type) { - return false; - } - - return 1 === AccountType::whereIn('type', [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE])->where('type', ucfirst($type))->count(); - } - /** * @param string $type */ @@ -326,4 +320,18 @@ class AccountUpdateService } Log::debug('Account was not marked as inactive, do nothing.'); } + + /** + * @param string $type + * + * @return bool + */ + private function isLiabilityType(string $type): bool + { + if ('' === $type) { + return false; + } + + return 1 === AccountType::whereIn('type', [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE])->where('type', ucfirst($type))->count(); + } } diff --git a/app/Services/Internal/Update/BillUpdateService.php b/app/Services/Internal/Update/BillUpdateService.php index 1cad40408f..5749cfae57 100644 --- a/app/Services/Internal/Update/BillUpdateService.php +++ b/app/Services/Internal/Update/BillUpdateService.php @@ -56,7 +56,8 @@ class BillUpdateService if (array_key_exists('currency_id', $data) || array_key_exists('currency_code', $data)) { $factory = app(TransactionCurrencyFactory::class); - $currency = $factory->find((int) ($data['currency_id'] ?? null), $data['currency_code'] ?? null) ?? app('amount')->getDefaultCurrencyByUser($bill->user); + $currency = $factory->find((int)($data['currency_id'] ?? null), $data['currency_code'] ?? null) ?? + app('amount')->getDefaultCurrencyByUser($bill->user); // enable the currency if it isn't. $currency->enabled = true; diff --git a/app/Services/Internal/Update/CategoryUpdateService.php b/app/Services/Internal/Update/CategoryUpdateService.php index 819db8b38d..4d51a254cd 100644 --- a/app/Services/Internal/Update/CategoryUpdateService.php +++ b/app/Services/Internal/Update/CategoryUpdateService.php @@ -67,8 +67,8 @@ class CategoryUpdateService */ public function update(Category $category, array $data): Category { - $oldName = $category->name; - if(array_key_exists('name', $data)) { + $oldName = $category->name; + if (array_key_exists('name', $data)) { $category->name = $data['name']; $category->save(); // update triggers and actions diff --git a/app/Services/Internal/Update/CurrencyUpdateService.php b/app/Services/Internal/Update/CurrencyUpdateService.php index b1d99f0e05..f84a1b78f2 100644 --- a/app/Services/Internal/Update/CurrencyUpdateService.php +++ b/app/Services/Internal/Update/CurrencyUpdateService.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Services\Internal\Update; use FireflyIII\Models\TransactionCurrency; -use Log; /** * Class CurrencyUpdateService diff --git a/app/Services/Internal/Update/RecurrenceUpdateService.php b/app/Services/Internal/Update/RecurrenceUpdateService.php index 71332053f1..503430dcab 100644 --- a/app/Services/Internal/Update/RecurrenceUpdateService.php +++ b/app/Services/Internal/Update/RecurrenceUpdateService.php @@ -25,9 +25,11 @@ namespace FireflyIII\Services\Internal\Update; use Exception; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Factory\TransactionCurrencyFactory; use FireflyIII\Models\Note; use FireflyIII\Models\Recurrence; use FireflyIII\Models\RecurrenceRepetition; +use FireflyIII\Models\RecurrenceTransaction; use FireflyIII\Services\Internal\Support\RecurringTransactionTrait; use FireflyIII\Services\Internal\Support\TransactionTypeTrait; use FireflyIII\User; @@ -103,11 +105,12 @@ class RecurrenceUpdateService // update all transactions: -// // update all transactions (and associated meta-data) -// if (array_key_exists('transactions', $data)) { -// $this->deleteTransactions($recurrence); -// $this->createTransactions($recurrence, $data['transactions'] ?? []); -// } + // update all transactions (and associated meta-data) + if (array_key_exists('transactions', $data)) { + $this->updateTransactions($recurrence, $data['transactions'] ?? []); + // $this->deleteTransactions($recurrence); + // $this->createTransactions($recurrence, $data['transactions'] ?? []); + } return $recurrence; } @@ -153,7 +156,7 @@ class RecurrenceUpdateService } // user added or removed repetitions, delete all and recreate: if ($originalCount !== count($repetitions)) { - Log::debug('Del + recreate'); + Log::debug('Delete existing repetitions and create new ones.'); $this->deleteRepetitions($recurrence); $this->createRepetitions($recurrence, $repetitions); @@ -172,7 +175,7 @@ class RecurrenceUpdateService 'moment' => 'repetition_moment', 'skip' => 'repetition_skip', 'weekend' => 'weekend', - ]; + ]; foreach ($fields as $field => $column) { if (array_key_exists($field, $current)) { $match->$column = $current[$field]; @@ -193,6 +196,7 @@ class RecurrenceUpdateService $originalCount = $recurrence->recurrenceRepetitions()->count(); if (1 === $originalCount) { Log::debug('Return the first one'); + return $recurrence->recurrenceRepetitions()->first(); } // find it: @@ -211,4 +215,126 @@ class RecurrenceUpdateService return $query->first(); } + + /** + * TODO this method is way too complex. + * + * @param Recurrence $recurrence + * @param array $transactions + * + * @throws FireflyException + */ + private function updateTransactions(Recurrence $recurrence, array $transactions): void + { + $originalCount = $recurrence->recurrenceTransactions()->count(); + if (0 === count($transactions)) { + // wont drop transactions, rather avoid. + return; + } + // user added or removed repetitions, delete all and recreate: + if ($originalCount !== count($transactions)) { + Log::debug('Delete existing transactions and create new ones.'); + $this->deleteTransactions($recurrence); + $this->createTransactions($recurrence, $transactions); + + return; + } + $currencyFactory = app(TransactionCurrencyFactory::class); + + + // loop all and try to match them: + if ($originalCount === count($transactions)) { + Log::debug('Loop and find'); + foreach ($transactions as $current) { + $match = $this->matchTransaction($recurrence, $current); + if (null === $match) { + throw new FireflyException('Cannot match recurring transaction to existing transaction. Not sure what to do. Break.'); + } + $currency = null; + $foreignCurrency = null; + if (array_key_exists('currency_id', $current) || array_key_exists('currency_code', $current)) { + $currency = $currencyFactory->find($current['currency_id'] ?? null, $currency['currency_code'] ?? null); + } + if (null === $currency) { + unset($current['currency_id'], $currency['currency_code']); + } + if (null !== $currency) { + $current['currency_id'] = (int)$currency->id; + } + if (array_key_exists('foreign_currency_id', $current) || array_key_exists('foreign_currency_code', $current)) { + $foreignCurrency = $currencyFactory->find($current['foreign_currency_id'] ?? null, $currency['foreign_currency_code'] ?? null); + } + if (null === $foreignCurrency) { + unset($current['foreign_currency_id'], $currency['foreign_currency_code']); + } + if (null !== $foreignCurrency) { + $current['foreign_currency_id'] = (int)$foreignCurrency->id; + } + + // update fields + $fields = [ + 'source_id' => 'source_id', + 'destination_id' => 'destination_id', + 'amount' => 'amount', + 'foreign_amount' => 'foreign_amount', + 'description' => 'description', + 'currency_id' => 'transaction_currency_id', + 'foreign_currency_id' => 'foreign_currency_id', + ]; + foreach ($fields as $field => $column) { + if (array_key_exists($field, $current)) { + $match->$column = $current[$field]; + $match->save(); + } + } + // update meta data + if (array_key_exists('budget_id', $current)) { + $this->setBudget($match, (int)$current['budget_id']); + } + if (array_key_exists('category_id', $current)) { + $this->setCategory($match, (int)$current['category_id']); + } + if (array_key_exists('tags', $current)) { + $this->updateTags($match, $current['tags']); + } + if (array_key_exists('piggy_bank_id', $current)) { + $this->updatePiggyBank($match, (int)$current['piggy_bank_id']); + } + } + } + } + + /** + * @param array $data + * + * @return RecurrenceTransaction|null + */ + private function matchTransaction(Recurrence $recurrence, array $data): ?RecurrenceTransaction + { + $originalCount = $recurrence->recurrenceTransactions()->count(); + if (1 === $originalCount) { + Log::debug('Return the first one'); + + return $recurrence->recurrenceTransactions()->first(); + } + // find it based on data + $fields = [ + 'id' => 'id', + 'currency_id' => 'transaction_currency_id', + 'foreign_currency_id' => 'foreign_currency_id', + 'source_id' => 'source_id', + 'destination_id' => 'destination_id', + 'amount' => 'amount', + 'foreign_amount' => 'foreign_amount', + 'description' => 'description', + ]; + $query = $recurrence->recurrenceTransactions(); + foreach ($fields as $field => $column) { + if (array_key_exists($field, $data)) { + $query->where($column, $data[$field]); + } + } + + return $query->first(); + } } diff --git a/app/Services/Password/PwndVerifierV2.php b/app/Services/Password/PwndVerifierV2.php index 5afdb5e27c..8566ba7dbf 100644 --- a/app/Services/Password/PwndVerifierV2.php +++ b/app/Services/Password/PwndVerifierV2.php @@ -30,6 +30,7 @@ use RuntimeException; /** * Class PwndVerifierV2. + * * @codeCoverageIgnore */ class PwndVerifierV2 implements Verifier @@ -50,7 +51,7 @@ class PwndVerifierV2 implements Verifier $uri = sprintf('https://api.pwnedpasswords.com/range/%s', $prefix); $opt = [ 'headers' => [ - 'User-Agent' => 'Firefly III v' . config('firefly.version'), + 'User-Agent' => 'Firefly III v' . config('firefly.version'), 'Add-Padding' => 'true', ], 'timeout' => 3.1415]; @@ -61,7 +62,7 @@ class PwndVerifierV2 implements Verifier try { $client = new Client(); $res = $client->request('GET', $uri, $opt); - } catch (GuzzleException|Exception $e) { + } catch (GuzzleException | Exception $e) { Log::error(sprintf('Could not verify password security: %s', $e->getMessage())); return true; diff --git a/app/Services/Webhook/StandardWebhookSender.php b/app/Services/Webhook/StandardWebhookSender.php index 9f3e720050..22fd2136c9 100644 --- a/app/Services/Webhook/StandardWebhookSender.php +++ b/app/Services/Webhook/StandardWebhookSender.php @@ -68,14 +68,6 @@ class StandardWebhookSender implements WebhookSenderInterface return $this->version; } - /** - * @inheritDoc - */ - public function setMessage(WebhookMessage $message): void - { - $this->message = $message; - } - /** * @inheritDoc */ @@ -144,4 +136,12 @@ class StandardWebhookSender implements WebhookSenderInterface Log::debug(sprintf('Webhook request body size: %d bytes', strlen($json))); Log::debug(sprintf('Response body: %s', $res->getBody())); } + + /** + * @inheritDoc + */ + public function setMessage(WebhookMessage $message): void + { + $this->message = $message; + } } diff --git a/app/Services/Webhook/WebhookSenderInterface.php b/app/Services/Webhook/WebhookSenderInterface.php index 381dd23904..646a68b865 100644 --- a/app/Services/Webhook/WebhookSenderInterface.php +++ b/app/Services/Webhook/WebhookSenderInterface.php @@ -55,13 +55,13 @@ interface WebhookSenderInterface */ public function getVersion(): int; - /** - * @param WebhookMessage $message - */ - public function setMessage(WebhookMessage $message): void; - /** * */ public function send(): void; + + /** + * @param WebhookMessage $message + */ + public function setMessage(WebhookMessage $message): void; } diff --git a/app/Support/Amount.php b/app/Support/Amount.php index f7b73cd0a2..d2280d48f0 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -27,7 +27,6 @@ use FireflyIII\Models\TransactionCurrency; use FireflyIII\User; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Support\Collection; -use Log; use NumberFormatter; /** @@ -37,6 +36,225 @@ use NumberFormatter; */ class Amount { + /** + * This method will properly format the given number, in color or "black and white", + * as a currency, given two things: the currency required and the current locale. + * + * @param TransactionCurrency $format + * @param string $amount + * @param bool $coloured + * + * @return string + * + */ + public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = null): string + { + return $this->formatFlat($format->symbol, (int)$format->decimal_places, $amount, $coloured); + } + + /** + * This method will properly format the given number, in color or "black and white", + * as a currency, given two things: the currency required and the current locale. + * + * @param string $symbol + * @param int $decimalPlaces + * @param string $amount + * @param bool $coloured + * + * @return string + * + * @noinspection MoreThanThreeArgumentsInspection + */ + public function formatFlat(string $symbol, int $decimalPlaces, string $amount, bool $coloured = null): string + { + $locale = app('steam')->getLocale(); + + $coloured = $coloured ?? true; + + $fmt = new NumberFormatter($locale, NumberFormatter::CURRENCY); + $fmt->setSymbol(NumberFormatter::CURRENCY_SYMBOL, $symbol); + $fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimalPlaces); + $fmt->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimalPlaces); + $result = $fmt->format((float)$amount); + + if (true === $coloured) { + if ($amount > 0) { + return sprintf('%s', $result); + } + if ($amount < 0) { + return sprintf('%s', $result); + } + + return sprintf('%s', $result); + } + + return $result; + } + + /** + * @return Collection + */ + public function getAllCurrencies(): Collection + { + return TransactionCurrency::orderBy('code', 'ASC')->get(); + } + + /** + * @return Collection + */ + public function getCurrencies(): Collection + { + return TransactionCurrency::where('enabled', true)->orderBy('code', 'ASC')->get(); + } + + /** + * @return string + */ + public function getCurrencyCode(): string + { + $cache = new CacheProperties; + $cache->addProperty('getCurrencyCode'); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $currencyPreference = app('preferences')->get('currencyPreference', config('firefly.default_currency', 'EUR')); + + $currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); + if ($currency) { + $cache->store($currency->code); + + return $currency->code; + } + $cache->store(config('firefly.default_currency', 'EUR')); + + return (string)config('firefly.default_currency', 'EUR'); + } + + /** + * @return TransactionCurrency + */ + public function getDefaultCurrency(): TransactionCurrency + { + /** @var User $user */ + $user = auth()->user(); + + return $this->getDefaultCurrencyByUser($user); + } + + /** + * @param User $user + * + * @return TransactionCurrency + */ + public function getDefaultCurrencyByUser(User $user): TransactionCurrency + { + $cache = new CacheProperties; + $cache->addProperty('getDefaultCurrency'); + $cache->addProperty($user->id); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + $currencyPreference = app('preferences')->getForUser($user, 'currencyPreference', config('firefly.default_currency', 'EUR')); + $currencyPrefStr = $currencyPreference ? $currencyPreference->data : 'EUR'; + + // at this point the currency preference could be encrypted, if coming from an old version. + $currencyCode = $this->tryDecrypt((string)$currencyPrefStr); + + // could still be json encoded: + if (strlen($currencyCode) > 3) { + $currencyCode = json_decode($currencyCode, true, 512, JSON_THROW_ON_ERROR) ?? 'EUR'; + } + /** @var TransactionCurrency $currency */ + $currency = TransactionCurrency::where('code', $currencyCode)->first(); + if (null === $currency) { + // get EUR + $currency = TransactionCurrency::where('code', 'EUR')->first(); + } + $cache->store($currency); + + return $currency; + } + + /** + * @param string $value + * + * @return string + */ + private function tryDecrypt(string $value): string + { + try { + $value = Crypt::decrypt($value); // verified + } catch (DecryptException $e) { + // ignore decryption error. + } + + return $value; + } + + /** + * This method returns the correct format rules required by accounting.js, + * the library used to format amounts in charts. + * + * Used only in one place. + * + * @return array + */ + public function getJsConfig(): array + { + $config = $this->getLocaleInfo(); + $negative = self::getAmountJsConfig($config['n_sep_by_space'], $config['n_sign_posn'], $config['negative_sign'], $config['n_cs_precedes']); + $positive = self::getAmountJsConfig($config['p_sep_by_space'], $config['p_sign_posn'], $config['positive_sign'], $config['p_cs_precedes']); + + return [ + 'mon_decimal_point' => $config['mon_decimal_point'], + 'mon_thousands_sep' => $config['mon_thousands_sep'], + 'format' => [ + 'pos' => $positive, + 'neg' => $negative, + 'zero' => $positive, + ], + ]; + } + + /** + * @return array + */ + private function getLocaleInfo(): array + { + // get config from preference, not from translation: + $locale = app('steam')->getLocale(); + $array = app('steam')->getLocaleArray($locale); + + setlocale(LC_MONETARY, $array); + $info = localeconv(); + + // correct variables + $info['n_cs_precedes'] = $this->getLocaleField($info, 'n_cs_precedes'); + $info['p_cs_precedes'] = $this->getLocaleField($info, 'p_cs_precedes'); + + $info['n_sep_by_space'] = $this->getLocaleField($info, 'n_sep_by_space'); + $info['p_sep_by_space'] = $this->getLocaleField($info, 'p_sep_by_space'); + + $fmt = new NumberFormatter($locale, NumberFormatter::CURRENCY); + + $info['mon_decimal_point'] = $fmt->getSymbol(NumberFormatter::MONETARY_SEPARATOR_SYMBOL); + $info['mon_thousands_sep'] = $fmt->getSymbol(NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL); + + return $info; + } + + /** + * @param array $info + * @param string $field + * + * @return bool + */ + private function getLocaleField(array $info, string $field): bool + { + return (is_bool($info[$field]) && true === $info[$field]) + || (is_int($info[$field]) && 1 === $info[$field]); + } + /** * bool $sepBySpace is $localeconv['n_sep_by_space'] * int $signPosn = $localeconv['n_sign_posn'] @@ -111,230 +329,11 @@ class Amount return $format; } - /** - * This method returns the correct format rules required by accounting.js, - * the library used to format amounts in charts. - * - * Used only in one place. - * - * @return array - */ - public function getJsConfig(): array - { - $config = $this->getLocaleInfo(); - $negative = self::getAmountJsConfig($config['n_sep_by_space'], $config['n_sign_posn'], $config['negative_sign'], $config['n_cs_precedes']); - $positive = self::getAmountJsConfig($config['p_sep_by_space'], $config['p_sign_posn'], $config['positive_sign'], $config['p_cs_precedes']); - - return [ - 'mon_decimal_point' => $config['mon_decimal_point'], - 'mon_thousands_sep' => $config['mon_thousands_sep'], - 'format' => [ - 'pos' => $positive, - 'neg' => $negative, - 'zero' => $positive, - ], - ]; - } - - /** - * @return array - */ - private function getLocaleInfo(): array - { - // get config from preference, not from translation: - $locale = app('steam')->getLocale(); - $array = app('steam')->getLocaleArray($locale); - - setlocale(LC_MONETARY, $array); - $info = localeconv(); - - // correct variables - $info['n_cs_precedes'] = $this->getLocaleField($info, 'n_cs_precedes'); - $info['p_cs_precedes'] = $this->getLocaleField($info, 'p_cs_precedes'); - - $info['n_sep_by_space'] = $this->getLocaleField($info, 'n_sep_by_space'); - $info['p_sep_by_space'] = $this->getLocaleField($info, 'p_sep_by_space'); - - $fmt = new NumberFormatter( $locale, NumberFormatter::CURRENCY); - - $info['mon_decimal_point'] = $fmt->getSymbol(NumberFormatter::MONETARY_SEPARATOR_SYMBOL); - $info['mon_thousands_sep'] = $fmt->getSymbol(NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL); - - return $info; - } - - /** - * This method will properly format the given number, in color or "black and white", - * as a currency, given two things: the currency required and the current locale. - * - * @param TransactionCurrency $format - * @param string $amount - * @param bool $coloured - * - * @return string - * - */ - public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = null): string - { - return $this->formatFlat($format->symbol, (int)$format->decimal_places, $amount, $coloured); - } - - /** - * This method will properly format the given number, in color or "black and white", - * as a currency, given two things: the currency required and the current locale. - * - * @param string $symbol - * @param int $decimalPlaces - * @param string $amount - * @param bool $coloured - * - * @return string - * - * @noinspection MoreThanThreeArgumentsInspection - */ - public function formatFlat(string $symbol, int $decimalPlaces, string $amount, bool $coloured = null): string - { - $locale = app('steam')->getLocale(); - - $coloured = $coloured ?? true; - - $fmt = new NumberFormatter( $locale, NumberFormatter::CURRENCY ); - $fmt->setSymbol(NumberFormatter::CURRENCY_SYMBOL, $symbol); - $fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimalPlaces); - $fmt->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimalPlaces); - $result = $fmt->format((float) $amount); - - if (true === $coloured) { - if ($amount > 0) { - return sprintf('%s', $result); - } - if ($amount < 0) { - return sprintf('%s', $result); - } - - return sprintf('%s', $result); - } - - return $result; - } - - /** - * @return Collection - */ - public function getAllCurrencies(): Collection - { - return TransactionCurrency::orderBy('code', 'ASC')->get(); - } - - /** - * @return Collection - */ - public function getCurrencies(): Collection - { - return TransactionCurrency::where('enabled', true)->orderBy('code', 'ASC')->get(); - } - - /** - * @return string - */ - public function getCurrencyCode(): string - { - $cache = new CacheProperties; - $cache->addProperty('getCurrencyCode'); - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - $currencyPreference = app('preferences')->get('currencyPreference', config('firefly.default_currency', 'EUR')); - - $currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); - if ($currency) { - $cache->store($currency->code); - - return $currency->code; - } - $cache->store(config('firefly.default_currency', 'EUR')); - - return (string)config('firefly.default_currency', 'EUR'); - } - - /** - * @return TransactionCurrency - */ - public function getDefaultCurrency(): TransactionCurrency - { - /** @var User $user */ - $user = auth()->user(); - - return $this->getDefaultCurrencyByUser($user); - } - /** * @return TransactionCurrency */ public function getSystemCurrency(): TransactionCurrency { - return TransactionCurrency::where('code', 'EUR')->first(); - } - - /** - * @param User $user - * - * @return TransactionCurrency - */ - public function getDefaultCurrencyByUser(User $user): TransactionCurrency - { - $cache = new CacheProperties; - $cache->addProperty('getDefaultCurrency'); - $cache->addProperty($user->id); - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore - } - $currencyPreference = app('preferences')->getForUser($user, 'currencyPreference', config('firefly.default_currency', 'EUR')); - $currencyPrefStr = $currencyPreference ? $currencyPreference->data : 'EUR'; - - // at this point the currency preference could be encrypted, if coming from an old version. - $currencyCode = $this->tryDecrypt((string) $currencyPrefStr); - - // could still be json encoded: - if (strlen($currencyCode) > 3) { - $currencyCode = json_decode($currencyCode, true, 512, JSON_THROW_ON_ERROR) ?? 'EUR'; - } - /** @var TransactionCurrency $currency */ - $currency = TransactionCurrency::where('code', $currencyCode)->first(); - if (null === $currency) { - // get EUR - $currency = TransactionCurrency::where('code', 'EUR')->first(); - } - $cache->store($currency); - - return $currency; - } - - /** - * @param array $info - * @param string $field - * - * @return bool - */ - private function getLocaleField(array $info, string $field): bool - { - return (is_bool($info[$field]) && true === $info[$field]) - || (is_int($info[$field]) && 1 === $info[$field]); - } - - /** - * @param string $value - * - * @return string - */ - private function tryDecrypt(string $value): string - { - try { - $value = Crypt::decrypt($value); // verified - } catch (DecryptException $e) { - // ignore decryption error. - } - - return $value; + return TransactionCurrency::where('code', 'EUR')->first(); } } diff --git a/app/Support/Authentication/RemoteUserGuard.php b/app/Support/Authentication/RemoteUserGuard.php index 42432e25ba..fc8e28bbd7 100644 --- a/app/Support/Authentication/RemoteUserGuard.php +++ b/app/Support/Authentication/RemoteUserGuard.php @@ -45,7 +45,7 @@ class RemoteUserGuard implements Guard /** * Create a new authentication guard. * - * @param \Illuminate\Contracts\Auth\UserProvider $provider + * @param UserProvider $provider * * @return void */ @@ -79,10 +79,10 @@ class RemoteUserGuard implements Guard $retrievedUser = $this->provider->retrieveById($userID); // store email address if present in header and not already set. - $header = config('auth.guard_email'); + $header = config('auth.guard_email'); if (null !== $header) { - $emailAddress = (string) (request()->server($header) ?? null); + $emailAddress = (string)(request()->server($header) ?? null); $preference = app('preferences')->getForUser($retrievedUser, 'remote_guard_alt_email', null); if (null !== $emailAddress && null === $preference && $emailAddress !== $userID) { diff --git a/app/Support/Binder/Date.php b/app/Support/Binder/Date.php index ea4b6e7826..423b699a7d 100644 --- a/app/Support/Binder/Date.php +++ b/app/Support/Binder/Date.php @@ -39,7 +39,7 @@ class Date implements BinderInterface * @param Route $route * * @return Carbon - * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @throws NotFoundHttpException */ public static function routeBinder(string $value, Route $route): Carbon { diff --git a/app/Support/Binder/TagList.php b/app/Support/Binder/TagList.php index 3f7bf64d1e..ba4d06f60f 100644 --- a/app/Support/Binder/TagList.php +++ b/app/Support/Binder/TagList.php @@ -39,7 +39,7 @@ class TagList implements BinderInterface * @param Route $route * * @return Collection - * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @throws NotFoundHttpException */ public static function routeBinder(string $value, Route $route): Collection { diff --git a/app/Support/CacheProperties.php b/app/Support/CacheProperties.php index 7472bc91c9..4d7c36ab15 100644 --- a/app/Support/CacheProperties.php +++ b/app/Support/CacheProperties.php @@ -23,10 +23,13 @@ declare(strict_types=1); namespace FireflyIII\Support; use Cache; +use Carbon\Carbon; +use FireflyIII\Models\Category; use Illuminate\Support\Collection; /** * Class CacheProperties. + * * @codeCoverageIgnore */ class CacheProperties @@ -49,8 +52,8 @@ class CacheProperties } /** - * @param $property - * @param Collection|\Carbon\Carbon|\FireflyIII\Models\Category|array|int|string $property + * @param $property + * @param Collection|Carbon|Category|array|int|string $property */ public function addProperty($property): void { @@ -86,15 +89,6 @@ class CacheProperties return Cache::has($this->hash); } - /** - * @param $data - * @param (array|mixed)[]|Collection|\Carbon\Carbon|string $data - */ - public function store($data): void - { - Cache::forever($this->hash, $data); - } - /** */ private function hash(): void @@ -105,4 +99,13 @@ class CacheProperties } $this->hash = substr(hash('sha256', $content), 0, 16); } + + /** + * @param $data + * @param (array|mixed)[]|Collection|\Carbon\Carbon|string $data + */ + public function store($data): void + { + Cache::forever($this->hash, $data); + } } diff --git a/app/Support/Chart/Budget/FrontpageChartGenerator.php b/app/Support/Chart/Budget/FrontpageChartGenerator.php index 89c75126fc..5496e0305b 100644 --- a/app/Support/Chart/Budget/FrontpageChartGenerator.php +++ b/app/Support/Chart/Budget/FrontpageChartGenerator.php @@ -37,13 +37,13 @@ use Illuminate\Support\Collection; */ class FrontpageChartGenerator { - private User $user; - private Carbon $start; - private Carbon $end; - private BudgetRepositoryInterface $budgetRepository; - private BudgetLimitRepositoryInterface $blRepository; protected OperationsRepositoryInterface $opsRepository; + private BudgetLimitRepositoryInterface $blRepository; + private BudgetRepositoryInterface $budgetRepository; + private Carbon $end; private string $monthAndDayFormat; + private Carbon $start; + private User $user; /** * FrontpageChartGenerator constructor. @@ -79,38 +79,6 @@ class FrontpageChartGenerator return $data; } - /** - * A basic setter for the user. Also updates the repositories with the right user. - * - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - $this->budgetRepository->setUser($user); - $this->blRepository->setUser($user); - $this->opsRepository->setUser($user); - - $locale = app('steam')->getLocale(); - $this->monthAndDayFormat = (string)trans('config.month_and_day', [], $locale); - } - - /** - * @param Carbon $start - */ - public function setStart(Carbon $start): void - { - $this->start = $start; - } - - /** - * @param Carbon $end - */ - public function setEnd(Carbon $end): void - { - $this->end = $end; - } - /** * For each budget, gets all budget limits for the current time range. * When no limits are present, the time range is used to collect information on money spent. @@ -238,5 +206,37 @@ class FrontpageChartGenerator return $data; } + /** + * @param Carbon $end + */ + public function setEnd(Carbon $end): void + { + $this->end = $end; + } + + /** + * @param Carbon $start + */ + public function setStart(Carbon $start): void + { + $this->start = $start; + } + + /** + * A basic setter for the user. Also updates the repositories with the right user. + * + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + $this->budgetRepository->setUser($user); + $this->blRepository->setUser($user); + $this->opsRepository->setUser($user); + + $locale = app('steam')->getLocale(); + $this->monthAndDayFormat = (string)trans('config.month_and_day', [], $locale); + } + } diff --git a/app/Support/Chart/Category/FrontpageChartGenerator.php b/app/Support/Chart/Category/FrontpageChartGenerator.php index 1df9f7e456..1969448183 100644 --- a/app/Support/Chart/Category/FrontpageChartGenerator.php +++ b/app/Support/Chart/Category/FrontpageChartGenerator.php @@ -99,6 +99,29 @@ class FrontpageChartGenerator return $this->insertValues($currencyData, $tempData); } + /** + * @param Category $category + * @param Collection $accounts + * + * @return array + */ + private function collectExpenses(Category $category, Collection $accounts): array + { + $spent = $this->opsRepos->sumExpenses($this->start, $this->end, $accounts, new Collection([$category])); + $tempData = []; + foreach ($spent as $currency) { + $this->addCurrency($currency); + $tempData[] = [ + 'name' => $category->name, + 'sum' => $currency['sum'], + 'sum_float' => round((float)$currency['sum'], $currency['currency_decimal_places']), + 'currency_id' => (int)$currency['currency_id'], + ]; + } + + return $tempData; + } + /** * @param array $currency */ @@ -115,29 +138,6 @@ class FrontpageChartGenerator ]; } - /** - * @param Category $category - * @param Collection $accounts - * - * @return array - */ - private function collectExpenses(Category $category, Collection $accounts): array - { - $spent = $this->opsRepos->sumExpenses($this->start, $this->end, $accounts, new Collection([$category])); - $tempData = []; - foreach ($spent as $currency) { - $this->addCurrency($currency); - $tempData[] = [ - 'name' => $category->name, - 'sum' => $currency['sum'], - 'sum_float' => round((float) $currency['sum'], $currency['currency_decimal_places']), - 'currency_id' => (int)$currency['currency_id'], - ]; - } - - return $tempData; - } - /** * @param Collection $accounts * @@ -152,7 +152,7 @@ class FrontpageChartGenerator $tempData[] = [ 'name' => trans('firefly.no_category'), 'sum' => $currency['sum'], - 'sum_float' => round((float) $currency['sum'], $currency['currency_decimal_places'] ?? 2), + 'sum_float' => round((float)$currency['sum'], $currency['currency_decimal_places'] ?? 2), 'currency_id' => (int)$currency['currency_id'], ]; } diff --git a/app/Support/Chart/Category/WholePeriodChartGenerator.php b/app/Support/Chart/Category/WholePeriodChartGenerator.php index e957d83384..b79592cf19 100644 --- a/app/Support/Chart/Category/WholePeriodChartGenerator.php +++ b/app/Support/Chart/Category/WholePeriodChartGenerator.php @@ -27,10 +27,8 @@ use Carbon\Carbon; use FireflyIII\Models\AccountType; use FireflyIII\Models\Category; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\OperationsRepositoryInterface; use Illuminate\Support\Collection; -use Log; /** * Class WholePeriodChartGenerator @@ -109,8 +107,8 @@ class WholePeriodChartGenerator $earnedInfoKey = sprintf('earned-in-%s', $code); $spentAmount = $spent[$key][$currencyId]['sum'] ?? '0'; $earnedAmount = $earned[$key][$currencyId]['sum'] ?? '0'; - $chartData[$spentInfoKey]['entries'][$label] = round((float) $spentAmount, $currency['currency_decimal_places']); - $chartData[$earnedInfoKey]['entries'][$label] = round((float) $earnedAmount, $currency['currency_decimal_places']); + $chartData[$spentInfoKey]['entries'][$label] = round((float)$spentAmount, $currency['currency_decimal_places']); + $chartData[$earnedInfoKey]['entries'][$label] = round((float)$earnedAmount, $currency['currency_decimal_places']); } $current = app('navigation')->addPeriod($current, $step, 0); } diff --git a/app/Support/ChartColour.php b/app/Support/ChartColour.php index 518a834bcd..2969a496d3 100644 --- a/app/Support/ChartColour.php +++ b/app/Support/ChartColour.php @@ -24,6 +24,7 @@ namespace FireflyIII\Support; /** * Class ChartColour. + * * @codeCoverageIgnore */ class ChartColour diff --git a/app/Support/Cronjobs/AbstractCronjob.php b/app/Support/Cronjobs/AbstractCronjob.php index b5ab855754..04b22249bb 100644 --- a/app/Support/Cronjobs/AbstractCronjob.php +++ b/app/Support/Cronjobs/AbstractCronjob.php @@ -25,6 +25,7 @@ namespace FireflyIII\Support\Cronjobs; use Carbon\Carbon; use Exception; + /** * Class AbstractCronjob * @@ -32,14 +33,15 @@ use Exception; */ abstract class AbstractCronjob { - /** @var int */ - public $timeBetweenRuns = 43200; + public int $timeBetweenRuns = 43200; + protected Carbon $date; + protected bool $force; - /** @var bool */ - protected $force; + public bool $jobFired; + public bool $jobSucceeded; + public bool $jobErrored; - /** @var Carbon */ - protected $date; + public ?string $message; /** * AbstractCronjob constructor. @@ -50,17 +52,16 @@ abstract class AbstractCronjob { $this->force = false; $this->date = today(config('app.timezone')); + $this->jobErrored = false; + $this->jobSucceeded = false; + $this->jobFired = false; + $this->message = null; } - - /** - * @param bool $force + * */ - public function setForce(bool $force): void - { - $this->force = $force; - } + abstract public function fire(): void; /** * @param Carbon $date @@ -71,8 +72,11 @@ abstract class AbstractCronjob } /** - * @return bool + * @param bool $force */ - abstract public function fire(): bool; + public function setForce(bool $force): void + { + $this->force = $force; + } } diff --git a/app/Support/Cronjobs/AutoBudgetCronjob.php b/app/Support/Cronjobs/AutoBudgetCronjob.php index 059491c4f6..aa210a7927 100644 --- a/app/Support/Cronjobs/AutoBudgetCronjob.php +++ b/app/Support/Cronjobs/AutoBudgetCronjob.php @@ -39,7 +39,7 @@ class AutoBudgetCronjob extends AbstractCronjob /** * @inheritDoc */ - public function fire(): bool + public function fire(): void { /** @var Configuration $config */ $config = app('fireflyconfig')->get('last_ab_job', 0); @@ -54,8 +54,8 @@ class AutoBudgetCronjob extends AbstractCronjob Log::info(sprintf('It has been %s since the auto budget cron-job has fired.', $diffForHumans)); if (false === $this->force) { Log::info('The auto budget cron-job will not fire now.'); - - return false; + $this->message = sprintf('It has been %s since the auto budget cron-job has fired. It will not fire now.', $diffForHumans); + return; } // fire job regardless. @@ -69,10 +69,7 @@ class AutoBudgetCronjob extends AbstractCronjob } $this->fireAutoBudget(); - app('preferences')->mark(); - - return true; } /** @@ -85,6 +82,13 @@ class AutoBudgetCronjob extends AbstractCronjob $job = app(CreateAutoBudgetLimits::class); $job->setDate($this->date); $job->handle(); + + // get stuff from job: + $this->jobFired = true; + $this->jobErrored = false; + $this->jobSucceeded = true; + $this->message = 'Auto-budget cron job fired successfully.'; + app('fireflyconfig')->set('last_ab_job', (int)$this->date->format('U')); Log::info('Done with auto budget cron job task.'); } diff --git a/app/Support/Cronjobs/RecurringCronjob.php b/app/Support/Cronjobs/RecurringCronjob.php index 6e5cd4b7a3..c27a8366ee 100644 --- a/app/Support/Cronjobs/RecurringCronjob.php +++ b/app/Support/Cronjobs/RecurringCronjob.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace FireflyIII\Support\Cronjobs; use Carbon\Carbon; +use Exception; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Jobs\CreateRecurringTransactions; use FireflyIII\Models\Configuration; @@ -35,16 +36,17 @@ use Log; class RecurringCronjob extends AbstractCronjob { /** - * @return bool * @throws FireflyException */ - public function fire(): bool + public function fire(): void { + Log::debug(sprintf('Now in %s', __METHOD__)); /** @var Configuration $config */ $config = app('fireflyconfig')->get('last_rt_job', 0); $lastTime = (int)$config->data; $diff = time() - $lastTime; $diffForHumans = Carbon::now()->diffForHumans(Carbon::createFromTimestamp($lastTime), true); + if (0 === $lastTime) { Log::info('Recurring transactions cron-job has never fired before.'); } @@ -53,8 +55,9 @@ class RecurringCronjob extends AbstractCronjob Log::info(sprintf('It has been %s since the recurring transactions cron-job has fired.', $diffForHumans)); if (false === $this->force) { Log::info('The cron-job will not fire now.'); + $this->message = sprintf('It has been %s since the recurring transactions cron-job has fired. It will not fire now.', $diffForHumans); - return false; + return; } // fire job regardless. @@ -70,8 +73,6 @@ class RecurringCronjob extends AbstractCronjob $this->fireRecurring(); app('preferences')->mark(); - - return true; } /** @@ -85,8 +86,15 @@ class RecurringCronjob extends AbstractCronjob $job->setDate($this->date); $job->setForce($this->force); $job->handle(); + + // get stuff from job: + $this->jobFired = true; + $this->jobErrored = false; + $this->jobSucceeded = true; + $this->message = 'Recurring transactions cron job fired successfully.'; + app('fireflyconfig')->set('last_rt_job', (int)$this->date->format('U')); - Log::info(sprintf('Marked the last time this job has run as "%s" (%d)',$this->date->format('Y-m-d H:i:s'),(int)$this->date->format('U'))); + Log::info(sprintf('Marked the last time this job has run as "%s" (%d)', $this->date->format('Y-m-d H:i:s'), (int)$this->date->format('U'))); Log::info('Done with recurring cron job task.'); } } diff --git a/app/Support/Cronjobs/TelemetryCronjob.php b/app/Support/Cronjobs/TelemetryCronjob.php index c659166384..a7b0ad1f64 100644 --- a/app/Support/Cronjobs/TelemetryCronjob.php +++ b/app/Support/Cronjobs/TelemetryCronjob.php @@ -40,18 +40,21 @@ class TelemetryCronjob extends AbstractCronjob * @inheritDoc * @throws FireflyException */ - public function fire(): bool + public function fire(): void { // do not fire if telemetry is disabled. if (false === config('firefly.send_telemetry') || false === config('firefly.feature_flags.telemetry')) { - Log::warning('Telemetry is disabled. The cron job will do nothing.'); - return false; + $msg = 'Telemetry is disabled. The cron job will do nothing.'; + $this->message = $msg; + Log::warning($msg); + + return; } /** @var Configuration $config */ $config = app('fireflyconfig')->get('last_tm_job', 0); - $lastTime = (int) $config->data; + $lastTime = (int)$config->data; $diff = time() - $lastTime; $diffForHumans = Carbon::now()->diffForHumans(Carbon::createFromTimestamp($lastTime), true); if (0 === $lastTime) { @@ -62,8 +65,8 @@ class TelemetryCronjob extends AbstractCronjob Log::info(sprintf('It has been %s since the telemetry cron-job has fired.', $diffForHumans)); if (false === $this->force) { Log::info('The cron-job will not fire now.'); - - return false; + $this->message = sprintf('It has been %s since the telemetry cron-job has fired. It will not fire now.', $diffForHumans); + return; } // fire job regardless. @@ -79,8 +82,6 @@ class TelemetryCronjob extends AbstractCronjob $this->fireTelemetry(); app('preferences')->mark(); - - return true; } @@ -96,9 +97,14 @@ class TelemetryCronjob extends AbstractCronjob $job->setForce($this->force); $job->handle(); + $this->jobFired = true; + $this->jobErrored = false; + $this->jobSucceeded = true; + $this->message = 'Telemetry cron job fired successfully.'; + // TODO remove old, submitted telemetry data. - app('fireflyconfig')->set('last_tm_job', (int) $this->date->format('U')); + app('fireflyconfig')->set('last_tm_job', (int)$this->date->format('U')); Log::info('Done with telemetry cron job task.'); } } diff --git a/app/Support/Domain.php b/app/Support/Domain.php index e06821b560..94beefa05e 100644 --- a/app/Support/Domain.php +++ b/app/Support/Domain.php @@ -24,6 +24,7 @@ namespace FireflyIII\Support; /** * Class Domain. + * * @codeCoverageIgnore */ class Domain diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php index 7a48c38b11..d5fb36f40a 100644 --- a/app/Support/ExpandedForm.php +++ b/app/Support/ExpandedForm.php @@ -39,10 +39,11 @@ use Throwable; class ExpandedForm { use FormSupport; + /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string * @@ -59,7 +60,7 @@ class ExpandedForm // make sure value is formatted nicely: if (null !== $value && '' !== $value) { - $value = round((float) $value, 8); + $value = round((float)$value, 8); } try { $html = prefixView('form.amount-no-currency', compact('classes', 'name', 'label', 'value', 'options'))->render(); @@ -73,9 +74,9 @@ class ExpandedForm /** * @param string $name - * @param int $value - * @param mixed $checked - * @param array $options + * @param int $value + * @param mixed $checked + * @param array $options * * @return string * @@ -109,8 +110,8 @@ class ExpandedForm /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string * @@ -134,7 +135,7 @@ class ExpandedForm /** * @param string $name - * @param array $options + * @param array $options * * @return string * @@ -157,8 +158,8 @@ class ExpandedForm /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string * @@ -183,8 +184,8 @@ class ExpandedForm /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string * @@ -207,7 +208,7 @@ class ExpandedForm } /** - * @param \Illuminate\Support\Collection $set + * @param Collection $set * * @return array * @@ -235,8 +236,8 @@ class ExpandedForm /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ @@ -252,7 +253,7 @@ class ExpandedForm // make sure value is formatted nicely: if (null !== $value && '' !== $value) { - $value = round((float) $value, $selectedCurrency->decimal_places); + $value = round((float)$value, $selectedCurrency->decimal_places); } try { $html = prefixView('form.non-selectable-amount', compact('selectedCurrency', 'classes', 'name', 'label', 'value', 'options'))->render(); @@ -266,8 +267,8 @@ class ExpandedForm /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string * @@ -290,153 +291,6 @@ class ExpandedForm return $html; } - /** - * @param string $type - * @param string $name - * - * @return string - * - */ - public function optionsList(string $type, string $name): string - { - try { - $html = prefixView('form.options', compact('type', 'name'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render select(): %s', $e->getMessage())); - $html = 'Could not render optionsList.'; - } - - return $html; - } - - /** - * @param string $name - * @param array $options - * - * @return string - * - */ - public function password(string $name, array $options = null): string - { - - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - try { - $html = prefixView('form.password', compact('classes', 'name', 'label', 'options'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render password(): %s', $e->getMessage())); - $html = 'Could not render password.'; - } - - return $html; - } - - /** - * Function to render a percentage. - * - * @param string $name - * @param mixed $value - * @param array $options - * - * @return string - * - */ - public function percentage(string $name, $value = null, array $options = null): string - { - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - $value = $this->fillFieldValue($name, $value); - $options['step'] = 'any'; - unset($options['placeholder']); - try { - $html = prefixView('form.percentage', compact('classes', 'name', 'label', 'value', 'options'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render percentage(): %s', $e->getMessage())); - $html = 'Could not render percentage.'; - } - - return $html; - } - - /** - * @param string $name - * @param mixed $value - * @param array $options - * - * @return string - * - */ - public function staticText(string $name, $value, array $options = null): string - { - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - try { - $html = prefixView('form.static', compact('classes', 'name', 'label', 'value', 'options'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render staticText(): %s', $e->getMessage())); - $html = 'Could not render staticText.'; - } - - return $html; - } - - /** - * @param string $name - * @param mixed $value - * @param array $options - * - * @return string - * - */ - public function text(string $name, $value = null, array $options = null): string - { - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - $value = $this->fillFieldValue($name, $value); - try { - $html = prefixView('form.text', compact('classes', 'name', 'label', 'value', 'options'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render text(): %s', $e->getMessage())); - $html = 'Could not render text.'; - } - - return $html; - } - - /** - * @param string $name - * @param mixed $value - * @param array $options - * - * @return string - * - */ - public function textarea(string $name, $value = null, array $options = null): string - { - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - $value = $this->fillFieldValue($name, $value); - $options['rows'] = 4; - - if (null === $value) { - $value = ''; - } - - try { - $html = prefixView('form.textarea', compact('classes', 'name', 'label', 'value', 'options'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render textarea(): %s', $e->getMessage())); - $html = 'Could not render textarea.'; - } - - return $html; - } - /** * @param null $value * @param array|null $options @@ -465,4 +319,151 @@ class ExpandedForm return $html; } + + /** + * @param string $type + * @param string $name + * + * @return string + * + */ + public function optionsList(string $type, string $name): string + { + try { + $html = prefixView('form.options', compact('type', 'name'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render select(): %s', $e->getMessage())); + $html = 'Could not render optionsList.'; + } + + return $html; + } + + /** + * @param string $name + * @param array $options + * + * @return string + * + */ + public function password(string $name, array $options = null): string + { + + $label = $this->label($name, $options); + $options = $this->expandOptionArray($name, $label, $options); + $classes = $this->getHolderClasses($name); + try { + $html = prefixView('form.password', compact('classes', 'name', 'label', 'options'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render password(): %s', $e->getMessage())); + $html = 'Could not render password.'; + } + + return $html; + } + + /** + * Function to render a percentage. + * + * @param string $name + * @param mixed $value + * @param array $options + * + * @return string + * + */ + public function percentage(string $name, $value = null, array $options = null): string + { + $label = $this->label($name, $options); + $options = $this->expandOptionArray($name, $label, $options); + $classes = $this->getHolderClasses($name); + $value = $this->fillFieldValue($name, $value); + $options['step'] = 'any'; + unset($options['placeholder']); + try { + $html = prefixView('form.percentage', compact('classes', 'name', 'label', 'value', 'options'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render percentage(): %s', $e->getMessage())); + $html = 'Could not render percentage.'; + } + + return $html; + } + + /** + * @param string $name + * @param mixed $value + * @param array $options + * + * @return string + * + */ + public function staticText(string $name, $value, array $options = null): string + { + $label = $this->label($name, $options); + $options = $this->expandOptionArray($name, $label, $options); + $classes = $this->getHolderClasses($name); + try { + $html = prefixView('form.static', compact('classes', 'name', 'label', 'value', 'options'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render staticText(): %s', $e->getMessage())); + $html = 'Could not render staticText.'; + } + + return $html; + } + + /** + * @param string $name + * @param mixed $value + * @param array $options + * + * @return string + * + */ + public function text(string $name, $value = null, array $options = null): string + { + $label = $this->label($name, $options); + $options = $this->expandOptionArray($name, $label, $options); + $classes = $this->getHolderClasses($name); + $value = $this->fillFieldValue($name, $value); + try { + $html = prefixView('form.text', compact('classes', 'name', 'label', 'value', 'options'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render text(): %s', $e->getMessage())); + $html = 'Could not render text.'; + } + + return $html; + } + + /** + * @param string $name + * @param mixed $value + * @param array $options + * + * @return string + * + */ + public function textarea(string $name, $value = null, array $options = null): string + { + $label = $this->label($name, $options); + $options = $this->expandOptionArray($name, $label, $options); + $classes = $this->getHolderClasses($name); + $value = $this->fillFieldValue($name, $value); + $options['rows'] = 4; + + if (null === $value) { + $value = ''; + } + + try { + $html = prefixView('form.textarea', compact('classes', 'name', 'label', 'value', 'options'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render textarea(): %s', $e->getMessage())); + $html = 'Could not render textarea.'; + } + + return $html; + } } diff --git a/app/Support/Export/ExportDataGenerator.php b/app/Support/Export/ExportDataGenerator.php index e54ce6c6d8..612c10b818 100644 --- a/app/Support/Export/ExportDataGenerator.php +++ b/app/Support/Export/ExportDataGenerator.php @@ -51,6 +51,7 @@ use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\User; use Illuminate\Support\Collection; +use League\Csv\CannotInsertRecord; use League\Csv\Writer; /** @@ -58,19 +59,19 @@ use League\Csv\Writer; */ class ExportDataGenerator { + private Collection $accounts; private Carbon $end; - private bool $exportTransactions; - private Carbon $start; private bool $exportAccounts; + private bool $exportBills; private bool $exportBudgets; private bool $exportCategories; - private bool $exportTags; + private bool $exportPiggies; private bool $exportRecurring; private bool $exportRules; - private bool $exportBills; - private bool $exportPiggies; + private bool $exportTags; + private bool $exportTransactions; + private Carbon $start; private User $user; - private Collection $accounts; public function __construct() { @@ -89,25 +90,9 @@ class ExportDataGenerator $this->exportPiggies = false; } - /** - * @param User $user - */ - public function setUser(User $user): void - { - $this->user = $user; - } - - /** - * @param Collection $accounts - */ - public function setAccounts(Collection $accounts): void - { - $this->accounts = $accounts; - } - /** * @return array - * @throws \League\Csv\CannotInsertRecord + * @throws CannotInsertRecord */ public function export(): array { @@ -143,150 +128,6 @@ class ExportDataGenerator return $return; } - /** - * @param bool $exportAccounts - */ - public function setExportAccounts(bool $exportAccounts): void - { - $this->exportAccounts = $exportAccounts; - } - - /** - * @param bool $exportBudgets - */ - public function setExportBudgets(bool $exportBudgets): void - { - $this->exportBudgets = $exportBudgets; - } - - /** - * @param bool $exportCategories - */ - public function setExportCategories(bool $exportCategories): void - { - $this->exportCategories = $exportCategories; - } - - /** - * @param bool $exportTags - */ - public function setExportTags(bool $exportTags): void - { - $this->exportTags = $exportTags; - } - - /** - * @param bool $exportRecurring - */ - public function setExportRecurring(bool $exportRecurring): void - { - $this->exportRecurring = $exportRecurring; - } - - /** - * @param bool $exportRules - */ - public function setExportRules(bool $exportRules): void - { - $this->exportRules = $exportRules; - } - - /** - * @param bool $exportBills - */ - public function setExportBills(bool $exportBills): void - { - $this->exportBills = $exportBills; - } - - /** - * @param bool $exportPiggies - */ - public function setExportPiggies(bool $exportPiggies): void - { - $this->exportPiggies = $exportPiggies; - } - - /** - * @param Carbon $end - */ - public function setEnd(Carbon $end): void - { - $this->end = $end; - } - - /** - * @param bool $exportTransactions - */ - public function setExportTransactions(bool $exportTransactions): void - { - $this->exportTransactions = $exportTransactions; - } - - /** - * @param Carbon $start - */ - public function setStart(Carbon $start): void - { - $this->start = $start; - } - - /** - * @return string - */ - private function exportRules(): string - { - $header = ['user_id', 'rule_id', 'row_contains', 'created_at', 'updated_at', 'group_id', 'group_name', 'title', 'description', 'order', 'active', - 'stop_processing', 'strict', 'trigger_type', 'trigger_value', 'trigger_order', 'trigger_active', 'trigger_stop_processing', 'action_type', - 'action_value', 'action_order', 'action_active', 'action_stop_processing',]; - $ruleRepos = app(RuleRepositoryInterface::class); - $ruleRepos->setUser($this->user); - $rules = $ruleRepos->getAll(); - $records = []; - /** @var Rule $rule */ - foreach ($rules as $rule) { - $records[] = [ - $this->user->id, $rule->id, 'rule', - $rule->created_at->toAtomString(), $rule->updated_at->toAtomString(), - $rule->ruleGroup->id, $rule->ruleGroup->name, - $rule->title, $rule->description, $rule->order, $rule->active, $rule->stop_processing, $rule->strict, - ]; - /** @var RuleTrigger $trigger */ - foreach ($rule->ruleTriggers as $trigger) { - $records[] = [ - $this->user->id, $rule->id, 'trigger', - null, null, - null, null, - null, null, null, null, null, null, - $trigger->trigger_type, $trigger->trigger_value, $trigger->order, $trigger->active, $trigger->stop_processing, - ]; - } - - /** @var RuleAction $action */ - foreach ($rule->ruleActions as $action) { - $records[] = [ - $this->user->id, $rule->id, 'action', - null, null, - null, null, - null, null, null, null, null, null, - null, null, null, null, null, - $action->action_type, $action->action_value, $action->order, $action->active, $action->stop_processing, - ]; - } - } - - //load the CSV document from a string - $csv = Writer::createFromString(''); - - //insert the header - $csv->insertOne($header); - - //insert all the records - $csv->insertAll($records); - - return $csv->getContent(); //returns the CSV document as a string - } - /** * @return string */ @@ -380,7 +221,7 @@ class ExportDataGenerator /** * @return string - * @throws \League\Csv\CannotInsertRecord + * @throws CannotInsertRecord */ private function exportBudgets(): string { @@ -610,6 +451,62 @@ class ExportDataGenerator return $csv->getContent(); //returns the CSV document as a string } + /** + * @return string + */ + private function exportRules(): string + { + $header = ['user_id', 'rule_id', 'row_contains', 'created_at', 'updated_at', 'group_id', 'group_name', 'title', 'description', 'order', 'active', + 'stop_processing', 'strict', 'trigger_type', 'trigger_value', 'trigger_order', 'trigger_active', 'trigger_stop_processing', 'action_type', + 'action_value', 'action_order', 'action_active', 'action_stop_processing',]; + $ruleRepos = app(RuleRepositoryInterface::class); + $ruleRepos->setUser($this->user); + $rules = $ruleRepos->getAll(); + $records = []; + /** @var Rule $rule */ + foreach ($rules as $rule) { + $records[] = [ + $this->user->id, $rule->id, 'rule', + $rule->created_at->toAtomString(), $rule->updated_at->toAtomString(), + $rule->ruleGroup->id, $rule->ruleGroup->name, + $rule->title, $rule->description, $rule->order, $rule->active, $rule->stop_processing, $rule->strict, + ]; + /** @var RuleTrigger $trigger */ + foreach ($rule->ruleTriggers as $trigger) { + $records[] = [ + $this->user->id, $rule->id, 'trigger', + null, null, + null, null, + null, null, null, null, null, null, + $trigger->trigger_type, $trigger->trigger_value, $trigger->order, $trigger->active, $trigger->stop_processing, + ]; + } + + /** @var RuleAction $action */ + foreach ($rule->ruleActions as $action) { + $records[] = [ + $this->user->id, $rule->id, 'action', + null, null, + null, null, + null, null, null, null, null, null, + null, null, null, null, null, + $action->action_type, $action->action_value, $action->order, $action->active, $action->stop_processing, + ]; + } + } + + //load the CSV document from a string + $csv = Writer::createFromString(''); + + //insert the header + $csv->insertOne($header); + + //insert all the records + $csv->insertAll($records); + + return $csv->getContent(); //returns the CSV document as a string + } + /** * @return string */ @@ -668,7 +565,7 @@ class ExportDataGenerator $collector->setUser($this->user); $collector->setRange($this->start, $this->end)->withAccountInformation()->withCategoryInformation()->withBillInformation() ->withBudgetInformation()->withTagInformation()->withNotes(); - if(0 !== $this->accounts->count()) { + if (0 !== $this->accounts->count()) { $collector->setAccounts($this->accounts); } @@ -776,4 +673,108 @@ class ExportDataGenerator return implode(',', $smol); } + /** + * @param Collection $accounts + */ + public function setAccounts(Collection $accounts): void + { + $this->accounts = $accounts; + } + + /** + * @param Carbon $end + */ + public function setEnd(Carbon $end): void + { + $this->end = $end; + } + + /** + * @param bool $exportAccounts + */ + public function setExportAccounts(bool $exportAccounts): void + { + $this->exportAccounts = $exportAccounts; + } + + /** + * @param bool $exportBills + */ + public function setExportBills(bool $exportBills): void + { + $this->exportBills = $exportBills; + } + + /** + * @param bool $exportBudgets + */ + public function setExportBudgets(bool $exportBudgets): void + { + $this->exportBudgets = $exportBudgets; + } + + /** + * @param bool $exportCategories + */ + public function setExportCategories(bool $exportCategories): void + { + $this->exportCategories = $exportCategories; + } + + /** + * @param bool $exportPiggies + */ + public function setExportPiggies(bool $exportPiggies): void + { + $this->exportPiggies = $exportPiggies; + } + + /** + * @param bool $exportRecurring + */ + public function setExportRecurring(bool $exportRecurring): void + { + $this->exportRecurring = $exportRecurring; + } + + /** + * @param bool $exportRules + */ + public function setExportRules(bool $exportRules): void + { + $this->exportRules = $exportRules; + } + + /** + * @param bool $exportTags + */ + public function setExportTags(bool $exportTags): void + { + $this->exportTags = $exportTags; + } + + /** + * @param bool $exportTransactions + */ + public function setExportTransactions(bool $exportTransactions): void + { + $this->exportTransactions = $exportTransactions; + } + + /** + * @param Carbon $start + */ + public function setStart(Carbon $start): void + { + $this->start = $start; + } + + /** + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + } + } diff --git a/app/Support/Facades/Preferences.php b/app/Support/Facades/Preferences.php index 4c1fc36bbc..049ea2f34a 100644 --- a/app/Support/Facades/Preferences.php +++ b/app/Support/Facades/Preferences.php @@ -27,6 +27,7 @@ use FireflyIII\User; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Facade; use Log; + /** * @codeCoverageIgnore * Class Preferences. diff --git a/app/Support/FireflyConfig.php b/app/Support/FireflyConfig.php index 97504e757a..de5e3cd02f 100644 --- a/app/Support/FireflyConfig.php +++ b/app/Support/FireflyConfig.php @@ -31,6 +31,7 @@ use Log; /** * Class FireflyConfig. + * * @codeCoverageIgnore */ class FireflyConfig @@ -67,8 +68,8 @@ class FireflyConfig * @param string $name * @param null $default * - * @throws FireflyException * @return Configuration|null + * @throws FireflyException */ public function get(string $name, $default = null): ?Configuration { @@ -80,7 +81,7 @@ class FireflyConfig try { /** @var Configuration $config */ $config = Configuration::where('name', $name)->first(['id', 'name', 'data']); - } catch (QueryException|Exception $e) { + } catch (QueryException | Exception $e) { throw new FireflyException(sprintf('Could not poll the database: %s', $e->getMessage())); } @@ -99,7 +100,7 @@ class FireflyConfig /** * @param string $name - * @param mixed $default + * @param mixed $default * * @return \FireflyIII\Models\Configuration|null */ @@ -132,8 +133,8 @@ class FireflyConfig } /** - * @param string $name - * @param $value + * @param string $name + * @param $value * @param int|string|true $value * * @return Configuration @@ -143,7 +144,7 @@ class FireflyConfig /** @var Configuration $config */ try { $config = Configuration::whereName($name)->first(); - } catch (QueryException|Exception $e) { + } catch (QueryException | Exception $e) { $item = new Configuration; $item->name = $name; $item->data = $value; diff --git a/app/Support/Form/AccountForm.php b/app/Support/Form/AccountForm.php index edf9cea406..d1bff36c9e 100644 --- a/app/Support/Form/AccountForm.php +++ b/app/Support/Form/AccountForm.php @@ -42,18 +42,39 @@ class AccountForm { use FormSupport; + /** + * Grouped dropdown list of all accounts that are valid as the destination of a withdrawal. + * + * @param string $name + * @param mixed $value + * @param array $options + * + * @return string + */ + public function activeDepositDestinations(string $name, $value = null, array $options = null): string + { + $types = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN, AccountType::REVENUE,]; + $repository = $this->getAccountRepository(); + $grouped = $this->getAccountsGrouped($types, $repository); + $cash = $repository->getCashAccount(); + $key = (string)trans('firefly.cash_account_type'); + $grouped[$key][$cash->id] = sprintf('(%s)', (string)trans('firefly.cash')); + + return $this->select($name, $grouped, $value, $options); + } + private function getAccountsGrouped(array $types, AccountRepositoryInterface $repository = null): array { if (null === $repository) { $repository = $this->getAccountRepository(); } - $accountList = $repository->getActiveAccountsByType($types); - $liabilityTypes = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN,]; - $grouped = []; + $accountList = $repository->getActiveAccountsByType($types); + $liabilityTypes = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN,]; + $grouped = []; /** @var Account $account */ foreach ($accountList as $account) { - $role = (string)$repository->getMetaValue($account, 'account_role'); + $role = (string)$repository->getMetaValue($account, 'account_role'); if (in_array($account->accountType->type, $liabilityTypes, true)) { $role = sprintf('l_%s', $account->accountType->type); } elseif ('' === $role) { @@ -65,7 +86,7 @@ class AccountForm $role = 'no_account_type'; } } - $key = (string) trans(sprintf('firefly.opt_group_%s', $role)); + $key = (string)trans(sprintf('firefly.opt_group_%s', $role)); $grouped[$key][$account->id] = $account->name; } @@ -76,8 +97,8 @@ class AccountForm * Grouped dropdown list of all accounts that are valid as the destination of a withdrawal. * * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ @@ -94,33 +115,11 @@ class AccountForm return $this->select($name, $grouped, $value, $options); } - /** - * Grouped dropdown list of all accounts that are valid as the destination of a withdrawal. - * - * @param string $name - * @param mixed $value - * @param array $options - * - * @return string - */ - public function activeDepositDestinations(string $name, $value = null, array $options = null): string - { - $types = [AccountType::MORTGAGE, AccountType::DEBT, AccountType::CREDITCARD, AccountType::LOAN, AccountType::REVENUE,]; - $repository = $this->getAccountRepository(); - $grouped = $this->getAccountsGrouped($types, $repository); - $cash = $repository->getCashAccount(); - $key = (string)trans('firefly.cash_account_type'); - $grouped[$key][$cash->id] = sprintf('(%s)', (string)trans('firefly.cash')); - - return $this->select($name, $grouped, $value, $options); - } - - /** * Check list of asset accounts. * * @param string $name - * @param array $options + * @param array $options * * @return string * @@ -134,8 +133,8 @@ class AccountForm $selected = request()->old($name) ?? []; // get all asset accounts: - $types = [AccountType::ASSET, AccountType::DEFAULT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::DEBT]; - $grouped = $this->getAccountsGrouped($types); + $types = [AccountType::ASSET, AccountType::DEFAULT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::DEBT]; + $grouped = $this->getAccountsGrouped($types); unset($options['class']); try { @@ -152,8 +151,8 @@ class AccountForm * Basic list of asset accounts. * * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ @@ -170,8 +169,8 @@ class AccountForm * Same list but all liabilities as well. * * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ diff --git a/app/Support/Form/CurrencyForm.php b/app/Support/Form/CurrencyForm.php index c75f270579..907d7b867a 100644 --- a/app/Support/Form/CurrencyForm.php +++ b/app/Support/Form/CurrencyForm.php @@ -44,56 +44,67 @@ class CurrencyForm use FormSupport; /** - * TODO cleanup and describe. * @param string $name * @param mixed $value * @param array $options * * @return string */ - public function currencyList(string $name, $value = null, array $options = null): string + public function amount(string $name, $value = null, array $options = null): string { - /** @var CurrencyRepositoryInterface $currencyRepos */ - $currencyRepos = app(CurrencyRepositoryInterface::class); - - // get all currencies: - $list = $currencyRepos->get(); - $array = []; - /** @var TransactionCurrency $currency */ - foreach ($list as $currency) { - $array[$currency->id] = $currency->name . ' (' . $currency->symbol . ')'; - } - - return $this->select($name, $array, $value, $options); + return $this->currencyField($name, 'amount', $value, $options); } /** - * TODO cleanup and describe. - * * @param string $name + * @param string $view * @param mixed $value * @param array $options * * @return string + * */ - public function currencyListEmpty(string $name, $value = null, array $options = null): string + protected function currencyField(string $name, string $view, $value = null, array $options = null): string { - /** @var CurrencyRepositoryInterface $currencyRepos */ - $currencyRepos = app(CurrencyRepositoryInterface::class); + $label = $this->label($name, $options); + $options = $this->expandOptionArray($name, $label, $options); + $classes = $this->getHolderClasses($name); + $value = $this->fillFieldValue($name, $value); + $options['step'] = 'any'; + $defaultCurrency = $options['currency'] ?? Amt::getDefaultCurrency(); + /** @var Collection $currencies */ + $currencies = app('amount')->getCurrencies(); + unset($options['currency'], $options['placeholder']); - // get all currencies: - $list = $currencyRepos->get(); - $array = [ - 0 => (string)trans('firefly.no_currency'), - ]; - /** @var TransactionCurrency $currency */ - foreach ($list as $currency) { - $array[$currency->id] = $currency->name . ' (' . $currency->symbol . ')'; + // perhaps the currency has been sent to us in the field $amount_currency_id_$name (amount_currency_id_amount) + $preFilled = session('preFilled'); + $key = 'amount_currency_id_' . $name; + $sentCurrencyId = isset($preFilled[$key]) ? (int)$preFilled[$key] : $defaultCurrency->id; + + Log::debug(sprintf('Sent currency ID is %d', $sentCurrencyId)); + + // find this currency in set of currencies: + foreach ($currencies as $currency) { + if ($currency->id === $sentCurrencyId) { + $defaultCurrency = $currency; + Log::debug(sprintf('default currency is now %s', $defaultCurrency->code)); + break; + } } - return $this->select($name, $array, $value, $options); - } + // make sure value is formatted nicely: + if (null !== $value && '' !== $value) { + $value = round((float)$value, $defaultCurrency->decimal_places); + } + try { + $html = prefixView('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Could not render currencyField(): %s', $e->getMessage())); + $html = 'Could not render currencyField.'; + } + return $html; + } /** * TODO describe and cleanup. @@ -151,7 +162,7 @@ class CurrencyForm // make sure value is formatted nicely: if (null !== $value && '' !== $value) { - $value = round((float) $value, $defaultCurrency->decimal_places); + $value = round((float)$value, $defaultCurrency->decimal_places); } try { $html = prefixView('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); @@ -164,66 +175,55 @@ class CurrencyForm } /** + * TODO cleanup and describe. + * * @param string $name - * @param string $view * @param mixed $value * @param array $options * * @return string - * */ - protected function currencyField(string $name, string $view, $value = null, array $options = null): string + public function currencyList(string $name, $value = null, array $options = null): string { - $label = $this->label($name, $options); - $options = $this->expandOptionArray($name, $label, $options); - $classes = $this->getHolderClasses($name); - $value = $this->fillFieldValue($name, $value); - $options['step'] = 'any'; - $defaultCurrency = $options['currency'] ?? Amt::getDefaultCurrency(); - /** @var Collection $currencies */ - $currencies = app('amount')->getCurrencies(); - unset($options['currency'], $options['placeholder']); + /** @var CurrencyRepositoryInterface $currencyRepos */ + $currencyRepos = app(CurrencyRepositoryInterface::class); - // perhaps the currency has been sent to us in the field $amount_currency_id_$name (amount_currency_id_amount) - $preFilled = session('preFilled'); - $key = 'amount_currency_id_' . $name; - $sentCurrencyId = isset($preFilled[$key]) ? (int)$preFilled[$key] : $defaultCurrency->id; - - Log::debug(sprintf('Sent currency ID is %d', $sentCurrencyId)); - - // find this currency in set of currencies: - foreach ($currencies as $currency) { - if ($currency->id === $sentCurrencyId) { - $defaultCurrency = $currency; - Log::debug(sprintf('default currency is now %s', $defaultCurrency->code)); - break; - } + // get all currencies: + $list = $currencyRepos->get(); + $array = []; + /** @var TransactionCurrency $currency */ + foreach ($list as $currency) { + $array[$currency->id] = $currency->name . ' (' . $currency->symbol . ')'; } - // make sure value is formatted nicely: - if (null !== $value && '' !== $value) { - $value = round((float) $value, $defaultCurrency->decimal_places); - } - try { - $html = prefixView('form.' . $view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Could not render currencyField(): %s', $e->getMessage())); - $html = 'Could not render currencyField.'; - } - - return $html; + return $this->select($name, $array, $value, $options); } /** + * TODO cleanup and describe. + * * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ - public function amount(string $name, $value = null, array $options = null): string + public function currencyListEmpty(string $name, $value = null, array $options = null): string { - return $this->currencyField($name, 'amount', $value, $options); + /** @var CurrencyRepositoryInterface $currencyRepos */ + $currencyRepos = app(CurrencyRepositoryInterface::class); + + // get all currencies: + $list = $currencyRepos->get(); + $array = [ + 0 => (string)trans('firefly.no_currency'), + ]; + /** @var TransactionCurrency $currency */ + foreach ($list as $currency) { + $array[$currency->id] = $currency->name . ' (' . $currency->symbol . ')'; + } + + return $this->select($name, $array, $value, $options); } } diff --git a/app/Support/Form/FormSupport.php b/app/Support/Form/FormSupport.php index 00e09cd728..af8a30ca7d 100644 --- a/app/Support/Form/FormSupport.php +++ b/app/Support/Form/FormSupport.php @@ -38,30 +38,6 @@ trait FormSupport { - /** - * @return AccountRepositoryInterface - */ - protected function getAccountRepository(): AccountRepositoryInterface - { - return app(AccountRepositoryInterface::class); - } - - /** - * @return Carbon - */ - protected function getDate(): Carbon - { - /** @var Carbon $date */ - $date = null; - try { - $date = today(config('app.timezone')); - } catch (Exception $e) { - $e->getMessage(); - } - - return $date; - } - /** * @param string $name * @param array $list @@ -88,6 +64,23 @@ trait FormSupport return $html; } + /** + * @param $name + * @param $options + * + * @return string + */ + protected function label(string $name, array $options = null): string + { + $options = $options ?? []; + if (isset($options['label'])) { + return $options['label']; + } + $name = str_replace('[]', '', $name); + + return (string)trans('form.' . $name); + } + /** * @param $name * @param $label @@ -107,6 +100,25 @@ trait FormSupport return $options; } + /** + * @param $name + * + * @return string + */ + protected function getHolderClasses(string $name): string + { + // Get errors from session: + /** @var MessageBag $errors */ + $errors = session('errors'); + $classes = 'form-group'; + + if (null !== $errors && $errors->has($name)) { + $classes = 'form-group has-error has-feedback'; + } + + return $classes; + } + /** * @param string $name * @param $value @@ -137,38 +149,26 @@ trait FormSupport } /** - * @param $name - * - * @return string + * @return AccountRepositoryInterface */ - protected function getHolderClasses(string $name): string + protected function getAccountRepository(): AccountRepositoryInterface { - // Get errors from session: - /** @var MessageBag $errors */ - $errors = session('errors'); - $classes = 'form-group'; - - if (null !== $errors && $errors->has($name)) { - $classes = 'form-group has-error has-feedback'; - } - - return $classes; + return app(AccountRepositoryInterface::class); } /** - * @param $name - * @param $options - * - * @return string + * @return Carbon */ - protected function label(string $name, array $options = null): string + protected function getDate(): Carbon { - $options = $options ?? []; - if (isset($options['label'])) { - return $options['label']; + /** @var Carbon $date */ + $date = null; + try { + $date = today(config('app.timezone')); + } catch (Exception $e) { + $e->getMessage(); } - $name = str_replace('[]', '', $name); - return (string)trans('form.' . $name); + return $date; } } diff --git a/app/Support/Form/PiggyBankForm.php b/app/Support/Form/PiggyBankForm.php index 017e01ac50..900b15a6b1 100644 --- a/app/Support/Form/PiggyBankForm.php +++ b/app/Support/Form/PiggyBankForm.php @@ -40,8 +40,8 @@ class PiggyBankForm * TODO cleanup and describe. * * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ @@ -51,7 +51,7 @@ class PiggyBankForm /** @var PiggyBankRepositoryInterface $repository */ $repository = app(PiggyBankRepositoryInterface::class); $piggyBanks = $repository->getPiggyBanksWithAmount(); - $title = (string) trans('firefly.default_group_title_name'); + $title = (string)trans('firefly.default_group_title_name'); $array = []; $subList = [ 0 => [ @@ -59,7 +59,7 @@ class PiggyBankForm 'title' => $title, ], 'piggies' => [ - (string) trans('firefly.none_in_select_list'), + (string)trans('firefly.none_in_select_list'), ], ], ]; diff --git a/app/Support/Form/RuleForm.php b/app/Support/Form/RuleForm.php index f8e277dc4b..b2ca38920e 100644 --- a/app/Support/Form/RuleForm.php +++ b/app/Support/Form/RuleForm.php @@ -36,10 +36,11 @@ use Illuminate\Support\HtmlString; class RuleForm { use FormSupport; + /** * @param string $name - * @param mixed $value - * @param array $options + * @param mixed $value + * @param array $options * * @return string */ @@ -60,8 +61,8 @@ class RuleForm } /** - * @param string $name - * @param null $value + * @param string $name + * @param null $value * @param array|null $options * * @return HtmlString diff --git a/app/Support/Http/Api/AccountFilter.php b/app/Support/Http/Api/AccountFilter.php index 3c7378aec2..8624181e5d 100644 --- a/app/Support/Http/Api/AccountFilter.php +++ b/app/Support/Http/Api/AccountFilter.php @@ -27,6 +27,7 @@ use FireflyIII\Models\AccountType; /** * Trait AccountFilter + * * @codeCoverageIgnore */ trait AccountFilter @@ -40,7 +41,7 @@ trait AccountFilter */ protected function mapAccountTypes(string $type): array { - $types = [ + $types = [ 'all' => [AccountType::DEFAULT, AccountType::CASH, AccountType::ASSET, AccountType::EXPENSE, AccountType::REVENUE, AccountType::INITIAL_BALANCE, AccountType::BENEFICIARY, AccountType::IMPORT, AccountType::RECONCILIATION, diff --git a/app/Support/Http/Api/ApiSupport.php b/app/Support/Http/Api/ApiSupport.php index 1f33b3074c..afe8de3b9e 100644 --- a/app/Support/Http/Api/ApiSupport.php +++ b/app/Support/Http/Api/ApiSupport.php @@ -28,6 +28,7 @@ use Illuminate\Support\Collection; /** * Trait ApiSupport + * * @codeCoverageIgnore */ trait ApiSupport diff --git a/app/Support/Http/Api/TransactionFilter.php b/app/Support/Http/Api/TransactionFilter.php index e6491a7ade..5dacf96b94 100644 --- a/app/Support/Http/Api/TransactionFilter.php +++ b/app/Support/Http/Api/TransactionFilter.php @@ -27,6 +27,7 @@ use FireflyIII\Models\TransactionType; /** * Trait TransactionFilter + * * @codeCoverageIgnore */ trait TransactionFilter @@ -40,7 +41,7 @@ trait TransactionFilter */ protected function mapTransactionTypes(string $type): array { - $types = [ + $types = [ 'all' => [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER, TransactionType::OPENING_BALANCE, TransactionType::RECONCILIATION,], 'withdrawal' => [TransactionType::WITHDRAWAL,], @@ -59,6 +60,7 @@ trait TransactionFilter 'specials' => [TransactionType::OPENING_BALANCE, TransactionType::RECONCILIATION,], 'default' => [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER,], ]; + return $types[$type] ?? $types['default']; diff --git a/app/Support/Http/Controllers/AugumentData.php b/app/Support/Http/Controllers/AugumentData.php index 6c1bcb637d..00709a4fe6 100644 --- a/app/Support/Http/Controllers/AugumentData.php +++ b/app/Support/Http/Controllers/AugumentData.php @@ -208,7 +208,7 @@ trait AugumentData $cache->addProperty('get-limits'); if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } $set = $blRepository->getBudgetLimits($budget, $start, $end); diff --git a/app/Support/Http/Controllers/CreateStuff.php b/app/Support/Http/Controllers/CreateStuff.php index d4961f0e00..e9c0f1bbab 100644 --- a/app/Support/Http/Controllers/CreateStuff.php +++ b/app/Support/Http/Controllers/CreateStuff.php @@ -30,7 +30,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\User; use Laravel\Passport\Passport; use Log; -use phpseclib\Crypt\RSA; + /** * Trait CreateStuff @@ -42,7 +42,7 @@ trait CreateStuff /** * Creates an asset account. * - * @param NewUserFormRequest $request + * @param NewUserFormRequest $request * @param TransactionCurrency $currency * * @return bool @@ -58,7 +58,7 @@ trait CreateStuff 'virtual_balance' => 0, 'account_type_id' => null, 'active' => true, - 'account_role' => 'defaultAsset', + 'account_role' => 'defaultAsset', 'opening_balance' => $request->input('bank_balance'), 'opening_balance_date' => new Carbon, 'currency_id' => $currency->id, @@ -73,7 +73,7 @@ trait CreateStuff * Creates a cash wallet. * * @param TransactionCurrency $currency - * @param string $language + * @param string $language * * @return bool */ @@ -88,7 +88,7 @@ trait CreateStuff 'virtual_balance' => 0, 'account_type_id' => null, 'active' => true, - 'account_role' => 'cashWalletAsset', + 'account_role' => 'cashWalletAsset', 'opening_balance' => null, 'opening_balance_date' => null, 'currency_id' => $currency->id, @@ -104,8 +104,14 @@ trait CreateStuff */ protected function createOAuthKeys(): void // create stuff { - $rsa = new RSA(); - $keys = $rsa->createKey(4096); + // switch on PHP version. + if (7 === PHP_MAJOR_VERSION) { + $rsa = new \phpseclib\Crypt\RSA; + $keys = $rsa->createKey(4096); + } + if (8 === PHP_MAJOR_VERSION) { + $keys = \phpseclib3\Crypt\RSA::createKey(4096); + } [$publicKey, $privateKey] = [ Passport::keyPath('oauth-public.key'), @@ -125,9 +131,9 @@ trait CreateStuff /** * Create a savings account. * - * @param NewUserFormRequest $request + * @param NewUserFormRequest $request * @param TransactionCurrency $currency - * @param string $language + * @param string $language * * @return bool */ @@ -157,7 +163,7 @@ trait CreateStuff * * @param array $data * - * @return \FireflyIII\User + * @return User */ protected function createUser(array $data): User // create object { diff --git a/app/Support/Http/Controllers/CronRunner.php b/app/Support/Http/Controllers/CronRunner.php index 7d298fba3e..58de807fef 100644 --- a/app/Support/Http/Controllers/CronRunner.php +++ b/app/Support/Http/Controllers/CronRunner.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Support\Http\Controllers; +use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Support\Cronjobs\AutoBudgetCronjob; use FireflyIII\Support\Cronjobs\RecurringCronjob; @@ -34,59 +35,97 @@ use FireflyIII\Support\Cronjobs\TelemetryCronjob; trait CronRunner { /** - * @return string + * @param bool $force + * @param Carbon $date + * + * @return array */ - protected function runRecurring(): string - { - /** @var RecurringCronjob $recurring */ - $recurring = app(RecurringCronjob::class); - try { - $result = $recurring->fire(); - } catch (FireflyException $e) { - return $e->getMessage(); - } - if (false === $result) { - return 'The recurring transaction cron job did not fire. It was fired less than half a day ago.'; - } - - return 'The recurring transaction cron job fired successfully.'; - } - - /** - * @return string - */ - protected function runTelemetry(): string { - /** @var TelemetryCronjob $telemetry */ - $telemetry = app(TelemetryCronjob::class); - try { - $result = $telemetry->fire(); - } catch (FireflyException $e) { - return $e->getMessage(); - } - if (false === $result) { - return 'The telemetry cron job did not fire.'; - } - - return 'The telemetry cron job fired successfully.'; - } - - /** - * @return string - */ - protected function runAutoBudget(): string + protected function runAutoBudget(bool $force, Carbon $date): array { /** @var AutoBudgetCronjob $autoBudget */ $autoBudget = app(AutoBudgetCronjob::class); + $autoBudget->setForce($force); + $autoBudget->setDate($date); try { - $result = $autoBudget->fire(); + $autoBudget->fire(); } catch (FireflyException $e) { - return $e->getMessage(); - } - if (false === $result) { - return 'The auto budget cron job did not fire.'; + return [ + 'job_fired' => false, + 'job_succeeded' => false, + 'job_errored' => true, + 'message' => $e->getMessage(), + ]; } - return 'The auto budget cron job fired successfully.'; + return [ + 'job_fired' => $autoBudget->jobFired, + 'job_succeeded' => $autoBudget->jobSucceeded, + 'job_errored' => $autoBudget->jobErrored, + 'message' => $autoBudget->message, + ]; + } + + /** + * @param bool $force + * @param Carbon $date + * + * @return array + */ + protected function runRecurring(bool $force, Carbon $date): array + { + /** @var RecurringCronjob $recurring */ + $recurring = app(RecurringCronjob::class); + $recurring->setForce($force); + $recurring->setDate($date); + try { + $recurring->fire(); + } catch (FireflyException $e) { + return [ + 'job_fired' => false, + 'job_succeeded' => false, + 'job_errored' => true, + 'message' => $e->getMessage(), + ]; + } + + return [ + 'job_fired' => $recurring->jobFired, + 'job_succeeded' => $recurring->jobSucceeded, + 'job_errored' => $recurring->jobErrored, + 'message' => $recurring->message, + ]; + + } + + /** + * @param bool $force + * @param Carbon $date + * + * @return array + */ + protected function runTelemetry(bool $force, Carbon $date): array + { + /** @var TelemetryCronjob $telemetry */ + $telemetry = app(TelemetryCronjob::class); + $telemetry->setForce($force); + $telemetry->setDate($date); + try { + $telemetry->fire(); + } catch (FireflyException $e) { + return [ + 'job_fired' => false, + 'job_succeeded' => false, + 'job_errored' => true, + 'message' => $e->getMessage(), + ]; + } + + return [ + 'job_fired' => $telemetry->jobFired, + 'job_succeeded' => $telemetry->jobSucceeded, + 'job_errored' => $telemetry->jobErrored, + 'message' => $telemetry->message, + ]; } } diff --git a/app/Support/Http/Controllers/DateCalculation.php b/app/Support/Http/Controllers/DateCalculation.php index f82a2954e0..c699cd6c63 100644 --- a/app/Support/Http/Controllers/DateCalculation.php +++ b/app/Support/Http/Controllers/DateCalculation.php @@ -50,6 +50,7 @@ trait DateCalculation if ($start->lte($today) && $end->gte($today)) { $difference = $today->diffInDays($end); } + return 0 === $difference ? 1 : $difference; } diff --git a/app/Support/Http/Controllers/GetConfigurationData.php b/app/Support/Http/Controllers/GetConfigurationData.php index 2e1a5c32ba..6aa4cc6888 100644 --- a/app/Support/Http/Controllers/GetConfigurationData.php +++ b/app/Support/Http/Controllers/GetConfigurationData.php @@ -42,7 +42,7 @@ trait GetConfigurationData */ protected function errorReporting(int $value): string // get configuration { - $array = [ + $array = [ -1 => 'ALL errors', E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED => 'E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED', E_ALL => 'E_ALL', @@ -51,6 +51,7 @@ trait GetConfigurationData E_ALL & ~E_NOTICE & ~E_STRICT => 'E_ALL & ~E_NOTICE & ~E_STRICT', E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_ERROR | E_CORE_ERROR => 'E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR', ]; + return $array[$value] ?? (string)$value; } @@ -90,7 +91,7 @@ trait GetConfigurationData */ protected function getDateRangeConfig(): array // get configuration + get preferences. { - $viewRange = (string) app('preferences')->get('viewRange', '1M')->data; + $viewRange = (string)app('preferences')->get('viewRange', '1M')->data; /** @var Carbon $start */ $start = session('start'); /** @var Carbon $end */ @@ -197,6 +198,7 @@ trait GetConfigurationData return $steps; } + /** * */ diff --git a/app/Support/Http/Controllers/ModelInformation.php b/app/Support/Http/Controllers/ModelInformation.php index 9d486e5e6c..ca35c4de5c 100644 --- a/app/Support/Http/Controllers/ModelInformation.php +++ b/app/Support/Http/Controllers/ModelInformation.php @@ -86,9 +86,9 @@ trait ModelInformation $mortgage = $repository->getAccountTypeByType(AccountType::MORTGAGE); /** @noinspection NullPointerExceptionInspection */ $liabilityTypes = [ - $debt->id => (string) trans(sprintf('firefly.account_type_%s', AccountType::DEBT)), - $loan->id => (string) trans(sprintf('firefly.account_type_%s', AccountType::LOAN)), - $mortgage->id => (string) trans(sprintf('firefly.account_type_%s', AccountType::MORTGAGE)), + $debt->id => (string)trans(sprintf('firefly.account_type_%s', AccountType::DEBT)), + $loan->id => (string)trans(sprintf('firefly.account_type_%s', AccountType::LOAN)), + $mortgage->id => (string)trans(sprintf('firefly.account_type_%s', AccountType::MORTGAGE)), ]; asort($liabilityTypes); @@ -103,7 +103,7 @@ trait ModelInformation { $roles = []; foreach (config('firefly.accountRoles') as $role) { - $roles[$role] = (string) trans(sprintf('firefly.account_role_%s', $role)); + $roles[$role] = (string)trans(sprintf('firefly.account_role_%s', $role)); } return $roles; @@ -124,7 +124,7 @@ trait ModelInformation foreach ($operators as $key => $operator) { if ('user_action' !== $key && false === $operator['alias']) { - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); } } asort($triggers); @@ -133,8 +133,8 @@ trait ModelInformation $billTriggers = ['currency_is', 'amount_more', 'amount_less', 'description_contains']; $values = [ $bill->transactionCurrency()->first()->name, - round((float) $bill->amount_min, 12), - round((float) $bill->amount_max, 12), + round((float)$bill->amount_min, 12), + round((float)$bill->amount_max, 12), $bill->name, ]; foreach ($billTriggers as $index => $trigger) { @@ -178,7 +178,7 @@ trait ModelInformation foreach ($operators as $key => $operator) { if ('user_action' !== $key && false === $operator['alias']) { - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); } } asort($triggers); diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php index 7d887c2de2..fecdf36b28 100644 --- a/app/Support/Http/Controllers/PeriodOverview.php +++ b/app/Support/Http/Controllers/PeriodOverview.php @@ -70,8 +70,8 @@ trait PeriodOverview * performance reasons. * * @param Account $account The account involved - * @param Carbon $date The start date. - * @param Carbon $end The end date. + * @param Carbon $date The start date. + * @param Carbon $end The end date. * * @return array */ @@ -124,30 +124,145 @@ trait PeriodOverview $spent = $this->filterJournalsByDate($spentSet, $currentDate['start'], $currentDate['end']); $transferredAway = $this->filterTransferredAway($account, $this->filterJournalsByDate($transferSet, $currentDate['start'], $currentDate['end'])); $transferredIn = $this->filterTransferredIn($account, $this->filterJournalsByDate($transferSet, $currentDate['start'], $currentDate['end'])); - $entries[] = - [ - 'title' => $title, - 'route' => - route('accounts.show', [$account->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), + $entries[] + = [ + 'title' => $title, + 'route' => + route('accounts.show', [$account->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), - 'total_transactions' => count($spent) + count($earned) + count($transferredAway) + count($transferredIn), - 'spent' => $this->groupByCurrency($spent), - 'earned' => $this->groupByCurrency($earned), - 'transferred_away' => $this->groupByCurrency($transferredAway), - 'transferred_in' => $this->groupByCurrency($transferredIn), - ]; + 'total_transactions' => count($spent) + count($earned) + count($transferredAway) + count($transferredIn), + 'spent' => $this->groupByCurrency($spent), + 'earned' => $this->groupByCurrency($earned), + 'transferred_away' => $this->groupByCurrency($transferredAway), + 'transferred_in' => $this->groupByCurrency($transferredIn), + ]; } $cache->store($entries); return $entries; } + /** + * Filter a list of journals by a set of dates, and then group them by currency. + * + * @param array $array + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function filterJournalsByDate(array $array, Carbon $start, Carbon $end): array + { + $result = []; + /** @var array $journal */ + foreach ($array as $journal) { + if ($journal['date'] <= $end && $journal['date'] >= $start) { + $result[] = $journal; + } + } + + return $result; + } + + /** + * Return only transactions where $account is the source. + * + * @param Account $account + * @param array $journals + * + * @return array + */ + private function filterTransferredAway(Account $account, array $journals): array + { + $return = []; + /** @var array $journal */ + foreach ($journals as $journal) { + if ($account->id === (int)$journal['source_account_id']) { + $return[] = $journal; + } + } + + return $return; + } + + /** + * Return only transactions where $account is the source. + * + * @param Account $account + * @param array $journals + * + * @return array + * @codeCoverageIgnore + */ + private function filterTransferredIn(Account $account, array $journals): array + { + $return = []; + /** @var array $journal */ + foreach ($journals as $journal) { + if ($account->id === (int)$journal['destination_account_id']) { + $return[] = $journal; + } + } + + return $return; + } + + /** + * @param array $journals + * + * @return array + * @codeCoverageIgnore + */ + private function groupByCurrency(array $journals): array + { + $return = []; + /** @var array $journal */ + foreach ($journals as $journal) { + $currencyId = (int)$journal['currency_id']; + $foreignCurrencyId = $journal['foreign_currency_id']; + if (!isset($return[$currencyId])) { + $return[$currencyId] = [ + 'amount' => '0', + 'count' => 0, + 'currency_id' => $currencyId, + 'currency_name' => $journal['currency_name'], + 'currency_code' => $journal['currency_code'], + 'currency_symbol' => $journal['currency_symbol'], + 'currency_decimal_places' => $journal['currency_decimal_places'], + ]; + } + $return[$currencyId]['amount'] = bcadd($return[$currencyId]['amount'], $journal['amount'] ?? '0'); + $return[$currencyId]['count']++; + + if (null !== $foreignCurrencyId && null !== $journal['foreign_amount']) { + if (!isset($return[$foreignCurrencyId])) { + $return[$foreignCurrencyId] = [ + 'amount' => '0', + 'count' => 0, + 'currency_id' => (int)$foreignCurrencyId, + 'currency_name' => $journal['foreign_currency_name'], + 'currency_code' => $journal['foreign_currency_code'], + 'currency_symbol' => $journal['foreign_currency_symbol'], + 'currency_decimal_places' => $journal['foreign_currency_decimal_places'], + ]; + + } + $return[$foreignCurrencyId]['count']++; + $return[$foreignCurrencyId]['amount'] = bcadd($return[$foreignCurrencyId]['amount'], $journal['foreign_amount']); + } + + } + + return $return; + } + /** * Overview for single category. Has been refactored recently. * * @param Category $category - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end + * * @return array */ protected function getCategoryPeriodOverview(Category $category, Carbon $start, Carbon $end): array @@ -200,17 +315,19 @@ trait PeriodOverview $earned = $this->filterJournalsByDate($earnedSet, $currentDate['start'], $currentDate['end']); $transferred = $this->filterJournalsByDate($transferSet, $currentDate['start'], $currentDate['end']); $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); - $entries[] = - [ - 'transactions' => 0, - 'title' => $title, - 'route' => route('categories.show', - [$category->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), - 'total_transactions' => count($spent) + count($earned) + count($transferred), - 'spent' => $this->groupByCurrency($spent), - 'earned' => $this->groupByCurrency($earned), - 'transferred' => $this->groupByCurrency($transferred), - ]; + $entries[] + = [ + 'transactions' => 0, + 'title' => $title, + 'route' => route( + 'categories.show', + [$category->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')] + ), + 'total_transactions' => count($spent) + count($earned) + count($transferred), + 'spent' => $this->groupByCurrency($spent), + 'earned' => $this->groupByCurrency($earned), + 'transferred' => $this->groupByCurrency($transferred), + ]; } $cache->store($entries); @@ -254,18 +371,18 @@ trait PeriodOverview $journals = $collector->getExtractedJournals(); foreach ($dates as $currentDate) { - $set = $this->filterJournalsByDate($journals, $currentDate['start'], $currentDate['end']); - $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); - $entries[] = - [ - 'title' => $title, - 'route' => route('budgets.no-budget', [$currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), - 'total_transactions' => count($set), - 'spent' => $this->groupByCurrency($set), - 'earned' => [], - 'transferred_away' => [], - 'transferred_in' => [], - ]; + $set = $this->filterJournalsByDate($journals, $currentDate['start'], $currentDate['end']); + $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); + $entries[] + = [ + 'title' => $title, + 'route' => route('budgets.no-budget', [$currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), + 'total_transactions' => count($set), + 'spent' => $this->groupByCurrency($set), + 'earned' => [], + 'transferred_away' => [], + 'transferred_in' => [], + ]; } $cache->store($entries); @@ -336,15 +453,15 @@ trait PeriodOverview $earned = $this->filterJournalsByDate($earnedSet, $currentDate['start'], $currentDate['end']); $transferred = $this->filterJournalsByDate($transferSet, $currentDate['start'], $currentDate['end']); $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); - $entries[] = - [ - 'title' => $title, - 'route' => route('categories.no-category', [$currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), - 'total_transactions' => count($spent) + count($earned) + count($transferred), - 'spent' => $this->groupByCurrency($spent), - 'earned' => $this->groupByCurrency($earned), - 'transferred' => $this->groupByCurrency($transferred), - ]; + $entries[] + = [ + 'title' => $title, + 'route' => route('categories.no-category', [$currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), + 'total_transactions' => count($spent) + count($earned) + count($transferred), + 'spent' => $this->groupByCurrency($spent), + 'earned' => $this->groupByCurrency($earned), + 'transferred' => $this->groupByCurrency($transferred), + ]; } Log::debug('End of loops'); $cache->store($entries); @@ -355,7 +472,7 @@ trait PeriodOverview /** * This shows a period overview for a tag. It goes back in time and lists all relevant transactions and sums. * - * @param Tag $tag + * @param Tag $tag * * @param Carbon $date * @@ -374,7 +491,7 @@ trait PeriodOverview $cache->addProperty('tag-period-entries'); $cache->addProperty($tag->id); if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); @@ -409,17 +526,19 @@ trait PeriodOverview $earned = $this->filterJournalsByDate($earnedSet, $currentDate['start'], $currentDate['end']); $transferred = $this->filterJournalsByDate($transferSet, $currentDate['start'], $currentDate['end']); $title = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); - $entries[] = - [ - 'transactions' => 0, - 'title' => $title, - 'route' => route('tags.show', - [$tag->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), - 'total_transactions' => count($spent) + count($earned) + count($transferred), - 'spent' => $this->groupByCurrency($spent), - 'earned' => $this->groupByCurrency($earned), - 'transferred' => $this->groupByCurrency($transferred), - ]; + $entries[] + = [ + 'transactions' => 0, + 'title' => $title, + 'route' => route( + 'tags.show', + [$tag->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')] + ), + 'total_transactions' => count($spent) + count($earned) + count($transferred), + 'spent' => $this->groupByCurrency($spent), + 'earned' => $this->groupByCurrency($earned), + 'transferred' => $this->groupByCurrency($transferred), + ]; } return $entries; @@ -473,127 +592,18 @@ trait PeriodOverview } - $entries[] = - [ - 'title' => $title, - 'route' => - route('transactions.index', [$transactionType, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), - 'total_transactions' => count($spent) + count($earned) + count($transferred), - 'spent' => $this->groupByCurrency($spent), - 'earned' => $this->groupByCurrency($earned), - 'transferred' => $this->groupByCurrency($transferred), - ]; + $entries[] + = [ + 'title' => $title, + 'route' => + route('transactions.index', [$transactionType, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]), + 'total_transactions' => count($spent) + count($earned) + count($transferred), + 'spent' => $this->groupByCurrency($spent), + 'earned' => $this->groupByCurrency($earned), + 'transferred' => $this->groupByCurrency($transferred), + ]; } return $entries; } - - /** - * Return only transactions where $account is the source. - * @param Account $account - * @param array $journals - * @return array - */ - private function filterTransferredAway(Account $account, array $journals): array - { - $return = []; - /** @var array $journal */ - foreach ($journals as $journal) { - if ($account->id === (int)$journal['source_account_id']) { - $return[] = $journal; - } - } - - return $return; - } - - /** - * Return only transactions where $account is the source. - * @param Account $account - * @param array $journals - * @return array - * @codeCoverageIgnore - */ - private function filterTransferredIn(Account $account, array $journals): array - { - $return = []; - /** @var array $journal */ - foreach ($journals as $journal) { - if ($account->id === (int)$journal['destination_account_id']) { - $return[] = $journal; - } - } - - return $return; - } - - /** - * Filter a list of journals by a set of dates, and then group them by currency. - * - * @param array $array - * @param Carbon $start - * @param Carbon $end - * @return array - */ - private function filterJournalsByDate(array $array, Carbon $start, Carbon $end): array - { - $result = []; - /** @var array $journal */ - foreach ($array as $journal) { - if ($journal['date'] <= $end && $journal['date'] >= $start) { - $result[] = $journal; - } - } - - return $result; - } - - /** - * @param array $journals - * - * @return array - * @codeCoverageIgnore - */ - private function groupByCurrency(array $journals): array - { - $return = []; - /** @var array $journal */ - foreach ($journals as $journal) { - $currencyId = (int)$journal['currency_id']; - $foreignCurrencyId = $journal['foreign_currency_id']; - if (!isset($return[$currencyId])) { - $return[$currencyId] = [ - 'amount' => '0', - 'count' => 0, - 'currency_id' => $currencyId, - 'currency_name' => $journal['currency_name'], - 'currency_code' => $journal['currency_code'], - 'currency_symbol' => $journal['currency_symbol'], - 'currency_decimal_places' => $journal['currency_decimal_places'], - ]; - } - $return[$currencyId]['amount'] = bcadd($return[$currencyId]['amount'], $journal['amount'] ?? '0'); - $return[$currencyId]['count']++; - - if (null !== $foreignCurrencyId && null !== $journal['foreign_amount']) { - if (!isset($return[$foreignCurrencyId])) { - $return[$foreignCurrencyId] = [ - 'amount' => '0', - 'count' => 0, - 'currency_id' => (int)$foreignCurrencyId, - 'currency_name' => $journal['foreign_currency_name'], - 'currency_code' => $journal['foreign_currency_code'], - 'currency_symbol' => $journal['foreign_currency_symbol'], - 'currency_decimal_places' => $journal['foreign_currency_decimal_places'], - ]; - - } - $return[$foreignCurrencyId]['count']++; - $return[$foreignCurrencyId]['amount'] = bcadd($return[$foreignCurrencyId]['amount'], $journal['foreign_amount']); - } - - } - - return $return; - } } diff --git a/app/Support/Http/Controllers/RenderPartialViews.php b/app/Support/Http/Controllers/RenderPartialViews.php index 6703547548..66ee8e5dc9 100644 --- a/app/Support/Http/Controllers/RenderPartialViews.php +++ b/app/Support/Http/Controllers/RenderPartialViews.php @@ -45,50 +45,6 @@ use Throwable; trait RenderPartialViews { - /** - * Get options for double report. - * - * @return string - */ - protected function doubleReportOptions(): string // render a view - { - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - $expense = $repository->getActiveAccountsByType([AccountType::EXPENSE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]); - $revenue = $repository->getActiveAccountsByType([AccountType::REVENUE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]); - $set = []; - - /** @var Account $account */ - foreach ($expense as $account) { - // loop revenue, find same account: - /** @var Account $otherAccount */ - foreach ($revenue as $otherAccount) { - if ( - ( - ($otherAccount->name === $account->name) - || - (null !== $account->iban && null !== $otherAccount->iban && $otherAccount->iban === $account->iban) - ) - && $otherAccount->id !== $account->id - ) { - $set[] = $account; - } - } - } - - // @codeCoverageIgnoreStart - try { - $result = prefixView('reports.options.double', compact('set'))->render(); - } catch (Throwable $e) { - Log::error(sprintf('Cannot render reports.options.tag: %s', $e->getMessage())); - $result = 'Could not render view.'; - } - - // @codeCoverageIgnoreEnd - - return $result; - } - /** * View for transactions in a budget for an account. * @@ -103,10 +59,10 @@ trait RenderPartialViews /** @var BudgetRepositoryInterface $budgetRepository */ $budgetRepository = app(BudgetRepositoryInterface::class); - $budget = $budgetRepository->findNull((int) $attributes['budgetId']); + $budget = $budgetRepository->findNull((int)$attributes['budgetId']); $accountRepos = app(AccountRepositoryInterface::class); - $account = $accountRepos->findNull((int) $attributes['accountId']); + $account = $accountRepos->findNull((int)$attributes['accountId']); $journals = $popupHelper->balanceForBudget($budget, $account, $attributes); // @codeCoverageIgnoreStart @@ -160,7 +116,7 @@ trait RenderPartialViews /** @var PopupReportInterface $popupHelper */ $popupHelper = app(PopupReportInterface::class); - $budget = $budgetRepository->findNull((int) $attributes['budgetId']); + $budget = $budgetRepository->findNull((int)$attributes['budgetId']); if (null === $budget) { $budget = new Budget; } @@ -192,7 +148,7 @@ trait RenderPartialViews /** @var CategoryRepositoryInterface $categoryRepository */ $categoryRepository = app(CategoryRepositoryInterface::class); - $category = $categoryRepository->findNull((int) $attributes['categoryId']); + $category = $categoryRepository->findNull((int)$attributes['categoryId']); $journals = $popupHelper->byCategory($category, $attributes); try { @@ -228,6 +184,49 @@ trait RenderPartialViews return $result; } + /** + * Get options for double report. + * + * @return string + */ + protected function doubleReportOptions(): string // render a view + { + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); + $expense = $repository->getActiveAccountsByType([AccountType::EXPENSE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]); + $revenue = $repository->getActiveAccountsByType([AccountType::REVENUE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]); + $set = []; + + /** @var Account $account */ + foreach ($expense as $account) { + // loop revenue, find same account: + /** @var Account $otherAccount */ + foreach ($revenue as $otherAccount) { + if ( + ( + ($otherAccount->name === $account->name) + || (null !== $account->iban && null !== $otherAccount->iban && $otherAccount->iban === $account->iban) + ) + && $otherAccount->id !== $account->id + ) { + $set[] = $account; + } + } + } + + // @codeCoverageIgnoreStart + try { + $result = prefixView('reports.options.double', compact('set'))->render(); + } catch (Throwable $e) { + Log::error(sprintf('Cannot render reports.options.tag: %s', $e->getMessage())); + $result = 'Could not render view.'; + } + + // @codeCoverageIgnoreEnd + + return $result; + } + /** * Returns all the expenses that went to the given expense account. * @@ -243,7 +242,7 @@ trait RenderPartialViews /** @var PopupReportInterface $popupHelper */ $popupHelper = app(PopupReportInterface::class); - $account = $accountRepository->findNull((int) $attributes['accountId']); + $account = $accountRepository->findNull((int)$attributes['accountId']); if (null === $account) { return 'This is an unknown account. Apologies.'; @@ -317,7 +316,7 @@ trait RenderPartialViews foreach ($operators as $key => $operator) { if ('user_action' !== $key && false === $operator['alias']) { - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); } } asort($triggers); @@ -369,7 +368,7 @@ trait RenderPartialViews /** @var PopupReportInterface $popupHelper */ $popupHelper = app(PopupReportInterface::class); - $account = $accountRepository->findNull((int) $attributes['accountId']); + $account = $accountRepository->findNull((int)$attributes['accountId']); if (null === $account) { return 'This is an unknown category. Apologies.'; diff --git a/app/Support/Http/Controllers/RequestInformation.php b/app/Support/Http/Controllers/RequestInformation.php index 32f3167c0b..0d465859b3 100644 --- a/app/Support/Http/Controllers/RequestInformation.php +++ b/app/Support/Http/Controllers/RequestInformation.php @@ -98,6 +98,7 @@ trait RequestInformation // also check cache first: if ($help->inCache($route, $language)) { Log::debug(sprintf('Help text %s was in cache.', $language)); + return $help->getFromCache($route, $language); } $baseHref = route('index'); @@ -117,6 +118,24 @@ trait RequestInformation return '

' . trans('firefly.route_has_no_help') . '

'; // @codeCoverageIgnore } + /** + * @return string + */ + protected function getPageName(): string // get request info + { + return str_replace('.', '_', RouteFacade::currentRouteName()); + } + + /** + * Get the specific name of a page for intro. + * + * @return string + */ + protected function getSpecificPageName(): string // get request info + { + return null === RouteFacade::current()->parameter('objectType') ? '' : '_' . RouteFacade::current()->parameter('objectType'); + } + /** * Get a list of triggers. * @@ -152,7 +171,6 @@ trait RequestInformation $specificPage = $this->getSpecificPageName(); - // indicator if user has seen the help for this page ( + special page): $key = sprintf('shown_demo_%s%s', $page, $specificPage); // is there an intro for this route? @@ -172,24 +190,6 @@ trait RequestInformation return $shownDemo; } - /** - * @return string - */ - protected function getPageName(): string // get request info - { - return str_replace('.', '_', RouteFacade::currentRouteName()); - } - - /** - * Get the specific name of a page for intro. - * - * @return string - */ - protected function getSpecificPageName(): string // get request info - { - return null === RouteFacade::current()->parameter('objectType') ? '' : '_' . RouteFacade::current()->parameter('objectType'); - } - /** * Check if date is outside session range. * @@ -249,7 +249,7 @@ trait RequestInformation /** * Validate users new password. * - * @param User $user + * @param User $user * @param string $current * @param string $new * diff --git a/app/Support/Http/Controllers/RuleManagement.php b/app/Support/Http/Controllers/RuleManagement.php index ae6ff1e9a7..2ead11c60f 100644 --- a/app/Support/Http/Controllers/RuleManagement.php +++ b/app/Support/Http/Controllers/RuleManagement.php @@ -36,8 +36,138 @@ use Throwable; */ trait RuleManagement { + /** + * + */ + protected function createDefaultRule(): void + { + /** @var RuleRepositoryInterface $ruleRepository */ + $ruleRepository = app(RuleRepositoryInterface::class); + if (0 === $ruleRepository->count()) { + $data = [ + 'rule_group_id' => $ruleRepository->getFirstRuleGroup()->id, + 'stop_processing' => 0, + 'title' => (string)trans('firefly.default_rule_name'), + 'description' => (string)trans('firefly.default_rule_description'), + 'trigger' => 'store-journal', + 'strict' => true, + 'active' => true, + 'triggers' => [ + [ + 'type' => 'description_is', + 'value' => (string)trans('firefly.default_rule_trigger_description'), + 'stop_processing' => false, + + ], + [ + 'type' => 'from_account_is', + 'value' => (string)trans('firefly.default_rule_trigger_from_account'), + 'stop_processing' => false, + + ], + + ], + 'actions' => [ + [ + 'type' => 'prepend_description', + 'value' => (string)trans('firefly.default_rule_action_prepend'), + 'stop_processing' => false, + ], + [ + 'type' => 'set_category', + 'value' => (string)trans('firefly.default_rule_action_set_category'), + 'stop_processing' => false, + ], + ], + ]; + + $ruleRepository->store($data); + } + } + + /** + * @param Request $request + * + * @return array + * @codeCoverageIgnore + */ + protected function getPreviousActions(Request $request): array + { + $index = 0; + $triggers = []; + $oldInput = $request->old('actions'); + if (is_array($oldInput)) { + foreach ($oldInput as $oldAction) { + try { + $triggers[] = prefixView( + 'rules.partials.action', + [ + 'oldAction' => $oldAction['type'], + 'oldValue' => $oldAction['value'], + 'oldChecked' => 1 === (int)($oldAction['stop_processing'] ?? '0'), + 'count' => $index + 1, + ] + )->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Throwable was thrown in getPreviousActions(): %s', $e->getMessage())); + Log::error($e->getTraceAsString()); + } + $index++; + } + } + + return $triggers; + } + + /** + * @param Request $request + * + * @return array + * @codeCoverageIgnore + */ + protected function getPreviousTriggers(Request $request): array + { + // TODO duplicated code. + $operators = config('firefly.search.operators'); + $triggers = []; + foreach ($operators as $key => $operator) { + if ('user_action' !== $key && false === $operator['alias']) { + + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + } + } + asort($triggers); + + $index = 0; + $renderedEntries = []; + $oldInput = $request->old('triggers'); + if (is_array($oldInput)) { + foreach ($oldInput as $oldTrigger) { + try { + $renderedEntries[] = prefixView( + 'rules.partials.trigger', + [ + 'oldTrigger' => OperatorQuerySearch::getRootOperator($oldTrigger['type']), + 'oldValue' => $oldTrigger['value'], + 'oldChecked' => 1 === (int)($oldTrigger['stop_processing'] ?? '0'), + 'count' => $index + 1, + 'triggers' => $triggers, + ] + )->render(); + } catch (Throwable $e) { + Log::debug(sprintf('Throwable was thrown in getPreviousTriggers(): %s', $e->getMessage())); + Log::error($e->getTraceAsString()); + } + $index++; + } + } + + return $renderedEntries; + } + /** * @param array $submittedOperators + * * @return array */ protected function parseFromOperators(array $submittedOperators): array @@ -49,7 +179,7 @@ trait RuleManagement foreach ($operators as $key => $operator) { if ('user_action' !== $key && false === $operator['alias']) { - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); + $triggers[$key] = (string)trans(sprintf('firefly.rule_trigger_%s_choice', $key)); } } asort($triggers); @@ -77,135 +207,6 @@ trait RuleManagement return $renderedEntries; } - /** - * - */ - protected function createDefaultRule(): void - { - /** @var RuleRepositoryInterface $ruleRepository */ - $ruleRepository = app(RuleRepositoryInterface::class); - if (0 === $ruleRepository->count()) { - $data = [ - 'rule_group_id' => $ruleRepository->getFirstRuleGroup()->id, - 'stop_processing' => 0, - 'title' => (string) trans('firefly.default_rule_name'), - 'description' => (string) trans('firefly.default_rule_description'), - 'trigger' => 'store-journal', - 'strict' => true, - 'active' => true, - 'triggers' => [ - [ - 'type' => 'description_is', - 'value' => (string) trans('firefly.default_rule_trigger_description'), - 'stop_processing' => false, - - ], - [ - 'type' => 'from_account_is', - 'value' => (string) trans('firefly.default_rule_trigger_from_account'), - 'stop_processing' => false, - - ], - - ], - 'actions' => [ - [ - 'type' => 'prepend_description', - 'value' => (string) trans('firefly.default_rule_action_prepend'), - 'stop_processing' => false, - ], - [ - 'type' => 'set_category', - 'value' => (string) trans('firefly.default_rule_action_set_category'), - 'stop_processing' => false, - ], - ], - ]; - - $ruleRepository->store($data); - } - } - - /** - * @param Request $request - * - * @return array - * @codeCoverageIgnore - */ - protected function getPreviousActions(Request $request): array - { - $index = 0; - $triggers = []; - $oldInput = $request->old('actions'); - if (is_array($oldInput)) { - foreach ($oldInput as $oldAction) { - try { - $triggers[] = prefixView( - 'rules.partials.action', - [ - 'oldAction' => $oldAction['type'], - 'oldValue' => $oldAction['value'], - 'oldChecked' => 1 === (int) ($oldAction['stop_processing'] ?? '0'), - 'count' => $index + 1, - ] - )->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Throwable was thrown in getPreviousActions(): %s', $e->getMessage())); - Log::error($e->getTraceAsString()); - } - $index++; - } - } - - return $triggers; - } - - /** - * @param Request $request - * - * @return array - * @codeCoverageIgnore - */ - protected function getPreviousTriggers(Request $request): array - { - // TODO duplicated code. - $operators = config('firefly.search.operators'); - $triggers = []; - foreach ($operators as $key => $operator) { - if ('user_action' !== $key && false === $operator['alias']) { - - $triggers[$key] = (string) trans(sprintf('firefly.rule_trigger_%s_choice', $key)); - } - } - asort($triggers); - - $index = 0; - $renderedEntries = []; - $oldInput = $request->old('triggers'); - if (is_array($oldInput)) { - foreach ($oldInput as $oldTrigger) { - try { - $renderedEntries[] = prefixView( - 'rules.partials.trigger', - [ - 'oldTrigger' => OperatorQuerySearch::getRootOperator($oldTrigger['type']), - 'oldValue' => $oldTrigger['value'], - 'oldChecked' => 1 === (int) ($oldTrigger['stop_processing'] ?? '0'), - 'count' => $index + 1, - 'triggers' => $triggers, - ] - )->render(); - } catch (Throwable $e) { - Log::debug(sprintf('Throwable was thrown in getPreviousTriggers(): %s', $e->getMessage())); - Log::error($e->getTraceAsString()); - } - $index++; - } - } - - return $renderedEntries; - } - /** * */ @@ -215,8 +216,8 @@ trait RuleManagement $repository = app(RuleGroupRepositoryInterface::class); if (0 === $repository->count()) { $data = [ - 'title' => (string) trans('firefly.default_rule_group_name'), - 'description' => (string) trans('firefly.default_rule_group_description'), + 'title' => (string)trans('firefly.default_rule_group_name'), + 'description' => (string)trans('firefly.default_rule_group_description'), 'active' => true, ]; diff --git a/app/Support/Http/Controllers/TransactionCalculation.php b/app/Support/Http/Controllers/TransactionCalculation.php index 782b715d91..533434a967 100644 --- a/app/Support/Http/Controllers/TransactionCalculation.php +++ b/app/Support/Http/Controllers/TransactionCalculation.php @@ -39,8 +39,8 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array */ @@ -63,8 +63,8 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $tags - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array * @@ -85,8 +85,8 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $budgets - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array */ @@ -105,8 +105,8 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $categories - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array */ @@ -129,8 +129,8 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $categories - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array */ @@ -149,14 +149,14 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $opposing - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array */ protected function getIncomeForOpposing(Collection $accounts, Collection $opposing, Carbon $start, Carbon $end): array { - $total =$accounts->merge($opposing); + $total = $accounts->merge($opposing); /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setAccounts($total)->setRange($start, $end)->withAccountInformation()->setTypes([TransactionType::DEPOSIT]); @@ -169,8 +169,8 @@ trait TransactionCalculation * * @param Collection $accounts * @param Collection $tags - * @param Carbon $start - * @param Carbon $end + * @param Carbon $start + * @param Carbon $end * * @return array */ diff --git a/app/Support/Http/Controllers/UserNavigation.php b/app/Support/Http/Controllers/UserNavigation.php index c324434c92..5bf7c550cc 100644 --- a/app/Support/Http/Controllers/UserNavigation.php +++ b/app/Support/Http/Controllers/UserNavigation.php @@ -29,6 +29,8 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use Illuminate\Http\RedirectResponse; +use Illuminate\Routing\Redirector; use Illuminate\Support\Str; use Illuminate\Support\ViewErrorBag; use Log; @@ -40,6 +42,33 @@ use Log; trait UserNavigation { + /** + * Functionality:. + * + * - If the $identifier contains the word "delete" then a remembered uri with the text "/show/" in it will not be returned but instead the index (/) + * will be returned. + * - If the remembered uri contains "jscript/" the remembered uri will not be returned but instead the index (/) will be returned. + * + * @param string $identifier + * + * @return string + */ + protected function getPreviousUri(string $identifier): string + { + Log::debug(sprintf('Trying to retrieve URL stored under "%s"', $identifier)); + $uri = (string)session($identifier); + Log::debug(sprintf('The URI is %s', $uri)); + + if (false !== strpos($uri, 'jscript')) { + $uri = $this->redirectUri; // @codeCoverageIgnore + Log::debug(sprintf('URI is now %s (uri contains jscript)', $uri)); + } + + Log::debug(sprintf('Return direct link %s', $uri)); + + return $uri; + } + /** * Will return false if you cant edit this account type. * @@ -73,38 +102,10 @@ trait UserNavigation return in_array($type, $editable, true); } - /** - * @param TransactionGroup $group - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - */ - protected function redirectGroupToAccount(TransactionGroup $group) - { - /** @var TransactionJournal $journal */ - $journal = $group->transactionJournals()->first(); - if (null === $journal) { - Log::error(sprintf('No journals in group #%d', $group->id)); - - return redirect(route('index')); - } - // prefer redirect to everything but expense and revenue: - $transactions = $journal->transactions; - $ignore = [AccountType::REVENUE, AccountType::EXPENSE, AccountType::RECONCILIATION, AccountType::INITIAL_BALANCE]; - /** @var Transaction $transaction */ - foreach ($transactions as $transaction) { - $type = $transaction->account->accountType->type; - if (!in_array($type, $ignore, true)) { - return redirect(route('accounts.edit', [$transaction->account_id])); - } - } - - return redirect(route('index')); - } - /** * @param Account $account * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return RedirectResponse|Redirector */ protected function redirectAccountToAccount(Account $account) { @@ -136,31 +137,32 @@ trait UserNavigation return redirect(route('index')); } - /** - * Functionality:. + * @param TransactionGroup $group * - * - If the $identifier contains the word "delete" then a remembered uri with the text "/show/" in it will not be returned but instead the index (/) - * will be returned. - * - If the remembered uri contains "jscript/" the remembered uri will not be returned but instead the index (/) will be returned. - * - * @param string $identifier - * - * @return string + * @return RedirectResponse|Redirector */ - protected function getPreviousUri(string $identifier): string + protected function redirectGroupToAccount(TransactionGroup $group) { - Log::debug(sprintf('Trying to retrieve URL stored under "%s"', $identifier)); - $uri = (string)session($identifier); - Log::debug(sprintf('The URI is %s', $uri)); + /** @var TransactionJournal $journal */ + $journal = $group->transactionJournals()->first(); + if (null === $journal) { + Log::error(sprintf('No journals in group #%d', $group->id)); - if (false !== strpos($uri, 'jscript')) { - $uri = $this->redirectUri; // @codeCoverageIgnore - Log::debug(sprintf('URI is now %s (uri contains jscript)', $uri)); + return redirect(route('index')); + } + // prefer redirect to everything but expense and revenue: + $transactions = $journal->transactions; + $ignore = [AccountType::REVENUE, AccountType::EXPENSE, AccountType::RECONCILIATION, AccountType::INITIAL_BALANCE]; + /** @var Transaction $transaction */ + foreach ($transactions as $transaction) { + $type = $transaction->account->accountType->type; + if (!in_array($type, $ignore, true)) { + return redirect(route('accounts.edit', [$transaction->account_id])); + } } - Log::debug(sprintf('Return direct link %s', $uri)); - return $uri; + return redirect(route('index')); } /** @@ -178,6 +180,7 @@ trait UserNavigation Log::debug(sprintf('Saving URL %s under key %s', $return, $identifier)); session()->put($identifier, $return); } + return $return; } } diff --git a/app/Support/Logging/AuditLogger.php b/app/Support/Logging/AuditLogger.php index 7732823add..01eecf70e4 100644 --- a/app/Support/Logging/AuditLogger.php +++ b/app/Support/Logging/AuditLogger.php @@ -30,6 +30,7 @@ use Monolog\Handler\AbstractProcessingHandler; /** * Class AuditLogger + * * @codeCoverageIgnore */ class AuditLogger @@ -37,7 +38,7 @@ class AuditLogger /** * Customize the given logger instance. * - * @param Logger $logger + * @param Logger $logger * * @return void */ diff --git a/app/Support/Logging/AuditProcessor.php b/app/Support/Logging/AuditProcessor.php index e8e6bdc245..b3651b6357 100644 --- a/app/Support/Logging/AuditProcessor.php +++ b/app/Support/Logging/AuditProcessor.php @@ -26,6 +26,7 @@ namespace FireflyIII\Support\Logging; /** * Class AuditProcessor + * * @codeCoverageIgnore */ class AuditProcessor @@ -39,21 +40,24 @@ class AuditProcessor { if (auth()->check()) { - $record['message'] = sprintf('AUDIT: %s (%s (%s) -> %s:%s)', - $record['message'], - app('request')->ip(), - auth()->user()->email, - request()->method(), request()->url() + $record['message'] = sprintf( + 'AUDIT: %s (%s (%s) -> %s:%s)', + $record['message'], + app('request')->ip(), + auth()->user()->email, + request()->method(), request()->url() ); return $record; } - $record['message'] = sprintf('AUDIT: %s (%s -> %s:%s)', - $record['message'], - app('request')->ip(), - request()->method(), request()->url() + $record['message'] = sprintf( + 'AUDIT: %s (%s -> %s:%s)', + $record['message'], + app('request')->ip(), + request()->method(), request()->url() ); + return $record; } } diff --git a/app/Support/Report/Budget/BudgetReportGenerator.php b/app/Support/Report/Budget/BudgetReportGenerator.php index 40b1e24fa9..c3cd5ce743 100644 --- a/app/Support/Report/Budget/BudgetReportGenerator.php +++ b/app/Support/Report/Budget/BudgetReportGenerator.php @@ -310,10 +310,10 @@ class BudgetReportGenerator $budgetedPct = '0'; if (0 !== bccomp($spent, '0') && 0 !== bccomp($totalSpent, '0')) { - $spentPct = round((float) bcmul(bcdiv($spent, $totalSpent), '100')); + $spentPct = round((float)bcmul(bcdiv($spent, $totalSpent), '100')); } if (0 !== bccomp($budgeted, '0') && 0 !== bccomp($totalBudgeted, '0')) { - $budgetedPct = round((float) bcmul(bcdiv($budgeted, $totalBudgeted), '100')); + $budgetedPct = round((float)bcmul(bcdiv($budgeted, $totalBudgeted), '100')); } $this->report['sums'][$currencyId]['budgeted'] = $this->report['sums'][$currencyId]['budgeted'] ?? '0'; $this->report['budgets'][$budgetId]['budget_limits'][$limitId]['spent_pct'] = $spentPct; diff --git a/app/Support/Report/Category/CategoryReportGenerator.php b/app/Support/Report/Category/CategoryReportGenerator.php index 34431affd5..229c765a80 100644 --- a/app/Support/Report/Category/CategoryReportGenerator.php +++ b/app/Support/Report/Category/CategoryReportGenerator.php @@ -151,7 +151,7 @@ class CategoryReportGenerator */ private function processCategoryRow(int $currencyId, array $currencyRow, int $categoryId, array $categoryRow): void { - $key = sprintf('%s-%s', $currencyId, $categoryId); + $key = sprintf('%s-%s', $currencyId, $categoryId); $this->report['categories'][$key] = $this->report['categories'][$key] ?? [ 'id' => $categoryId, 'title' => $categoryRow['name'], diff --git a/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php b/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php index 9bef93fbcb..655222d6ae 100644 --- a/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php +++ b/app/Support/Repositories/Recurring/CalculateRangeOccurrences.php @@ -80,7 +80,7 @@ trait CalculateRangeOccurrences } while ($start < $end) { $domCorrected = min($dayOfMonth, $start->daysInMonth); - $start->day = $domCorrected; + $start->day = $domCorrected; if (0 === $attempts % $skipMod && $start->lte($start) && $end->gte($start)) { $return[] = clone $start; } @@ -92,7 +92,6 @@ trait CalculateRangeOccurrences } - /** * Get the number of daily occurrences for a recurring transaction until date $end is reached. Will skip every $skipMod-1 occurrences. * diff --git a/app/Support/Repositories/Recurring/CalculateXOccurrences.php b/app/Support/Repositories/Recurring/CalculateXOccurrences.php index b77ebc857a..c5b8f42e46 100644 --- a/app/Support/Repositories/Recurring/CalculateXOccurrences.php +++ b/app/Support/Repositories/Recurring/CalculateXOccurrences.php @@ -62,7 +62,6 @@ trait CalculateXOccurrences } - /** * Calculates the number of monthly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip * over $skipMod -1 recurrences. @@ -140,7 +139,6 @@ trait CalculateXOccurrences } - /** * Calculates the number of weekly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip * over $skipMod -1 recurrences. @@ -184,7 +182,6 @@ trait CalculateXOccurrences } - /** * Calculates the number of yearly occurrences for a recurring transaction, starting at the date, until $count is reached. It will skip * over $skipMod -1 recurrences. diff --git a/app/Support/Request/AppendsLocationData.php b/app/Support/Request/AppendsLocationData.php index a5e7b8769a..87da9c5c35 100644 --- a/app/Support/Request/AppendsLocationData.php +++ b/app/Support/Request/AppendsLocationData.php @@ -30,6 +30,124 @@ use Log; */ trait AppendsLocationData { + /** + * Read the submitted Request data and add new or updated Location data to the array. + * + * @param array $data + * + * @param string|null $prefix + * + * @return array + */ + protected function appendLocationData(array $data, ?string $prefix): array + { + Log::debug(sprintf('Now in appendLocationData("%s")', $prefix), $data); + $data['store_location'] = false; + $data['update_location'] = false; + $data['remove_location'] = false; + $data['longitude'] = null; + $data['latitude'] = null; + $data['zoom_level'] = null; + + $longitudeKey = $this->getLocationKey($prefix, 'longitude'); + $latitudeKey = $this->getLocationKey($prefix, 'latitude'); + $zoomLevelKey = $this->getLocationKey($prefix, 'zoom_level'); + $isValidPOST = $this->isValidPost($prefix); + $isValidPUT = $this->isValidPUT($prefix); + $isValidEmptyPUT = $this->isValidEmptyPUT($prefix); + + // for a POST (store), all fields must be present and not NULL. + if ($isValidPOST) { + Log::debug('Method is POST and all fields present and not NULL.'); + $data['store_location'] = true; + $data['longitude'] = $this->string($longitudeKey); + $data['latitude'] = $this->string($latitudeKey); + $data['zoom_level'] = $this->string($zoomLevelKey); + } + + // for a PUT (api update) or POST update (UI) + if ($isValidPUT) { + Log::debug('Method is PUT and all fields present and not NULL.'); + $data['update_location'] = true; + $data['longitude'] = $this->string($longitudeKey); + $data['latitude'] = $this->string($latitudeKey); + $data['zoom_level'] = $this->string($zoomLevelKey); + } + if ($isValidEmptyPUT) { + Log::debug('Method is PUT and all fields present and NULL.'); + $data['remove_location'] = true; + } + Log::debug(sprintf('Returning longitude: "%s", latitude: "%s", zoom level: "%s"', $data['longitude'], $data['latitude'], $data['zoom_level'])); + Log::debug( + sprintf( + 'Returning actions: store: %s, update: %s, delete: %s', + var_export($data['store_location'], true), + var_export($data['update_location'], true), + var_export($data['remove_location'], true), + ) + ); + + return $data; + } + + /** + * @param string|null $prefix + * @param string $key + * + * @return string + */ + private function getLocationKey(?string $prefix, string $key): string + { + if (null === $prefix) { + return $key; + } + + return sprintf('%s_%s', $prefix, $key); + } + + /** + * @param string|null $prefix + * + * @return bool + */ + private function isValidPOST(?string $prefix): bool + { + Log::debug('Now in isValidPOST()'); + $longitudeKey = $this->getLocationKey($prefix, 'longitude'); + $latitudeKey = $this->getLocationKey($prefix, 'latitude'); + $zoomLevelKey = $this->getLocationKey($prefix, 'zoom_level'); + $hasLocationKey = $this->getLocationKey($prefix, 'has_location'); + // fields must not be null: + if (null !== $this->get($longitudeKey) && null !== $this->get($latitudeKey) && null !== $this->get($zoomLevelKey)) { + Log::debug('All fields present'); + // if is POST and route contains API, this is enough: + if ('POST' === $this->method() && $this->routeIs('api.v1.*')) { + Log::debug('Is API location'); + + return true; + } + // if is POST and route does not contain API, must also have "has_location" = true + if ('POST' === $this->method() && $this->routeIs('*.store') && !$this->routeIs('api.v1.*') && $hasLocationKey) { + Log::debug('Is POST + store route.'); + $hasLocation = $this->boolean($hasLocationKey); + if (true === $hasLocation) { + Log::debug('Has form form location'); + + return true; + } + Log::debug('Does not have form location'); + + return false; + } + Log::debug('Is not POST API or POST form'); + + return false; + } + Log::debug('Fields not present'); + + return false; + } + /** * Abstract method stolen from "InteractsWithInput". * @@ -65,108 +183,6 @@ trait AppendsLocationData */ abstract public function routeIs(...$patterns); - /** - * Read the submitted Request data and add new or updated Location data to the array. - * - * @param array $data - * - * @param string|null $prefix - * - * @return array - */ - protected function appendLocationData(array $data, ?string $prefix): array - { - Log::debug(sprintf('Now in appendLocationData("%s")', $prefix), $data); - $data['store_location'] = false; - $data['update_location'] = false; - $data['remove_location'] = false; - $data['longitude'] = null; - $data['latitude'] = null; - $data['zoom_level'] = null; - - $longitudeKey = $this->getLocationKey($prefix, 'longitude'); - $latitudeKey = $this->getLocationKey($prefix, 'latitude'); - $zoomLevelKey = $this->getLocationKey($prefix, 'zoom_level'); - $isValidPOST = $this->isValidPost($prefix); - $isValidPUT = $this->isValidPUT($prefix); - $isValidEmptyPUT = $this->isValidEmptyPUT($prefix); - - // for a POST (store), all fields must be present and not NULL. - if ($isValidPOST) { - Log::debug('Method is POST and all fields present and not NULL.'); - $data['store_location'] = true; - $data['longitude'] = $this->string($longitudeKey); - $data['latitude'] = $this->string($latitudeKey); - $data['zoom_level'] = $this->string($zoomLevelKey); - } - - if ($isValidPUT) { - Log::debug('Method is PUT and all fields present and not NULL.'); - $data['update_location'] = true; - $data['longitude'] = $this->string($longitudeKey); - $data['latitude'] = $this->string($latitudeKey); - $data['zoom_level'] = $this->string($zoomLevelKey); - } - if ($isValidEmptyPUT) { - Log::debug('Method is PUT and all fields present and NULL.'); - $data['remove_location'] = true; - } - Log::debug(sprintf('Returning longitude: "%s", latitude: "%s", zoom level: "%s"', $data['longitude'], $data['latitude'], $data['zoom_level'])); - Log::debug( - sprintf( - 'Returning actions: store: %s, update: %s, delete: %s', - var_export($data['store_location'], true), - var_export($data['update_location'], true), - var_export($data['remove_location'], true), - ) - ); - - return $data; - } - - /** - * Abstract method to ensure filling later. - * - * @param string $field - * - * @return string|null - */ - abstract protected function nullableString(string $field): ?string; - - /** - * @param string|null $prefix - * @param string $key - * - * @return string - */ - private function getLocationKey(?string $prefix, string $key): string - { - if (null === $prefix) { - return $key; - } - - return sprintf('%s_%s', $prefix, $key); - } - - /** - * @param string|null $prefix - * - * @return bool - */ - private function isValidPOST(?string $prefix): bool - { - $longitudeKey = $this->getLocationKey($prefix, 'longitude'); - $latitudeKey = $this->getLocationKey($prefix, 'latitude'); - $zoomLevelKey = $this->getLocationKey($prefix, 'zoom_level'); - - return ('POST' === $this->method() && $this->routeIs('*.store')) - && ( - null !== $this->get($longitudeKey) - && null !== $this->get($latitudeKey) - && null !== $this->get($zoomLevelKey) - ); - } - /** * @param string|null $prefix * @@ -174,16 +190,42 @@ trait AppendsLocationData */ private function isValidPUT(?string $prefix): bool { - $longitudeKey = $this->getLocationKey($prefix, 'longitude'); - $latitudeKey = $this->getLocationKey($prefix, 'latitude'); - $zoomLevelKey = $this->getLocationKey($prefix, 'zoom_level'); + $longitudeKey = $this->getLocationKey($prefix, 'longitude'); + $latitudeKey = $this->getLocationKey($prefix, 'latitude'); + $zoomLevelKey = $this->getLocationKey($prefix, 'zoom_level'); + $hasLocationKey = $this->getLocationKey($prefix, 'has_location'); + Log::debug('Now in isValidPUT()'); - return ( - null !== $this->get($longitudeKey) - && null !== $this->get($latitudeKey) - && null !== $this->get($zoomLevelKey)) - && (('PUT' === $this->method() && $this->routeIs('*.update')) - || ('POST' === $this->method() && $this->routeIs('*.update'))); + // all fields must be set: + if (null !== $this->get($longitudeKey) && null !== $this->get($latitudeKey) && null !== $this->get($zoomLevelKey)) { + Log::debug('All fields present.'); + // must be PUT and API route: + if ('PUT' === $this->method() && $this->routeIs('api.v1.*')) { + Log::debug('Is API location'); + + return true; + } + // if POST and not API route, must also have "has_location" + // if is POST and route does not contain API, must also have "has_location" = true + if ('POST' === $this->method() && $this->routeIs('*.update') && !$this->routeIs('api.v1.*') && $hasLocationKey) { + Log::debug('Is POST + store route.'); + $hasLocation = $this->boolean($hasLocationKey); + if (true === $hasLocation) { + Log::debug('Has form location data + has_location'); + + return true; + } + Log::debug('Does not have form location'); + + return false; + } + Log::debug('Is not POST API or POST form'); + + return false; + } + Log::debug('Fields not present'); + + return false; } /** @@ -207,4 +249,13 @@ trait AppendsLocationData } + /** + * Abstract method to ensure filling later. + * + * @param string $field + * + * @return string|null + */ + abstract protected function nullableString(string $field): ?string; + } diff --git a/app/Support/Request/ConvertsDataTypes.php b/app/Support/Request/ConvertsDataTypes.php index e2ff0e08fa..032dd4fbea 100644 --- a/app/Support/Request/ConvertsDataTypes.php +++ b/app/Support/Request/ConvertsDataTypes.php @@ -33,46 +33,6 @@ use Log; trait ConvertsDataTypes { - /** - * Returns all data in the request, or omits the field if not set, - * according to the config from the request. This is the way. - * - * @param array $fields - * - * @return array - */ - protected function getAllData(array $fields): array - { - $return = []; - foreach ($fields as $field => $info) { - if ($this->has($info[0])) { - $method = $info[1]; - $return[$field] = $this->$method($info[0]); - } - } - - return $return; - } - - /** - * Return date or NULL. - * - * @param string $field - * - * @return Carbon|null - */ - protected function date(string $field): ?Carbon - { - $result = null; - try { - $result = $this->get($field) ? new Carbon($this->get($field)) : null; - } catch (Exception $e) { - Log::debug(sprintf('Exception when parsing date. Not interesting: %s', $e->getMessage())); - } - - return $result; - } - /** * Return integer value. * @@ -85,41 +45,28 @@ trait ConvertsDataTypes return (int)$this->get($field); } - /** - * Return floating value. + * Return string value, but keep newlines. * * @param string $field * - * @return float|null + * @return string */ - protected function float(string $field): ?float + public function nlString(string $field): string { - $res = $this->get($field); - if (null === $res) { - return null; - } - - return (float)$res; + return app('steam')->nlCleanString((string)($this->get($field) ?? '')); } - /** - * Parse and clean a string, but keep the newlines. + * Return string value. * - * @param string|null $string + * @param string $field * - * @return string|null + * @return string */ - protected function nlStringFromValue(?string $string): ?string + public function string(string $field): string { - if (null === $string) { - return null; - } - $result = app('steam')->nlCleanString($string); - - return '' === $result ? null : $result; - + return app('steam')->cleanString((string)($this->get($field) ?? '')); } /** @@ -142,6 +89,56 @@ trait ConvertsDataTypes return null; } + /** + * @param string $value + * + * @return bool + */ + protected function convertBoolean(?string $value): bool + { + if (null === $value) { + return false; + } + if ('' === $value) { + return false; + } + if ('true' === $value) { + return true; + } + if ('yes' === $value) { + return true; + } + if (1 === $value) { + return true; + } + if ('1' === $value) { + return true; + } + if (true === $value) { + return true; + } + + return false; + } + + /** + * Return date or NULL. + * + * @param string $field + * + * @return Carbon|null + */ + protected function date(string $field): ?Carbon + { + $result = null; + try { + $result = $this->get($field) ? new Carbon($this->get($field)) : null; + } catch (Exception $e) { + Log::debug(sprintf('Exception when parsing date. Not interesting: %s', $e->getMessage())); + } + + return $result; + } /** * @param string|null $string @@ -169,22 +166,42 @@ trait ConvertsDataTypes } /** - * Parse and clean a string. + * Return floating value. * - * @param string|null $string + * @param string $field * - * @return string|null + * @return float|null */ - protected function stringFromValue(?string $string): ?string + protected function float(string $field): ?float { - if (null === $string) { + $res = $this->get($field); + if (null === $res) { return null; } - $result = app('steam')->cleanString($string); - return '' === $result ? null : $result; + return (float)$res; } + /** + * Returns all data in the request, or omits the field if not set, + * according to the config from the request. This is the way. + * + * @param array $fields + * + * @return array + */ + protected function getAllData(array $fields): array + { + $return = []; + foreach ($fields as $field => $info) { + if ($this->has($info[0])) { + $method = $info[1]; + $return[$field] = $this->$method($info[0]); + } + } + + return $return; + } /** * Parse to integer @@ -206,15 +223,21 @@ trait ConvertsDataTypes } /** - * Return string value, but keep newlines. + * Parse and clean a string, but keep the newlines. * - * @param string $field + * @param string|null $string * - * @return string + * @return string|null */ - public function nlString(string $field): string + protected function nlStringFromValue(?string $string): ?string { - return app('steam')->nlCleanString((string)($this->get($field) ?? '')); + if (null === $string) { + return null; + } + $result = app('steam')->nlCleanString($string); + + return '' === $result ? null : $result; + } /** @@ -254,39 +277,6 @@ trait ConvertsDataTypes return app('steam')->nlCleanString((string)($this->get($field) ?? '')); } - - /** - * @param string $value - * - * @return bool - */ - protected function convertBoolean(?string $value): bool - { - if (null === $value) { - return false; - } - if ('' === $value) { - return false; - } - if ('true' === $value) { - return true; - } - if ('yes' === $value) { - return true; - } - if (1 === $value) { - return true; - } - if ('1' === $value) { - return true; - } - if (true === $value) { - return true; - } - - return false; - } - /** * Return string value, or NULL if empty. * @@ -308,14 +298,19 @@ trait ConvertsDataTypes } /** - * Return string value. + * Parse and clean a string. * - * @param string $field + * @param string|null $string * - * @return string + * @return string|null */ - public function string(string $field): string + protected function stringFromValue(?string $string): ?string { - return app('steam')->cleanString((string)($this->get($field) ?? '')); + if (null === $string) { + return null; + } + $result = app('steam')->cleanString($string); + + return '' === $result ? null : $result; } } diff --git a/app/Support/Request/GetRuleConfiguration.php b/app/Support/Request/GetRuleConfiguration.php index a852550c38..18c11d6688 100644 --- a/app/Support/Request/GetRuleConfiguration.php +++ b/app/Support/Request/GetRuleConfiguration.php @@ -69,6 +69,7 @@ trait GetRuleConfiguration $return[] = $key; } } + return $return; } } diff --git a/app/Support/Search/AccountSearch.php b/app/Support/Search/AccountSearch.php index 1b781771d4..4f22a75030 100644 --- a/app/Support/Search/AccountSearch.php +++ b/app/Support/Search/AccountSearch.php @@ -61,7 +61,7 @@ class AccountSearch implements GenericSearchInterface public function search(): Collection { - $searchQuery = $this->user->accounts() + $searchQuery = $this->user->accounts() ->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id') ->leftJoin('account_meta', 'accounts.id', '=', 'account_meta.account_id') ->whereIn('account_types.type', $this->types); diff --git a/app/Support/Search/OperatorQuerySearch.php b/app/Support/Search/OperatorQuerySearch.php index 966e2905df..9188dba8df 100644 --- a/app/Support/Search/OperatorQuerySearch.php +++ b/app/Support/Search/OperatorQuerySearch.php @@ -86,21 +86,21 @@ class OperatorQuerySearch implements SearchInterface private BillRepositoryInterface $billRepository; private BudgetRepositoryInterface $budgetRepository; private CategoryRepositoryInterface $categoryRepository; - private TagRepositoryInterface $tagRepository; - private CurrencyRepositoryInterface $currencyRepository; - private TransactionTypeRepositoryInterface $typeRepository; - private User $user; - private ParsedQuery $query; - private int $page; - private int $limit; - private array $words; - private array $validOperators; private GroupCollectorInterface $collector; - private float $startTime; - private Collection $modifiers; // obsolete + private CurrencyRepositoryInterface $currencyRepository; + private Carbon $date; + private int $limit; +private Collection $modifiers; private Collection $operators; private string $originalQuery; - private Carbon $date; + private int $page; + private ParsedQuery $query; + private float $startTime; + private TagRepositoryInterface $tagRepository; + private TransactionTypeRepositoryInterface $typeRepository; // obsolete + private User $user; + private array $validOperators; + private array $words; /** * OperatorQuerySearch constructor. @@ -146,14 +146,6 @@ class OperatorQuerySearch implements SearchInterface return $this->operators; } - /** - * @param Carbon $date - */ - public function setDate(Carbon $date): void - { - $this->date = $date; - } - /** * @inheritDoc * @codeCoverageIgnore @@ -163,24 +155,6 @@ class OperatorQuerySearch implements SearchInterface return implode(' ', $this->words); } - /** - * @return array - */ - public function getWords(): array - { - return $this->words; - } - - /** - * @inheritDoc - * @codeCoverageIgnore - */ - public function setPage(int $page): void - { - $this->page = $page; - $this->collector->setPage($this->page); - } - /** * @inheritDoc * @codeCoverageIgnore @@ -231,6 +205,33 @@ class OperatorQuerySearch implements SearchInterface return $this->collector->getPaginatedGroups(); } + /** + * @param Carbon $date + */ + public function setDate(Carbon $date): void + { + $this->date = $date; + } + + /** + * @param int $limit + */ + public function setLimit(int $limit): void + { + $this->limit = $limit; + $this->collector->setLimit($this->limit); + } + + /** + * @inheritDoc + * @codeCoverageIgnore + */ + public function setPage(int $page): void + { + $this->page = $page; + $this->collector->setPage($this->page); + } + /** * @inheritDoc * @codeCoverageIgnore @@ -644,6 +645,28 @@ class OperatorQuerySearch implements SearchInterface return true; } + /** + * @param string $operator + * + * @return string + * @throws FireflyException + */ + public static function getRootOperator(string $operator): string + { + $config = config(sprintf('firefly.search.operators.%s', $operator)); + if (null === $config) { + throw new FireflyException(sprintf('No configuration for search operator "%s"', $operator)); + } + if (true === $config['alias']) { + Log::debug(sprintf('"%s" is an alias for "%s", so return that instead.', $operator, $config['alias_for'])); + + return $config['alias_for']; + } + Log::debug(sprintf('"%s" is not an alias.', $operator)); + + return $operator; + } + /** * searchDirection: 1 = source (default), 2 = destination * stringPosition: 1 = start (default), 2 = end, 3 = contains, 4 = is @@ -709,7 +732,6 @@ class OperatorQuerySearch implements SearchInterface $this->collector->$collectorMethod($filtered); } - /** * searchDirection: 1 = source (default), 2 = destination * stringPosition: 1 = start (default), 2 = end, 3 = contains, 4 = is @@ -787,6 +809,14 @@ class OperatorQuerySearch implements SearchInterface $this->collector->$collectorMethod($filtered); } + /** + * @return Account + */ + private function getCashAccount(): Account + { + return $this->accountRepository->getCashAccount(); + } + /** * @param string $value * @@ -809,28 +839,6 @@ class OperatorQuerySearch implements SearchInterface return $result; } - /** - * @param string $operator - * - * @return string - * @throws FireflyException - */ - public static function getRootOperator(string $operator): string - { - $config = config(sprintf('firefly.search.operators.%s', $operator)); - if (null === $config) { - throw new FireflyException(sprintf('No configuration for search operator "%s"', $operator)); - } - if (true === $config['alias']) { - Log::debug(sprintf('"%s" is an alias for "%s", so return that instead.', $operator, $config['alias_for'])); - - return $config['alias_for']; - } - Log::debug(sprintf('"%s" is not an alias.', $operator)); - - return $operator; - } - /** * @param string $value * @@ -852,19 +860,10 @@ class OperatorQuerySearch implements SearchInterface } /** - * @param int $limit + * @return array */ - public function setLimit(int $limit): void + public function getWords(): array { - $this->limit = $limit; - $this->collector->setLimit($this->limit); - } - - /** - * @return Account - */ - private function getCashAccount(): Account - { - return $this->accountRepository->getCashAccount(); + return $this->words; } } diff --git a/app/Support/Search/SearchInterface.php b/app/Support/Search/SearchInterface.php index 0dcfcc0f7d..fe5a44fa9c 100644 --- a/app/Support/Search/SearchInterface.php +++ b/app/Support/Search/SearchInterface.php @@ -47,16 +47,6 @@ interface SearchInterface */ public function getWordsAsString(): string; - /** - * @param int $page - */ - public function setPage(int $page): void; - - /** - * @param int $limit - */ - public function setLimit(int $limit): void; - /** * @return bool */ @@ -77,13 +67,23 @@ interface SearchInterface */ public function searchTransactions(): LengthAwarePaginator; - /** - * @param User $user - */ - public function setUser(User $user); - /** * @param Carbon $date */ public function setDate(Carbon $date): void; + + /** + * @param int $limit + */ + public function setLimit(int $limit): void; + + /** + * @param int $page + */ + public function setPage(int $page): void; + + /** + * @param User $user + */ + public function setUser(User $user); } diff --git a/app/Support/System/GeneratesInstallationId.php b/app/Support/System/GeneratesInstallationId.php index 15ea57d3e7..f4e468e791 100644 --- a/app/Support/System/GeneratesInstallationId.php +++ b/app/Support/System/GeneratesInstallationId.php @@ -39,9 +39,10 @@ trait GeneratesInstallationId protected function generateInstallationId(): void { try { - $config = app('fireflyconfig')->get('installation_id', null); - } catch(FireflyException $e) { + $config = app('fireflyconfig')->get('installation_id', null); + } catch (FireflyException $e) { Log::info('Could not create or generate installation ID. Do not continue.'); + return; } @@ -52,7 +53,7 @@ trait GeneratesInstallationId if (null === $config) { $uuid4 = Uuid::uuid4(); - $uniqueId = (string) $uuid4; + $uniqueId = (string)$uuid4; Log::info(sprintf('Created Firefly III installation ID %s', $uniqueId)); app('fireflyconfig')->set('installation_id', $uniqueId); } diff --git a/app/Support/System/OAuthKeys.php b/app/Support/System/OAuthKeys.php index e6cb83dfa0..7817af69e7 100644 --- a/app/Support/System/OAuthKeys.php +++ b/app/Support/System/OAuthKeys.php @@ -36,58 +36,6 @@ class OAuthKeys private const PRIVATE_KEY = 'oauth_private_key'; private const PUBLIC_KEY = 'oauth_public_key'; - /** - * - */ - public static function generateKeys(): void - { - Artisan::registerCommand(new KeysCommand()); - Artisan::call('passport:keys'); - } - - /** - * @return bool - */ - public static function hasKeyFiles(): bool - { - $private = storage_path('oauth-private.key'); - $public = storage_path('oauth-public.key'); - - return file_exists($private) && file_exists($public); - } - - /** - * @return bool - */ - public static function keysInDatabase(): bool - { - return app('fireflyconfig')->has(self::PRIVATE_KEY) && app('fireflyconfig')->has(self::PUBLIC_KEY); - } - - /** - * - */ - public static function restoreKeysFromDB(): void - { - $privateContent = Crypt::decrypt(app('fireflyconfig')->get(self::PRIVATE_KEY)->data); - $publicContent = Crypt::decrypt(app('fireflyconfig')->get(self::PUBLIC_KEY)->data); - $private = storage_path('oauth-private.key'); - $public = storage_path('oauth-public.key'); - file_put_contents($private, $privateContent); - file_put_contents($public, $publicContent); - } - - /** - * - */ - public static function storeKeysInDB(): void - { - $private = storage_path('oauth-private.key'); - $public = storage_path('oauth-public.key'); - app('fireflyconfig')->set(self::PRIVATE_KEY, Crypt::encrypt(file_get_contents($private))); - app('fireflyconfig')->set(self::PUBLIC_KEY, Crypt::encrypt(file_get_contents($public))); - } - /** * */ @@ -109,4 +57,56 @@ class OAuthKeys } } + /** + * @return bool + */ + public static function keysInDatabase(): bool + { + return app('fireflyconfig')->has(self::PRIVATE_KEY) && app('fireflyconfig')->has(self::PUBLIC_KEY); + } + + /** + * @return bool + */ + public static function hasKeyFiles(): bool + { + $private = storage_path('oauth-private.key'); + $public = storage_path('oauth-public.key'); + + return file_exists($private) && file_exists($public); + } + + /** + * + */ + public static function generateKeys(): void + { + Artisan::registerCommand(new KeysCommand()); + Artisan::call('passport:keys'); + } + + /** + * + */ + public static function storeKeysInDB(): void + { + $private = storage_path('oauth-private.key'); + $public = storage_path('oauth-public.key'); + app('fireflyconfig')->set(self::PRIVATE_KEY, Crypt::encrypt(file_get_contents($private))); + app('fireflyconfig')->set(self::PUBLIC_KEY, Crypt::encrypt(file_get_contents($public))); + } + + /** + * + */ + public static function restoreKeysFromDB(): void + { + $privateContent = Crypt::decrypt(app('fireflyconfig')->get(self::PRIVATE_KEY)->data); + $publicContent = Crypt::decrypt(app('fireflyconfig')->get(self::PUBLIC_KEY)->data); + $private = storage_path('oauth-private.key'); + $public = storage_path('oauth-public.key'); + file_put_contents($private, $privateContent); + file_put_contents($public, $publicContent); + } + } diff --git a/app/Support/Twig/AmountFormat.php b/app/Support/Twig/AmountFormat.php index 233d991385..11303f80e0 100644 --- a/app/Support/Twig/AmountFormat.php +++ b/app/Support/Twig/AmountFormat.php @@ -25,9 +25,9 @@ namespace FireflyIII\Support\Twig; use FireflyIII\Models\Account as AccountModel; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use Twig\TwigFunction; -use Twig\TwigFilter; use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; +use Twig\TwigFunction; /** * Contains all amount formatting routines. @@ -73,6 +73,22 @@ class AmountFormat extends AbstractExtension ); } + /** + * @return TwigFilter + */ + protected function formatAmountPlain(): TwigFilter + { + return new TwigFilter( + 'formatAmountPlain', + static function (string $string): string { + $currency = app('amount')->getDefaultCurrency(); + + return app('amount')->formatAnything($currency, $string, false); + }, + ['is_safe' => ['html']] + ); + } + /** * Will format the amount by the currency related to the given account. * @@ -96,24 +112,6 @@ class AmountFormat extends AbstractExtension ); } - /** - * Will format the amount by the currency related to the given account. - * - * @return TwigFunction - */ - protected function formatAmountByCurrency(): TwigFunction - { - return new TwigFunction( - 'formatAmountByCurrency', - static function (TransactionCurrency $currency, string $amount, bool $coloured = null): string { - $coloured = $coloured ?? true; - - return app('amount')->formatAnything($currency, $amount, $coloured); - }, - ['is_safe' => ['html']] - ); - } - /** * Will format the amount by the currency related to the given account. * @@ -138,16 +136,18 @@ class AmountFormat extends AbstractExtension } /** - * @return TwigFilter + * Will format the amount by the currency related to the given account. + * + * @return TwigFunction */ - protected function formatAmountPlain(): TwigFilter + protected function formatAmountByCurrency(): TwigFunction { - return new TwigFilter( - 'formatAmountPlain', - static function (string $string): string { - $currency = app('amount')->getDefaultCurrency(); + return new TwigFunction( + 'formatAmountByCurrency', + static function (TransactionCurrency $currency, string $amount, bool $coloured = null): string { + $coloured = $coloured ?? true; - return app('amount')->formatAnything($currency, $string, false); + return app('amount')->formatAnything($currency, $amount, $coloured); }, ['is_safe' => ['html']] ); diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index 7812e9434a..58da41788b 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -72,109 +72,6 @@ class General extends AbstractExtension ]; } - protected function getRootSearchOperator(): TwigFunction - { - return new TwigFunction( - 'getRootSearchOperator', - static function (string $operator): string { - return OperatorQuerySearch::getRootOperator($operator); - } - ); - } - - /** - * Will return "active" when a part of the route matches the argument. - * ie. "accounts" will match "accounts.index". - * - * @return TwigFunction - */ - protected function activeRoutePartial(): TwigFunction - { - return new TwigFunction( - 'activeRoutePartial', - static function (): string { - $args = func_get_args(); - $route = $args[0]; // name of the route. - $name = Route::getCurrentRoute()->getName() ?? ''; - if (false !== strpos($name, $route)) { - return 'active'; - } - - return ''; - } - ); - } - - /** - * Will return "menu-open" when a part of the route matches the argument. - * ie. "accounts" will match "accounts.index". - * - * @return TwigFunction - */ - protected function menuOpenRoutePartial(): TwigFunction - { - return new TwigFunction( - 'menuOpenRoutePartial', - static function (): string { - $args = func_get_args(); - $route = $args[0]; // name of the route. - $name = Route::getCurrentRoute()->getName() ?? ''; - if (false !== strpos($name, $route)) { - return 'menu-open'; - } - - return ''; - } - ); - } - - /** - * This function will return "active" when the current route matches the first argument (even partly) - * but, the variable $objectType has been set and matches the second argument. - * - * @return TwigFunction - */ - protected function activeRoutePartialObjectType(): TwigFunction - { - return new TwigFunction( - 'activeRoutePartialObjectType', - static function ($context): string { - [, $route, $objectType] = func_get_args(); - $activeObjectType = $context['objectType'] ?? false; - - if ($objectType === $activeObjectType && false !== stripos(Route::getCurrentRoute()->getName(), $route)) { - return 'active'; - } - - return ''; - }, - ['needs_context' => true] - ); - } - - /** - * Will return "active" when the current route matches the given argument - * exactly. - * - * @return TwigFunction - */ - protected function activeRouteStrict(): TwigFunction - { - return new TwigFunction( - 'activeRouteStrict', - static function (): string { - $args = func_get_args(); - $route = $args[0]; // name of the route. - - if (Route::getCurrentRoute()->getName() === $route) { - return 'active'; - } - - return ''; - } - ); - } - /** * Show account balance. Only used on the front page of Firefly III. * @@ -196,23 +93,6 @@ class General extends AbstractExtension ); } - /** - * Formats a string as a thing by converting it to a Carbon first. - * - * @return TwigFunction - */ - protected function formatDate(): TwigFunction - { - return new TwigFunction( - 'formatDate', - function (string $date, string $format): string { - $carbon = new Carbon($date); - - return $carbon->formatLocalized($format); - } - ); - } - /** * Used to convert 1024 to 1kb etc. * @@ -238,79 +118,6 @@ class General extends AbstractExtension ); } - /** - * @return TwigFunction - * @deprecated because it uses a query in a view - * TODO remove me. - */ - protected function getMetaField(): TwigFunction - { - return new TwigFunction( - 'accountGetMetaField', - static function (Account $account, string $field): string { - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - $result = $repository->getMetaValue($account, $field); - if (null === $result) { - return ''; - } - - return $result; - } - ); - } - - /** - * Will return true if the user is of role X. - * - * @return TwigFunction - */ - protected function hasRole(): TwigFunction - { - return new TwigFunction( - 'hasRole', - static function (string $role): bool { - $repository = app(UserRepositoryInterface::class); - if ($repository->hasRole(auth()->user(), $role)) { - return true; - } - - return false; - } - ); - } - - /** - * @return TwigFilter - */ - protected function markdown(): TwigFilter - { - return new TwigFilter( - 'markdown', - static function (string $text): string { - $environment = Environment::createCommonMarkEnvironment(); - $environment->addExtension(new GithubFlavoredMarkdownExtension()); - - $converter = new CommonMarkConverter(['allow_unsafe_links' => false, 'max_nesting_level' => 3, 'html_input' => 'escape'], $environment); - - return $converter->convertToHtml($text); - }, ['is_safe' => ['html']] - ); - } - - /** - * @return TwigFilter - */ - protected function floatval(): TwigFilter - { - return new TwigFilter( - 'floatval', - static function ($value): float { - return (float)$value; - } - ); - } - /** * Show icon with attachment. * @@ -390,6 +197,37 @@ class General extends AbstractExtension ); } + /** + * @return TwigFilter + */ + protected function markdown(): TwigFilter + { + return new TwigFilter( + 'markdown', + static function (string $text): string { + $environment = Environment::createCommonMarkEnvironment(); + $environment->addExtension(new GithubFlavoredMarkdownExtension()); + + $converter = new CommonMarkConverter(['allow_unsafe_links' => false, 'max_nesting_level' => 3, 'html_input' => 'escape'], $environment); + + return $converter->convertToHtml($text); + }, ['is_safe' => ['html']] + ); + } + + /** + * @return TwigFilter + */ + protected function floatval(): TwigFilter + { + return new TwigFilter( + 'floatval', + static function ($value): float { + return (float)$value; + } + ); + } + /** * Basic example thing for some views. * @@ -404,4 +242,166 @@ class General extends AbstractExtension } ); } + + /** + * Will return "active" when the current route matches the given argument + * exactly. + * + * @return TwigFunction + */ + protected function activeRouteStrict(): TwigFunction + { + return new TwigFunction( + 'activeRouteStrict', + static function (): string { + $args = func_get_args(); + $route = $args[0]; // name of the route. + + if (Route::getCurrentRoute()->getName() === $route) { + return 'active'; + } + + return ''; + } + ); + } + + /** + * Will return "active" when a part of the route matches the argument. + * ie. "accounts" will match "accounts.index". + * + * @return TwigFunction + */ + protected function activeRoutePartial(): TwigFunction + { + return new TwigFunction( + 'activeRoutePartial', + static function (): string { + $args = func_get_args(); + $route = $args[0]; // name of the route. + $name = Route::getCurrentRoute()->getName() ?? ''; + if (false !== strpos($name, $route)) { + return 'active'; + } + + return ''; + } + ); + } + + /** + * This function will return "active" when the current route matches the first argument (even partly) + * but, the variable $objectType has been set and matches the second argument. + * + * @return TwigFunction + */ + protected function activeRoutePartialObjectType(): TwigFunction + { + return new TwigFunction( + 'activeRoutePartialObjectType', + static function ($context): string { + [, $route, $objectType] = func_get_args(); + $activeObjectType = $context['objectType'] ?? false; + + if ($objectType === $activeObjectType && false !== stripos(Route::getCurrentRoute()->getName(), $route)) { + return 'active'; + } + + return ''; + }, + ['needs_context' => true] + ); + } + + /** + * Will return "menu-open" when a part of the route matches the argument. + * ie. "accounts" will match "accounts.index". + * + * @return TwigFunction + */ + protected function menuOpenRoutePartial(): TwigFunction + { + return new TwigFunction( + 'menuOpenRoutePartial', + static function (): string { + $args = func_get_args(); + $route = $args[0]; // name of the route. + $name = Route::getCurrentRoute()->getName() ?? ''; + if (false !== strpos($name, $route)) { + return 'menu-open'; + } + + return ''; + } + ); + } + + /** + * Formats a string as a thing by converting it to a Carbon first. + * + * @return TwigFunction + */ + protected function formatDate(): TwigFunction + { + return new TwigFunction( + 'formatDate', + function (string $date, string $format): string { + $carbon = new Carbon($date); + + return $carbon->formatLocalized($format); + } + ); + } + + /** + * @return TwigFunction + * @deprecated because it uses a query in a view + * TODO remove me. + */ + protected function getMetaField(): TwigFunction + { + return new TwigFunction( + 'accountGetMetaField', + static function (Account $account, string $field): string { + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); + $result = $repository->getMetaValue($account, $field); + if (null === $result) { + return ''; + } + + return $result; + } + ); + } + + /** + * Will return true if the user is of role X. + * + * @return TwigFunction + */ + protected function hasRole(): TwigFunction + { + return new TwigFunction( + 'hasRole', + static function (string $role): bool { + $repository = app(UserRepositoryInterface::class); + if ($repository->hasRole(auth()->user(), $role)) { + return true; + } + + return false; + } + ); + } + + protected function getRootSearchOperator(): TwigFunction + { + return new TwigFunction( + 'getRootSearchOperator', + static function (string $operator): string { + return OperatorQuerySearch::getRootOperator($operator); + } + ); + } } diff --git a/app/Support/Twig/Rule.php b/app/Support/Twig/Rule.php index b09f891e61..45e197a9bd 100644 --- a/app/Support/Twig/Rule.php +++ b/app/Support/Twig/Rule.php @@ -32,25 +32,15 @@ use Twig\TwigFunction; class Rule extends AbstractExtension { /** - * @return TwigFunction + * @return array */ - public function allActionTriggers(): TwigFunction + public function getFunctions(): array { - return new TwigFunction( - 'allRuleActions', - static function () { - // array of valid values for actions - $ruleActions = array_keys(Config::get('firefly.rule-actions')); - $possibleActions = []; - foreach ($ruleActions as $key) { - $possibleActions[$key] = (string)trans('firefly.rule_action_' . $key . '_choice'); - } - unset($ruleActions); - asort($possibleActions); - - return $possibleActions; - } - ); + return [ + $this->allJournalTriggers(), + $this->allRuleTriggers(), + $this->allActionTriggers(), + ]; } /** @@ -93,14 +83,24 @@ class Rule extends AbstractExtension } /** - * @return array + * @return TwigFunction */ - public function getFunctions(): array + public function allActionTriggers(): TwigFunction { - return [ - $this->allJournalTriggers(), - $this->allRuleTriggers(), - $this->allActionTriggers(), - ]; + return new TwigFunction( + 'allRuleActions', + static function () { + // array of valid values for actions + $ruleActions = array_keys(Config::get('firefly.rule-actions')); + $possibleActions = []; + foreach ($ruleActions as $key) { + $possibleActions[$key] = (string)trans('firefly.rule_action_' . $key . '_choice'); + } + unset($ruleActions); + asort($possibleActions); + + return $possibleActions; + } + ); } } diff --git a/app/Support/Twig/TransactionGroupTwig.php b/app/Support/Twig/TransactionGroupTwig.php index 934411517e..31e9c558b1 100644 --- a/app/Support/Twig/TransactionGroupTwig.php +++ b/app/Support/Twig/TransactionGroupTwig.php @@ -29,7 +29,6 @@ use FireflyIII\Models\AccountType; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; -use Log; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -54,6 +53,226 @@ class TransactionGroupTwig extends AbstractExtension ]; } + /** + * Shows the amount for a single journal array. + * + * @return TwigFunction + */ + public function journalArrayAmount(): TwigFunction + { + return new TwigFunction( + 'journalArrayAmount', + function (array $array): string { + // if is not a withdrawal, amount positive. + $result = $this->normalJournalArrayAmount($array); + // now append foreign amount, if any. + if (null !== $array['foreign_amount']) { + $foreign = $this->foreignJournalArrayAmount($array); + $result = sprintf('%s (%s)', $result, $foreign); + } + + return $result; + }, + ['is_safe' => ['html']] + ); + } + + /** + * Generate normal amount for transaction from a transaction group. + * + * @param array $array + * + * @return string + */ + private function normalJournalArrayAmount(array $array): string + { + $type = $array['transaction_type_type'] ?? TransactionType::WITHDRAWAL; + $amount = $array['amount'] ?? '0'; + $colored = true; + $sourceType = $array['source_account_type'] ?? 'invalid'; + $amount = $this->signAmount($amount, $type, $sourceType); + + if ($type === TransactionType::TRANSFER) { + $colored = false; + } + + $result = app('amount')->formatFlat($array['currency_symbol'], (int)$array['currency_decimal_places'], $amount, $colored); + if ($type === TransactionType::TRANSFER) { + $result = sprintf('%s', $result); + } + + return $result; + } + + /** + * @param string $amount + * @param string $transactionType + * @param string $sourceType + * + * @return string + */ + private function signAmount(string $amount, string $transactionType, string $sourceType): string + { + + // withdrawals stay negative + if ($transactionType !== TransactionType::WITHDRAWAL) { + $amount = bcmul($amount, '-1'); + } + + // opening balance and it comes from initial balance? its expense. + if ($transactionType === TransactionType::OPENING_BALANCE && AccountType::INITIAL_BALANCE !== $sourceType) { + $amount = bcmul($amount, '-1'); + } + + // reconciliation and it comes from reconciliation? + if ($transactionType === TransactionType::RECONCILIATION && AccountType::RECONCILIATION !== $sourceType) { + $amount = bcmul($amount, '-1'); + } + + return $amount; + } + + /** + * Generate foreign amount for transaction from a transaction group. + * + * @param array $array + * + * @return string + */ + private function foreignJournalArrayAmount(array $array): string + { + $type = $array['transaction_type_type'] ?? TransactionType::WITHDRAWAL; + $amount = $array['foreign_amount'] ?? '0'; + $colored = true; + + $sourceType = $array['source_account_type'] ?? 'invalid'; + $amount = $this->signAmount($amount, $type, $sourceType); + + if ($type === TransactionType::TRANSFER) { + $colored = false; + } + $result = app('amount')->formatFlat($array['foreign_currency_symbol'], (int)$array['foreign_currency_decimal_places'], $amount, $colored); + if ($type === TransactionType::TRANSFER) { + $result = sprintf('%s', $result); + } + + return $result; + } + + /** + * Shows the amount for a single journal object. + * + * @return TwigFunction + */ + public function journalObjectAmount(): TwigFunction + { + return new TwigFunction( + 'journalObjectAmount', + function (TransactionJournal $journal): string { + $result = $this->normalJournalObjectAmount($journal); + // now append foreign amount, if any. + if ($this->journalObjectHasForeign($journal)) { + $foreign = $this->foreignJournalObjectAmount($journal); + $result = sprintf('%s (%s)', $result, $foreign); + } + + return $result; + }, + ['is_safe' => ['html']] + ); + } + + /** + * Generate normal amount for transaction from a transaction group. + * + * @param TransactionJournal $journal + * + * @return string + */ + private function normalJournalObjectAmount(TransactionJournal $journal): string + { + $type = $journal->transactionType->type; + $first = $journal->transactions()->where('amount', '<', 0)->first(); + $currency = $journal->transactionCurrency; + $amount = $first->amount ?? '0'; + $colored = true; + $sourceType = $first->account()->first()->accountType()->first()->type; + + $amount = $this->signAmount($amount, $type, $sourceType); + + if ($type === TransactionType::TRANSFER) { + $colored = false; + } + $result = app('amount')->formatFlat($currency->symbol, (int)$currency->decimal_places, $amount, $colored); + if ($type === TransactionType::TRANSFER) { + $result = sprintf('%s', $result); + } + + return $result; + } + + /** + * @param TransactionJournal $journal + * + * @return bool + */ + private function journalObjectHasForeign(TransactionJournal $journal): bool + { + /** @var Transaction $first */ + $first = $journal->transactions()->where('amount', '<', 0)->first(); + + return null !== $first->foreign_amount; + } + + /** + * Generate foreign amount for journal from a transaction group. + * + * @param TransactionJournal $journal + * + * @return string + */ + private function foreignJournalObjectAmount(TransactionJournal $journal): string + { + $type = $journal->transactionType->type; + /** @var Transaction $first */ + $first = $journal->transactions()->where('amount', '<', 0)->first(); + $currency = $first->foreignCurrency; + $amount = $first->foreign_amount ?? '0'; + $colored = true; + $sourceType = $first->account()->first()->accountType()->first()->type; + + $amount = $this->signAmount($amount, $type, $sourceType); + + if ($type === TransactionType::TRANSFER) { + $colored = false; + } + $result = app('amount')->formatFlat($currency->symbol, (int)$currency->decimal_places, $amount, $colored); + if ($type === TransactionType::TRANSFER) { + $result = sprintf('%s', $result); + } + + return $result; + } + + /** + * @return TwigFunction + */ + public function journalHasMeta(): TwigFunction + { + return new TwigFunction( + 'journalHasMeta', + static function (int $journalId, string $metaField) { + $count = DB::table('journal_meta') + ->where('name', $metaField) + ->where('transaction_journal_id', $journalId) + ->whereNull('deleted_at') + ->count(); + + return 1 === $count; + } + ); + } + /** * @return TwigFunction */ @@ -97,222 +316,4 @@ class TransactionGroupTwig extends AbstractExtension } ); } - - /** - * @return TwigFunction - */ - public function journalHasMeta(): TwigFunction - { - return new TwigFunction( - 'journalHasMeta', - static function (int $journalId, string $metaField) { - $count = DB::table('journal_meta') - ->where('name', $metaField) - ->where('transaction_journal_id', $journalId) - ->whereNull('deleted_at') - ->count(); - - return 1 === $count; - } - ); - } - - /** - * Shows the amount for a single journal array. - * - * @return TwigFunction - */ - public function journalArrayAmount(): TwigFunction - { - return new TwigFunction( - 'journalArrayAmount', - function (array $array): string { - // if is not a withdrawal, amount positive. - $result = $this->normalJournalArrayAmount($array); - // now append foreign amount, if any. - if (null !== $array['foreign_amount']) { - $foreign = $this->foreignJournalArrayAmount($array); - $result = sprintf('%s (%s)', $result, $foreign); - } - - return $result; - }, - ['is_safe' => ['html']] - ); - } - - /** - * Shows the amount for a single journal object. - * - * @return TwigFunction - */ - public function journalObjectAmount(): TwigFunction - { - return new TwigFunction( - 'journalObjectAmount', - function (TransactionJournal $journal): string { - $result = $this->normalJournalObjectAmount($journal); - // now append foreign amount, if any. - if ($this->journalObjectHasForeign($journal)) { - $foreign = $this->foreignJournalObjectAmount($journal); - $result = sprintf('%s (%s)', $result, $foreign); - } - - return $result; - }, - ['is_safe' => ['html']] - ); - } - - /** - * Generate foreign amount for transaction from a transaction group. - * - * @param array $array - * - * @return string - */ - private function foreignJournalArrayAmount(array $array): string - { - $type = $array['transaction_type_type'] ?? TransactionType::WITHDRAWAL; - $amount = $array['foreign_amount'] ?? '0'; - $colored = true; - - $sourceType = $array['source_account_type'] ?? 'invalid'; - $amount = $this->signAmount($amount, $type, $sourceType); - - if ($type === TransactionType::TRANSFER) { - $colored = false; - } - $result = app('amount')->formatFlat($array['foreign_currency_symbol'], (int) $array['foreign_currency_decimal_places'], $amount, $colored); - if ($type === TransactionType::TRANSFER) { - $result = sprintf('%s', $result); - } - - return $result; - } - - /** - * Generate foreign amount for journal from a transaction group. - * - * @param TransactionJournal $journal - * - * @return string - */ - private function foreignJournalObjectAmount(TransactionJournal $journal): string - { - $type = $journal->transactionType->type; - /** @var Transaction $first */ - $first = $journal->transactions()->where('amount', '<', 0)->first(); - $currency = $first->foreignCurrency; - $amount = $first->foreign_amount ?? '0'; - $colored = true; - $sourceType = $first->account()->first()->accountType()->first()->type; - - $amount = $this->signAmount($amount, $type, $sourceType); - - if ($type === TransactionType::TRANSFER) { - $colored = false; - } - $result = app('amount')->formatFlat($currency->symbol, (int) $currency->decimal_places, $amount, $colored); - if ($type === TransactionType::TRANSFER) { - $result = sprintf('%s', $result); - } - - return $result; - } - - /** - * Generate normal amount for transaction from a transaction group. - * - * @param array $array - * - * @return string - */ - private function normalJournalArrayAmount(array $array): string - { - $type = $array['transaction_type_type'] ?? TransactionType::WITHDRAWAL; - $amount = $array['amount'] ?? '0'; - $colored = true; - $sourceType = $array['source_account_type'] ?? 'invalid'; - $amount = $this->signAmount($amount, $type, $sourceType); - - if ($type === TransactionType::TRANSFER) { - $colored = false; - } - - $result = app('amount')->formatFlat($array['currency_symbol'], (int) $array['currency_decimal_places'], $amount, $colored); - if ($type === TransactionType::TRANSFER) { - $result = sprintf('%s', $result); - } - - return $result; - } - - /** - * Generate normal amount for transaction from a transaction group. - * - * @param TransactionJournal $journal - * - * @return string - */ - private function normalJournalObjectAmount(TransactionJournal $journal): string - { - $type = $journal->transactionType->type; - $first = $journal->transactions()->where('amount', '<', 0)->first(); - $currency = $journal->transactionCurrency; - $amount = $first->amount ?? '0'; - $colored = true; - $sourceType = $first->account()->first()->accountType()->first()->type; - - $amount = $this->signAmount($amount, $type, $sourceType); - - if ($type === TransactionType::TRANSFER) { - $colored = false; - } - $result = app('amount')->formatFlat($currency->symbol, (int) $currency->decimal_places, $amount, $colored); - if ($type === TransactionType::TRANSFER) { - $result = sprintf('%s', $result); - } - - return $result; - } - - /** - * @param TransactionJournal $journal - * @return bool - */ - private function journalObjectHasForeign(TransactionJournal $journal): bool - { - /** @var Transaction $first */ - $first = $journal->transactions()->where('amount', '<', 0)->first(); - - return null !== $first->foreign_amount; - } - - /** - * @param string $amount - * @param string $transactionType - * @param string $sourceType - * @return string - */ - private function signAmount(string $amount, string $transactionType, string $sourceType): string - { - - // withdrawals stay negative - if ($transactionType !== TransactionType::WITHDRAWAL) { - $amount = bcmul($amount, '-1'); - } - - // opening balance and it comes from initial balance? its expense. - if ($transactionType === TransactionType::OPENING_BALANCE && AccountType::INITIAL_BALANCE !== $sourceType) { - $amount = bcmul($amount, '-1'); - } - - // reconciliation and it comes from reconciliation? - if ($transactionType === TransactionType::RECONCILIATION && AccountType::RECONCILIATION !== $sourceType) { - $amount = bcmul($amount, '-1'); - } - - return $amount; - } } diff --git a/app/TransactionRules/Actions/AddTag.php b/app/TransactionRules/Actions/AddTag.php index e7c0d40290..db64b8adfd 100644 --- a/app/TransactionRules/Actions/AddTag.php +++ b/app/TransactionRules/Actions/AddTag.php @@ -74,7 +74,9 @@ class AddTag implements ActionInterface return true; } - Log::debug(sprintf('RuleAction AddTag fired but tag %d ("%s") was already added to journal %d.', $tag->id, $tag->tag, $journal['transaction_journal_id'])); + Log::debug( + sprintf('RuleAction AddTag fired but tag %d ("%s") was already added to journal %d.', $tag->id, $tag->tag, $journal['transaction_journal_id']) + ); return false; } diff --git a/app/TransactionRules/Actions/RemoveTag.php b/app/TransactionRules/Actions/RemoveTag.php index 80832ab7f4..f67a785dd3 100644 --- a/app/TransactionRules/Actions/RemoveTag.php +++ b/app/TransactionRules/Actions/RemoveTag.php @@ -26,6 +26,7 @@ use FireflyIII\Models\RuleAction; use FireflyIII\User; use Log; use DB; + /** * Class RemoveTag. */ @@ -57,12 +58,14 @@ class RemoveTag implements ActionInterface Log::debug(sprintf('RuleAction RemoveTag removed tag #%d ("%s") from journal #%d.', $tag->id, $tag->tag, $journal['transaction_journal_id'])); DB::table('tag_transaction_journal') ->where('transaction_journal_id', $journal['transaction_journal_id']) - ->where('tag_id', $tag->id) + ->where('tag_id', $tag->id) ->delete(); return true; } - Log::debug(sprintf('RuleAction RemoveTag tried to remove tag "%s" from journal #%d but no such tag exists.', $name, $journal['transaction_journal_id'])); + Log::debug( + sprintf('RuleAction RemoveTag tried to remove tag "%s" from journal #%d but no such tag exists.', $name, $journal['transaction_journal_id']) + ); return true; } diff --git a/app/TransactionRules/Actions/SetNotes.php b/app/TransactionRules/Actions/SetNotes.php index e86f53082d..4bf792e0bb 100644 --- a/app/TransactionRules/Actions/SetNotes.php +++ b/app/TransactionRules/Actions/SetNotes.php @@ -61,7 +61,12 @@ class SetNotes implements ActionInterface $dbNote->text = $this->action->action_value; $dbNote->save(); - Log::debug(sprintf('RuleAction SetNotes changed the notes of journal #%d from "%s" to "%s".', $journal['transaction_journal_id'], $oldNotes, $this->action->action_value)); + Log::debug( + sprintf( + 'RuleAction SetNotes changed the notes of journal #%d from "%s" to "%s".', $journal['transaction_journal_id'], $oldNotes, + $this->action->action_value + ) + ); return true; } diff --git a/app/TransactionRules/Engine/RuleEngineInterface.php b/app/TransactionRules/Engine/RuleEngineInterface.php index b61f175255..6f00d01350 100644 --- a/app/TransactionRules/Engine/RuleEngineInterface.php +++ b/app/TransactionRules/Engine/RuleEngineInterface.php @@ -52,16 +52,28 @@ use Illuminate\Support\Collection; interface RuleEngineInterface { /** - * @param User $user + * Add operators added to each search by the rule engine. + * + * @param array $operator */ - public function setUser(User $user): void; + public function addOperator(array $operator): void; /** - * Add rules for the engine to execute. - * - * @param Collection $rules + * Find all transactions only, dont apply anything. */ - public function setRules(Collection $rules): void; + public function find(): Collection; + + /** + * Fire the rule engine. + */ + public function fire(): void; + + /** + * Return the number of changed transactions from the previous "fire" action. + * + * @return int + */ + public function getResults(): int; /** * Add entire rule groups for the engine to execute. @@ -71,27 +83,15 @@ interface RuleEngineInterface public function setRuleGroups(Collection $ruleGroups): void; /** - * Add operators added to each search by the rule engine. + * Add rules for the engine to execute. * - * @param array $operator + * @param Collection $rules */ - public function addOperator(array $operator): void; + public function setRules(Collection $rules): void; /** - * Fire the rule engine. + * @param User $user */ - public function fire(): void; - - /** - * Find all transactions only, dont apply anything. - */ - public function find(): Collection; - - /** - * Return the number of changed transactions from the previous "fire" action. - * - * @return int - */ - public function getResults(): int; + public function setUser(User $user): void; } diff --git a/app/TransactionRules/Engine/SearchRuleEngine.php b/app/TransactionRules/Engine/SearchRuleEngine.php index b7f1477366..8474d58ea6 100644 --- a/app/TransactionRules/Engine/SearchRuleEngine.php +++ b/app/TransactionRules/Engine/SearchRuleEngine.php @@ -42,11 +42,11 @@ use Log; */ class SearchRuleEngine implements RuleEngineInterface { - private User $user; - private Collection $rules; - private array $operators; private Collection $groups; + private array $operators; private array $resultCount; + private Collection $rules; + private User $user; public function __construct() { @@ -56,43 +56,6 @@ class SearchRuleEngine implements RuleEngineInterface $this->resultCount = []; } - /** - * @inheritDoc - */ - public function setUser(User $user): void - { - $this->user = $user; - $this->operators = []; - } - - /** - * @inheritDoc - */ - public function setRules(Collection $rules): void - { - Log::debug(__METHOD__); - foreach ($rules as $rule) { - if ($rule instanceof Rule) { - Log::debug(sprintf('Adding a rule to the SearchRuleEngine: #%d ("%s")', $rule->id, $rule->title)); - $this->rules->push($rule); - } - } - } - - /** - * @inheritDoc - */ - public function setRuleGroups(Collection $ruleGroups): void - { - Log::debug(__METHOD__); - foreach ($ruleGroups as $group) { - if ($group instanceof RuleGroup) { - Log::debug(sprintf('Adding a rule group to the SearchRuleEngine: #%d ("%s")', $group->id, $group->title)); - $this->groups->push($group); - } - } - } - /** * @inheritDoc */ @@ -102,6 +65,27 @@ class SearchRuleEngine implements RuleEngineInterface $this->operators[] = $operator; } + /** + * + */ + public function find(): Collection + { + Log::debug('SearchRuleEngine::find()'); + $collection = new Collection; + foreach ($this->rules as $rule) { + $found = new Collection; + if (true === $rule->strict) { + $found = $this->findStrictRule($rule); + } + if (false === $rule->strict) { + $found = $this->findNonStrictRule($rule); + } + $collection = $collection->merge($found); + } + + return $collection->unique(); + } + /** * @inheritDoc * @throws FireflyException @@ -132,27 +116,6 @@ class SearchRuleEngine implements RuleEngineInterface Log::debug('SearchRuleEngine:: done processing all rules!'); } - /** - * - */ - public function find(): Collection - { - Log::debug('SearchRuleEngine::find()'); - $collection = new Collection; - foreach ($this->rules as $rule) { - $found = new Collection; - if (true === $rule->strict) { - $found = $this->findStrictRule($rule); - } - if (false === $rule->strict) { - $found = $this->findNonStrictRule($rule); - } - $collection = $collection->merge($found); - } - - return $collection->unique(); - } - /** * Return the number of changed transactions from the previous "fire" action. * @@ -163,6 +126,43 @@ class SearchRuleEngine implements RuleEngineInterface return count($this->resultCount); } + /** + * @inheritDoc + */ + public function setRuleGroups(Collection $ruleGroups): void + { + Log::debug(__METHOD__); + foreach ($ruleGroups as $group) { + if ($group instanceof RuleGroup) { + Log::debug(sprintf('Adding a rule group to the SearchRuleEngine: #%d ("%s")', $group->id, $group->title)); + $this->groups->push($group); + } + } + } + + /** + * @inheritDoc + */ + public function setRules(Collection $rules): void + { + Log::debug(__METHOD__); + foreach ($rules as $rule) { + if ($rule instanceof Rule) { + Log::debug(sprintf('Adding a rule to the SearchRuleEngine: #%d ("%s")', $rule->id, $rule->title)); + $this->rules->push($rule); + } + } + } + + /** + * @inheritDoc + */ + public function setUser(User $user): void + { + $this->user = $user; + $this->operators = []; + } + /** * Returns true if the rule has been triggered. * @@ -184,6 +184,152 @@ class SearchRuleEngine implements RuleEngineInterface return $this->fireNonStrictRule($rule); } + /** + * Return true if the rule is fired (the collection is larger than zero). + * + * @param Rule $rule + * + * @return bool + * @throws FireflyException + */ + private function fireStrictRule(Rule $rule): bool + { + Log::debug(sprintf('SearchRuleEngine::fireStrictRule(%d)!', $rule->id)); + $collection = $this->findStrictRule($rule); + + $this->processResults($rule, $collection); + Log::debug(sprintf('SearchRuleEngine:: done processing strict rule #%d', $rule->id)); + + $result = $collection->count() > 0; + if (true === $result) { + Log::debug(sprintf('SearchRuleEngine:: rule #%d was triggered (on %d transaction(s)).', $rule->id, $collection->count())); + + return true; + } + Log::debug(sprintf('SearchRuleEngine:: rule #%d was not triggered (on %d transaction(s)).', $rule->id, $collection->count())); + + return false; + } + + /** + * Finds the transactions a strict rule will execute on. + * + * @param Rule $rule + * + * @return Collection + */ + private function findStrictRule(Rule $rule): Collection + { + Log::debug(sprintf('Now in findStrictRule(#%d)', $rule->id ?? 0)); + $searchArray = []; + /** @var RuleTrigger $ruleTrigger */ + foreach ($rule->ruleTriggers as $ruleTrigger) { + // if needs no context, value is different: + $needsContext = config(sprintf('firefly.search.operators.%s.needs_context', $ruleTrigger->trigger_type)) ?? true; + if (false === $needsContext) { + Log::debug(sprintf('SearchRuleEngine:: add a rule trigger: %s:true', $ruleTrigger->trigger_type)); + $searchArray[$ruleTrigger->trigger_type][] = 'true'; + } + if (true === $needsContext) { + Log::debug(sprintf('SearchRuleEngine:: add a rule trigger: %s:"%s"', $ruleTrigger->trigger_type, $ruleTrigger->trigger_value)); + $searchArray[$ruleTrigger->trigger_type][] = sprintf('"%s"', $ruleTrigger->trigger_value); + } + } + + // add local operators: + foreach ($this->operators as $operator) { + Log::debug(sprintf('SearchRuleEngine:: add local added operator: %s:"%s"', $operator['type'], $operator['value'])); + $searchArray[$operator['type']][] = sprintf('"%s"', $operator['value']); + } + $date = today(config('app.timezone')); + if ($this->hasSpecificJournalTrigger($searchArray)) { + $date = $this->setDateFromJournalTrigger($searchArray); + } + + + // build and run the search engine. + $searchEngine = app(SearchInterface::class); + $searchEngine->setUser($this->user); + $searchEngine->setPage(1); + $searchEngine->setLimit(31337); + $searchEngine->setDate($date); + + foreach ($searchArray as $type => $searches) { + foreach ($searches as $value) { + $searchEngine->parseQuery(sprintf('%s:%s', $type, $value)); + } + } + + $result = $searchEngine->searchTransactions(); + + return $result->getCollection(); + } + + /** + * Search in the triggers of this particular search and if it contains + * one search operator for "journal_id" it means the date ranges + * in the search may need to be updated. + * + * @param array $array + * + * @return bool + */ + private function hasSpecificJournalTrigger(array $array): bool + { + Log::debug('Now in hasSpecificJournalTrigger.'); + $journalTrigger = false; + $dateTrigger = false; + foreach ($array as $triggerName => $values) { + if ('journal_id' === $triggerName) { + if (is_array($values) && 1 === count($values)) { + Log::debug('Found a journal_id trigger with 1 journal, true.'); + $journalTrigger = true; + } + } + if (in_array($triggerName, ['date_is', 'date', 'on', 'date_before', 'before', 'date_after', 'after'], true)) { + Log::debug('Found a date related trigger, set to true.'); + $dateTrigger = true; + } + } + $result = $journalTrigger && $dateTrigger; + Log::debug(sprintf('Result of hasSpecificJournalTrigger is %s.', var_export($result, true))); + + return $result; + } + + /** + * @param array $array + * + * @return Carbon + */ + private function setDateFromJournalTrigger(array $array): Carbon + { + Log::debug('Now in setDateFromJournalTrigger()'); + $journalId = 0; + foreach ($array as $triggerName => $values) { + if ('journal_id' === $triggerName) { + if (is_array($values) && 1 === count($values)) { + $journalId = (int)trim(($values[0] ?? '"0"'), '"'); // follows format "123". + Log::debug(sprintf('Found journal ID #%d', $journalId)); + } + } + } + if (0 !== $journalId) { + $repository = app(JournalRepositoryInterface::class); + $repository->setUser($this->user); + $journal = $repository->findNull($journalId); + if (null !== $journal) { + $date = $journal->date; + Log::debug(sprintf('Found journal #%d with date %s.', $journal->id, $journal->date->format('Y-m-d'))); + + return $date; + } + } + Log::debug('Found no journal, return default date.'); + + return today(config('app.timezone')); + } + /** * @param Rule $rule * @param Collection $collection @@ -272,33 +418,6 @@ class SearchRuleEngine implements RuleEngineInterface return false; } - /** - * Return true if the rule is fired (the collection is larger than zero). - * - * @param Rule $rule - * - * @return bool - * @throws FireflyException - */ - private function fireStrictRule(Rule $rule): bool - { - Log::debug(sprintf('SearchRuleEngine::fireStrictRule(%d)!', $rule->id)); - $collection = $this->findStrictRule($rule); - - $this->processResults($rule, $collection); - Log::debug(sprintf('SearchRuleEngine:: done processing strict rule #%d', $rule->id)); - - $result = $collection->count() > 0; - if (true === $result) { - Log::debug(sprintf('SearchRuleEngine:: rule #%d was triggered (on %d transaction(s)).', $rule->id, $collection->count())); - - return true; - } - Log::debug(sprintf('SearchRuleEngine:: rule #%d was not triggered (on %d transaction(s)).', $rule->id, $collection->count())); - - return false; - } - /** * Return true if the rule is fired (the collection is larger than zero). * @@ -318,60 +437,6 @@ class SearchRuleEngine implements RuleEngineInterface return $collection->count() > 0; } - /** - * Finds the transactions a strict rule will execute on. - * - * @param Rule $rule - * - * @return Collection - */ - private function findStrictRule(Rule $rule): Collection - { - Log::debug(sprintf('Now in findStrictRule(#%d)', $rule->id ?? 0)); - $searchArray = []; - /** @var RuleTrigger $ruleTrigger */ - foreach ($rule->ruleTriggers as $ruleTrigger) { - // if needs no context, value is different: - $needsContext = config(sprintf('firefly.search.operators.%s.needs_context', $ruleTrigger->trigger_type)) ?? true; - if (false === $needsContext) { - Log::debug(sprintf('SearchRuleEngine:: add a rule trigger: %s:true', $ruleTrigger->trigger_type)); - $searchArray[$ruleTrigger->trigger_type][] = 'true'; - } - if (true === $needsContext) { - Log::debug(sprintf('SearchRuleEngine:: add a rule trigger: %s:"%s"', $ruleTrigger->trigger_type, $ruleTrigger->trigger_value)); - $searchArray[$ruleTrigger->trigger_type][] = sprintf('"%s"', $ruleTrigger->trigger_value); - } - } - - // add local operators: - foreach ($this->operators as $operator) { - Log::debug(sprintf('SearchRuleEngine:: add local added operator: %s:"%s"', $operator['type'], $operator['value'])); - $searchArray[$operator['type']][] = sprintf('"%s"', $operator['value']); - } - $date = today(config('app.timezone')); - if ($this->hasSpecificJournalTrigger($searchArray)) { - $date = $this->setDateFromJournalTrigger($searchArray); - } - - - // build and run the search engine. - $searchEngine = app(SearchInterface::class); - $searchEngine->setUser($this->user); - $searchEngine->setPage(1); - $searchEngine->setLimit(31337); - $searchEngine->setDate($date); - - foreach ($searchArray as $type => $searches) { - foreach ($searches as $value) { - $searchEngine->parseQuery(sprintf('%s:%s', $type, $value)); - } - } - - $result = $searchEngine->searchTransactions(); - - return $result->getCollection(); - } - /** * @param Rule $rule * @@ -444,38 +509,6 @@ class SearchRuleEngine implements RuleEngineInterface return $unique; } - /** - * Search in the triggers of this particular search and if it contains - * one search operator for "journal_id" it means the date ranges - * in the search may need to be updated. - * - * @param array $array - * - * @return bool - */ - private function hasSpecificJournalTrigger(array $array): bool - { - Log::debug('Now in hasSpecificJournalTrigger.'); - $journalTrigger = false; - $dateTrigger = false; - foreach ($array as $triggerName => $values) { - if ('journal_id' === $triggerName) { - if (is_array($values) && 1 === count($values)) { - Log::debug('Found a journal_id trigger with 1 journal, true.'); - $journalTrigger = true; - } - } - if (in_array($triggerName, ['date_is', 'date', 'on', 'date_before', 'before', 'date_after', 'after'], true)) { - Log::debug('Found a date related trigger, set to true.'); - $dateTrigger = true; - } - } - $result = $journalTrigger && $dateTrigger; - Log::debug(sprintf('Result of hasSpecificJournalTrigger is %s.', var_export($result, true))); - - return $result; - } - /** * @param RuleGroup $group * @@ -501,37 +534,4 @@ class SearchRuleEngine implements RuleEngineInterface return $all; } - - /** - * @param array $array - * - * @return Carbon - */ - private function setDateFromJournalTrigger(array $array): Carbon - { - Log::debug('Now in setDateFromJournalTrigger()'); - $journalId = 0; - foreach ($array as $triggerName => $values) { - if ('journal_id' === $triggerName) { - if (is_array($values) && 1 === count($values)) { - $journalId = (int)trim(($values[0] ?? '"0"'), '"'); // follows format "123". - Log::debug(sprintf('Found journal ID #%d', $journalId)); - } - } - } - if (0 !== $journalId) { - $repository = app(JournalRepositoryInterface::class); - $repository->setUser($this->user); - $journal = $repository->findNull($journalId); - if (null !== $journal) { - $date = $journal->date; - Log::debug(sprintf('Found journal #%d with date %s.', $journal->id, $journal->date->format('Y-m-d'))); - - return $date; - } - } - Log::debug('Found no journal, return default date.'); - - return today(config('app.timezone')); - } } diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index 711f134c9d..79436a89c6 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -149,22 +149,16 @@ class AccountTransformer extends AbstractTransformer } /** - * @param Account $account - * @param string|null $accountRole - * @param string $accountType - * - * @return array + * @return Carbon */ - private function getCCInfo(Account $account, ?string $accountRole, string $accountType): array + private function getDate(): Carbon { - $monthlyPaymentDate = null; - $creditCardType = null; - if ('ccAsset' === $accountRole && 'asset' === $accountType) { - $creditCardType = $this->repository->getMetaValue($account, 'cc_type'); - $monthlyPaymentDate = $this->repository->getMetaValue($account, 'cc_monthly_payment_date'); + $date = today(config('app.timezone')); + if (null !== $this->parameters->get('date')) { + $date = $this->parameters->get('date'); } - return [$creditCardType, $monthlyPaymentDate]; + return $date; } /** @@ -189,34 +183,22 @@ class AccountTransformer extends AbstractTransformer } /** - * @return Carbon - */ - private function getDate(): Carbon - { - $date = today(config('app.timezone')); - if (null !== $this->parameters->get('date')) { - $date = $this->parameters->get('date'); - } - - return $date; - } - - /** - * @param Account $account - * @param string $accountType + * @param Account $account + * @param string|null $accountRole + * @param string $accountType * * @return array */ - private function getInterest(Account $account, string $accountType): array + private function getCCInfo(Account $account, ?string $accountRole, string $accountType): array { - $interest = null; - $interestPeriod = null; - if ('liabilities' === $accountType) { - $interest = $this->repository->getMetaValue($account, 'interest'); - $interestPeriod = $this->repository->getMetaValue($account, 'interest_period'); + $monthlyPaymentDate = null; + $creditCardType = null; + if ('ccAsset' === $accountRole && 'asset' === $accountType) { + $creditCardType = $this->repository->getMetaValue($account, 'cc_type'); + $monthlyPaymentDate = $this->repository->getMetaValue($account, 'cc_monthly_payment_date'); } - return [$interest, $interestPeriod]; + return [$creditCardType, $monthlyPaymentDate]; } /** @@ -241,4 +223,22 @@ class AccountTransformer extends AbstractTransformer return [$openingBalance, $openingBalanceDate]; } + + /** + * @param Account $account + * @param string $accountType + * + * @return array + */ + private function getInterest(Account $account, string $accountType): array + { + $interest = null; + $interestPeriod = null; + if ('liabilities' === $accountType) { + $interest = $this->repository->getMetaValue($account, 'interest'); + $interestPeriod = $this->repository->getMetaValue($account, 'interest_period'); + } + + return [$interest, $interestPeriod]; + } } diff --git a/app/Transformers/AttachmentTransformer.php b/app/Transformers/AttachmentTransformer.php index 34d2f4ade1..d410c8dd88 100644 --- a/app/Transformers/AttachmentTransformer.php +++ b/app/Transformers/AttachmentTransformer.php @@ -26,7 +26,6 @@ namespace FireflyIII\Transformers; use FireflyIII\Models\Attachment; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; -use Log; /** * Class AttachmentTransformer diff --git a/app/Transformers/AvailableBudgetTransformer.php b/app/Transformers/AvailableBudgetTransformer.php index 538a18547f..f6f504f9e1 100644 --- a/app/Transformers/AvailableBudgetTransformer.php +++ b/app/Transformers/AvailableBudgetTransformer.php @@ -29,16 +29,15 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\NoBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use Illuminate\Support\Collection; -use Log; /** * Class AvailableBudgetTransformer */ class AvailableBudgetTransformer extends AbstractTransformer { - private NoBudgetRepositoryInterface $noBudgetRepository; + private NoBudgetRepositoryInterface $noBudgetRepository; private OperationsRepositoryInterface $opsRepository; - private BudgetRepositoryInterface $repository; + private BudgetRepositoryInterface $repository; /** * CurrencyTransformer constructor. @@ -68,11 +67,11 @@ class AvailableBudgetTransformer extends AbstractTransformer 'id' => (string)$availableBudget->id, 'created_at' => $availableBudget->created_at->toAtomString(), 'updated_at' => $availableBudget->updated_at->toAtomString(), - 'currency_id' => (string) $currency->id, + 'currency_id' => (string)$currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => (int) $currency->decimal_places, - 'amount' => number_format((float) $availableBudget->amount, $currency->decimal_places, '.', ''), + 'currency_decimal_places' => (int)$currency->decimal_places, + 'amount' => number_format((float)$availableBudget->amount, $currency->decimal_places, '.', ''), 'start' => $availableBudget->start_date->format('Y-m-d'), 'end' => $availableBudget->end_date->format('Y-m-d'), 'spent_in_budgets' => [], diff --git a/app/Transformers/BillTransformer.php b/app/Transformers/BillTransformer.php index 1f5da82d73..4af76d1fb9 100644 --- a/app/Transformers/BillTransformer.php +++ b/app/Transformers/BillTransformer.php @@ -29,7 +29,6 @@ use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use Illuminate\Support\Collection; -use Log; /** * Class BillTransformer @@ -72,8 +71,8 @@ class BillTransformer extends AbstractTransformer /** @var ObjectGroup $objectGroup */ $objectGroup = $bill->objectGroups->first(); if (null !== $objectGroup) { - $objectGroupId = (int) $objectGroup->id; - $objectGroupOrder = (int) $objectGroup->order; + $objectGroupId = (int)$objectGroup->id; + $objectGroupOrder = (int)$objectGroup->order; $objectGroupTitle = $objectGroup->title; } @@ -81,18 +80,18 @@ class BillTransformer extends AbstractTransformer 'id' => (int)$bill->id, 'created_at' => $bill->created_at->toAtomString(), 'updated_at' => $bill->updated_at->toAtomString(), - 'currency_id' => (string) $bill->transaction_currency_id, + 'currency_id' => (string)$bill->transaction_currency_id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => (int) $currency->decimal_places, + 'currency_decimal_places' => (int)$currency->decimal_places, 'name' => $bill->name, - 'amount_min' => number_format((float) $bill->amount_min, $currency->decimal_places, '.', ''), - 'amount_max' => number_format((float) $bill->amount_max, $currency->decimal_places, '.', ''), + 'amount_min' => number_format((float)$bill->amount_min, $currency->decimal_places, '.', ''), + 'amount_max' => number_format((float)$bill->amount_max, $currency->decimal_places, '.', ''), 'date' => $bill->date->format('Y-m-d'), 'repeat_freq' => $bill->repeat_freq, - 'skip' => (int) $bill->skip, + 'skip' => (int)$bill->skip, 'active' => $bill->active, - 'order' => (int) $bill->order, + 'order' => (int)$bill->order, 'notes' => $notes, 'next_expected_match' => $paidData['next_expected_match'], 'pay_dates' => $payDates, @@ -109,52 +108,6 @@ class BillTransformer extends AbstractTransformer ]; } - /** - * Returns the latest date in the set, or start when set is empty. - * - * @param Collection $dates - * @param Carbon $default - * - * @return Carbon - */ - protected function lastPaidDate(Collection $dates, Carbon $default): Carbon - { - if (0 === $dates->count()) { - return $default; // @codeCoverageIgnore - } - $latest = $dates->first()->date; - /** @var TransactionJournal $date */ - foreach ($dates as $journal) { - if ($journal->date->gte($latest)) { - $latest = $journal->date; - } - } - - return $latest; - } - - /** - * Given a bill and a date, this method will tell you at which moment this bill expects its next - * transaction. Whether or not it is there already, is not relevant. - * - * @param Bill $bill - * @param Carbon $date - * - * @return Carbon - */ - protected function nextDateMatch(Bill $bill, Carbon $date): Carbon - { - //Log::debug(sprintf('Now in nextDateMatch(%d, %s)', $bill->id, $date->format('Y-m-d'))); - $start = clone $bill->date; - //Log::debug(sprintf('Bill start date is %s', $start->format('Y-m-d'))); - while ($start < $date) { - $start = app('navigation')->addPeriod($start, $bill->repeat_freq, $bill->skip); - } - //Log::debug(sprintf('End of loop, bill start date is now %s', $start->format('Y-m-d'))); - - return $start; - } - /** * Get the data the bill was paid and predict the next expected match. * @@ -166,7 +119,7 @@ class BillTransformer extends AbstractTransformer { //Log::debug(sprintf('Now in paidData for bill #%d', $bill->id)); if (null === $this->parameters->get('start') || null === $this->parameters->get('end')) { - // Log::debug('parameters are NULL, return empty array'); + // Log::debug('parameters are NULL, return empty array'); return [ 'paid_dates' => [], @@ -202,7 +155,7 @@ class BillTransformer extends AbstractTransformer $nextMatch = app('navigation')->addPeriod($nextMatch, $bill->repeat_freq, $bill->skip); //Log::debug(sprintf('Next match is now %s.', $nextMatch->format('Y-m-d'))); } - if($nextMatch->isSameDay($lastPaidDate)) { + if ($nextMatch->isSameDay($lastPaidDate)) { /* * Add another period because its the same day as the last paid date. */ @@ -224,11 +177,36 @@ class BillTransformer extends AbstractTransformer 'paid_dates' => $result, 'next_expected_match' => $nextMatch->format('Y-m-d'), ]; + //Log::debug('Result', $result); return $result; } + /** + * Returns the latest date in the set, or start when set is empty. + * + * @param Collection $dates + * @param Carbon $default + * + * @return Carbon + */ + protected function lastPaidDate(Collection $dates, Carbon $default): Carbon + { + if (0 === $dates->count()) { + return $default; // @codeCoverageIgnore + } + $latest = $dates->first()->date; + /** @var TransactionJournal $date */ + foreach ($dates as $journal) { + if ($journal->date->gte($latest)) { + $latest = $journal->date; + } + } + + return $latest; + } + /** * @param Bill $bill * @@ -262,8 +240,31 @@ class BillTransformer extends AbstractTransformer return $date->format('Y-m-d'); } ); - $array = $simple->toArray(); + $array = $simple->toArray(); return $array; } + + /** + * Given a bill and a date, this method will tell you at which moment this bill expects its next + * transaction. Whether or not it is there already, is not relevant. + * + * @param Bill $bill + * @param Carbon $date + * + * @return Carbon + */ + protected function nextDateMatch(Bill $bill, Carbon $date): Carbon + { + //Log::debug(sprintf('Now in nextDateMatch(%d, %s)', $bill->id, $date->format('Y-m-d'))); + $start = clone $bill->date; + //Log::debug(sprintf('Bill start date is %s', $start->format('Y-m-d'))); + while ($start < $date) { + $start = app('navigation')->addPeriod($start, $bill->repeat_freq, $bill->skip); + } + + //Log::debug(sprintf('End of loop, bill start date is now %s', $start->format('Y-m-d'))); + + return $start; + } } diff --git a/app/Transformers/BudgetLimitTransformer.php b/app/Transformers/BudgetLimitTransformer.php index 0e81a6dc2a..7bf3a04280 100644 --- a/app/Transformers/BudgetLimitTransformer.php +++ b/app/Transformers/BudgetLimitTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; use FireflyIII\Models\BudgetLimit; -use FireflyIII\Repositories\Budget\BudgetLimitRepository; use FireflyIII\Repositories\Budget\OperationsRepository; use Illuminate\Support\Collection; use League\Fractal\Resource\Item; @@ -63,7 +62,9 @@ class BudgetLimitTransformer extends AbstractTransformer { $repository = app(OperationsRepository::class); $repository->setUser($budgetLimit->budget->user); - $expenses = $repository->sumExpenses($budgetLimit->start_date, $budgetLimit->end_date, null, new Collection([$budgetLimit->budget]), $budgetLimit->transactionCurrency); + $expenses = $repository->sumExpenses( + $budgetLimit->start_date, $budgetLimit->end_date, null, new Collection([$budgetLimit->budget]), $budgetLimit->transactionCurrency + ); $currency = $budgetLimit->transactionCurrency; @@ -84,13 +85,13 @@ class BudgetLimitTransformer extends AbstractTransformer $amount = number_format((float)$amount, $currencyDecimalPlaces, '.', ''); return [ - 'id' => (string) $budgetLimit->id, + 'id' => (string)$budgetLimit->id, 'created_at' => $budgetLimit->created_at->toAtomString(), 'updated_at' => $budgetLimit->updated_at->toAtomString(), 'start' => $budgetLimit->start_date->format('Y-m-d'), 'end' => $budgetLimit->end_date->format('Y-m-d'), 'budget_id' => (string)$budgetLimit->budget_id, - 'currency_id' => (string) $currencyId, + 'currency_id' => (string)$currencyId, 'currency_code' => $currencyCode, 'currency_name' => $currencyName, 'currency_decimal_places' => $currencyDecimalPlaces, diff --git a/app/Transformers/BudgetTransformer.php b/app/Transformers/BudgetTransformer.php index 4b32c539ff..2be1ba1e36 100644 --- a/app/Transformers/BudgetTransformer.php +++ b/app/Transformers/BudgetTransformer.php @@ -87,6 +87,7 @@ class BudgetTransformer extends AbstractTransformer $abAmount = number_format((float)$autoBudget->amount, $autoBudget->transactionCurrency->decimal_places, '.', ''); $abPeriod = $autoBudget->period; } + return [ 'id' => (string)$budget->id, 'created_at' => $budget->created_at->toAtomString(), diff --git a/app/Transformers/CurrencyExchangeRateTransformer.php b/app/Transformers/CurrencyExchangeRateTransformer.php index 5b8a6e905e..d7fdbdea63 100644 --- a/app/Transformers/CurrencyExchangeRateTransformer.php +++ b/app/Transformers/CurrencyExchangeRateTransformer.php @@ -38,22 +38,23 @@ class CurrencyExchangeRateTransformer extends AbstractTransformer */ public function transform(CurrencyExchangeRate $rate): array { - $result = number_format((float) $rate->rate * (float) $this->parameters->get('amount'), $rate->toCurrency->decimal_places, '.', ''); + $result = number_format((float)$rate->rate * (float)$this->parameters->get('amount'), $rate->toCurrency->decimal_places, '.', ''); $result = 0.0 === $result ? null : $result; + return [ 'id' => (int)$rate->id, 'created_at' => $rate->created_at->toAtomString(), 'updated_at' => $rate->updated_at->toAtomString(), - 'from_currency_id' => (int) $rate->fromCurrency->id, + 'from_currency_id' => (int)$rate->fromCurrency->id, 'from_currency_name' => $rate->fromCurrency->name, 'from_currency_code' => $rate->fromCurrency->code, 'from_currency_symbol' => $rate->fromCurrency->symbol, - 'from_currency_decimal_places' => (int) $rate->fromCurrency->decimal_places, - 'to_currency_id' => (int) $rate->toCurrency->id, + 'from_currency_decimal_places' => (int)$rate->fromCurrency->decimal_places, + 'to_currency_id' => (int)$rate->toCurrency->id, 'to_currency_name' => $rate->toCurrency->name, 'to_currency_code' => $rate->toCurrency->code, 'to_currency_symbol' => $rate->toCurrency->symbol, - 'to_currency_decimal_places' => (int) $rate->toCurrency->decimal_places, + 'to_currency_decimal_places' => (int)$rate->toCurrency->decimal_places, 'date' => $rate->date->format('Y-m-d'), 'rate' => (float)$rate->rate, 'amount' => $result, diff --git a/app/Transformers/CurrencyTransformer.php b/app/Transformers/CurrencyTransformer.php index bf9ecedec1..0c3e1b7966 100644 --- a/app/Transformers/CurrencyTransformer.php +++ b/app/Transformers/CurrencyTransformer.php @@ -43,10 +43,11 @@ class CurrencyTransformer extends AbstractTransformer $isDefault = false; $defaultCurrency = $this->parameters->get('defaultCurrency'); if (null !== $defaultCurrency) { - $isDefault = (int) $defaultCurrency->id === (int) $currency->id; + $isDefault = (int)$defaultCurrency->id === (int)$currency->id; } + return [ - 'id' => (int) $currency->id, + 'id' => (int)$currency->id, 'created_at' => $currency->created_at->toAtomString(), 'updated_at' => $currency->updated_at->toAtomString(), 'default' => $isDefault, @@ -54,7 +55,7 @@ class CurrencyTransformer extends AbstractTransformer 'name' => $currency->name, 'code' => $currency->code, 'symbol' => $currency->symbol, - 'decimal_places' => (int) $currency->decimal_places, + 'decimal_places' => (int)$currency->decimal_places, 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/ObjectGroupTransformer.php b/app/Transformers/ObjectGroupTransformer.php index 7641fb341a..e71da4d0c1 100644 --- a/app/Transformers/ObjectGroupTransformer.php +++ b/app/Transformers/ObjectGroupTransformer.php @@ -26,7 +26,6 @@ namespace FireflyIII\Transformers; use FireflyIII\Models\ObjectGroup; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; -use Log; /** * Class AccountTransformer @@ -58,11 +57,11 @@ class ObjectGroupTransformer extends AbstractTransformer $this->repository->setUser($objectGroup->user); return [ - 'id' => (string) $objectGroup->id, + 'id' => (string)$objectGroup->id, 'created_at' => $objectGroup->created_at->toAtomString(), 'updated_at' => $objectGroup->updated_at->toAtomString(), 'title' => $objectGroup->title, - 'order' => (int) $objectGroup->order, + 'order' => (int)$objectGroup->order, 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/PiggyBankEventTransformer.php b/app/Transformers/PiggyBankEventTransformer.php index e34e4ae714..c5a9e4f48e 100644 --- a/app/Transformers/PiggyBankEventTransformer.php +++ b/app/Transformers/PiggyBankEventTransformer.php @@ -88,7 +88,7 @@ class PiggyBankEventTransformer extends AbstractTransformer 'currency_symbol' => $currency->symbol, 'currency_decimal_places' => (int)$currency->decimal_places, 'transaction_journal_id' => $journalId ? (string)$journalId : null, - 'transaction_group_id' => $groupId ? (string)$groupId: null, + 'transaction_group_id' => $groupId ? (string)$groupId : null, 'links' => [ [ 'rel' => 'self', diff --git a/app/Transformers/PiggyBankTransformer.php b/app/Transformers/PiggyBankTransformer.php index 6f07503aa1..41fac2d3bb 100644 --- a/app/Transformers/PiggyBankTransformer.php +++ b/app/Transformers/PiggyBankTransformer.php @@ -36,8 +36,8 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; */ class PiggyBankTransformer extends AbstractTransformer { - private AccountRepositoryInterface $accountRepos; - private CurrencyRepositoryInterface $currencyRepos; + private AccountRepositoryInterface $accountRepos; + private CurrencyRepositoryInterface $currencyRepos; private PiggyBankRepositoryInterface $piggyRepos; /** @@ -83,14 +83,14 @@ class PiggyBankTransformer extends AbstractTransformer /** @var ObjectGroup $objectGroup */ $objectGroup = $piggyBank->objectGroups->first(); if (null !== $objectGroup) { - $objectGroupId = (int) $objectGroup->id; - $objectGroupOrder = (int) $objectGroup->order; + $objectGroupId = (int)$objectGroup->id; + $objectGroupOrder = (int)$objectGroup->order; $objectGroupTitle = $objectGroup->title; } // get currently saved amount: $currentAmountStr = $this->piggyRepos->getCurrentAmount($piggyBank); - $currentAmount = number_format((float) $currentAmountStr, $currency->decimal_places, '.', ''); + $currentAmount = number_format((float)$currentAmountStr, $currency->decimal_places, '.', ''); // left to save: $leftToSave = bcsub($piggyBank->targetamount, $currentAmountStr); @@ -99,27 +99,28 @@ class PiggyBankTransformer extends AbstractTransformer // target and percentage: $targetAmount = $piggyBank->targetamount; - $targetAmount = 1 === bccomp('0.01', (string) $targetAmount) ? '0.01' : $targetAmount; - $percentage = (int) (0 !== bccomp('0', $currentAmountStr) ? $currentAmountStr / $targetAmount * 100 : 0); + $targetAmount = 1 === bccomp('0.01', (string)$targetAmount) ? '0.01' : $targetAmount; + $percentage = (int)(0 !== bccomp('0', $currentAmountStr) ? $currentAmountStr / $targetAmount * 100 : 0); + return [ - 'id' => (string) $piggyBank->id, + 'id' => (string)$piggyBank->id, 'created_at' => $piggyBank->created_at->toAtomString(), 'updated_at' => $piggyBank->updated_at->toAtomString(), - 'account_id' => (string) $piggyBank->account_id, + 'account_id' => (string)$piggyBank->account_id, 'account_name' => $piggyBank->account->name, 'name' => $piggyBank->name, - 'currency_id' => (string) $currency->id, + 'currency_id' => (string)$currency->id, 'currency_code' => $currency->code, 'currency_symbol' => $currency->symbol, - 'currency_decimal_places' => (int) $currency->decimal_places, - 'target_amount' => number_format((float) $targetAmount, $currency->decimal_places, '.', ''), + 'currency_decimal_places' => (int)$currency->decimal_places, + 'target_amount' => number_format((float)$targetAmount, $currency->decimal_places, '.', ''), 'percentage' => $percentage, 'current_amount' => $currentAmount, - 'left_to_save' => number_format((float) $leftToSave, $currency->decimal_places, '.', ''), - 'save_per_month' => number_format((float) $this->piggyRepos->getSuggestedMonthlyAmount($piggyBank), $currency->decimal_places, '.', ''), + 'left_to_save' => number_format((float)$leftToSave, $currency->decimal_places, '.', ''), + 'save_per_month' => number_format((float)$this->piggyRepos->getSuggestedMonthlyAmount($piggyBank), $currency->decimal_places, '.', ''), 'start_date' => $startDate, 'target_date' => $targetDate, - 'order' => (int) $piggyBank->order, + 'order' => (int)$piggyBank->order, 'active' => true, 'notes' => $notes, 'object_group_id' => $objectGroupId ? (string)$objectGroupId : null, diff --git a/app/Transformers/PreferenceTransformer.php b/app/Transformers/PreferenceTransformer.php index 89c6db70e8..1455cc0cd8 100644 --- a/app/Transformers/PreferenceTransformer.php +++ b/app/Transformers/PreferenceTransformer.php @@ -25,7 +25,6 @@ namespace FireflyIII\Transformers; use FireflyIII\Models\Preference; -use Log; /** * Class PreferenceTransformer diff --git a/app/Transformers/RecurrenceTransformer.php b/app/Transformers/RecurrenceTransformer.php index 6f794758e9..c8e063a96e 100644 --- a/app/Transformers/RecurrenceTransformer.php +++ b/app/Transformers/RecurrenceTransformer.php @@ -148,61 +148,6 @@ class RecurrenceTransformer extends AbstractTransformer return $return; } - /** - * @param RecurrenceTransaction $transaction - * @param array $array - * - * @return array - * @throws FireflyException - */ - private function getTransactionMeta(RecurrenceTransaction $transaction, array $array): array - { - Log::debug(sprintf('Now in %s', __METHOD__)); - $array['tags'] = []; - $array['category_id'] = null; - $array['category_name'] = null; - $array['budget_id'] = null; - $array['budget_name'] = null; - $array['piggy_bank_id'] = null; - $array['piggy_bank_name'] = null; - - /** @var RecurrenceTransactionMeta $transactionMeta */ - foreach ($transaction->recurrenceTransactionMeta as $transactionMeta) { - switch ($transactionMeta->name) { - default: - throw new FireflyException(sprintf('Recurrence transformer cant handle field "%s"', $transactionMeta->name)); - case 'bill_id': - break; - case 'tags': - $array['tags'] = json_decode($transactionMeta->value); - break; - case 'piggy_bank_id': - $piggy = $this->piggyRepos->findNull((int)$transactionMeta->value); - if (null !== $piggy) { - $array['piggy_bank_id'] = (string)$piggy->id; - $array['piggy_bank_name'] = $piggy->name; - } - break; - case 'category_name': - $category = $this->factory->findOrCreate(null, $transactionMeta->value); - if (null !== $category) { - $array['category_id'] = (string)$category->id; - $array['category_name'] = $category->name; - } - break; - case 'budget_id': - $budget = $this->budgetRepos->findNull((int)$transactionMeta->value); - if (null !== $budget) { - $array['budget_id'] = (string)$budget->id; - $array['budget_name'] = $budget->name; - } - break; - } - } - - return $array; - } - /** * @param Recurrence $recurrence * @@ -293,4 +238,67 @@ class RecurrenceTransformer extends AbstractTransformer return $return; } + /** + * @param RecurrenceTransaction $transaction + * @param array $array + * + * @return array + * @throws FireflyException + */ + private function getTransactionMeta(RecurrenceTransaction $transaction, array $array): array + { + Log::debug(sprintf('Now in %s', __METHOD__)); + $array['tags'] = []; + $array['category_id'] = null; + $array['category_name'] = null; + $array['budget_id'] = null; + $array['budget_name'] = null; + $array['piggy_bank_id'] = null; + $array['piggy_bank_name'] = null; + + /** @var RecurrenceTransactionMeta $transactionMeta */ + foreach ($transaction->recurrenceTransactionMeta as $transactionMeta) { + switch ($transactionMeta->name) { + default: + throw new FireflyException(sprintf('Recurrence transformer cant handle field "%s"', $transactionMeta->name)); + case 'bill_id': + break; + case 'tags': + $array['tags'] = json_decode($transactionMeta->value); + break; + case 'piggy_bank_id': + $piggy = $this->piggyRepos->findNull((int)$transactionMeta->value); + if (null !== $piggy) { + $array['piggy_bank_id'] = (string)$piggy->id; + $array['piggy_bank_name'] = $piggy->name; + } + break; + case 'category_id': + $category = $this->factory->findOrCreate((int)$transactionMeta->value, null); + if (null !== $category) { + $array['category_id'] = (string)$category->id; + $array['category_name'] = $category->name; + } + break; + break; + case 'category_name': + $category = $this->factory->findOrCreate(null, $transactionMeta->value); + if (null !== $category) { + $array['category_id'] = (string)$category->id; + $array['category_name'] = $category->name; + } + break; + case 'budget_id': + $budget = $this->budgetRepos->findNull((int)$transactionMeta->value); + if (null !== $budget) { + $array['budget_id'] = (string)$budget->id; + $array['budget_name'] = $budget->name; + } + break; + } + } + + return $array; + } + } diff --git a/app/Transformers/RuleTransformer.php b/app/Transformers/RuleTransformer.php index c715d8570f..202df6e659 100644 --- a/app/Transformers/RuleTransformer.php +++ b/app/Transformers/RuleTransformer.php @@ -64,7 +64,7 @@ class RuleTransformer extends AbstractTransformer 'id' => (string)$rule->id, 'created_at' => $rule->created_at->toAtomString(), 'updated_at' => $rule->updated_at->toAtomString(), - 'rule_group_id' => (string) $rule->rule_group_id, + 'rule_group_id' => (string)$rule->rule_group_id, 'title' => $rule->title, 'description' => $rule->description, 'order' => (int)$rule->order, @@ -83,32 +83,6 @@ class RuleTransformer extends AbstractTransformer ]; } - /** - * @param Rule $rule - * - * @return array - */ - private function actions(Rule $rule): array - { - $result = []; - $actions = $this->ruleRepository->getRuleActions($rule); - /** @var RuleAction $ruleAction */ - foreach ($actions as $ruleAction) { - $result[] = [ - 'id' => (string)$ruleAction->id, - 'created_at' => $ruleAction->created_at->toAtomString(), - 'updated_at' => $ruleAction->updated_at->toAtomString(), - 'type' => $ruleAction->action_type, - 'value' => $ruleAction->action_value, - 'order' => $ruleAction->order, - 'active' => $ruleAction->active, - 'stop_processing' => $ruleAction->stop_processing, - ]; - } - - return $result; - } - /** * @param Rule $rule * @@ -160,4 +134,30 @@ class RuleTransformer extends AbstractTransformer return $result; } + + /** + * @param Rule $rule + * + * @return array + */ + private function actions(Rule $rule): array + { + $result = []; + $actions = $this->ruleRepository->getRuleActions($rule); + /** @var RuleAction $ruleAction */ + foreach ($actions as $ruleAction) { + $result[] = [ + 'id' => (string)$ruleAction->id, + 'created_at' => $ruleAction->created_at->toAtomString(), + 'updated_at' => $ruleAction->updated_at->toAtomString(), + 'type' => $ruleAction->action_type, + 'value' => $ruleAction->action_value, + 'order' => $ruleAction->order, + 'active' => $ruleAction->active, + 'stop_processing' => $ruleAction->stop_processing, + ]; + } + + return $result; + } } diff --git a/app/Transformers/TagTransformer.php b/app/Transformers/TagTransformer.php index 8f5c6114e3..c63918027e 100644 --- a/app/Transformers/TagTransformer.php +++ b/app/Transformers/TagTransformer.php @@ -55,6 +55,7 @@ class TagTransformer extends AbstractTransformer $longitude = $location->longitude; $zoomLevel = (int)$location->zoom_level; } + return [ 'id' => (int)$tag->id, 'created_at' => $tag->created_at->toAtomString(), diff --git a/app/Transformers/TransactionGroupTransformer.php b/app/Transformers/TransactionGroupTransformer.php index 92f3ebf5c6..2c74cfda85 100644 --- a/app/Transformers/TransactionGroupTransformer.php +++ b/app/Transformers/TransactionGroupTransformer.php @@ -90,6 +90,194 @@ class TransactionGroupTransformer extends AbstractTransformer ]; } + /** + * @param NullArrayObject $data + * + * @return array + */ + private function transformTransactions(NullArrayObject $data): array + { + $result = []; + $transactions = $data['transactions'] ?? []; + foreach ($transactions as $transaction) { + $result[] = $this->transformTransaction($transaction); + } + + return $result; + } + + /** + * @param array $transaction + * + * @return array + */ + private function transformTransaction(array $transaction): array + { + $row = new NullArrayObject($transaction); + + // amount: + $type = $this->stringFromArray($transaction, 'transaction_type_type', TransactionType::WITHDRAWAL); + $amount = app('steam')->positive($row['amount'] ?? '0'); + $foreignAmount = null; + if (null !== $row['foreign_amount']) { + $foreignAmount = app('steam')->positive($row['foreign_amount']); + } + + $metaFieldData = $this->groupRepos->getMetaFields((int)$row['transaction_journal_id'], $this->metaFields); + $metaDateData = $this->groupRepos->getMetaDateFields((int)$row['transaction_journal_id'], $this->metaDateFields); + + $longitude = null; + $latitude = null; + $zoomLevel = null; + $location = $this->getLocationById((int)$row['transaction_journal_id']); + if (null !== $location) { + $longitude = $location->longitude; + $latitude = $location->latitude; + $zoomLevel = $location->zoom_level; + } + + return [ + 'user' => (string)$row['user_id'], + 'transaction_journal_id' => (int)$row['transaction_journal_id'], + 'type' => strtolower($type), + 'date' => $row['date']->toAtomString(), + 'order' => $row['order'], + + 'currency_id' => (string)$row['currency_id'], + 'currency_code' => $row['currency_code'], + 'currency_name' => $row['currency_name'], + 'currency_symbol' => $row['currency_symbol'], + 'currency_decimal_places' => (int)$row['currency_decimal_places'], + + 'foreign_currency_id' => $this->stringFromArray($transaction, 'foreign_currency_id', null), + 'foreign_currency_code' => $row['foreign_currency_code'], + 'foreign_currency_symbol' => $row['foreign_currency_symbol'], + 'foreign_currency_decimal_places' => $row['foreign_currency_decimal_places'], + + 'amount' => $amount, + 'foreign_amount' => $foreignAmount, + + 'description' => $row['description'], + + 'source_id' => (string)$row['source_account_id'], + 'source_name' => $row['source_account_name'], + 'source_iban' => $row['source_account_iban'], + 'source_type' => $row['source_account_type'], + + 'destination_id' => (string)$row['destination_account_id'], + 'destination_name' => $row['destination_account_name'], + 'destination_iban' => $row['destination_account_iban'], + 'destination_type' => $row['destination_account_type'], + + 'budget_id' => $this->stringFromArray($transaction, 'budget_id', null), + 'budget_name' => $row['budget_name'], + + 'category_id' => $this->stringFromArray($transaction, 'category_id', null), + 'category_name' => $row['category_name'], + + 'bill_id' => $this->stringFromArray($transaction, 'bill_id', null), + 'bill_name' => $row['bill_name'], + + 'reconciled' => $row['reconciled'], + 'notes' => $this->groupRepos->getNoteText((int)$row['transaction_journal_id']), + 'tags' => $this->groupRepos->getTags((int)$row['transaction_journal_id']), + + 'internal_reference' => $metaFieldData['internal_reference'], + 'external_id' => $metaFieldData['external_id'], + 'original_source' => $metaFieldData['original_source'], + 'recurrence_id' => $this->stringFromArray($metaFieldData->getArrayCopy(), 'recurrence_id', null), + 'recurrence_total' => $this->integerFromArray($metaFieldData->getArrayCopy(), 'recurrence_total'), + 'recurrence_count' => $this->integerFromArray($metaFieldData->getArrayCopy(), 'recurrence_count'), + 'bunq_payment_id' => $metaFieldData['bunq_payment_id'], + 'external_uri' => $metaFieldData['external_uri'], + 'import_hash_v2' => $metaFieldData['import_hash_v2'], + + 'sepa_cc' => $metaFieldData['sepa_cc'], + 'sepa_ct_op' => $metaFieldData['sepa_ct_op'], + 'sepa_ct_id' => $metaFieldData['sepa_ct_id'], + 'sepa_db' => $metaFieldData['sepa_db'], + 'sepa_country' => $metaFieldData['sepa_country'], + 'sepa_ep' => $metaFieldData['sepa_ep'], + 'sepa_ci' => $metaFieldData['sepa_ci'], + 'sepa_batch_id' => $metaFieldData['sepa_batch_id'], + + 'interest_date' => $this->dateFromArray($metaDateData, 'interest_date'), + 'book_date' => $this->dateFromArray($metaDateData, 'book_date'), + 'process_date' => $this->dateFromArray($metaDateData, 'process_date'), + 'due_date' => $this->dateFromArray($metaDateData, 'due_date'), + 'payment_date' => $this->dateFromArray($metaDateData, 'payment_date'), + 'invoice_date' => $this->dateFromArray($metaDateData, 'invoice_date'), + + // location data + 'longitude' => $longitude, + 'latitude' => $latitude, + 'zoom_level' => $zoomLevel, + ]; + } + + /** + * @param array $array + * @param string $key + * @param string|null $default + * + * @return string|null + */ + private function stringFromArray(array $array, string $key, ?string $default): ?string + { + if (array_key_exists($key, $array) && null === $array[$key]) { + return null; + } + if (array_key_exists($key, $array) && null !== $array[$key]) { + return (string)$array[$key]; + } + + if (null !== $default) { + return (string)$default; + } + + return null; + } + + /** + * @param int $journalId + * + * @return Location|null + */ + private function getLocationById(int $journalId): ?Location + { + return $this->groupRepos->getLocation($journalId); + } + + /** + * @param array $array + * @param string $key + * + * @return int|null + */ + private function integerFromArray(array $array, string $key): ?int + { + if (array_key_exists($key, $array)) { + return (int)$array[$key]; + } + + return null; + } + + /** + * @param NullArrayObject $object + * @param string $key + * + * @return string|null + */ + private function dateFromArray(NullArrayObject $object, string $key): ?string + { + if (null === $object[$key]) { + return null; + } + + return $object[$key]->toAtomString(); + } + /** * @param TransactionGroup $group * @@ -125,182 +313,17 @@ class TransactionGroupTransformer extends AbstractTransformer } /** - * @param string $type - * @param string $amount - * - * @return string - */ - private function getAmount(string $type, string $amount): string - { - $amount = app('steam')->positive($amount); - if (TransactionType::WITHDRAWAL !== $type) { - $amount = app('steam')->negative($amount); - } - - return $amount; - } - - /** - * @param Bill|null $bill + * @param Collection $transactionJournals * * @return array - */ - private function getBill(?Bill $bill): array - { - $array = [ - 'id' => null, - 'name' => null, - ]; - if (null === $bill) { - return $array; - } - $array['id'] = (string)$bill->id; - $array['name'] = $bill->name; - - return $array; - } - - /** - * @param Budget|null $budget - * - * @return array - */ - private function getBudget(?Budget $budget): array - { - $array = [ - 'id' => null, - 'name' => null, - ]; - if (null === $budget) { - return $array; - } - $array['id'] = (int)$budget->id; - $array['name'] = $budget->name; - - return $array; - } - - /** - * @param Category|null $category - * - * @return array - */ - private function getCategory(?Category $category): array - { - $array = [ - 'id' => null, - 'name' => null, - ]; - if (null === $category) { - return $array; - } - $array['id'] = (int)$category->id; - $array['name'] = $category->name; - - return $array; - } - - /** - * @param NullArrayObject $dates - * - * @return array - */ - private function getDates(NullArrayObject $dates): array - { - $fields = [ - 'interest_date', - 'book_date', - 'process_date', - 'due_date', - 'payment_date', - 'invoice_date', - ]; - $return = []; - foreach ($fields as $field) { - $return[$field] = null; - if (null !== $dates[$field]) { - $return[$field] = $dates[$field]->toAtomString(); - } - } - - return $return; - } - - /** - * @param TransactionJournal $journal - * - * @return Transaction * @throws FireflyException */ - private function getDestinationTransaction(TransactionJournal $journal): Transaction + private function transformJournals(Collection $transactionJournals): array { - $result = $journal->transactions->first( - static function (Transaction $transaction) { - return (float)$transaction->amount > 0; - } - ); - if (null === $result) { - throw new FireflyException(sprintf('Journal #%d unexpectedly has no destination transaction.', $journal->id)); - } - - return $result; - } - - /** - * @param string $type - * @param string|null $foreignAmount - * - * @return string|null - */ - private function getForeignAmount(string $type, ?string $foreignAmount): ?string - { - $result = null; - if (null !== $foreignAmount) { - $result = TransactionType::WITHDRAWAL !== $type ? app('steam')->negative($foreignAmount) : app('steam')->positive($foreignAmount); - } - - return $result; - } - - /** - * @param TransactionCurrency|null $currency - * - * @return array - */ - private function getForeignCurrency(?TransactionCurrency $currency): array - { - $array = [ - 'id' => null, - 'code' => null, - 'symbol' => null, - 'decimal_places' => null, - ]; - if (null === $currency) { - return $array; - } - $array['id'] = (int)$currency->id; - $array['code'] = $currency->code; - $array['symbol'] = $currency->symbol; - $array['decimal_places'] = (int)$currency->decimal_places; - - return $array; - } - - /** - * @param TransactionJournal $journal - * - * @return Transaction - * @throws FireflyException - */ - private function getSourceTransaction(TransactionJournal $journal): Transaction - { - $result = $journal->transactions->first( - static function (Transaction $transaction) { - return (float)$transaction->amount < 0; - } - ); - if (null === $result) { - throw new FireflyException(sprintf('Journal #%d unexpectedly has no source transaction.', $journal->id)); + $result = []; + /** @var TransactionJournal $journal */ + foreach ($transactionJournals as $journal) { + $result[] = $this->transformJournal($journal); } return $result; @@ -417,198 +440,185 @@ class TransactionGroupTransformer extends AbstractTransformer } /** - * @param Collection $transactionJournals + * @param TransactionJournal $journal * - * @return array + * @return Transaction * @throws FireflyException */ - private function transformJournals(Collection $transactionJournals): array + private function getSourceTransaction(TransactionJournal $journal): Transaction { - $result = []; - /** @var TransactionJournal $journal */ - foreach ($transactionJournals as $journal) { - $result[] = $this->transformJournal($journal); + $result = $journal->transactions->first( + static function (Transaction $transaction) { + return (float)$transaction->amount < 0; + } + ); + if (null === $result) { + throw new FireflyException(sprintf('Journal #%d unexpectedly has no source transaction.', $journal->id)); } return $result; } /** - * @param NullArrayObject $data + * @param TransactionJournal $journal * - * @return array + * @return Transaction + * @throws FireflyException */ - private function transformTransactions(NullArrayObject $data): array + private function getDestinationTransaction(TransactionJournal $journal): Transaction { - $result = []; - $transactions = $data['transactions'] ?? []; - foreach ($transactions as $transaction) { - $result[] = $this->transformTransaction($transaction); + $result = $journal->transactions->first( + static function (Transaction $transaction) { + return (float)$transaction->amount > 0; + } + ); + if (null === $result) { + throw new FireflyException(sprintf('Journal #%d unexpectedly has no destination transaction.', $journal->id)); } return $result; } /** - * @param array $transaction + * @param string $type + * @param string $amount + * + * @return string + */ + private function getAmount(string $type, string $amount): string + { + $amount = app('steam')->positive($amount); + if (TransactionType::WITHDRAWAL !== $type) { + $amount = app('steam')->negative($amount); + } + + return $amount; + } + + /** + * @param string $type + * @param string|null $foreignAmount + * + * @return string|null + */ + private function getForeignAmount(string $type, ?string $foreignAmount): ?string + { + $result = null; + if (null !== $foreignAmount) { + $result = TransactionType::WITHDRAWAL !== $type ? app('steam')->negative($foreignAmount) : app('steam')->positive($foreignAmount); + } + + return $result; + } + + /** + * @param NullArrayObject $dates * * @return array */ - private function transformTransaction(array $transaction): array + private function getDates(NullArrayObject $dates): array { - $row = new NullArrayObject($transaction); - - // amount: - $type = $this->stringFromArray($transaction, 'transaction_type_type', TransactionType::WITHDRAWAL); - $amount = app('steam')->positive($row['amount'] ?? '0'); - $foreignAmount = null; - if (null !== $row['foreign_amount']) { - $foreignAmount = app('steam')->positive($row['foreign_amount']); - } - - $metaFieldData = $this->groupRepos->getMetaFields((int)$row['transaction_journal_id'], $this->metaFields); - $metaDateData = $this->groupRepos->getMetaDateFields((int)$row['transaction_journal_id'], $this->metaDateFields); - - $longitude = null; - $latitude = null; - $zoomLevel = null; - $location = $this->getLocationById((int)$row['transaction_journal_id']); - if (null !== $location) { - $longitude = $location->longitude; - $latitude = $location->latitude; - $zoomLevel = $location->zoom_level; - } - - return [ - 'user' => (string)$row['user_id'], - 'transaction_journal_id' => (int)$row['transaction_journal_id'], - 'type' => strtolower($type), - 'date' => $row['date']->toAtomString(), - 'order' => $row['order'], - - 'currency_id' => (string)$row['currency_id'], - 'currency_code' => $row['currency_code'], - 'currency_name' => $row['currency_name'], - 'currency_symbol' => $row['currency_symbol'], - 'currency_decimal_places' => (int)$row['currency_decimal_places'], - - 'foreign_currency_id' => $this->stringFromArray($transaction, 'foreign_currency_id', null), - 'foreign_currency_code' => $row['foreign_currency_code'], - 'foreign_currency_symbol' => $row['foreign_currency_symbol'], - 'foreign_currency_decimal_places' => $row['foreign_currency_decimal_places'], - - 'amount' => $amount, - 'foreign_amount' => $foreignAmount, - - 'description' => $row['description'], - - 'source_id' => (string)$row['source_account_id'], - 'source_name' => $row['source_account_name'], - 'source_iban' => $row['source_account_iban'], - 'source_type' => $row['source_account_type'], - - 'destination_id' => (string)$row['destination_account_id'], - 'destination_name' => $row['destination_account_name'], - 'destination_iban' => $row['destination_account_iban'], - 'destination_type' => $row['destination_account_type'], - - 'budget_id' => $this->stringFromArray($transaction, 'budget_id', null), - 'budget_name' => $row['budget_name'], - - 'category_id' => $this->stringFromArray($transaction, 'category_id', null), - 'category_name' => $row['category_name'], - - 'bill_id' => $this->stringFromArray($transaction, 'bill_id', null), - 'bill_name' => $row['bill_name'], - - 'reconciled' => $row['reconciled'], - 'notes' => $this->groupRepos->getNoteText((int)$row['transaction_journal_id']), - 'tags' => $this->groupRepos->getTags((int)$row['transaction_journal_id']), - - 'internal_reference' => $metaFieldData['internal_reference'], - 'external_id' => $metaFieldData['external_id'], - 'original_source' => $metaFieldData['original_source'], - 'recurrence_id' => $this->stringFromArray($metaFieldData->getArrayCopy(), 'recurrence_id', null), - 'recurrence_total' => $this->integerFromArray($metaFieldData->getArrayCopy(), 'recurrence_total'), - 'recurrence_count' => $this->integerFromArray($metaFieldData->getArrayCopy(), 'recurrence_count'), - 'bunq_payment_id' => $metaFieldData['bunq_payment_id'], - 'external_uri' => $metaFieldData['external_uri'], - 'import_hash_v2' => $metaFieldData['import_hash_v2'], - - 'sepa_cc' => $metaFieldData['sepa_cc'], - 'sepa_ct_op' => $metaFieldData['sepa_ct_op'], - 'sepa_ct_id' => $metaFieldData['sepa_ct_id'], - 'sepa_db' => $metaFieldData['sepa_db'], - 'sepa_country' => $metaFieldData['sepa_country'], - 'sepa_ep' => $metaFieldData['sepa_ep'], - 'sepa_ci' => $metaFieldData['sepa_ci'], - 'sepa_batch_id' => $metaFieldData['sepa_batch_id'], - - 'interest_date' => $this->dateFromArray($metaDateData, 'interest_date'), - 'book_date' => $this->dateFromArray($metaDateData, 'book_date'), - 'process_date' => $this->dateFromArray($metaDateData, 'process_date'), - 'due_date' => $this->dateFromArray($metaDateData, 'due_date'), - 'payment_date' => $this->dateFromArray($metaDateData, 'payment_date'), - 'invoice_date' => $this->dateFromArray($metaDateData, 'invoice_date'), - - // location data - 'longitude' => $longitude, - 'latitude' => $latitude, - 'zoom_level' => $zoomLevel, + $fields = [ + 'interest_date', + 'book_date', + 'process_date', + 'due_date', + 'payment_date', + 'invoice_date', ]; + $return = []; + foreach ($fields as $field) { + $return[$field] = null; + if (null !== $dates[$field]) { + $return[$field] = $dates[$field]->toAtomString(); + } + } + + return $return; } /** - * @param array $array - * @param string $key - * @param string|null $default + * @param TransactionCurrency|null $currency * - * @return string|null + * @return array */ - private function stringFromArray(array $array, string $key, ?string $default): ?string + private function getForeignCurrency(?TransactionCurrency $currency): array { - if (array_key_exists($key, $array) && null === $array[$key]) { - return null; - } - if (array_key_exists($key, $array) && null !== $array[$key]) { - return (string) $array[$key]; + $array = [ + 'id' => null, + 'code' => null, + 'symbol' => null, + 'decimal_places' => null, + ]; + if (null === $currency) { + return $array; } + $array['id'] = (int)$currency->id; + $array['code'] = $currency->code; + $array['symbol'] = $currency->symbol; + $array['decimal_places'] = (int)$currency->decimal_places; - if (null !== $default) { - return (string) $default; - } - - return null; + return $array; } /** - * @param array $array - * @param string $key + * @param Budget|null $budget * - * @return int|null + * @return array */ - private function integerFromArray(array $array, string $key): ?int + private function getBudget(?Budget $budget): array { - if (array_key_exists($key, $array)) { - return (int)$array[$key]; + $array = [ + 'id' => null, + 'name' => null, + ]; + if (null === $budget) { + return $array; } + $array['id'] = (int)$budget->id; + $array['name'] = $budget->name; - return null; + return $array; } /** - * @param NullArrayObject $object - * @param string $key + * @param Category|null $category * - * @return string|null + * @return array */ - private function dateFromArray(NullArrayObject $object, string $key): ?string + private function getCategory(?Category $category): array { - if (null === $object[$key]) { - return null; + $array = [ + 'id' => null, + 'name' => null, + ]; + if (null === $category) { + return $array; } + $array['id'] = (int)$category->id; + $array['name'] = $category->name; - return $object[$key]->toAtomString(); + return $array; + } + + /** + * @param Bill|null $bill + * + * @return array + */ + private function getBill(?Bill $bill): array + { + $array = [ + 'id' => null, + 'name' => null, + ]; + if (null === $bill) { + return $array; + } + $array['id'] = (string)$bill->id; + $array['name'] = $bill->name; + + return $array; } /** @@ -620,14 +630,4 @@ class TransactionGroupTransformer extends AbstractTransformer { return $journal->locations()->first(); } - - /** - * @param int $journalId - * - * @return Location|null - */ - private function getLocationById(int $journalId): ?Location - { - return $this->groupRepos->getLocation($journalId); - } } diff --git a/app/Transformers/UserTransformer.php b/app/Transformers/UserTransformer.php index 5d10e45b42..161caa997b 100644 --- a/app/Transformers/UserTransformer.php +++ b/app/Transformers/UserTransformer.php @@ -26,7 +26,6 @@ namespace FireflyIII\Transformers; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; -use Log; /** * Class UserTransformer @@ -46,6 +45,7 @@ class UserTransformer extends AbstractTransformer public function transform(User $user): array { $this->repository = $this->repository ?? app(UserRepositoryInterface::class); + return [ 'id' => (int)$user->id, 'created_at' => $user->created_at->toAtomString(), diff --git a/app/Validation/Account/AccountValidatorProperties.php b/app/Validation/Account/AccountValidatorProperties.php index 172fea5212..61197490ab 100644 --- a/app/Validation/Account/AccountValidatorProperties.php +++ b/app/Validation/Account/AccountValidatorProperties.php @@ -24,10 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Validation\Account; -use FireflyIII\Models\Account; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\User; - /** * I have no idea what made me do this. I'll reverse it some day. * diff --git a/app/Validation/Account/DepositValidation.php b/app/Validation/Account/DepositValidation.php index 65e02abceb..c9661a2c33 100644 --- a/app/Validation/Account/DepositValidation.php +++ b/app/Validation/Account/DepositValidation.php @@ -32,22 +32,6 @@ use Log; */ trait DepositValidation { - /** - * @param array $accountTypes - * - * @return bool - */ - abstract protected function canCreateTypes(array $accountTypes): bool; - - /** - * @param array $validTypes - * @param int $accountId - * @param string $accountName - * - * @return Account|null - */ - abstract protected function findExistingAccount(array $validTypes, int $accountId, string $accountName): ?Account; - /** * @param int|null $accountId * @param $accountName @@ -64,7 +48,7 @@ trait DepositValidation if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { // if both values are NULL we return false, // because the destination of a deposit can't be created. - $this->destError = (string) trans('validation.deposit_dest_need_data'); + $this->destError = (string)trans('validation.deposit_dest_need_data'); Log::error('Both values are NULL, cant create deposit destination.'); $result = false; } @@ -76,10 +60,10 @@ trait DepositValidation if (null === $result) { // otherwise try to find the account: - $search = $this->findExistingAccount($validTypes, (int) $accountId, (string) $accountName); + $search = $this->findExistingAccount($validTypes, (int)$accountId, (string)$accountName); if (null === $search) { Log::debug('findExistingAccount() returned NULL, so the result is false.'); - $this->destError = (string) trans('validation.deposit_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); + $this->destError = (string)trans('validation.deposit_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); $result = false; } if (null !== $search) { @@ -94,6 +78,22 @@ trait DepositValidation return $result; } + /** + * @param array $accountTypes + * + * @return bool + */ + abstract protected function canCreateTypes(array $accountTypes): bool; + + /** + * @param array $validTypes + * @param int $accountId + * @param string $accountName + * + * @return Account|null + */ + abstract protected function findExistingAccount(array $validTypes, int $accountId, string $accountName): ?Account; + /** * @param int|null $accountId * @param string|null $accountName @@ -110,7 +110,7 @@ trait DepositValidation // if both values are NULL return false, // because the source of a deposit can't be created. // (this never happens). - $this->sourceError = (string) trans('validation.deposit_source_need_data'); + $this->sourceError = (string)trans('validation.deposit_source_need_data'); $result = false; } @@ -134,6 +134,7 @@ trait DepositValidation $account->accountType = $accountType; $this->source = $account; } + return $result ?? false; } } diff --git a/app/Validation/Account/OBValidation.php b/app/Validation/Account/OBValidation.php index 86c358a80c..3efabe83cc 100644 --- a/app/Validation/Account/OBValidation.php +++ b/app/Validation/Account/OBValidation.php @@ -33,13 +33,6 @@ use Log; */ trait OBValidation { - /** - * @param array $accountTypes - * - * @return bool - */ - abstract protected function canCreateTypes(array $accountTypes): bool; - /** * @param int|null $accountId * @param $accountName @@ -56,7 +49,7 @@ trait OBValidation if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { // if both values are NULL we return false, // because the destination of a deposit can't be created. - $this->destError = (string) trans('validation.ob_dest_need_data'); + $this->destError = (string)trans('validation.ob_dest_need_data'); Log::error('Both values are NULL, cant create OB destination.'); $result = false; } @@ -68,10 +61,10 @@ trait OBValidation if (null === $result) { // otherwise try to find the account: - $search = $this->findExistingAccount($validTypes, (int) $accountId, (string) $accountName); + $search = $this->findExistingAccount($validTypes, (int)$accountId, (string)$accountName); if (null === $search) { Log::debug('findExistingAccount() returned NULL, so the result is false.', $validTypes); - $this->destError = (string) trans('validation.ob_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); + $this->destError = (string)trans('validation.ob_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); $result = false; } if (null !== $search) { @@ -86,6 +79,13 @@ trait OBValidation return $result; } + /** + * @param array $accountTypes + * + * @return bool + */ + abstract protected function canCreateTypes(array $accountTypes): bool; + /** * Source of an opening balance can either be an asset account * or an "initial balance account". The latter can be created. @@ -107,7 +107,7 @@ trait OBValidation // if both values are NULL return false, // because the source of a deposit can't be created. // (this never happens). - $this->sourceError = (string) trans('validation.ob_source_need_data'); + $this->sourceError = (string)trans('validation.ob_source_need_data'); $result = false; } @@ -143,6 +143,7 @@ trait OBValidation $account->accountType = $accountType; $this->source = $account; } + return $result ?? false; } } diff --git a/app/Validation/Account/ReconciliationValidation.php b/app/Validation/Account/ReconciliationValidation.php index 63c9a21f57..450c9977ed 100644 --- a/app/Validation/Account/ReconciliationValidation.php +++ b/app/Validation/Account/ReconciliationValidation.php @@ -24,8 +24,8 @@ declare(strict_types=1); namespace FireflyIII\Validation\Account; -use Log; use FireflyIII\Models\AccountType; +use Log; /** * Trait ReconciliationValidation @@ -89,20 +89,24 @@ trait ReconciliationValidation Log::debug('In validateReconciliationSource'); if (null === $accountId) { Log::debug('Return FALSE'); + return false; } $result = $this->accountRepository->findNull($accountId); $types = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE, AccountType::RECONCILIATION]; if (null === $result) { Log::debug('Return FALSE'); + return false; } if (in_array($result->accountType->type, $types, true)) { $this->source = $result; Log::debug('Return TRUE'); + return true; } Log::debug('Return FALSE'); + return false; } diff --git a/app/Validation/Account/TransferValidation.php b/app/Validation/Account/TransferValidation.php index c0570e65b1..44459963aa 100644 --- a/app/Validation/Account/TransferValidation.php +++ b/app/Validation/Account/TransferValidation.php @@ -31,22 +31,6 @@ use Log; */ trait TransferValidation { - /** - * @param array $accountTypes - * - * @return bool - */ - abstract protected function canCreateTypes(array $accountTypes): bool; - - /** - * @param array $validTypes - * @param int $accountId - * @param string $accountName - * - * @return Account|null - */ - abstract protected function findExistingAccount(array $validTypes, int $accountId, string $accountName): ?Account; - /** * @param int|null $accountId * @param $accountName @@ -61,16 +45,16 @@ trait TransferValidation if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { // if both values are NULL we return false, // because the destination of a transfer can't be created. - $this->destError = (string) trans('validation.transfer_dest_need_data'); + $this->destError = (string)trans('validation.transfer_dest_need_data'); Log::error('Both values are NULL, cant create transfer destination.'); return false; } // otherwise try to find the account: - $search = $this->findExistingAccount($validTypes, (int) $accountId, (string) $accountName); + $search = $this->findExistingAccount($validTypes, (int)$accountId, (string)$accountName); if (null === $search) { - $this->destError = (string) trans('validation.transfer_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); + $this->destError = (string)trans('validation.transfer_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); return false; } @@ -87,6 +71,22 @@ trait TransferValidation return true; } + /** + * @param array $accountTypes + * + * @return bool + */ + abstract protected function canCreateTypes(array $accountTypes): bool; + + /** + * @param array $validTypes + * @param int $accountId + * @param string $accountName + * + * @return Account|null + */ + abstract protected function findExistingAccount(array $validTypes, int $accountId, string $accountName): ?Account; + /** * @param int|null $accountId * @param string|null $accountName @@ -101,16 +101,16 @@ trait TransferValidation if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { // if both values are NULL we return false, // because the source of a withdrawal can't be created. - $this->sourceError = (string) trans('validation.transfer_source_need_data'); + $this->sourceError = (string)trans('validation.transfer_source_need_data'); Log::warning('Not a valid source, need more data.'); return false; } // otherwise try to find the account: - $search = $this->findExistingAccount($validTypes, (int) $accountId, (string) $accountName); + $search = $this->findExistingAccount($validTypes, (int)$accountId, (string)$accountName); if (null === $search) { - $this->sourceError = (string) trans('validation.transfer_source_bad_data', ['id' => $accountId, 'name' => $accountName]); + $this->sourceError = (string)trans('validation.transfer_source_bad_data', ['id' => $accountId, 'name' => $accountName]); Log::warning('Not a valid source, cant find it.', $validTypes); return false; diff --git a/app/Validation/Account/WithdrawalValidation.php b/app/Validation/Account/WithdrawalValidation.php index 6b41fb9c51..1dc5d4293b 100644 --- a/app/Validation/Account/WithdrawalValidation.php +++ b/app/Validation/Account/WithdrawalValidation.php @@ -33,20 +33,38 @@ use Log; trait WithdrawalValidation { /** - * @param array $accountTypes + * @param int|null $accountId + * @param string|null $accountName * * @return bool */ - abstract protected function canCreateTypes(array $accountTypes): bool; + protected function validateGenericSource(?int $accountId, ?string $accountName): bool + { + Log::debug(sprintf('Now in validateGenericSource(%d, "%s")', $accountId, $accountName)); + // source can be any of the following types. + $validTypes = [AccountType::ASSET, AccountType::REVENUE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]; + if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { + // if both values are NULL we return TRUE + // because we assume the user doesnt want to submit / change anything. + $this->sourceError = (string)trans('validation.withdrawal_source_need_data'); + Log::warning('Not a valid source. Need more data.'); - /** - * @param array $validTypes - * @param int $accountId - * @param string $accountName - * - * @return Account|null - */ - abstract protected function findExistingAccount(array $validTypes, int $accountId, string $accountName): ?Account; + return false; + } + + // otherwise try to find the account: + $search = $this->findExistingAccount($validTypes, (int)$accountId, (string)$accountName); + if (null === $search) { + $this->sourceError = (string)trans('validation.withdrawal_source_bad_data', ['id' => $accountId, 'name' => $accountName]); + Log::warning('Not a valid source. Cant find it.', $validTypes); + + return false; + } + $this->source = $search; + Log::debug('Valid source account!'); + + return true; + } /** * @param int|null $accountId @@ -62,7 +80,7 @@ trait WithdrawalValidation if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { // if both values are NULL return false, // because the destination of a withdrawal can never be created automatically. - $this->destError = (string) trans('validation.withdrawal_dest_need_data'); + $this->destError = (string)trans('validation.withdrawal_dest_need_data'); return false; } @@ -75,7 +93,7 @@ trait WithdrawalValidation if (in_array($type, $validTypes, true)) { return true; } - $this->destError = (string) trans('validation.withdrawal_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); + $this->destError = (string)trans('validation.withdrawal_dest_bad_data', ['id' => $accountId, 'name' => $accountName]); return false; } @@ -85,6 +103,13 @@ trait WithdrawalValidation return true === $this->canCreateTypes($validTypes); } + /** + * @param array $accountTypes + * + * @return bool + */ + abstract protected function canCreateTypes(array $accountTypes): bool; + /** * @param int|null $accountId * @param string|null $accountName @@ -99,16 +124,16 @@ trait WithdrawalValidation if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { // if both values are NULL we return false, // because the source of a withdrawal can't be created. - $this->sourceError = (string) trans('validation.withdrawal_source_need_data'); + $this->sourceError = (string)trans('validation.withdrawal_source_need_data'); Log::warning('Not a valid source. Need more data.'); return false; } // otherwise try to find the account: - $search = $this->findExistingAccount($validTypes, (int) $accountId, (string) $accountName); + $search = $this->findExistingAccount($validTypes, (int)$accountId, (string)$accountName); if (null === $search) { - $this->sourceError = (string) trans('validation.withdrawal_source_bad_data', ['id' => $accountId, 'name' => $accountName]); + $this->sourceError = (string)trans('validation.withdrawal_source_bad_data', ['id' => $accountId, 'name' => $accountName]); Log::warning('Not a valid source. Cant find it.', $validTypes); return false; @@ -120,36 +145,11 @@ trait WithdrawalValidation } /** - * @param int|null $accountId - * @param string|null $accountName + * @param array $validTypes + * @param int $accountId + * @param string $accountName * - * @return bool + * @return Account|null */ - protected function validateGenericSource(?int $accountId, ?string $accountName): bool - { - Log::debug(sprintf('Now in validateGenericSource(%d, "%s")', $accountId, $accountName)); - // source can be any of the following types. - $validTypes = [AccountType::ASSET, AccountType::REVENUE, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]; - if (null === $accountId && null === $accountName && false === $this->canCreateTypes($validTypes)) { - // if both values are NULL we return TRUE - // because we assume the user doesnt want to submit / change anything. - $this->sourceError = (string) trans('validation.withdrawal_source_need_data'); - Log::warning('Not a valid source. Need more data.'); - - return false; - } - - // otherwise try to find the account: - $search = $this->findExistingAccount($validTypes, (int) $accountId, (string) $accountName); - if (null === $search) { - $this->sourceError = (string) trans('validation.withdrawal_source_bad_data', ['id' => $accountId, 'name' => $accountName]); - Log::warning('Not a valid source. Cant find it.', $validTypes); - - return false; - } - $this->source = $search; - Log::debug('Valid source account!'); - - return true; - } + abstract protected function findExistingAccount(array $validTypes, int $accountId, string $accountName): ?Account; } diff --git a/app/Validation/AccountValidator.php b/app/Validation/AccountValidator.php index c544da6e8e..f70d860706 100644 --- a/app/Validation/AccountValidator.php +++ b/app/Validation/AccountValidator.php @@ -45,8 +45,8 @@ class AccountValidator public bool $createMode; public string $destError; - public ?Account $destination; - public ?Account $source; + public ?Account $destination; + public ?Account $source; public string $sourceError; private AccountRepositoryInterface $accountRepository; private array $combinations; @@ -69,6 +69,14 @@ class AccountValidator $this->accountRepository = app(AccountRepositoryInterface::class); } + /** + * @return Account|null + */ + public function getSource(): ?Account + { + return $this->source; + } + /** * @param string $transactionType */ @@ -167,21 +175,6 @@ class AccountValidator return $result; } - /** - * @param string $accountType - * - * @return bool - */ - protected function canCreateType(string $accountType): bool - { - $canCreate = [AccountType::EXPENSE, AccountType::REVENUE, AccountType::INITIAL_BALANCE]; - if (in_array($accountType, $canCreate, true)) { - return true; - } - - return false; - } - /** * @param array $accountTypes * @@ -203,6 +196,21 @@ class AccountValidator return false; } + /** + * @param string $accountType + * + * @return bool + */ + protected function canCreateType(string $accountType): bool + { + $canCreate = [AccountType::EXPENSE, AccountType::REVENUE, AccountType::INITIAL_BALANCE]; + if (in_array($accountType, $canCreate, true)) { + return true; + } + + return false; + } + /** * @param array $validTypes * @param int $accountId @@ -228,12 +236,4 @@ class AccountValidator return null; } - /** - * @return Account|null - */ - public function getSource(): ?Account - { - return $this->source; - } - } diff --git a/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php b/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php index 13ce60046c..1555bf35ed 100644 --- a/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php +++ b/app/Validation/AutoBudget/ValidatesAutoBudgetRequest.php @@ -39,27 +39,27 @@ trait ValidatesAutoBudgetRequest $data = $validator->getData(); $type = $data['auto_budget_type'] ?? ''; $amount = $data['auto_budget_amount'] ?? ''; - $period = (string) ($data['auto_budget_period'] ?? ''); + $period = (string)($data['auto_budget_period'] ?? ''); $currencyId = $data['auto_budget_currency_id'] ?? ''; $currencyCode = $data['auto_budget_currency_code'] ?? ''; if (is_numeric($type)) { - $type = (int) $type; + $type = (int)$type; } if (0 === $type || 'none' === $type || '' === $type) { return; } // basic float check: if ('' === $amount) { - $validator->errors()->add('auto_budget_amount', (string) trans('validation.amount_required_for_auto_budget')); + $validator->errors()->add('auto_budget_amount', (string)trans('validation.amount_required_for_auto_budget')); } - if (1 !== bccomp((string) $amount, '0')) { - $validator->errors()->add('auto_budget_amount', (string) trans('validation.auto_budget_amount_positive')); + if (1 !== bccomp((string)$amount, '0')) { + $validator->errors()->add('auto_budget_amount', (string)trans('validation.auto_budget_amount_positive')); } if ('' === $period) { - $validator->errors()->add('auto_budget_period', (string) trans('validation.auto_budget_period_mandatory')); + $validator->errors()->add('auto_budget_period', (string)trans('validation.auto_budget_period_mandatory')); } if ('' === $currencyCode && '' === $currencyId) { - $validator->errors()->add('auto_budget_amount', (string) trans('validation.require_currency_info')); + $validator->errors()->add('auto_budget_amount', (string)trans('validation.require_currency_info')); } } } diff --git a/app/Validation/CurrencyValidation.php b/app/Validation/CurrencyValidation.php index 6dc42b2944..1220d103d0 100644 --- a/app/Validation/CurrencyValidation.php +++ b/app/Validation/CurrencyValidation.php @@ -35,13 +35,6 @@ use Log; */ trait CurrencyValidation { - /** - * @param Validator $validator - * - * @return array - */ - abstract protected function getTransactionsArray(Validator $validator): array; - /** * If the transactions contain foreign amounts, there must also be foreign currency information. * @@ -59,16 +52,23 @@ trait CurrencyValidation ) { $validator->errors()->add( 'transactions.' . $index . '.foreign_amount', - (string) trans('validation.require_currency_info') + (string)trans('validation.require_currency_info') ); } // if the currency is present, then the amount must be present as well. if ((isset($transaction['foreign_currency_id']) || isset($transaction['foreign_currency_code'])) && !isset($transaction['foreign_amount'])) { $validator->errors()->add( 'transactions.' . $index . '.foreign_amount', - (string) trans('validation.require_currency_amount') + (string)trans('validation.require_currency_amount') ); } } } + + /** + * @param Validator $validator + * + * @return array + */ + abstract protected function getTransactionsArray(Validator $validator): array; } diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index dda899058a..dffebe32d2 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -44,6 +44,7 @@ use Google2FA; use Illuminate\Support\Collection; use Illuminate\Validation\Validator; use Log; +use function is_string; /** * Class FireflyValidator. @@ -58,7 +59,7 @@ class FireflyValidator extends Validator */ public function validate2faCode($attribute, $value): bool { - if (!\is_string($value) || null === $value || 6 !== strlen($value)) { + if (!is_string($value) || null === $value || 6 !== strlen($value)) { return false; } @@ -114,7 +115,7 @@ class FireflyValidator extends Validator */ public function validateIban($attribute, $value): bool { - if (!\is_string($value) || null === $value || strlen($value) < 6) { + if (!is_string($value) || null === $value || strlen($value) < 6) { return false; } // strip spaces @@ -431,6 +432,141 @@ class FireflyValidator extends Validator return $this->validateByAccountName($value); } + /** + * @return bool + */ + private function validateAccountAnonymously(): bool + { + if (!isset($this->data['user_id'])) { + return false; + } + + $user = User::find($this->data['user_id']); + $type = AccountType::find($this->data['account_type_id'])->first(); + $value = $this->data['name']; + + $set = $user->accounts()->where('account_type_id', $type->id)->get(); + // TODO no longer need to loop like this + /** @var Account $entry */ + foreach ($set as $entry) { + if ($entry->name === $value) { + return false; + } + } + + return true; + } + + /** + * @param string $value + * @param array $parameters + * @param string $type + * + * @return bool + */ + private function validateByAccountTypeString(string $value, array $parameters, string $type): bool + { + /** @var array $search */ + $search = Config::get('firefly.accountTypeByIdentifier.' . $type); + + if (null === $search) { + return false; + } + + /** @var Collection $accountTypes */ + $accountTypes = AccountType::whereIn('type', $search)->get(); + $ignore = (int)($parameters[0] ?? 0.0); + $accountTypeIds = $accountTypes->pluck('id')->toArray(); + /** @var Collection $set */ + $set = auth()->user()->accounts()->whereIn('account_type_id', $accountTypeIds)->where('id', '!=', $ignore)->get(); + // TODO no longer need to loop like this + /** @var Account $entry */ + foreach ($set as $entry) { + if ($entry->name === $value) { + return false; + } + } + + return true; + } + + /** + * @param $value + * @param $parameters + * + * @return bool + */ + private function validateByAccountTypeId($value, $parameters): bool + { + $type = AccountType::find($this->data['account_type_id'])->first(); + $ignore = (int)($parameters[0] ?? 0.0); + + /** @var Collection $set */ + $set = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore)->get(); + // TODO no longer need to loop like this + /** @var Account $entry */ + foreach ($set as $entry) { + // TODO no longer need to loop like this. + if ($entry->name === $value) { + return false; + } + } + + return true; + } + + /** + * @param $value + * + * @return bool + */ + private function validateByParameterId(int $accountId, $value): bool + { + /** @var Account $existingAccount */ + $existingAccount = Account::find($accountId); + + $type = $existingAccount->accountType; + $ignore = $existingAccount->id; + + /** @var Collection $set */ + $entry = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore) + ->where('name', $value) + ->first(); + + return null === $entry; + } + + /** + * @param $value + * + * @return bool + */ + private function validateByAccountId($value): bool + { + /** @var Account $existingAccount */ + $existingAccount = Account::find($this->data['id']); + + $type = $existingAccount->accountType; + $ignore = $existingAccount->id; + + /** @var Collection $set */ + $entry = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore) + ->where('name', $value) + ->first(); + + return null === $entry; + } + + /** + * @param string $value + * + * @return bool + */ + private function validateByAccountName(string $value): bool + { + return auth()->user()->accounts()->where('name', $value)->count() === 0; + } + /** * @param $attribute * @param $value @@ -466,6 +602,49 @@ class FireflyValidator extends Validator return true; } + public function validateUniqueExistingWebhook($value, $parameters, $something): bool + { + $existingId = (int)($something[0] ?? 0); + $trigger = 0; + $response = 0; + $delivery = 0; + $triggers = array_flip(config('firefly.webhooks.triggers')); + $responses = array_flip(config('firefly.webhooks.responses')); + $deliveries = array_flip(config('firefly.webhooks.deliveries')); + if (auth()->check()) { + // get existing webhook value: + if (0 !== $existingId) { + /** @var Webhook $webhook */ + $webhook = auth()->user()->webhooks()->find($existingId); + if (null === $webhook) { + return false; + } + // set triggers etc. + $trigger = $triggers[$webhook->trigger] ?? 0; + $response = $responses[$webhook->response] ?? 0; + $delivery = $deliveries[$webhook->delivery] ?? 0; + } + if (0 === $existingId) { + $trigger = $triggers[$this->data['trigger']] ?? 0; + $response = $responses[$this->data['response']] ?? 0; + $delivery = $deliveries[$this->data['delivery']] ?? 0; + } + + + $url = $this->data['url']; + $userId = auth()->user()->id; + + return 0 === Webhook::whereUserId($userId) + ->where('trigger', $trigger) + ->where('response', $response) + ->where('delivery', $delivery) + ->where('id', '!=', $existingId) + ->where('url', $url)->count(); + } + + return false; + } + /** * * Validate an object and its unicity. Checks for encryption / encrypted values as well. @@ -531,7 +710,6 @@ class FireflyValidator extends Validator return 0 === $query->count(); } - /** * @param $attribute * @param $value @@ -563,118 +741,6 @@ class FireflyValidator extends Validator return true; } - /** - * @return bool - */ - private function validateAccountAnonymously(): bool - { - if (!isset($this->data['user_id'])) { - return false; - } - - $user = User::find($this->data['user_id']); - $type = AccountType::find($this->data['account_type_id'])->first(); - $value = $this->data['name']; - - $set = $user->accounts()->where('account_type_id', $type->id)->get(); - // TODO no longer need to loop like this - /** @var Account $entry */ - foreach ($set as $entry) { - if ($entry->name === $value) { - return false; - } - } - - return true; - } - - /** - * @param $value - * - * @return bool - */ - private function validateByAccountId($value): bool - { - /** @var Account $existingAccount */ - $existingAccount = Account::find($this->data['id']); - - $type = $existingAccount->accountType; - $ignore = $existingAccount->id; - - /** @var Collection $set */ - $entry = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore) - ->where('name', $value) - ->first(); - - return null === $entry; - } - - - /** - * @param $value - * - * @return bool - */ - private function validateByParameterId(int $accountId, $value): bool - { - /** @var Account $existingAccount */ - $existingAccount = Account::find($accountId); - - $type = $existingAccount->accountType; - $ignore = $existingAccount->id; - - /** @var Collection $set */ - $entry = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore) - ->where('name', $value) - ->first(); - - return null === $entry; - } - - public function validateUniqueExistingWebhook($value, $parameters, $something): bool - { - $existingId = (int)($something[0] ?? 0); - $trigger = 0; - $response = 0; - $delivery = 0; - $triggers = array_flip(config('firefly.webhooks.triggers')); - $responses = array_flip(config('firefly.webhooks.responses')); - $deliveries = array_flip(config('firefly.webhooks.deliveries')); - if (auth()->check()) { - // get existing webhook value: - if(0!== $existingId) { - /** @var Webhook $webhook */ - $webhook = auth()->user()->webhooks()->find($existingId); - if(null === $webhook) { - return false; - } - // set triggers etc. - $trigger = $triggers[$webhook->trigger] ?? 0; - $response = $responses[$webhook->response] ?? 0; - $delivery = $deliveries[$webhook->delivery] ?? 0; - } - if(0=== $existingId) { - $trigger = $triggers[$this->data['trigger']] ?? 0; - $response = $responses[$this->data['response']] ?? 0; - $delivery = $deliveries[$this->data['delivery']] ?? 0; - } - - - - $url = $this->data['url']; - $userId = auth()->user()->id; - - return 0 === Webhook::whereUserId($userId) - ->where('trigger', $trigger) - ->where('response', $response) - ->where('delivery', $delivery) - ->where('id', '!=', $existingId) - ->where('url', $url)->count(); - } - - return false; - } - /** * @param $value * @param $parameters @@ -708,72 +774,4 @@ class FireflyValidator extends Validator return false; } - - /** - * @param $value - * @param $parameters - * - * @return bool - */ - private function validateByAccountTypeId($value, $parameters): bool - { - $type = AccountType::find($this->data['account_type_id'])->first(); - $ignore = (int)($parameters[0] ?? 0.0); - - /** @var Collection $set */ - $set = auth()->user()->accounts()->where('account_type_id', $type->id)->where('id', '!=', $ignore)->get(); - // TODO no longer need to loop like this - /** @var Account $entry */ - foreach ($set as $entry) { - // TODO no longer need to loop like this. - if ($entry->name === $value) { - return false; - } - } - - return true; - } - - /** - * @param string $value - * @param array $parameters - * @param string $type - * - * @return bool - */ - private function validateByAccountTypeString(string $value, array $parameters, string $type): bool - { - /** @var array $search */ - $search = Config::get('firefly.accountTypeByIdentifier.' . $type); - - if (null === $search) { - return false; - } - - /** @var Collection $accountTypes */ - $accountTypes = AccountType::whereIn('type', $search)->get(); - $ignore = (int)($parameters[0] ?? 0.0); - $accountTypeIds = $accountTypes->pluck('id')->toArray(); - /** @var Collection $set */ - $set = auth()->user()->accounts()->whereIn('account_type_id', $accountTypeIds)->where('id', '!=', $ignore)->get(); - // TODO no longer need to loop like this - /** @var Account $entry */ - foreach ($set as $entry) { - if ($entry->name === $value) { - return false; - } - } - - return true; - } - - /** - * @param string $value - * - * @return bool - */ - private function validateByAccountName(string $value): bool - { - return auth()->user()->accounts()->where('name', $value)->count() === 0; - } } diff --git a/app/Validation/GroupValidation.php b/app/Validation/GroupValidation.php index 0b6013bd40..2e150db636 100644 --- a/app/Validation/GroupValidation.php +++ b/app/Validation/GroupValidation.php @@ -36,40 +36,6 @@ use Log; trait GroupValidation { - /** - * @param Validator $validator - * - * @return array - */ - abstract protected function getTransactionsArray(Validator $validator): array; - - /** - * This method validates if the user has submitted transaction journal ID's for each array they submit, if they've submitted more than 1 transaction - * journal. This check is necessary because Firefly III isn't able to distinguish between journals without the ID. - * - * @param Validator $validator - * @param TransactionGroup $transactionGroup - */ - protected function validateJournalIds(Validator $validator, TransactionGroup $transactionGroup): void - { - Log::debug(sprintf('Now in GroupValidation::validateJournalIds(%d)', $transactionGroup->id)); - $transactions = $this->getTransactionsArray($validator); - - if (count($transactions) < 2) { - // no need for validation. - Log::debug(sprintf('%d transaction(s) in submission, can skip this check.', count($transactions))); - return; - } - // check each array: - /** - * @var int $index - * @var array $transaction - */ - foreach ($transactions as $index => $transaction) { - $this->validateJournalId($validator, $index, $transaction, $transactionGroup); - } - } - /** * Adds an error to the "description" field when the user has submitted no descriptions and no * journal description. @@ -95,6 +61,56 @@ trait GroupValidation } } + /** + * @param Validator $validator + */ + protected function validateGroupDescription(Validator $validator): void + { + Log::debug('Now in validateGroupDescription()'); + $data = $validator->getData(); + $transactions = $this->getTransactionsArray($validator); + + $groupTitle = $data['group_title'] ?? ''; + if ('' === $groupTitle && count($transactions) > 1) { + $validator->errors()->add('group_title', (string)trans('validation.group_title_mandatory')); + } + } + + /** + * This method validates if the user has submitted transaction journal ID's for each array they submit, if they've submitted more than 1 transaction + * journal. This check is necessary because Firefly III isn't able to distinguish between journals without the ID. + * + * @param Validator $validator + * @param TransactionGroup $transactionGroup + */ + protected function validateJournalIds(Validator $validator, TransactionGroup $transactionGroup): void + { + Log::debug(sprintf('Now in GroupValidation::validateJournalIds(%d)', $transactionGroup->id)); + $transactions = $this->getTransactionsArray($validator); + + if (count($transactions) < 2) { + // no need for validation. + Log::debug(sprintf('%d transaction(s) in submission, can skip this check.', count($transactions))); + + return; + } + // check each array: + /** + * @var int $index + * @var array $transaction + */ + foreach ($transactions as $index => $transaction) { + $this->validateJournalId($validator, $index, $transaction, $transactionGroup); + } + } + + /** + * @param Validator $validator + * + * @return array + */ + abstract protected function getTransactionsArray(Validator $validator): array; + /** * Do the validation required by validateJournalIds. * @@ -110,27 +126,11 @@ trait GroupValidation $journalId = $transaction['transaction_journal_id'] ?? null; Log::debug(sprintf('Now in validateJournalId(%d, %d)', $index, $journalId)); - $journalId = null === $journalId ? null : (int) $journalId; + $journalId = null === $journalId ? null : (int)$journalId; $count = $transactionGroup->transactionJournals()->where('id', $journalId)->count(); if (null === $journalId || (null !== $journalId && 0 !== $journalId && 0 === $count)) { Log::warning('Invalid submission: Each split must have transaction_journal_id (either valid ID or 0).'); - $validator->errors()->add(sprintf('transactions.%d.source_name', $index), (string) trans('validation.need_id_in_edit')); - } - } - - - /** - * @param Validator $validator - */ - protected function validateGroupDescription(Validator $validator): void - { - Log::debug('Now in validateGroupDescription()'); - $data = $validator->getData(); - $transactions = $this->getTransactionsArray($validator); - - $groupTitle = $data['group_title'] ?? ''; - if ('' === $groupTitle && count($transactions) > 1) { - $validator->errors()->add('group_title', (string) trans('validation.group_title_mandatory')); + $validator->errors()->add(sprintf('transactions.%d.source_name', $index), (string)trans('validation.need_id_in_edit')); } } diff --git a/app/Validation/RecurrenceValidation.php b/app/Validation/RecurrenceValidation.php index a58d4d2033..35f10bf622 100644 --- a/app/Validation/RecurrenceValidation.php +++ b/app/Validation/RecurrenceValidation.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace FireflyIII\Validation; use Carbon\Carbon; +use FireflyIII\Models\Recurrence; +use FireflyIII\Models\RecurrenceTransaction; use Illuminate\Validation\Validator; use InvalidArgumentException; use Log; @@ -36,23 +38,6 @@ use Log; */ trait RecurrenceValidation { - public function validateRecurringConfig(Validator $validator) { - $data = $validator->getData(); - $reps = array_key_exists('nr_of_repetitions', $data) ? (int)$data['nr_of_repetitions'] : null; - $repeatUntil = array_key_exists('repeat_until', $data) ? new Carbon($data['repeat_until']) : null; - - if(null === $reps && null === $repeatUntil) { - $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); - $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); - return; - } - if($reps > 0 && null !== $repeatUntil) { - $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); - $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); - return; - } - } - /** * Validate account information input for recurrences which are being updated. * @@ -65,7 +50,29 @@ trait RecurrenceValidation $data = $validator->getData(); $transactionType = $data['type'] ?? 'invalid'; - $transactions = $data['transactions'] ?? []; + + // grab model from parameter and try to set the transaction type from it + if ('invalid' === $transactionType) { + Log::debug('Type is invalid but we will search for it.'); + /** @var Recurrence $recurrence */ + $recurrence = $this->route()->parameter('recurrence'); + if (null !== $recurrence) { + Log::debug('There is a recurrence in the route.'); + // ok so we have a recurrence should be able to extract type somehow. + /** @var RecurrenceTransaction $first */ + $first = $recurrence->recurrenceTransactions()->first(); + if (null !== $first) { + $transactionType = $first->transactionType ? $first->transactionType->type : 'withdrawal'; + Log::debug(sprintf('Determined type to be %s.', $transactionType)); + } + if (null === $first) { + Log::warning('Just going to assume type is a withdrawal.'); + $transactionType = 'withdrawal'; + } + } + } + + $transactions = $data['transactions'] ?? []; /** @var AccountValidator $accountValidator */ $accountValidator = app(AccountValidator::class); @@ -75,6 +82,16 @@ trait RecurrenceValidation $transactionType = $transaction['type'] ?? $transactionType; $accountValidator->setTransactionType($transactionType); + if ( + !array_key_exists('source_id', $transaction) + && !array_key_exists('destination_id', $transaction) + && !array_key_exists('source_name', $transaction) + && !array_key_exists('destination_name', $transaction) + ) { + continue; + } + + // validate source account. $sourceId = isset($transaction['source_id']) ? (int)$transaction['source_id'] : null; $sourceName = $transaction['source_name'] ?? null; @@ -152,6 +169,26 @@ trait RecurrenceValidation } } + public function validateRecurringConfig(Validator $validator) + { + $data = $validator->getData(); + $reps = array_key_exists('nr_of_repetitions', $data) ? (int)$data['nr_of_repetitions'] : null; + $repeatUntil = array_key_exists('repeat_until', $data) ? new Carbon($data['repeat_until']) : null; + + if (null === $reps && null === $repeatUntil) { + $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); + $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); + + return; + } + if ($reps > 0 && null !== $repeatUntil) { + $validator->errors()->add('nr_of_repetitions', trans('validation.require_repeat_until')); + $validator->errors()->add('repeat_until', trans('validation.require_repeat_until')); + + return; + } + } + /** * @param Validator $validator */ diff --git a/app/Validation/TransactionValidation.php b/app/Validation/TransactionValidation.php index 28010f45f6..5c04015d40 100644 --- a/app/Validation/TransactionValidation.php +++ b/app/Validation/TransactionValidation.php @@ -61,6 +61,30 @@ trait TransactionValidation } } + /** + * @param Validator $validator + * + * @return array + */ + protected function getTransactionsArray(Validator $validator): array + { + $data = $validator->getData(); + $transactions = $data['transactions'] ?? []; + if (!is_countable($transactions)) { + Log::error(sprintf('Transactions array is not countable, because its a %s', gettype($transactions))); + + return []; + } + // a superfluous check but you never know. + if (!is_array($transactions)) { + Log::error(sprintf('Transactions array is not an array, because its a %s', gettype($transactions))); + + return []; + } + + return $transactions; + } + /** * @param Validator $validator * @param int $index @@ -193,6 +217,40 @@ trait TransactionValidation Log::debug('Done with validateSingleUpdate().'); } + /** + * @param TransactionGroup $group + * @param array $transactions + * + * @return string + */ + private function getTransactionType(TransactionGroup $group, array $transactions): string + { + return $transactions[0]['type'] ?? strtolower($group->transactionJournals()->first()->transactionType->type); + } + + /** + * @param array $transaction + * @param TransactionGroup $transactionGroup + * + * @return Account|null + */ + private function getOriginalSource(array $transaction, TransactionGroup $transactionGroup): ?Account + { + if (1 === $transactionGroup->transactionJournals->count()) { + $journal = $transactionGroup->transactionJournals->first(); + + return $journal->transactions()->where('amount', '<', 0)->first()->account; + } + /** @var TransactionJournal $journal */ + foreach ($transactionGroup->transactionJournals as $journal) { + if ((int)$journal->id === (int)$transaction['transaction_journal_id']) { + return $journal->transactions()->where('amount', '<', 0)->first()->account; + } + } + + return null; + } + /** * Adds an error to the validator when there are no transactions in the array of data. * @@ -209,22 +267,6 @@ trait TransactionValidation } } - /** - * @param Validator $validator - */ - public function validateTransactionArray(Validator $validator): void - { - $transactions = $this->getTransactionsArray($validator); - foreach ($transactions as $key => $value) { - if (!is_int($key)) { - $validator->errors()->add('transactions.0.description', (string)trans('validation.at_least_one_transaction')); - Log::debug('Added error: at_least_one_transaction.'); - - return; - } - } - } - /** * Adds an error to the validator when there are no transactions in the array of data. * @@ -244,6 +286,22 @@ trait TransactionValidation Log::debug('Added NO errors.'); } + /** + * @param Validator $validator + */ + public function validateTransactionArray(Validator $validator): void + { + $transactions = $this->getTransactionsArray($validator); + foreach ($transactions as $key => $value) { + if (!is_int($key)) { + $validator->errors()->add('transactions.0.description', (string)trans('validation.at_least_one_transaction')); + Log::debug('Added error: at_least_one_transaction.'); + + return; + } + } + } + /** * All types of splits must be equal. * @@ -296,48 +354,6 @@ trait TransactionValidation Log::debug('No errors in validateTransactionTypesForUpdate()'); } - /** - * @param array $array - * - * @return bool - */ - private function arrayEqual(array $array): bool - { - return 1 === count(array_unique($array)); - } - - /** - * @param int $journalId - * - * @return array - */ - private function getOriginalData(int $journalId): array - { - $return = [ - 'source_id' => 0, - 'source_name' => '', - 'destination_id' => 0, - 'destination_name' => '', - ]; - if (0 === $journalId) { - return $return; - } - /** @var Transaction $source */ - $source = Transaction::where('transaction_journal_id', $journalId)->where('amount', '<', 0)->with(['account'])->first(); - if (null !== $source) { - $return['source_id'] = $source->account_id; - $return['source_name'] = $source->account->name; - } - /** @var Transaction $destination */ - $destination = Transaction::where('transaction_journal_id', $journalId)->where('amount', '>', 0)->with(['account'])->first(); - if (null !== $source) { - $return['destination_id'] = $destination->account_id; - $return['destination_name'] = $destination->account->name; - } - - return $return; - } - /** * @param int $journalId * @@ -357,30 +373,6 @@ trait TransactionValidation return 'invalid'; } - /** - * @param Validator $validator - * - * @return array - */ - protected function getTransactionsArray(Validator $validator): array - { - $data = $validator->getData(); - $transactions = $data['transactions'] ?? []; - if (!is_countable($transactions)) { - Log::error(sprintf('Transactions array is not countable, because its a %s', gettype($transactions))); - - return []; - } - // a superfluous check but you never know. - if (!is_array($transactions)) { - Log::error(sprintf('Transactions array is not an array, because its a %s', gettype($transactions))); - - return []; - } - - return $transactions; - } - /** * @param Validator $validator */ @@ -423,125 +415,6 @@ trait TransactionValidation } } - /** - * @param TransactionGroup $group - * @param array $transactions - * - * @return string - */ - private function getTransactionType(TransactionGroup $group, array $transactions): string - { - return $transactions[0]['type'] ?? strtolower($group->transactionJournals()->first()->transactionType->type); - } - - /** - * @param array $transactions - * - * @return array - */ - private function collectComparisonData(array $transactions): array - { - $fields = ['source_id', 'destination_id', 'source_name', 'destination_name']; - $comparison = []; - foreach ($fields as $field) { - $comparison[$field] = []; - /** @var array $transaction */ - foreach ($transactions as $transaction) { - // source or destination may be omitted. If this is the case, use the original source / destination name + ID. - $originalData = $this->getOriginalData((int)($transaction['transaction_journal_id'] ?? 0)); - - // get field. - $comparison[$field][] = $transaction[$field] ?? $originalData[$field]; - } - } - - return $comparison; - } - - /** - * @param string $type - * @param array $comparison - * - * @return bool - */ - private function compareAccountData(string $type, array $comparison): bool - { - switch ($type) { - default: - case 'withdrawal': - return $this->compareAccountDataWithdrawal($comparison); - case 'deposit': - return $this->compareAccountDataDeposit($comparison); - case 'transfer': - return $this->compareAccountDataTransfer($comparison); - } - } - - /** - * @param array $comparison - * - * @return bool - */ - private function compareAccountDataTransfer(array $comparison): bool - { - if ($this->arrayEqual($comparison['source_id'])) { - // source ID's are equal, return void. - return true; - } - if ($this->arrayEqual($comparison['source_name'])) { - // source names are equal, return void. - return true; - } - if ($this->arrayEqual($comparison['destination_id'])) { - // destination ID's are equal, return void. - return true; - } - if ($this->arrayEqual($comparison['destination_name'])) { - // destination names are equal, return void. - return true; - } - - return false; - } - - /** - * @param array $comparison - * - * @return bool - */ - private function compareAccountDataWithdrawal(array $comparison): bool - { - if ($this->arrayEqual($comparison['source_id'])) { - // source ID's are equal, return void. - return true; - } - if ($this->arrayEqual($comparison['source_name'])) { - // source names are equal, return void. - return true; - } - - return false; - } - - /** - * @param array $comparison - * - * @return bool - */ - private function compareAccountDataDeposit(array $comparison): bool - { - if ($this->arrayEqual($comparison['destination_id'])) { - // destination ID's are equal, return void. - return true; - } - if ($this->arrayEqual($comparison['destination_name'])) { - // destination names are equal, return void. - return true; - } - - return false; - } - /** * @param Validator $validator * @param TransactionGroup $transactionGroup @@ -584,25 +457,152 @@ trait TransactionValidation } /** - * @param array $transaction - * @param TransactionGroup $transactionGroup + * @param array $transactions * - * @return Account|null + * @return array */ - private function getOriginalSource(array $transaction, TransactionGroup $transactionGroup): ?Account + private function collectComparisonData(array $transactions): array { - if (1 === $transactionGroup->transactionJournals->count()) { - $journal = $transactionGroup->transactionJournals->first(); + $fields = ['source_id', 'destination_id', 'source_name', 'destination_name']; + $comparison = []; + foreach ($fields as $field) { + $comparison[$field] = []; + /** @var array $transaction */ + foreach ($transactions as $transaction) { + // source or destination may be omitted. If this is the case, use the original source / destination name + ID. + $originalData = $this->getOriginalData((int)($transaction['transaction_journal_id'] ?? 0)); - return $journal->transactions()->where('amount', '<', 0)->first()->account; - } - /** @var TransactionJournal $journal */ - foreach ($transactionGroup->transactionJournals as $journal) { - if ((int)$journal->id === (int)$transaction['transaction_journal_id']) { - return $journal->transactions()->where('amount', '<', 0)->first()->account; + // get field. + $comparison[$field][] = $transaction[$field] ?? $originalData[$field]; } } - return null; + return $comparison; + } + + /** + * @param int $journalId + * + * @return array + */ + private function getOriginalData(int $journalId): array + { + $return = [ + 'source_id' => 0, + 'source_name' => '', + 'destination_id' => 0, + 'destination_name' => '', + ]; + if (0 === $journalId) { + return $return; + } + /** @var Transaction $source */ + $source = Transaction::where('transaction_journal_id', $journalId)->where('amount', '<', 0)->with(['account'])->first(); + if (null !== $source) { + $return['source_id'] = $source->account_id; + $return['source_name'] = $source->account->name; + } + /** @var Transaction $destination */ + $destination = Transaction::where('transaction_journal_id', $journalId)->where('amount', '>', 0)->with(['account'])->first(); + if (null !== $source) { + $return['destination_id'] = $destination->account_id; + $return['destination_name'] = $destination->account->name; + } + + return $return; + } + + /** + * @param string $type + * @param array $comparison + * + * @return bool + */ + private function compareAccountData(string $type, array $comparison): bool + { + switch ($type) { + default: + case 'withdrawal': + return $this->compareAccountDataWithdrawal($comparison); + case 'deposit': + return $this->compareAccountDataDeposit($comparison); + case 'transfer': + return $this->compareAccountDataTransfer($comparison); + } + } + + /** + * @param array $comparison + * + * @return bool + */ + private function compareAccountDataWithdrawal(array $comparison): bool + { + if ($this->arrayEqual($comparison['source_id'])) { + // source ID's are equal, return void. + return true; + } + if ($this->arrayEqual($comparison['source_name'])) { + // source names are equal, return void. + return true; + } + + return false; + } + + /** + * @param array $array + * + * @return bool + */ + private function arrayEqual(array $array): bool + { + return 1 === count(array_unique($array)); + } + + /** + * @param array $comparison + * + * @return bool + */ + private function compareAccountDataDeposit(array $comparison): bool + { + if ($this->arrayEqual($comparison['destination_id'])) { + // destination ID's are equal, return void. + return true; + } + if ($this->arrayEqual($comparison['destination_name'])) { + // destination names are equal, return void. + return true; + } + + return false; + } + + /** + * @param array $comparison + * + * @return bool + */ + private function compareAccountDataTransfer(array $comparison): bool + { + if ($this->arrayEqual($comparison['source_id'])) { + // source ID's are equal, return void. + return true; + } + if ($this->arrayEqual($comparison['source_name'])) { + // source names are equal, return void. + return true; + } + if ($this->arrayEqual($comparison['destination_id'])) { + // destination ID's are equal, return void. + return true; + } + if ($this->arrayEqual($comparison['destination_name'])) { + // destination names are equal, return void. + return true; + } + + return false; } } diff --git a/changelog.md b/changelog.md index ba3a246a86..7bf5e1551b 100644 --- a/changelog.md +++ b/changelog.md @@ -23,6 +23,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Changed - OAuth settings are visible for LDAP users. - If you set `FIREFLY_III_LAYOUT=v2`, Firefly III will show you the new layout on pages where it's available. +- New favicon. +- Cron job endpoint has changed. ### Deprecated - The current layout will no longer receive fixes and changes. @@ -48,6 +50,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - [Issue 4235](https://github.com/firefly-iii/firefly-iii/issues/4235) Info popup instandard financial report does not apply report's account filter - [Issue 4241](https://github.com/firefly-iii/firefly-iii/issues/4241) Broken chart - PHP configs that have "MB" as size indicator would be parsed badly. +- RSA token generation is now PHP7/8 compatible. ### API @@ -61,6 +64,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - [Issue 4394](https://github.com/firefly-iii/firefly-iii/issues/4394) Storing budgets works again. - [Issue 4426](https://github.com/firefly-iii/firefly-iii/issues/4426) Storing accounts would lead to bad capitalization in liability type. - [Issue 4435](https://github.com/firefly-iii/firefly-iii/issues/4435) Storing piggy banks with object group information would fail. +- Users can submit almost any field without other fields changing as well. ## 5.4.6 (API 1.4.0) - 2020-10-07 diff --git a/composer.lock b/composer.lock index 131f865731..5828ad86e0 100644 --- a/composer.lock +++ b/composer.lock @@ -1641,16 +1641,16 @@ }, { "name": "laravel/framework", - "version": "v8.32.1", + "version": "v8.33.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "7c37b64f8153c16b6406f5c28cf37828ebbe8846" + "reference": "354c57b8cb457549114074c500944455a288d6cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/7c37b64f8153c16b6406f5c28cf37828ebbe8846", - "reference": "7c37b64f8153c16b6406f5c28cf37828ebbe8846", + "url": "https://api.github.com/repos/laravel/framework/zipball/354c57b8cb457549114074c500944455a288d6cc", + "reference": "354c57b8cb457549114074c500944455a288d6cc", "shasum": "" }, "require": { @@ -1805,7 +1805,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-03-09T15:37:45+00:00" + "time": "2021-03-16T19:42:32+00:00" }, { "name": "laravel/passport", @@ -2077,16 +2077,16 @@ }, { "name": "lcobucci/jwt", - "version": "4.1.2", + "version": "4.1.3", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "c544710aa18e079baf0027ca4c8236913f46945b" + "reference": "1e66927ea937c199539f8a8a35e284b6667c4f2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/c544710aa18e079baf0027ca4c8236913f46945b", - "reference": "c544710aa18e079baf0027ca4c8236913f46945b", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/1e66927ea937c199539f8a8a35e284b6667c4f2c", + "reference": "1e66927ea937c199539f8a8a35e284b6667c4f2c", "shasum": "" }, "require": { @@ -2135,7 +2135,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/4.1.2" + "source": "https://github.com/lcobucci/jwt/tree/4.1.3" }, "funding": [ { @@ -2147,7 +2147,7 @@ "type": "patreon" } ], - "time": "2021-02-19T19:37:15+00:00" + "time": "2021-03-19T20:58:12+00:00" }, { "name": "league/commonmark", @@ -6967,30 +6967,35 @@ }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -7014,9 +7019,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.9.1" + "source": "https://github.com/webmozarts/assert/tree/1.10.0" }, - "time": "2020-07-08T17:02:28+00:00" + "time": "2021-03-09T10:59:23+00:00" } ], "packages-dev": [ @@ -7263,16 +7268,16 @@ }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.9.0", + "version": "v2.9.1", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "64a6b902583802c162cdccf7e76dc8619368bf1a" + "reference": "8d8302ff6adb55f8b844c798b8b1ffdee142f7e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/64a6b902583802c162cdccf7e76dc8619368bf1a", - "reference": "64a6b902583802c162cdccf7e76dc8619368bf1a", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/8d8302ff6adb55f8b844c798b8b1ffdee142f7e5", + "reference": "8d8302ff6adb55f8b844c798b8b1ffdee142f7e5", "shasum": "" }, "require": { @@ -7283,6 +7288,7 @@ "illuminate/console": "^8", "illuminate/filesystem": "^8", "illuminate/support": "^8", + "nikic/php-parser": "^4.7", "php": "^7.3 || ^8.0", "phpdocumentor/type-resolver": "^1.1.0" }, @@ -7297,6 +7303,9 @@ "spatie/phpunit-snapshot-assertions": "^3 || ^4", "vimeo/psalm": "^3.12" }, + "suggest": { + "illuminate/events": "Required for automatic helper generation (^6|^7|^8)." + }, "type": "library", "extra": { "branch-alias": { @@ -7337,7 +7346,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.9.0" + "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.9.1" }, "funding": [ { @@ -7345,7 +7354,7 @@ "type": "github" } ], - "time": "2020-12-29T10:11:05+00:00" + "time": "2021-03-15T19:22:08+00:00" }, { "name": "barryvdh/reflection-docblock", @@ -8133,16 +8142,16 @@ }, { "name": "filp/whoops", - "version": "2.9.2", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "df7933820090489623ce0be5e85c7e693638e536" + "reference": "f6e14679f948d8a5cfb866fa7065a30c66bd64d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/df7933820090489623ce0be5e85c7e693638e536", - "reference": "df7933820090489623ce0be5e85c7e693638e536", + "url": "https://api.github.com/repos/filp/whoops/zipball/f6e14679f948d8a5cfb866fa7065a30c66bd64d3", + "reference": "f6e14679f948d8a5cfb866fa7065a30c66bd64d3", "shasum": "" }, "require": { @@ -8192,7 +8201,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.9.2" + "source": "https://github.com/filp/whoops/tree/2.11.0" }, "funding": [ { @@ -8200,7 +8209,7 @@ "type": "github" } ], - "time": "2021-01-24T12:00:00+00:00" + "time": "2021-03-19T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8627,16 +8636,16 @@ }, { "name": "nunomaduro/larastan", - "version": "v0.7.0", + "version": "v0.7.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/larastan.git", - "reference": "179d7565674d4e264e60296d1b5b75413b7461b6" + "reference": "bbbe09ec16a565e6423878bd17fc4355fa0d0a4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/179d7565674d4e264e60296d1b5b75413b7461b6", - "reference": "179d7565674d4e264e60296d1b5b75413b7461b6", + "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/bbbe09ec16a565e6423878bd17fc4355fa0d0a4c", + "reference": "bbbe09ec16a565e6423878bd17fc4355fa0d0a4c", "shasum": "" }, "require": { @@ -8651,7 +8660,7 @@ "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", "mockery/mockery": "^0.9 || ^1.0", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^0.12.70", + "phpstan/phpstan": "0.12.81", "symfony/process": "^4.3 || ^5.0" }, "require-dev": { @@ -8700,7 +8709,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/larastan/issues", - "source": "https://github.com/nunomaduro/larastan/tree/v0.7.0" + "source": "https://github.com/nunomaduro/larastan/tree/v0.7.1" }, "funding": [ { @@ -8720,7 +8729,7 @@ "type": "patreon" } ], - "time": "2021-02-01T22:08:11+00:00" + "time": "2021-03-19T09:41:48+00:00" }, { "name": "openlss/lib-array2xml", @@ -9046,16 +9055,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.12.2", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "245710e971a030f42e08f4912863805570f23d39" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", - "reference": "245710e971a030f42e08f4912863805570f23d39", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { @@ -9107,9 +9116,9 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.2" + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" }, - "time": "2020-12-19T10:15:11+00:00" + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpstan/phpstan", @@ -9542,16 +9551,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.2", + "version": "9.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4" + "reference": "27241ac75fc37ecf862b6e002bf713b6566cbe41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f661659747f2f87f9e72095bb207bceb0f151cb4", - "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/27241ac75fc37ecf862b6e002bf713b6566cbe41", + "reference": "27241ac75fc37ecf862b6e002bf713b6566cbe41", "shasum": "" }, "require": { @@ -9629,7 +9638,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.3" }, "funding": [ { @@ -9641,7 +9650,7 @@ "type": "github" } ], - "time": "2021-02-02T14:45:58+00:00" + "time": "2021-03-17T07:30:34+00:00" }, { "name": "react/promise", @@ -9699,12 +9708,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "43a315341710475e88006a0e55864b348d3d781c" + "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/43a315341710475e88006a0e55864b348d3d781c", - "reference": "43a315341710475e88006a0e55864b348d3d781c", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11b8a607a59818bb21fc9ffb334f03032a6ce5dc", + "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc", "shasum": "" }, "conflict": { @@ -9763,10 +9772,10 @@ "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<=6.13.8|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<=7.5.15", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", @@ -9906,6 +9915,7 @@ "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -9942,8 +9952,8 @@ "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", @@ -10022,7 +10032,7 @@ "type": "tidelift" } ], - "time": "2021-03-13T00:05:05+00:00" + "time": "2021-03-19T20:02:32+00:00" }, { "name": "sebastian/cli-parser", @@ -11337,20 +11347,20 @@ }, { "name": "vimeo/psalm", - "version": "4.6.2", + "version": "4.6.4", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "bca09d74adc704c4eaee36a3c3e9d379e290fc3b" + "reference": "97fe86c4e158b5a57c5150aa5055c38b5a809aab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/bca09d74adc704c4eaee36a3c3e9d379e290fc3b", - "reference": "bca09d74adc704c4eaee36a3c3e9d379e290fc3b", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/97fe86c4e158b5a57c5150aa5055c38b5a809aab", + "reference": "97fe86c4e158b5a57c5150aa5055c38b5a809aab", "shasum": "" }, "require": { - "amphp/amp": "^2.1", + "amphp/amp": "^2.4.2", "amphp/byte-stream": "^1.5", "composer/package-versions-deprecated": "^1.8.0", "composer/semver": "^1.4 || ^2.0 || ^3.0", @@ -11376,7 +11386,6 @@ "psalm/psalm": "self.version" }, "require-dev": { - "amphp/amp": "^2.4.2", "bamarni/composer-bin-plugin": "^1.2", "brianium/paratest": "^4.0||^6.0", "ext-curl": "*", @@ -11436,9 +11445,9 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.6.2" + "source": "https://github.com/vimeo/psalm/tree/4.6.4" }, - "time": "2021-02-26T02:24:18+00:00" + "time": "2021-03-16T23:28:18+00:00" }, { "name": "webmozart/path-util", diff --git a/config/firefly.php b/config/firefly.php index 3b2ebd778e..531fd496ca 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -99,7 +99,7 @@ return [ 'webhooks' => false, ], - 'version' => '5.5.0-beta.2', + 'version' => '5.5.0-beta.3', 'api_version' => '1.5.0', 'db_version' => 16, 'maxUploadSize' => 1073741824, // 1 GB diff --git a/database/factories/FireflyIII/Models/AccountFactory.php b/database/factories/FireflyIII/Models/AccountFactory.php index 0f7d20e7c0..1d3ebf9771 100644 --- a/database/factories/FireflyIII/Models/AccountFactory.php +++ b/database/factories/FireflyIII/Models/AccountFactory.php @@ -39,6 +39,20 @@ class AccountFactory extends Factory */ protected $model = Account::class; + /** + * @return AccountFactory + */ + public function asset() + { + return $this->state( + function () { + return [ + 'account_type_id' => 3, + ]; + } + ); + } + /** * @inheritDoc */ @@ -58,12 +72,12 @@ class AccountFactory extends Factory /** * @return AccountFactory */ - public function asset() + public function expense() { return $this->state( function () { return [ - 'account_type_id' => 3, + 'account_type_id' => 4, ]; } ); @@ -83,19 +97,5 @@ class AccountFactory extends Factory ); } - /** - * @return AccountFactory - */ - public function expense() - { - return $this->state( - function () { - return [ - 'account_type_id' => 4, - ]; - } - ); - } - } diff --git a/database/factories/FireflyIII/Models/TransactionJournalFactory.php b/database/factories/FireflyIII/Models/TransactionJournalFactory.php index ec0e7daf32..20cb16769b 100644 --- a/database/factories/FireflyIII/Models/TransactionJournalFactory.php +++ b/database/factories/FireflyIII/Models/TransactionJournalFactory.php @@ -41,53 +41,7 @@ class TransactionJournalFactory extends Factory protected $model = TransactionJournal::class; /** - * Define the model's default state. - * - * @return array - */ - public function definition() - { - return [ - 'user_id' => 1, - 'transaction_type_id' => 1, - 'description' => $this->faker->words(3, true), - 'tag_count' => 0, - 'date' => $this->faker->date('Y-m-d'), - ]; - } - - /** - * @return \Illuminate\Database\Eloquent\Factories\Factory - */ - public function openingBalance() - { - return $this - ->state(fn () => ['transaction_type_id' => 4]) - ->afterCreating( - function (TransactionJournal $journal) { - // fix factory - $obAccount = Account::factory(Account::class)->initialBalance()->create(); - $assetAccount = Account::factory(Account::class)->asset()->create(); - Transaction::factory()->create( - [ - 'account_id' => $obAccount->id, - 'transaction_journal_id' => $journal->id, - 'amount' => '5', - ] - ); - Transaction::factory()->create( - [ - 'account_id' => $assetAccount->id, - 'transaction_journal_id' => $journal->id, - 'amount' => '-5', - ] - ); - } - ); - } - - /** - * @return \Illuminate\Database\Eloquent\Factories\Factory + * @return Factory */ public function brokenOpeningBalance() { @@ -120,4 +74,50 @@ class TransactionJournalFactory extends Factory } ); } + + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + 'transaction_type_id' => 1, + 'description' => $this->faker->words(3, true), + 'tag_count' => 0, + 'date' => $this->faker->date('Y-m-d'), + ]; + } + + /** + * @return Factory + */ + public function openingBalance() + { + return $this + ->state(fn() => ['transaction_type_id' => 4]) + ->afterCreating( + function (TransactionJournal $journal) { + // fix factory + $obAccount = Account::factory(Account::class)->initialBalance()->create(); + $assetAccount = Account::factory(Account::class)->asset()->create(); + Transaction::factory()->create( + [ + 'account_id' => $obAccount->id, + 'transaction_journal_id' => $journal->id, + 'amount' => '5', + ] + ); + Transaction::factory()->create( + [ + 'account_id' => $assetAccount->id, + 'transaction_journal_id' => $journal->id, + 'amount' => '-5', + ] + ); + } + ); + } } diff --git a/database/seeders/TransactionTypeSeeder.php b/database/seeders/TransactionTypeSeeder.php index 97eb6c19d0..adab1d38c8 100644 --- a/database/seeders/TransactionTypeSeeder.php +++ b/database/seeders/TransactionTypeSeeder.php @@ -39,7 +39,7 @@ class TransactionTypeSeeder extends Seeder TransactionType::TRANSFER, TransactionType::OPENING_BALANCE, TransactionType::RECONCILIATION, - TransactionType::INVALID + TransactionType::INVALID, ]; foreach ($types as $type) { diff --git a/frontend/src/app.scss b/frontend/src/app.scss index 0ab440fcfe..d960013999 100644 --- a/frontend/src/app.scss +++ b/frontend/src/app.scss @@ -18,6 +18,10 @@ * along with this program. If not, see . */ +// Firefly III colors (?) +@import 'scss/variables'; + + // Fonts @import '~@fortawesome/fontawesome-free/css/all.css'; // OverlayScrollbars @@ -40,8 +44,7 @@ // --------------------------------------------------- @import '~admin-lte/build/scss/variables'; -// Firefly III colors (?) -@import 'scss/variables'; + @import '~admin-lte/build/scss/mixins'; @import '~admin-lte/build/scss/parts/core'; @@ -68,7 +71,7 @@ //@import '../social-widgets'; // admin LTE pages (unused) -// @import 'parts/pages'; + @import '~admin-lte/build/scss/parts/pages'; // admin LTE plugins (unused) // @import 'parts/plugins'; diff --git a/frontend/src/components/transactions/Create.vue b/frontend/src/components/transactions/Create.vue index 061fe2920b..c3c945fce7 100644 --- a/frontend/src/components/transactions/Create.vue +++ b/frontend/src/components/transactions/Create.vue @@ -825,19 +825,18 @@ export default { * Get API value. */ getAllowedOpposingTypes: function () { - axios.get('./api/v1/configuration/static/firefly.allowed_opposing_types') + axios.get('./api/v1/configuration/firefly.allowed_opposing_types') .then(response => { - this.allowedOpposingTypes = response.data['firefly.allowed_opposing_types']; - // console.log('Set allowedOpposingTypes'); + this.allowedOpposingTypes = response.data.data.value; }); }, /** * Get API value. */ getAccountToTransaction: function () { - axios.get('./api/v1/configuration/static/firefly.account_to_transaction') + axios.get('./api/v1/configuration/firefly.account_to_transaction') .then(response => { - this.accountToTransaction = response.data['firefly.account_to_transaction']; + this.accountToTransaction = response.data.data.value; }); }, /** diff --git a/frontend/src/components/transactions/TransactionAccount.vue b/frontend/src/components/transactions/TransactionAccount.vue index a1396396d4..dfc0a29cc6 100644 --- a/frontend/src/components/transactions/TransactionAccount.vue +++ b/frontend/src/components/transactions/TransactionAccount.vue @@ -69,15 +69,34 @@ import {debounce} from 'lodash'; export default { name: "TransactionAccount", components: {VueTypeaheadBootstrap}, - props: [ - 'index', - 'direction', - 'value', - 'errors', - 'sourceAllowedTypes', - 'destinationAllowedTypes', - 'allowedOpposingTypes' - ], + props: { + index: { + type: Number, + }, + direction: { + type: String, + }, + value: { + type: Object, + default: () => ({}) + }, + errors: { + type: Array, + default: () => ([]) + }, + sourceAllowedTypes: { + type: Array, + default: () => ([]) + }, + destinationAllowedTypes: { + type: Array, + default: () => ([]) + }, + allowedOpposingTypes: { + type: Object, + default: () => ({}) + }, + }, data() { return { query: '', diff --git a/frontend/src/components/transactions/TransactionListLarge.vue b/frontend/src/components/transactions/TransactionListLarge.vue index c7c9a3d1a5..118cb58897 100644 --- a/frontend/src/components/transactions/TransactionListLarge.vue +++ b/frontend/src/components/transactions/TransactionListLarge.vue @@ -42,8 +42,8 @@ {{ tr.destination_name }} {{ tr.source_name }} - {{ tr.destination_name }} - {{ tr.source_name }} + {{ tr.destination_name }} + {{ tr.source_name }}
@@ -55,10 +55,10 @@ {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount) }}
- + {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount * -1) }}
- + {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount) }}
diff --git a/frontend/src/components/transactions/TransactionListMedium.vue b/frontend/src/components/transactions/TransactionListMedium.vue index cea86447af..776ed351fc 100644 --- a/frontend/src/components/transactions/TransactionListMedium.vue +++ b/frontend/src/components/transactions/TransactionListMedium.vue @@ -40,8 +40,8 @@ {{ tr.destination_name }} {{ tr.source_name }} - {{ tr.destination_name }} - {{ tr.source_name }} + {{ tr.destination_name }} + {{ tr.source_name }}
@@ -53,10 +53,10 @@ {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount) }}
- + {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount * -1) }}
- + {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount) }}
diff --git a/frontend/src/components/transactions/TransactionListSmall.vue b/frontend/src/components/transactions/TransactionListSmall.vue index cb4c645e23..26b99d0985 100644 --- a/frontend/src/components/transactions/TransactionListSmall.vue +++ b/frontend/src/components/transactions/TransactionListSmall.vue @@ -44,10 +44,10 @@ {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount) }}
- + {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount * -1) }}
- + {{ Intl.NumberFormat(locale, {style: 'currency', currency: tr.currency_code}).format(tr.amount) }}
diff --git a/frontend/src/components/transactions/TransactionLocation.vue b/frontend/src/components/transactions/TransactionLocation.vue index a973d4144b..eb1995801e 100644 --- a/frontend/src/components/transactions/TransactionLocation.vue +++ b/frontend/src/components/transactions/TransactionLocation.vue @@ -80,12 +80,12 @@ export default { }, created() { if (null === this.value || typeof this.value === 'undefined') { - axios.get('./api/v1/configuration/static/firefly.default_location').then(response => { - this.zoom = parseInt(response.data['firefly.default_location'].zoom_level); + axios.get('./api/v1/configuration/firefly.default_location').then(response => { + this.zoom = parseInt(response.data.data.value.zoom_level); this.center = [ - parseFloat(response.data['firefly.default_location'].latitude), - parseFloat(response.data['firefly.default_location'].longitude), + parseFloat(response.data.data.value.latitude), + parseFloat(response.data.data.value.longitude), ] ; }); diff --git a/frontend/src/locales/ru.json b/frontend/src/locales/ru.json index f7419dca2e..b4a85e1360 100644 --- a/frontend/src/locales/ru.json +++ b/frontend/src/locales/ru.json @@ -81,9 +81,9 @@ "first_split_overrules_source": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0447\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430", "first_split_overrules_destination": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0447\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f", "transaction_stored_link": "\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f #{ID} (\"{title}\")<\/a> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430.", - "custom_period": "Custom period", - "reset_to_current": "Reset to current period", - "select_period": "Select a period", + "custom_period": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0438\u043e\u0434", + "reset_to_current": "\u0421\u0431\u0440\u043e\u0441 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u0435\u0440\u0438\u043e\u0434\u0443", + "select_period": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0435\u0440\u0438\u043e\u0434", "location": "\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435", "other_budgets": "\u0411\u044e\u0434\u0436\u0435\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438", "journal_links": "\u0421\u0432\u044f\u0437\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438", diff --git a/frontend/src/scss/_variables.scss b/frontend/src/scss/_variables.scss index 6385868311..1f7cd4c5c1 100644 --- a/frontend/src/scss/_variables.scss +++ b/frontend/src/scss/_variables.scss @@ -17,3 +17,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + + +// slightly darker blue to match the logo: +$blue: #1E6581 !default; \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index 09f8267509..a93c2b9b3f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -29,20 +29,43 @@ convertWarningsToExceptions="true" processIsolation="false" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"> - - - ./app - - - - - ./tests/Api/Models - - - - - - - - + + + ./app + + + + + ./tests/Api/Models/TransactionCurrency + + + + + + + + + + diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index c0b63c4432..c8ff0f6704 100644 Binary files a/public/android-chrome-192x192.png and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png index 109bccdd9e..8f1e8cfecd 100644 Binary files a/public/android-chrome-512x512.png and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon-120x120-precomposed.png b/public/apple-touch-icon-120x120-precomposed.png deleted file mode 100644 index 736dde8566..0000000000 Binary files a/public/apple-touch-icon-120x120-precomposed.png and /dev/null differ diff --git a/public/apple-touch-icon-120x120.png b/public/apple-touch-icon-120x120.png deleted file mode 100644 index 95953309c4..0000000000 Binary files a/public/apple-touch-icon-120x120.png and /dev/null differ diff --git a/public/apple-touch-icon-152x152-precomposed.png b/public/apple-touch-icon-152x152-precomposed.png deleted file mode 100644 index 9980f5bc74..0000000000 Binary files a/public/apple-touch-icon-152x152-precomposed.png and /dev/null differ diff --git a/public/apple-touch-icon-152x152.png b/public/apple-touch-icon-152x152.png deleted file mode 100644 index 3427990721..0000000000 Binary files a/public/apple-touch-icon-152x152.png and /dev/null differ diff --git a/public/apple-touch-icon-180x180-precomposed.png b/public/apple-touch-icon-180x180-precomposed.png deleted file mode 100644 index ba1cf6bb74..0000000000 Binary files a/public/apple-touch-icon-180x180-precomposed.png and /dev/null differ diff --git a/public/apple-touch-icon-180x180.png b/public/apple-touch-icon-180x180.png deleted file mode 100644 index f62fe34365..0000000000 Binary files a/public/apple-touch-icon-180x180.png and /dev/null differ diff --git a/public/apple-touch-icon-60x60-precomposed.png b/public/apple-touch-icon-60x60-precomposed.png deleted file mode 100644 index 27d5dd196e..0000000000 Binary files a/public/apple-touch-icon-60x60-precomposed.png and /dev/null differ diff --git a/public/apple-touch-icon-60x60.png b/public/apple-touch-icon-60x60.png deleted file mode 100644 index f4ad0dacd8..0000000000 Binary files a/public/apple-touch-icon-60x60.png and /dev/null differ diff --git a/public/apple-touch-icon-76x76-precomposed.png b/public/apple-touch-icon-76x76-precomposed.png deleted file mode 100644 index dadf16c135..0000000000 Binary files a/public/apple-touch-icon-76x76-precomposed.png and /dev/null differ diff --git a/public/apple-touch-icon-76x76.png b/public/apple-touch-icon-76x76.png deleted file mode 100644 index fdb75004d1..0000000000 Binary files a/public/apple-touch-icon-76x76.png and /dev/null differ diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png index ba1cf6bb74..788ad500df 100644 Binary files a/public/apple-touch-icon-precomposed.png and b/public/apple-touch-icon-precomposed.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index f62fe34365..5dff872676 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml index 6c81a30729..ae2d076999 100644 --- a/public/browserconfig.xml +++ b/public/browserconfig.xml @@ -1,32 +1,9 @@ - - - - - - - #2d89ef + + #1e6581 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index 926b082daa..b1fd2fdd9d 100644 Binary files a/public/favicon-16x16.png and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index dadcf4d187..7ad79e57f3 100644 Binary files a/public/favicon-32x32.png and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico index 6042809272..4d160f492c 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot b/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot index cdef69f09b..d05ea581fb 100755 Binary files a/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot and b/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot differ diff --git a/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.svg b/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.svg index 54da424a7c..4e48a46697 100755 --- a/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.svg +++ b/public/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.svg @@ -2,11 +2,11 @@ -Created by FontForge 20200314 at Wed Jan 13 11:57:55 2021 +Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021 By Robert Madole Copyright (c) Font Awesome - + -Created by FontForge 20200314 at Wed Jan 13 11:57:54 2021 +Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021 By Robert Madole Copyright (c) Font Awesome - + -Created by FontForge 20200314 at Wed Jan 13 11:57:55 2021 +Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021 By Robert Madole Copyright (c) Font Awesome - + - + Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/public/v1/js/create_transaction.js b/public/v1/js/create_transaction.js index 50d5bdb595..5a692787b9 100644 --- a/public/v1/js/create_transaction.js +++ b/public/v1/js/create_transaction.js @@ -1 +1 @@ -(()=>{var e={7010:e=>{window,e.exports=function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=6)}([function(e,t,n){var a=n(8);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("7ec05f6c",a,!1,{})},function(e,t,n){var a=n(10);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("3453d19d",a,!1,{})},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n,a=e[1]||"",i=e[3];if(!i)return a;if(t&&"function"==typeof btoa){var o=(n=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),r=i.sources.map((function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"}));return[a].concat(r).concat([o]).join("\n")}return[a].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},i=0;in.parts.length&&(a.parts.length=n.parts.length)}else{var r=[];for(i=0;i div[data-v-61d92e31] {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%;\n}\n.ti-selected-item[data-v-61d92e31] {\n background-color: #5C6BC0;\n color: #fff;\n}\n',"",{version:3,sources:["C:/Users/johan/dev/vue-tags-input/vue-tags-input/C:/Users/johan/dev/vue-tags-input/vue-tags-input/vue-tags-input.scss"],names:[],mappings:"AAAA;EACE,uBAAuB;EACvB,mCAA8C;EAC9C,+JAAuM;EACvM,oBAAoB;EACpB,mBAAmB;CAAE;AAEvB;EACE,kCAAkC;EAClC,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;EACf,oCAAoC;EACpC,mCAAmC;CAAE;AAEvC;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,YAAY;EACZ,aAAa;EACb,sBAAsB;CAAE;AAE1B;EACE,uBAAuB;CAAE;AAE3B;EACE,cAAc;CAAE;AAElB;EACE,8BAA8B;CAAE;AAElC;EACE,iBAAiB;EACjB,mBAAmB;EACnB,uBAAuB;CAAE;AAE3B;EACE,aAAa;CAAE;AACf;IACE,gBAAgB;CAAE;AAEtB;EACE,uBAAuB;EACvB,cAAc;EACd,aAAa;EACb,gBAAgB;CAAE;AAEpB;EACE,cAAc;EACd,gBAAgB;EAChB,YAAY;EACZ,iBAAiB;CAAE;AAErB;EACE,0BAA0B;EAC1B,YAAY;EACZ,mBAAmB;EACnB,cAAc;EACd,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,cAAc;CAAE;AAClB;IACE,cAAc;IACd,oBAAoB;CAAE;AACxB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;IACnB,mBAAmB;IACnB,YAAY;IACZ,iBAAiB;CAAE;AACrB;IACE,iBAAiB;IACjB,cAAc;IACd,oBAAoB;IACpB,kBAAkB;CAAE;AACpB;MACE,gBAAgB;CAAE;AACtB;IACE,kBAAkB;CAAE;AACtB;IACE,0BAA0B;CAAE;AAEhC;EACE,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,aAAa;IACb,YAAY;CAAE;AAElB;EACE,qBAAqB;CAAE;AAEzB;EACE,uBAAuB;EACvB,iBAAiB;EACjB,mBAAmB;EACnB,YAAY;EACZ,uBAAuB;EACvB,YAAY;CAAE;AAEhB;EACE,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CAAE;AAEhB;EACE,0BAA0B;EAC1B,YAAY;CAAE",file:"vue-tags-input.scss?vue&type=style&index=0&id=61d92e31&lang=scss&scoped=true&",sourcesContent:['@font-face {\n font-family: \'icomoon\';\n src: url("./assets/fonts/icomoon.eot?7grlse");\n src: url("./assets/fonts/icomoon.eot?7grlse#iefix") format("embedded-opentype"), url("./assets/fonts/icomoon.ttf?7grlse") format("truetype"), url("./assets/fonts/icomoon.woff?7grlse") format("woff");\n font-weight: normal;\n font-style: normal; }\n\n[class^="ti-icon-"], [class*=" ti-icon-"] {\n font-family: \'icomoon\' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.ti-icon-check:before {\n content: "\\e902"; }\n\n.ti-icon-close:before {\n content: "\\e901"; }\n\n.ti-icon-undo:before {\n content: "\\e900"; }\n\nul {\n margin: 0px;\n padding: 0px;\n list-style-type: none; }\n\n*, *:before, *:after {\n box-sizing: border-box; }\n\ninput:focus {\n outline: none; }\n\ninput[disabled] {\n background-color: transparent; }\n\n.vue-tags-input {\n max-width: 450px;\n position: relative;\n background-color: #fff; }\n\ndiv.vue-tags-input.disabled {\n opacity: 0.5; }\n div.vue-tags-input.disabled * {\n cursor: default; }\n\n.ti-input {\n border: 1px solid #ccc;\n display: flex;\n padding: 4px;\n flex-wrap: wrap; }\n\n.ti-tags {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n line-height: 1em; }\n\n.ti-tag {\n background-color: #5C6BC0;\n color: #fff;\n border-radius: 2px;\n display: flex;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-tag:focus {\n outline: none; }\n .ti-tag .ti-content {\n display: flex;\n align-items: center; }\n .ti-tag .ti-tag-center {\n position: relative; }\n .ti-tag span {\n line-height: .85em; }\n .ti-tag span.ti-hidden {\n padding-left: 14px;\n visibility: hidden;\n height: 0px;\n white-space: pre; }\n .ti-tag .ti-actions {\n margin-left: 2px;\n display: flex;\n align-items: center;\n font-size: 1.15em; }\n .ti-tag .ti-actions i {\n cursor: pointer; }\n .ti-tag:last-child {\n margin-right: 4px; }\n .ti-tag.ti-invalid, .ti-tag.ti-tag.ti-deletion-mark {\n background-color: #e54d42; }\n\n.ti-new-tag-input-wrapper {\n display: flex;\n flex: 1 0 auto;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-new-tag-input-wrapper input {\n flex: 1 0 auto;\n min-width: 100px;\n border: none;\n padding: 0px;\n margin: 0px; }\n\n.ti-new-tag-input {\n line-height: initial; }\n\n.ti-autocomplete {\n border: 1px solid #ccc;\n border-top: none;\n position: absolute;\n width: 100%;\n background-color: #fff;\n z-index: 20; }\n\n.ti-item > div {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%; }\n\n.ti-selected-item {\n background-color: #5C6BC0;\n color: #fff; }\n'],sourceRoot:""}])},function(e,t,n){"use strict";e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t){e.exports="data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg8SBawAAAC8AAAAYGNtYXAXVtKJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZqWfozAAAAF4AAAA/GhlYWQPxZgIAAACdAAAADZoaGVhB4ADyAAAAqwAAAAkaG10eBIAAb4AAALQAAAAHGxvY2EAkgDiAAAC7AAAABBtYXhwAAkAHwAAAvwAAAAgbmFtZZlKCfsAAAMcAAABhnBvc3QAAwAAAAAEpAAAACAAAwOAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6QL//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAFYBAQO+AoEAHAAAATIXHgEXFhcHJicuAScmIyIGBxchERc2Nz4BNzYCFkpDQ28pKRdkECAfVTM0OT9wLZz+gJgdIiJLKSgCVRcYUjg5QiAzKys+ERIrJZoBgJoZFRQcCAgAAQDWAIEDKgLVAAsAAAEHFwcnByc3JzcXNwMq7u487u487u487u4Cme7uPO7uPO7uPO7uAAEAkgCBA4ACvQAFAAAlARcBJzcBgAHEPP4A7jz5AcQ8/gDuPAAAAAABAAAAAAAAH8nTUV8PPPUACwQAAAAAANZ1KhsAAAAA1nUqGwAAAAADvgLVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAO+AAEAAAAAAAAAAAAAAAAAAAAHBAAAAAAAAAAAAAAAAgAAAAQAAFYEAADWBAAAkgAAAAAACgAUAB4AUABqAH4AAQAAAAcAHQABAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},function(e,t){e.exports="data:font/woff;base64,d09GRgABAAAAAAUQAAsAAAAABMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIFrGNtYXAAAAFoAAAAVAAAAFQXVtKJZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAAAPwAAAD8pZ+jMGhlYWQAAALAAAAANgAAADYPxZgIaGhlYQAAAvgAAAAkAAAAJAeAA8hobXR4AAADHAAAABwAAAAcEgABvmxvY2EAAAM4AAAAEAAAABAAkgDibWF4cAAAA0gAAAAgAAAAIAAJAB9uYW1lAAADaAAAAYYAAAGGmUoJ+3Bvc3QAAATwAAAAIAAAACAAAwAAAAMDgAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6QIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOkC//3//wAAAAAAIOkA//3//wAB/+MXBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQBWAQEDvgKBABwAAAEyFx4BFxYXByYnLgEnJiMiBgcXIREXNjc+ATc2AhZKQ0NvKSkXZBAgH1UzNDk/cC2c/oCYHSIiSykoAlUXGFI4OUIgMysrPhESKyWaAYCaGRUUHAgIAAEA1gCBAyoC1QALAAABBxcHJwcnNyc3FzcDKu7uPO7uPO7uPO7uApnu7jzu7jzu7jzu7gABAJIAgQOAAr0ABQAAJQEXASc3AYABxDz+AO48+QHEPP4A7jwAAAAAAQAAAAAAAB/J01FfDzz1AAsEAAAAAADWdSobAAAAANZ1KhsAAAAAA74C1QAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADvgABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABWBAAA1gQAAJIAAAAAAAoAFAAeAFAAagB+AAEAAAAHAB0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},function(e,t,n){"use strict";n.r(t);var a=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vue-tags-input",class:[{"ti-disabled":e.disabled},{"ti-focus":e.focused}]},[n("div",{staticClass:"ti-input"},[e.tagsCopy?n("ul",{staticClass:"ti-tags"},[e._l(e.tagsCopy,(function(t,a){return n("li",{key:a,staticClass:"ti-tag",class:[{"ti-editing":e.tagsEditStatus[a]},t.tiClasses,t.classes,{"ti-deletion-mark":e.isMarked(a)}],style:t.style,attrs:{tabindex:"0"},on:{click:function(n){return e.$emit("tag-clicked",{tag:t,index:a})}}},[n("div",{staticClass:"ti-content"},[e.$scopedSlots["tag-left"]?n("div",{staticClass:"ti-tag-left"},[e._t("tag-left",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e(),e._v(" "),n("div",{ref:"tagCenter",refInFor:!0,staticClass:"ti-tag-center"},[e.$scopedSlots["tag-center"]?e._e():n("span",{class:{"ti-hidden":e.tagsEditStatus[a]},on:{click:function(t){return e.performEditTag(a)}}},[e._v(e._s(t.text))]),e._v(" "),e.$scopedSlots["tag-center"]?e._e():n("tag-input",{attrs:{scope:{edit:e.tagsEditStatus[a],maxlength:e.maxlength,tag:t,index:a,validateTag:e.createChangedTag,performCancelEdit:e.cancelEdit,performSaveEdit:e.performSaveTag}}}),e._v(" "),e._t("tag-center",null,{tag:t,index:a,maxlength:e.maxlength,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,validateTag:e.createChangedTag,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2),e._v(" "),e.$scopedSlots["tag-right"]?n("div",{staticClass:"ti-tag-right"},[e._t("tag-right",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e()]),e._v(" "),n("div",{staticClass:"ti-actions"},[e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:e.tagsEditStatus[a],expression:"tagsEditStatus[index]"}],staticClass:"ti-icon-undo",on:{click:function(t){return e.cancelEdit(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:!e.tagsEditStatus[a],expression:"!tagsEditStatus[index]"}],staticClass:"ti-icon-close",on:{click:function(t){return e.performDeleteTag(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._t("tag-actions",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)}):e._e()],2)])})),e._v(" "),n("li",{staticClass:"ti-new-tag-input-wrapper"},[n("input",e._b({ref:"newTagInput",staticClass:"ti-new-tag-input",class:[e.createClasses(e.newTag,e.tags,e.validation,e.isDuplicate)],attrs:{placeholder:e.placeholder,maxlength:e.maxlength,disabled:e.disabled,type:"text",size:"1"},domProps:{value:e.newTag},on:{keydown:[function(t){return e.performAddTags(e.filteredAutocompleteItems[e.selectedItem]||e.newTag,t)},function(t){return t.type.indexOf("key")||8===t.keyCode?e.invokeDelete(t):null},function(t){return t.type.indexOf("key")||9===t.keyCode?e.performBlur(t):null},function(t){return t.type.indexOf("key")||38===t.keyCode?e.selectItem(t,"before"):null},function(t){return t.type.indexOf("key")||40===t.keyCode?e.selectItem(t,"after"):null}],paste:e.addTagsFromPaste,input:e.updateNewTag,blur:function(t){return e.$emit("blur",t)},focus:function(t){e.focused=!0,e.$emit("focus",t)},click:function(t){!e.addOnlyFromAutocomplete&&(e.selectedItem=null)}}},"input",e.$attrs,!1))])],2):e._e()]),e._v(" "),e._t("between-elements"),e._v(" "),e.autocompleteOpen?n("div",{staticClass:"ti-autocomplete",on:{mouseout:function(t){e.selectedItem=null}}},[e._t("autocomplete-header"),e._v(" "),n("ul",e._l(e.filteredAutocompleteItems,(function(t,a){return n("li",{key:a,staticClass:"ti-item",class:[t.tiClasses,t.classes,{"ti-selected-item":e.isSelected(a)}],style:t.style,on:{mouseover:function(t){!e.disabled&&(e.selectedItem=a)}}},[e.$scopedSlots["autocomplete-item"]?e._t("autocomplete-item",null,{item:t,index:a,performAdd:function(t){return e.performAddTags(t,void 0,"autocomplete")},selected:e.isSelected(a)}):n("div",{on:{click:function(n){return e.performAddTags(t,void 0,"autocomplete")}}},[e._v("\n "+e._s(t.text)+"\n ")])],2)})),0),e._v(" "),e._t("autocomplete-footer")],2):e._e()],2)};a._withStripped=!0;var i=n(5),o=n.n(i),r=function(e){return JSON.parse(JSON.stringify(e))},s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3?arguments[3]:void 0;void 0===e.text&&(e={text:e});var i=function(e,t){return t.filter((function(t){var n=e.text;return"string"==typeof t.rule?!new RegExp(t.rule).test(n):t.rule instanceof RegExp?!t.rule.test(n):"[object Function]"==={}.toString.call(t.rule)?t.rule(e):void 0})).map((function(e){return e.classes}))}(e,n),o=function(e,t){for(var n=0;n1?n-1:0),i=1;i1?t-1:0),a=1;a=this.autocompleteMinLength&&this.filteredAutocompleteItems.length>0&&this.focused},filteredAutocompleteItems:function(){var e=this,t=this.autocompleteItems.map((function(t){return l(t,e.tags,e.validation,e.isDuplicate)}));return this.autocompleteFilterDuplicates?t.filter(this.duplicateFilter):t}},methods:{createClasses:s,getSelectedIndex:function(e){var t=this.filteredAutocompleteItems,n=this.selectedItem,a=t.length-1;if(0!==t.length)return null===n?0:"before"===e&&0===n?a:"after"===e&&n===a?0:"after"===e?n+1:n-1},selectDefaultItem:function(){this.addOnlyFromAutocomplete&&this.filteredAutocompleteItems.length>0?this.selectedItem=0:this.selectedItem=null},selectItem:function(e,t){e.preventDefault(),this.selectedItem=this.getSelectedIndex(t)},isSelected:function(e){return this.selectedItem===e},isMarked:function(e){return this.deletionMark===e},invokeDelete:function(){var e=this;if(this.deleteOnBackspace&&!(this.newTag.length>0)){var t=this.tagsCopy.length-1;null===this.deletionMark?(this.deletionMarkTime=setTimeout((function(){return e.deletionMark=null}),1e3),this.deletionMark=t):this.performDeleteTag(t)}},addTagsFromPaste:function(){var e=this;this.addFromPaste&&setTimeout((function(){return e.performAddTags(e.newTag)}),10)},performEditTag:function(e){var t=this;this.allowEditTags&&(this._events["before-editing-tag"]||this.editTag(e),this.$emit("before-editing-tag",{index:e,tag:this.tagsCopy[e],editTag:function(){return t.editTag(e)}}))},editTag:function(e){this.allowEditTags&&(this.toggleEditMode(e),this.focus(e))},toggleEditMode:function(e){this.allowEditTags&&!this.disabled&&this.$set(this.tagsEditStatus,e,!this.tagsEditStatus[e])},createChangedTag:function(e,t){var n=this.tagsCopy[e];n.text=t?t.target.value:this.tagsCopy[e].text,this.$set(this.tagsCopy,e,l(n,this.tagsCopy,this.validation,this.isDuplicate))},focus:function(e){var t=this;this.$nextTick((function(){var n=t.$refs.tagCenter[e].querySelector("input.ti-tag-input");n&&n.focus()}))},quote:function(e){return e.replace(/([()[{*+.$^\\|?])/g,"\\$1")},cancelEdit:function(e){this.tags[e]&&(this.tagsCopy[e]=r(l(this.tags[e],this.tags,this.validation,this.isDuplicate)),this.$set(this.tagsEditStatus,e,!1))},hasForbiddingAddRule:function(e){var t=this;return e.some((function(e){var n=t.validation.find((function(t){return e===t.classes}));return!!n&&n.disableAdd}))},createTagTexts:function(e){var t=this,n=new RegExp(this.separators.map((function(e){return t.quote(e)})).join("|"));return e.split(n).map((function(e){return{text:e}}))},performDeleteTag:function(e){var t=this;this._events["before-deleting-tag"]||this.deleteTag(e),this.$emit("before-deleting-tag",{index:e,tag:this.tagsCopy[e],deleteTag:function(){return t.deleteTag(e)}})},deleteTag:function(e){this.disabled||(this.deletionMark=null,clearTimeout(this.deletionMarkTime),this.tagsCopy.splice(e,1),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},noTriggerKey:function(e,t){var n=-1!==this[t].indexOf(e.keyCode)||-1!==this[t].indexOf(e.key);return n&&e.preventDefault(),!n},performAddTags:function(e,t,n){var a=this;if(!(this.disabled||t&&this.noTriggerKey(t,"addOnKey"))){var i=[];"object"===m(e)&&(i=[e]),"string"==typeof e&&(i=this.createTagTexts(e)),(i=i.filter((function(e){return e.text.trim().length>0}))).forEach((function(e){e=l(e,a.tags,a.validation,a.isDuplicate),a._events["before-adding-tag"]||a.addTag(e,n),a.$emit("before-adding-tag",{tag:e,addTag:function(){return a.addTag(e,n)}})}))}},duplicateFilter:function(e){return this.isDuplicate?!this.isDuplicate(this.tagsCopy,e):!this.tagsCopy.find((function(t){return t.text===e.text}))},addTag:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"new-tag-input",a=this.filteredAutocompleteItems.map((function(e){return e.text}));this.addOnlyFromAutocomplete&&-1===a.indexOf(e.text)||this.$nextTick((function(){return t.maxTags&&t.maxTags<=t.tagsCopy.length?t.$emit("max-tags-reached",e):t.avoidAddingDuplicates&&!t.duplicateFilter(e)?t.$emit("adding-duplicate",e):void(t.hasForbiddingAddRule(e.tiClasses)||(t.$emit("input",""),t.tagsCopy.push(e),t._events["update:tags"]&&t.$emit("update:tags",t.tagsCopy),"autocomplete"===n&&t.$refs.newTagInput.focus(),t.$emit("tags-changed",t.tagsCopy)))}))},performSaveTag:function(e,t){var n=this,a=this.tagsCopy[e];this.disabled||t&&this.noTriggerKey(t,"addOnKey")||0!==a.text.trim().length&&(this._events["before-saving-tag"]||this.saveTag(e,a),this.$emit("before-saving-tag",{index:e,tag:a,saveTag:function(){return n.saveTag(e,a)}}))},saveTag:function(e,t){if(this.avoidAddingDuplicates){var n=r(this.tagsCopy),a=n.splice(e,1)[0];if(this.isDuplicate?this.isDuplicate(n,a):-1!==n.map((function(e){return e.text})).indexOf(a.text))return this.$emit("saving-duplicate",t)}this.hasForbiddingAddRule(t.tiClasses)||(this.$set(this.tagsCopy,e,t),this.toggleEditMode(e),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},tagsEqual:function(){var e=this;return!this.tagsCopy.some((function(t,n){return!o()(t,e.tags[n])}))},updateNewTag:function(e){var t=e.target.value;this.newTag=t,this.$emit("input",t)},initTags:function(){this.tagsCopy=c(this.tags,this.validation,this.isDuplicate),this.tagsEditStatus=r(this.tags).map((function(){return!1})),this._events["update:tags"]&&!this.tagsEqual()&&this.$emit("update:tags",this.tagsCopy)},blurredOnClick:function(e){this.$el.contains(e.target)||this.$el.contains(document.activeElement)||this.performBlur(e)},performBlur:function(){this.addOnBlur&&this.focused&&this.performAddTags(this.newTag),this.focused=!1}},watch:{value:function(e){this.addOnlyFromAutocomplete||(this.selectedItem=null),this.newTag=e},tags:{handler:function(){this.initTags()},deep:!0},autocompleteOpen:"selectDefaultItem"},created:function(){this.newTag=this.value,this.initTags()},mounted:function(){this.selectDefaultItem(),document.addEventListener("click",this.blurredOnClick)},destroyed:function(){document.removeEventListener("click",this.blurredOnClick)}},b=(n(9),p(v,a,[],!1,null,"61d92e31",null));b.options.__file="vue-tags-input/vue-tags-input.vue";var y=b.exports;n.d(t,"VueTagsInput",(function(){return y})),n.d(t,"createClasses",(function(){return s})),n.d(t,"createTag",(function(){return l})),n.d(t,"createTags",(function(){return c})),n.d(t,"TagInput",(function(){return f})),y.install=function(e){return e.component(y.name,y)},"undefined"!=typeof window&&window.Vue&&window.Vue.use(y),t.default=y}])},9669:(e,t,n)=>{e.exports=n(1609)},5448:(e,t,n)=>{"use strict";var a=n(4867),i=n(6026),o=n(4372),r=n(5327),s=n(4097),l=n(4109),c=n(7985),u=n(5061);e.exports=function(e){return new Promise((function(t,n){var d=e.data,p=e.headers;a.isFormData(d)&&delete p["Content-Type"];var _=new XMLHttpRequest;if(e.auth){var f=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";p.Authorization="Basic "+btoa(f+":"+h)}var A=s(e.baseURL,e.url);if(_.open(e.method.toUpperCase(),r(A,e.params,e.paramsSerializer),!0),_.timeout=e.timeout,_.onreadystatechange=function(){if(_&&4===_.readyState&&(0!==_.status||_.responseURL&&0===_.responseURL.indexOf("file:"))){var a="getAllResponseHeaders"in _?l(_.getAllResponseHeaders()):null,o={data:e.responseType&&"text"!==e.responseType?_.response:_.responseText,status:_.status,statusText:_.statusText,headers:a,config:e,request:_};i(t,n,o),_=null}},_.onabort=function(){_&&(n(u("Request aborted",e,"ECONNABORTED",_)),_=null)},_.onerror=function(){n(u("Network Error",e,null,_)),_=null},_.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(u(t,e,"ECONNABORTED",_)),_=null},a.isStandardBrowserEnv()){var g=(e.withCredentials||c(A))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;g&&(p[e.xsrfHeaderName]=g)}if("setRequestHeader"in _&&a.forEach(p,(function(e,t){void 0===d&&"content-type"===t.toLowerCase()?delete p[t]:_.setRequestHeader(t,e)})),a.isUndefined(e.withCredentials)||(_.withCredentials=!!e.withCredentials),e.responseType)try{_.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&_.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&_.upload&&_.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){_&&(_.abort(),n(e),_=null)})),d||(d=null),_.send(d)}))}},1609:(e,t,n)=>{"use strict";var a=n(4867),i=n(1849),o=n(321),r=n(7185);function s(e){var t=new o(e),n=i(o.prototype.request,t);return a.extend(n,o.prototype,t),a.extend(n,t),n}var l=s(n(5655));l.Axios=o,l.create=function(e){return s(r(l.defaults,e))},l.Cancel=n(5263),l.CancelToken=n(4972),l.isCancel=n(6502),l.all=function(e){return Promise.all(e)},l.spread=n(8713),l.isAxiosError=n(6268),e.exports=l,e.exports.default=l},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,n)=>{"use strict";var a=n(5263);function i(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new a(e),t(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var e;return{token:new i((function(t){e=t})),cancel:e}},e.exports=i},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,n)=>{"use strict";var a=n(4867),i=n(5327),o=n(782),r=n(3572),s=n(7185);function l(e){this.defaults=e,this.interceptors={request:new o,response:new o}}l.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[r,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)n=n.then(t.shift(),t.shift());return n},l.prototype.getUri=function(e){return e=s(this.defaults,e),i(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},a.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),a.forEach(["post","put","patch"],(function(e){l.prototype[e]=function(t,n,a){return this.request(s(a||{},{method:e,url:t,data:n}))}})),e.exports=l},782:(e,t,n)=>{"use strict";var a=n(4867);function i(){this.handlers=[]}i.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},i.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},i.prototype.forEach=function(e){a.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=i},4097:(e,t,n)=>{"use strict";var a=n(1793),i=n(7303);e.exports=function(e,t){return e&&!a(t)?i(e,t):t}},5061:(e,t,n)=>{"use strict";var a=n(481);e.exports=function(e,t,n,i,o){var r=new Error(e);return a(r,t,n,i,o)}},3572:(e,t,n)=>{"use strict";var a=n(4867),i=n(8527),o=n(6502),r=n(5655);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=i(e.data,e.headers,e.transformRequest),e.headers=a.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),a.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||r.adapter)(e).then((function(t){return s(e),t.data=i(t.data,t.headers,e.transformResponse),t}),(function(t){return o(t)||(s(e),t&&t.response&&(t.response.data=i(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,n,a,i){return e.config=t,n&&(e.code=n),e.request=a,e.response=i,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){t=t||{};var n={},i=["url","method","data"],o=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function l(e,t){return a.isPlainObject(e)&&a.isPlainObject(t)?a.merge(e,t):a.isPlainObject(t)?a.merge({},t):a.isArray(t)?t.slice():t}function c(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(e[i],t[i])}a.forEach(i,(function(e){a.isUndefined(t[e])||(n[e]=l(void 0,t[e]))})),a.forEach(o,c),a.forEach(r,(function(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(void 0,t[i])})),a.forEach(s,(function(a){a in t?n[a]=l(e[a],t[a]):a in e&&(n[a]=l(void 0,e[a]))}));var u=i.concat(o).concat(r).concat(s),d=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===u.indexOf(e)}));return a.forEach(d,c),n}},6026:(e,t,n)=>{"use strict";var a=n(5061);e.exports=function(e,t,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?t(a("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},8527:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t,n){return a.forEach(n,(function(n){e=n(e,t)})),e}},5655:(e,t,n)=>{"use strict";var a=n(4155),i=n(4867),o=n(6016),r={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==a&&"[object process]"===Object.prototype.toString.call(a))&&(l=n(5448)),l),transformRequest:[function(e,t){return o(t,"Accept"),o(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(s(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),i.forEach(["post","put","patch"],(function(e){c.headers[e]=i.merge(r)})),e.exports=c},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),a=0;a{"use strict";var a=n(4867);function i(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var o;if(n)o=n(t);else if(a.isURLSearchParams(t))o=t.toString();else{var r=[];a.forEach(t,(function(e,t){null!=e&&(a.isArray(e)?t+="[]":e=[e],a.forEach(e,(function(e){a.isDate(e)?e=e.toISOString():a.isObject(e)&&(e=JSON.stringify(e)),r.push(i(t)+"="+i(e))})))})),o=r.join("&")}if(o){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?{write:function(e,t,n,i,o,r){var s=[];s.push(e+"="+encodeURIComponent(t)),a.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),a.isString(i)&&s.push("path="+i),a.isString(o)&&s.push("domain="+o),!0===r&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(e){var a=e;return t&&(n.setAttribute("href",a),a=n.href),n.setAttribute("href",a),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=i(window.location.href),function(t){var n=a.isString(t)?i(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},6016:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){a.forEach(e,(function(n,a){a!==t&&a.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[a])}))}},4109:(e,t,n)=>{"use strict";var a=n(4867),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,o,r={};return e?(a.forEach(e.split("\n"),(function(e){if(o=e.indexOf(":"),t=a.trim(e.substr(0,o)).toLowerCase(),n=a.trim(e.substr(o+1)),t){if(r[t]&&i.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([n]):r[t]?r[t]+", "+n:n}})),r):r}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4867:(e,t,n)=>{"use strict";var a=n(1849),i=Object.prototype.toString;function o(e){return"[object Array]"===i.call(e)}function r(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==i.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===i.call(e)}function u(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),o(e))for(var n=0,a=e.length;n{window.axios=n(9669),window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var a=document.head.querySelector('meta[name="csrf-token"]');a?window.axios.defaults.headers.common["X-CSRF-TOKEN"]=a.content:console.error("CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token")},5299:(e,t,n)=>{e.exports=new vuei18n({locale:document.documentElement.lang,fallbackLocale:"en",messages:{bg:n(987),cs:n(6054),de:n(7062),en:n(6886),"en-us":n(6886),"en-gb":n(5642),es:n(2360),el:n(1410),fr:n(6833),hu:n(6477),it:n(3092),nl:n(78),nb:n(2502),pl:n(8691),fi:n(3684),"pt-br":n(122),"pt-pt":n(4895),ro:n(403),ru:n(7448),"zh-tw":n(4963),"zh-cn":n(1922),sk:n(6949),sv:n(2285),vi:n(9783)}})},4155:e=>{var t,n,a=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var s,l=[],c=!1,u=-1;function d(){c&&s&&(c=!1,s.length?l=s.concat(l):u=-1,l.length&&p())}function p(){if(!c){var e=r(d);c=!0;for(var t=l.length;t;){for(s=l,l=[];++u1)for(var n=1;n{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Какво се случва?","flash_error":"Грешка!","flash_success":"Успех!","close":"Затвори","split_transaction_title":"Описание на разделена транзакция","errors_submission":"Имаше нещо нередно с вашите данни. Моля, проверете грешките.","split":"Раздели","single_split":"Раздел","transaction_stored_link":"Транзакция #{ID}(\\"{title}\\") беше записана.","transaction_updated_link":"Транзакция #{ID} беше обновена.","transaction_new_stored_link":"Транзакция #{ID} беше записана.","transaction_journal_information":"Информация за транзакция","no_budget_pointer":"Изглежда все още нямате бюджети. Трябва да създадете някои на страницата Бюджети . Бюджетите могат да ви помогнат да следите разходите си.","no_bill_pointer":"Изглежда все още нямате сметки. Трябва да създадете някои на страницата Сметки . Сметките могат да ви помогнат да следите разходите си.","source_account":"Разходна сметка","hidden_fields_preferences":"Можете да активирате повече опции за транзакции във вашите настройки.","destination_account":"Приходна сметка","add_another_split":"Добавяне на друг раздел","submission":"Изпращане","create_another":"След съхраняването се върнете тук, за да създадете нова.","reset_after":"Изчистване на формуляра след изпращане","submit":"Потвърди","amount":"Сума","date":"Дата","tags":"Етикети","no_budget":"(без бюджет)","no_bill":"(няма сметка)","category":"Категория","attachments":"Прикачени файлове","notes":"Бележки","external_uri":"External URL","update_transaction":"Обнови транзакцията","after_update_create_another":"След обновяването се върнете тук, за да продължите с редакцията.","store_as_new":"Съхранете като нова транзакция, вместо да я актуализирате.","split_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","none_in_select_list":"(нищо)","no_piggy_bank":"(без касичка)","description":"Описание","split_transaction_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","destination_account_reconciliation":"Не може да редактирате приходната сметка на транзакция за съгласуване.","source_account_reconciliation":"Не може да редактирате разходната сметка на транзакция за съгласуване.","budget":"Бюджет","bill":"Сметка","you_create_withdrawal":"Създавате теглене.","you_create_transfer":"Създавате прехвърляне.","you_create_deposit":"Създавате депозит.","edit":"Промени","delete":"Изтрий","name":"Име","profile_whoops":"Опаааа!","profile_something_wrong":"Нещо се обърка!","profile_try_again":"Нещо се обърка. Моля, опитайте отново.","profile_oauth_clients":"OAuth клиенти","profile_oauth_no_clients":"Не сте създали клиенти на OAuth.","profile_oauth_clients_header":"Клиенти","profile_oauth_client_id":"ИД (ID) на клиент","profile_oauth_client_name":"Име","profile_oauth_client_secret":"Тайна","profile_oauth_create_new_client":"Създай нов клиент","profile_oauth_create_client":"Създай клиент","profile_oauth_edit_client":"Редактирай клиент","profile_oauth_name_help":"Нещо, което вашите потребители ще разпознаят и ще се доверят.","profile_oauth_redirect_url":"Линк на препратката","profile_oauth_redirect_url_help":"URL адрес за обратно извикване на оторизацията на вашето приложение.","profile_authorized_apps":"Удостоверени приложения","profile_authorized_clients":"Удостоверени клиенти","profile_scopes":"Сфери","profile_revoke":"Анулирай","profile_personal_access_tokens":"Персонални маркери за достъп","profile_personal_access_token":"Персонален маркер за достъп","profile_personal_access_token_explanation":"Това е новия ви персонален маркер за достъп. Това е единственият път, когато ще бъде показан, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_no_personal_access_token":"Не сте създали никакви лични маркери за достъп.","profile_create_new_token":"Създай нов маркер","profile_create_token":"Създай маркер","profile_create":"Създай","profile_save_changes":"Запазване на промените","default_group_title_name":"(без група)","piggy_bank":"Касичка","profile_oauth_client_secret_title":"Тайна на клиента","profile_oauth_client_secret_expl":"Това е новата ви \\"тайна на клиента\\". Това е единственият път, когато ще бъде показана, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_oauth_confidential":"Поверително","profile_oauth_confidential_help":"Изисквайте клиента да се удостоверява с тайна. Поверителните клиенти могат да притежават идентификационни данни по защитен начин, без да ги излагат на неоторизирани страни. Публичните приложения, като например десктопа или JavaScript SPA приложения, не могат да пазят тайни по сигурен начин.","multi_account_warning_unknown":"В зависимост от вида на транзакцията която създавате, източникът и / или целевата сметка на следващите разделяния може да бъде променена от това което е дефинирано в първото разделение на транзакцията.","multi_account_warning_withdrawal":"Имайте предвид, че разходна сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на тегленето.","multi_account_warning_deposit":"Имайте предвид, че приходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на депозита.","multi_account_warning_transfer":"Имайте предвид, че приходната + разходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на прехвърлянето."},"form":{"interest_date":"Падеж на лихва","book_date":"Дата на осчетоводяване","process_date":"Дата на обработка","due_date":"Дата на падеж","foreign_amount":"Сума във валута","payment_date":"Дата на плащане","invoice_date":"Дата на фактура","internal_reference":"Вътрешна референция"},"config":{"html_language":"bg"}}')},6054:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Jak to jde?","flash_error":"Chyba!","flash_success":"Úspěšně dokončeno!","close":"Zavřít","split_transaction_title":"Popis rozúčtování","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Rozdělit","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Informace o transakci","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Zdrojový účet","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Cílový účet","add_another_split":"Přidat další rozúčtování","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Odeslat","amount":"Částka","date":"Datum","tags":"Štítky","no_budget":"(žádný rozpočet)","no_bill":"(no bill)","category":"Kategorie","attachments":"Přílohy","notes":"Poznámky","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.","none_in_select_list":"(žádné)","no_piggy_bank":"(žádná pokladnička)","description":"Popis","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Upravit","delete":"Odstranit","name":"Název","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Úrokové datum","book_date":"Datum rezervace","process_date":"Datum zpracování","due_date":"Datum splatnosti","foreign_amount":"Částka v cizí měně","payment_date":"Datum zaplacení","invoice_date":"Datum vystavení","internal_reference":"Interní reference"},"config":{"html_language":"cs"}}')},7062:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Überblick","flash_error":"Fehler!","flash_success":"Geschafft!","close":"Schließen","split_transaction_title":"Beschreibung der Splittbuchung","errors_submission":"Ihre Übermittlung ist fehlgeschlagen. Bitte überprüfen Sie die Fehler.","split":"Teilen","single_split":"Teil","transaction_stored_link":"Buchung #{ID} (\\"{title}\\") wurde gespeichert.","transaction_updated_link":"Buchung#{ID} wurde aktualisiert.","transaction_new_stored_link":"Buchung #{ID} wurde gespeichert.","transaction_journal_information":"Transaktionsinformationen","no_budget_pointer":"Sie scheinen noch keine Kostenrahmen festgelegt zu haben. Sie sollten einige davon auf der Seite Kostenrahmen- anlegen. Kostenrahmen können Ihnen dabei helfen, den Überblick über die Ausgaben zu behalten.","no_bill_pointer":"Sie scheinen noch keine Rechnungen zu haben. Sie sollten einige auf der Seite Rechnungen erstellen. Anhand der Rechnungen können Sie den Überblick über Ihre Ausgaben behalten.","source_account":"Quellkonto","hidden_fields_preferences":"Sie können weitere Buchungsoptionen in Ihren Einstellungen aktivieren.","destination_account":"Zielkonto","add_another_split":"Eine weitere Aufteilung hinzufügen","submission":"Übermittlung","create_another":"Nach dem Speichern hierher zurückkehren, um ein weiteres zu erstellen.","reset_after":"Formular nach der Übermittlung zurücksetzen","submit":"Absenden","amount":"Betrag","date":"Datum","tags":"Schlagwörter","no_budget":"(kein Budget)","no_bill":"(keine Belege)","category":"Kategorie","attachments":"Anhänge","notes":"Notizen","external_uri":"Externe URL","update_transaction":"Buchung aktualisieren","after_update_create_another":"Nach dem Aktualisieren hierher zurückkehren, um weiter zu bearbeiten.","store_as_new":"Als neue Buchung speichern statt zu aktualisieren.","split_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.","none_in_select_list":"(Keine)","no_piggy_bank":"(kein Sparschwein)","description":"Beschreibung","split_transaction_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchung geben.","destination_account_reconciliation":"Sie können das Zielkonto einer Kontenausgleichsbuchung nicht bearbeiten.","source_account_reconciliation":"Sie können das Quellkonto einer Kontenausgleichsbuchung nicht bearbeiten.","budget":"Budget","bill":"Rechnung","you_create_withdrawal":"Sie haben eine Auszahlung erstellt.","you_create_transfer":"Sie haben eine Buchung erstellt.","you_create_deposit":"Sie haben eine Einzahlung erstellt.","edit":"Bearbeiten","delete":"Löschen","name":"Name","profile_whoops":"Huch!","profile_something_wrong":"Ein Problem ist aufgetreten!","profile_try_again":"Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.","profile_oauth_clients":"OAuth-Clients","profile_oauth_no_clients":"Sie haben noch keine OAuth-Clients erstellt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client-ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Geheimnis","profile_oauth_create_new_client":"Neuen Client erstellen","profile_oauth_create_client":"Client erstellen","profile_oauth_edit_client":"Client bearbeiten","profile_oauth_name_help":"Etwas das Ihre Nutzer erkennen und dem sie vertrauen.","profile_oauth_redirect_url":"Weiterleitungs-URL","profile_oauth_redirect_url_help":"Die Authorisierungs-Callback-URL Ihrer Anwendung.","profile_authorized_apps":"Autorisierte Anwendungen","profile_authorized_clients":"Autorisierte Clients","profile_scopes":"Bereiche","profile_revoke":"Widerrufen","profile_personal_access_tokens":"Persönliche Zugangs-Tokens","profile_personal_access_token":"Persönlicher Zugangs-Token","profile_personal_access_token_explanation":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_no_personal_access_token":"Sie haben keine persönlichen Zugangsschlüssel erstellt.","profile_create_new_token":"Neuen Schlüssel erstellen","profile_create_token":"Schlüssel erstellen","profile_create":"Erstellen","profile_save_changes":"Änderungen speichern","default_group_title_name":"(ohne Gruppierung)","piggy_bank":"Sparschwein","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_oauth_confidential":"Vertraulich","profile_oauth_confidential_help":"Der Client muss sich mit einem Secret authentifizieren. Vertrauliche Clients können die Anmeldedaten speichern, ohne diese unautorisierten Akteuren mitzuteilen. Öffentliche Anwendungen wie native Desktop- oder JavaScript-SPA-Anwendungen können Geheimnisse nicht sicher speichern.","multi_account_warning_unknown":"Abhängig von der Art der Buchung, die Sie anlegen, kann das Quell- und/oder Zielkonto nachfolgender Aufteilungen durch das überschrieben werden, was in der ersten Aufteilung der Buchung definiert wurde.","multi_account_warning_withdrawal":"Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_deposit":"Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einzahlung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_transfer":"Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der Übertragung definiert ist, außer Kraft gesetzt wird."},"form":{"interest_date":"Zinstermin","book_date":"Buchungsdatum","process_date":"Bearbeitungsdatum","due_date":"Fälligkeitstermin","foreign_amount":"Ausländischer Betrag","payment_date":"Zahlungsdatum","invoice_date":"Rechnungsdatum","internal_reference":"Interner Verweis"},"config":{"html_language":"de"}}')},1410:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Τι παίζει;","flash_error":"Σφάλμα!","flash_success":"Επιτυχία!","close":"Κλείσιμο","split_transaction_title":"Περιγραφή της συναλλαγής με διαχωρισμό","errors_submission":"Υπήρξε κάποιο λάθος με την υποβολή σας. Παρακαλώ ελέγξτε τα σφάλματα.","split":"Διαχωρισμός","single_split":"Διαχωρισμός","transaction_stored_link":"Η συναλλαγή #{ID} (\\"{title}\\") έχει αποθηκευτεί.","transaction_updated_link":"Η συναλλαγή #{ID} έχει ενημερωθεί.","transaction_new_stored_link":"Η συναλλαγή #{ID} έχει αποθηκευτεί.","transaction_journal_information":"Πληροφορίες συναλλαγής","no_budget_pointer":"Φαίνεται πως δεν έχετε ορίσει προϋπολογισμούς ακόμη. Πρέπει να δημιουργήσετε κάποιον στη σελίδα προϋπολογισμών. Οι προϋπολογισμοί σας βοηθούν να επιβλέπετε τις δαπάνες σας.","no_bill_pointer":"Φαίνεται πως δεν έχετε ορίσει πάγια έξοδα ακόμη. Πρέπει να δημιουργήσετε κάποιο στη σελίδα πάγιων εξόδων. Τα πάγια έξοδα σας βοηθούν να επιβλέπετε τις δαπάνες σας.","source_account":"Λογαριασμός προέλευσης","hidden_fields_preferences":"Μπορείτε να ενεργοποιήσετε περισσότερες επιλογές συναλλαγών στις προτιμήσεις.","destination_account":"Λογαριασμός προορισμού","add_another_split":"Προσθήκη ενός ακόμα διαχωρισμού","submission":"Υποβολή","create_another":"Μετά την αποθήκευση, επιστρέψτε εδώ για να δημιουργήσετε ακόμη ένα.","reset_after":"Επαναφορά φόρμας μετά την υποβολή","submit":"Υποβολή","amount":"Ποσό","date":"Ημερομηνία","tags":"Ετικέτες","no_budget":"(χωρίς προϋπολογισμό)","no_bill":"(χωρίς πάγιο έξοδο)","category":"Κατηγορία","attachments":"Συνημμένα","notes":"Σημειώσεις","external_uri":"External URL","update_transaction":"Ενημέρωση συναλλαγής","after_update_create_another":"Μετά την ενημέρωση, επιστρέψτε εδώ για να συνεχίσετε την επεξεργασία.","store_as_new":"Αποθήκευση ως νέα συναλλαγή αντί για ενημέρωση.","split_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","none_in_select_list":"(τίποτα)","no_piggy_bank":"(χωρίς κουμπαρά)","description":"Περιγραφή","split_transaction_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","destination_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προορισμού σε μια συναλλαγή τακτοποίησης.","source_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προέλευσης σε μια συναλλαγή τακτοποίησης.","budget":"Προϋπολογισμός","bill":"Πάγιο έξοδο","you_create_withdrawal":"Δημιουργείτε μια ανάληψη.","you_create_transfer":"Δημιουργείτε μια μεταφορά.","you_create_deposit":"Δημιουργείτε μια κατάθεση.","edit":"Επεξεργασία","delete":"Διαγραφή","name":"Όνομα","profile_whoops":"Ούπς!","profile_something_wrong":"Κάτι πήγε στραβά!","profile_try_again":"Κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά.","profile_oauth_clients":"Πελάτες OAuth","profile_oauth_no_clients":"Δεν έχετε δημιουργήσει πελάτες OAuth.","profile_oauth_clients_header":"Πελάτες","profile_oauth_client_id":"Αναγνωριστικό πελάτη","profile_oauth_client_name":"Όνομα","profile_oauth_client_secret":"Μυστικό","profile_oauth_create_new_client":"Δημιουργία νέου πελάτη","profile_oauth_create_client":"Δημιουργία πελάτη","profile_oauth_edit_client":"Επεξεργασία πελάτη","profile_oauth_name_help":"Κάτι που οι χρήστες σας θα αναγνωρίζουν και θα εμπιστεύονται.","profile_oauth_redirect_url":"URL ανακατεύθυνσης","profile_oauth_redirect_url_help":"To authorization callback URL της εφαρμογής σας.","profile_authorized_apps":"Εξουσιοδοτημένες εφαρμογές","profile_authorized_clients":"Εξουσιοδοτημένοι πελάτες","profile_scopes":"Πεδία εφαρμογής","profile_revoke":"Ανάκληση","profile_personal_access_tokens":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token_explanation":"Εδώ είναι το νέο διακριτικό προσωπικής πρόσβασης. Αυτή είναι η μόνη φορά που θα εμφανιστεί, οπότε μη το χάσετε! Μπορείτε να χρησιμοποιείτε αυτό το διακριτικό για να κάνετε κλήσεις API.","profile_no_personal_access_token":"Δεν έχετε δημιουργήσει προσωπικά διακριτικά πρόσβασης.","profile_create_new_token":"Δημιουργία νέου διακριτικού","profile_create_token":"Δημιουργία διακριτικού","profile_create":"Δημιουργία","profile_save_changes":"Αποθήκευση αλλαγών","default_group_title_name":"(χωρίς ομάδα)","piggy_bank":"Κουμπαράς","profile_oauth_client_secret_title":"Μυστικό Πελάτη","profile_oauth_client_secret_expl":"Εδώ είναι το νέο σας μυστικό πελάτη. Αυτή είναι η μόνη φορά που θα σας εμφανιστεί, οπότε μην το χάσετε! Μπορείτε να το χρησιμοποιείτε για να κάνετε αιτήματα API.","profile_oauth_confidential":"Εμπιστευτικό","profile_oauth_confidential_help":"Απαιτήστε από το πρόγραμμα πελάτη να πραγματοποιήσει έλεγχο ταυτότητας με ένα μυστικό. Οι έμπιστοι πελάτες μπορούν να διατηρούν διαπιστευτήρια με ασφαλή τρόπο χωρίς να τα εκθέτουν σε μη εξουσιοδοτημένα μέρη. Οι δημόσιες εφαρμογές, όπως οι εγγενείς εφαρμογές για επιτραπέζιους υπολογιστές ή JavaScript SPA, δεν μπορούν να κρατήσουν μυστικά με ασφάλεια.","multi_account_warning_unknown":"Ανάλογα με τον τύπο της συναλλαγής που δημιουργείτε, ο λογαριασμός προέλευσης ή/και προορισμού των επόμενων διαχωρισμών ενδέχεται να παρακαμφθεί από αυτό που ορίζεται στο πρώτο διαχωρισμό της συναλλαγής.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ημερομηνία τοκισμού","book_date":"Ημερομηνία εγγραφής","process_date":"Ημερομηνία επεξεργασίας","due_date":"Ημερομηνία προθεσμίας","foreign_amount":"Ποσό σε ξένο νόμισμα","payment_date":"Ημερομηνία πληρωμής","invoice_date":"Ημερομηνία τιμολόγησης","internal_reference":"Εσωτερική αναφορά"},"config":{"html_language":"el"}}')},5642:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en-gb"}}')},6886:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en"}}')},2360:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"¿Qué está pasando?","flash_error":"¡Error!","flash_success":"¡Operación correcta!","close":"Cerrar","split_transaction_title":"Descripción de la transacción dividida","errors_submission":"Hubo un problema con su envío. Por favor, compruebe los errores.","split":"Separar","single_split":"División","transaction_stored_link":"La transacción #{ID} (\\"{title}\\") ha sido almacenada.","transaction_updated_link":"La transacción #{ID} ha sido actualizada.","transaction_new_stored_link":"La transacción #{ID} ha sido guardada.","transaction_journal_information":"Información de transacción","no_budget_pointer":"Parece que aún no tienes presupuestos. Debes crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.","no_bill_pointer":"Parece que aún no tienes facturas. Deberías crear algunas en la página de facturas. Las facturas pueden ayudarte a llevar un seguimiento de los gastos.","source_account":"Cuenta origen","hidden_fields_preferences":"Puede habilitar más opciones de transacción en sus ajustes .","destination_account":"Cuenta destino","add_another_split":"Añadir otra división","submission":"Envío","create_another":"Después de guardar, vuelve aquí para crear otro.","reset_after":"Restablecer formulario después del envío","submit":"Enviar","amount":"Cantidad","date":"Fecha","tags":"Etiquetas","no_budget":"(sin presupuesto)","no_bill":"(sin factura)","category":"Categoria","attachments":"Archivos adjuntos","notes":"Notas","external_uri":"External URL","update_transaction":"Actualizar transacción","after_update_create_another":"Después de actualizar, vuelve aquí para continuar editando.","store_as_new":"Almacenar como una nueva transacción en lugar de actualizar.","split_title_help":"Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.","none_in_select_list":"(ninguno)","no_piggy_bank":"(sin hucha)","description":"Descripción","split_transaction_title_help":"Si crea una transacción dividida, debe existir una descripción global para todas las divisiones de la transacción.","destination_account_reconciliation":"No puedes editar la cuenta de destino de una transacción de reconciliación.","source_account_reconciliation":"No puedes editar la cuenta de origen de una transacción de reconciliación.","budget":"Presupuesto","bill":"Factura","you_create_withdrawal":"Está creando un retiro.","you_create_transfer":"Está creando una transferencia.","you_create_deposit":"Está creando un depósito.","edit":"Editar","delete":"Eliminar","name":"Nombre","profile_whoops":"¡Ups!","profile_something_wrong":"¡Algo salió mal!","profile_try_again":"Algo salió mal. Por favor, vuelva a intentarlo.","profile_oauth_clients":"Clientes de OAuth","profile_oauth_no_clients":"No ha creado ningún cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID del cliente","profile_oauth_client_name":"Nombre","profile_oauth_client_secret":"Secreto","profile_oauth_create_new_client":"Crear un Nuevo Cliente","profile_oauth_create_client":"Crear Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que sus usuarios reconocerán y confiarán.","profile_oauth_redirect_url":"Redirigir URL","profile_oauth_redirect_url_help":"La URL de devolución de autorización de su aplicación.","profile_authorized_apps":"Aplicaciones autorizadas","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Ámbitos","profile_revoke":"Revocar","profile_personal_access_tokens":"Tokens de acceso personal","profile_personal_access_token":"Token de acceso personal","profile_personal_access_token_explanation":"Aquí está su nuevo token de acceso personal. Esta es la única vez que se mostrará así que ¡no lo pierda! Ahora puede usar este token para hacer solicitudes de la API.","profile_no_personal_access_token":"No ha creado ningún token de acceso personal.","profile_create_new_token":"Crear nuevo token","profile_create_token":"Crear token","profile_create":"Crear","profile_save_changes":"Guardar cambios","default_group_title_name":"(sin agrupación)","piggy_bank":"Hucha","profile_oauth_client_secret_title":"Secreto del Cliente","profile_oauth_client_secret_expl":"Aquí está su nuevo secreto de cliente. Esta es la única vez que se mostrará así que no lo pierda! Ahora puede usar este secreto para hacer solicitudes de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Requerir que el cliente se autentifique con un secreto. Los clientes confidenciales pueden mantener las credenciales de forma segura sin exponerlas a partes no autorizadas. Las aplicaciones públicas, como aplicaciones de escritorio nativo o SPA de JavaScript, no pueden guardar secretos de forma segura.","multi_account_warning_unknown":"Dependiendo del tipo de transacción que cree, la cuenta de origen y/o destino de divisiones posteriores puede ser anulada por lo que se define en la primera división de la transacción.","multi_account_warning_withdrawal":"Tenga en cuenta que la cuenta de origen de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_deposit":"Tenga en cuenta que la cuenta de destino de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_transfer":"Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores será anulada por lo que se defina en la primera división de la transferencia."},"form":{"interest_date":"Fecha de interés","book_date":"Fecha de registro","process_date":"Fecha de procesamiento","due_date":"Fecha de vencimiento","foreign_amount":"Cantidad extranjera","payment_date":"Fecha de pago","invoice_date":"Fecha de la factura","internal_reference":"Referencia interna"},"config":{"html_language":"es"}}')},3684:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mitä kuuluu?","flash_error":"Virhe!","flash_success":"Valmista tuli!","close":"Sulje","split_transaction_title":"Jaetun tapahtuman kuvaus","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Jaa","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Tapahtumatiedot","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Lähdetili","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Kohdetili","add_another_split":"Lisää tapahtumaan uusi osa","submission":"Vahvistus","create_another":"Tallennuksen jälkeen, palaa takaisin luomaan uusi tapahtuma.","reset_after":"Tyhjennä lomake lähetyksen jälkeen","submit":"Vahvista","amount":"Summa","date":"Päivämäärä","tags":"Tägit","no_budget":"(ei budjettia)","no_bill":"(no bill)","category":"Kategoria","attachments":"Liitteet","notes":"Muistiinpanot","external_uri":"External URL","update_transaction":"Päivitä tapahtuma","after_update_create_another":"Päivityksen jälkeen, palaa takaisin jatkamaan muokkausta.","store_as_new":"Tallenna uutena tapahtumana päivityksen sijaan.","split_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","none_in_select_list":"(ei mitään)","no_piggy_bank":"(ei säästöpossu)","description":"Kuvaus","split_transaction_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","destination_account_reconciliation":"Et voi muokata täsmäytystapahtuman kohdetiliä.","source_account_reconciliation":"Et voi muokata täsmäytystapahtuman lähdetiliä.","budget":"Budjetti","bill":"Lasku","you_create_withdrawal":"Olet luomassa nostoa.","you_create_transfer":"Olet luomassa siirtoa.","you_create_deposit":"Olet luomassa talletusta.","edit":"Muokkaa","delete":"Poista","name":"Nimi","profile_whoops":"Hupsis!","profile_something_wrong":"Jokin meni vikaan!","profile_try_again":"Jokin meni vikaan. Yritä uudelleen.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Asiakasohjelmat","profile_oauth_client_id":"Asiakastunnus","profile_oauth_client_name":"Nimi","profile_oauth_client_secret":"Salaisuus","profile_oauth_create_new_client":"Luo Uusi Asiakas","profile_oauth_create_client":"Luo Asiakas","profile_oauth_edit_client":"Muokkaa asiakasta","profile_oauth_name_help":"Jotain käyttäjillesi tuttua ja luotettavaa.","profile_oauth_redirect_url":"URL:n uudelleenohjaus","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Peruuta","profile_personal_access_tokens":"Henkilökohtaiset Käyttöoikeuskoodit","profile_personal_access_token":"Henkilökohtainen Käyttöoikeuskoodi","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Luo uusi tunnus","profile_create_token":"Luo tunnus","profile_create":"Luo","profile_save_changes":"Tallenna muutokset","default_group_title_name":"(ryhmittelemättömät)","piggy_bank":"Säästöpossu","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Korkopäivä","book_date":"Kirjauspäivä","process_date":"Käsittelypäivä","due_date":"Eräpäivä","foreign_amount":"Ulkomaan summa","payment_date":"Maksupäivä","invoice_date":"Laskun päivämäärä","internal_reference":"Sisäinen viite"},"config":{"html_language":"fi"}}')},6833:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Quoi de neuf ?","flash_error":"Erreur !","flash_success":"Super !","close":"Fermer","split_transaction_title":"Description de l\'opération ventilée","errors_submission":"Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs.","split":"Ventiler","single_split":"Ventilation","transaction_stored_link":"L\'opération n°{ID} (\\"{title}\\") a été enregistrée.","transaction_updated_link":"L\'opération n°{ID} a été mise à jour.","transaction_new_stored_link":"L\'opération n°{ID} a été enregistrée.","transaction_journal_information":"Informations sur l\'opération","no_budget_pointer":"Vous semblez n’avoir encore aucun budget. Vous devriez en créer un sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.","no_bill_pointer":"Vous semblez n\'avoir encore aucune facture. Vous devriez en créer une sur la page factures-. Les factures peuvent vous aider à garder une trace des dépenses.","source_account":"Compte source","hidden_fields_preferences":"Vous pouvez activer plus d\'options d\'opérations dans vos paramètres.","destination_account":"Compte de destination","add_another_split":"Ajouter une autre fraction","submission":"Soumission","create_another":"Après enregistrement, revenir ici pour en créer un nouveau.","reset_after":"Réinitialiser le formulaire après soumission","submit":"Soumettre","amount":"Montant","date":"Date","tags":"Tags","no_budget":"(pas de budget)","no_bill":"(aucune facture)","category":"Catégorie","attachments":"Pièces jointes","notes":"Notes","external_uri":"URL externe","update_transaction":"Mettre à jour l\'opération","after_update_create_another":"Après la mise à jour, revenir ici pour continuer l\'édition.","store_as_new":"Enregistrer comme une nouvelle opération au lieu de mettre à jour.","split_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.","none_in_select_list":"(aucun)","no_piggy_bank":"(aucune tirelire)","description":"Description","split_transaction_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fraction de l\'opération.","destination_account_reconciliation":"Vous ne pouvez pas modifier le compte de destination d\'une opération de rapprochement.","source_account_reconciliation":"Vous ne pouvez pas modifier le compte source d\'une opération de rapprochement.","budget":"Budget","bill":"Facture","you_create_withdrawal":"Vous saisissez une dépense.","you_create_transfer":"Vous saisissez un transfert.","you_create_deposit":"Vous saisissez un dépôt.","edit":"Modifier","delete":"Supprimer","name":"Nom","profile_whoops":"Oups !","profile_something_wrong":"Une erreur s\'est produite !","profile_try_again":"Une erreur s’est produite. Merci d’essayer à nouveau.","profile_oauth_clients":"Clients OAuth","profile_oauth_no_clients":"Vous n’avez pas encore créé de client OAuth.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Identifiant","profile_oauth_client_name":"Nom","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Créer un nouveau client","profile_oauth_create_client":"Créer un client","profile_oauth_edit_client":"Modifier le client","profile_oauth_name_help":"Quelque chose que vos utilisateurs reconnaîtront et qui inspirera confiance.","profile_oauth_redirect_url":"URL de redirection","profile_oauth_redirect_url_help":"URL de callback de votre application.","profile_authorized_apps":"Applications autorisées","profile_authorized_clients":"Clients autorisés","profile_scopes":"Permissions","profile_revoke":"Révoquer","profile_personal_access_tokens":"Jetons d\'accès personnels","profile_personal_access_token":"Jeton d\'accès personnel","profile_personal_access_token_explanation":"Voici votre nouveau jeton d’accès personnel. Ceci est la seule fois où vous pourrez le voir, ne le perdez pas ! Vous pouvez dès à présent utiliser ce jeton pour lancer des requêtes avec l’API.","profile_no_personal_access_token":"Vous n’avez pas encore créé de jeton d’accès personnel.","profile_create_new_token":"Créer un nouveau jeton","profile_create_token":"Créer un jeton","profile_create":"Créer","profile_save_changes":"Enregistrer les modifications","default_group_title_name":"(Sans groupement)","piggy_bank":"Tirelire","profile_oauth_client_secret_title":"Secret du client","profile_oauth_client_secret_expl":"Voici votre nouveau secret de client. C\'est la seule fois qu\'il sera affiché, donc ne le perdez pas ! Vous pouvez maintenant utiliser ce secret pour faire des requêtes d\'API.","profile_oauth_confidential":"Confidentiel","profile_oauth_confidential_help":"Exiger que le client s\'authentifie avec un secret. Les clients confidentiels peuvent détenir des informations d\'identification de manière sécurisée sans les exposer à des tiers non autorisés. Les applications publiques, telles que les applications de bureau natif ou les SPA JavaScript, ne peuvent pas tenir des secrets en toute sécurité.","multi_account_warning_unknown":"Selon le type d\'opération que vous créez, le(s) compte(s) source et/ou de destination des ventilations suivantes peuvent être remplacés par celui de la première ventilation de l\'opération.","multi_account_warning_withdrawal":"Gardez en tête que le compte source des ventilations suivantes peut être remplacé par celui de la première ventilation de la dépense.","multi_account_warning_deposit":"Gardez en tête que le compte de destination des ventilations suivantes peut être remplacé par celui de la première ventilation du dépôt.","multi_account_warning_transfer":"Gardez en tête que les comptes source et de destination des ventilations suivantes peuvent être remplacés par ceux de la première ventilation du transfert."},"form":{"interest_date":"Date de valeur (intérêts)","book_date":"Date de réservation","process_date":"Date de traitement","due_date":"Échéance","foreign_amount":"Montant en devise étrangère","payment_date":"Date de paiement","invoice_date":"Date de facturation","internal_reference":"Référence interne"},"config":{"html_language":"fr"}}')},6477:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mi a helyzet?","flash_error":"Hiba!","flash_success":"Siker!","close":"Bezárás","split_transaction_title":"Felosztott tranzakció leírása","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Felosztás","single_split":"Felosztás","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") mentve.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} mentve.","transaction_journal_information":"Tranzakciós információk","no_budget_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","no_bill_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","source_account":"Forrás számla","hidden_fields_preferences":"A beállításokban több mező is engedélyezhető.","destination_account":"Célszámla","add_another_split":"Másik felosztás hozzáadása","submission":"Feliratkozás","create_another":"A tárolás után térjen vissza ide új létrehozásához.","reset_after":"Űrlap törlése a beküldés után","submit":"Beküldés","amount":"Összeg","date":"Dátum","tags":"Címkék","no_budget":"(nincs költségkeret)","no_bill":"(no bill)","category":"Kategória","attachments":"Mellékletek","notes":"Megjegyzések","external_uri":"External URL","update_transaction":"Tranzakció frissítése","after_update_create_another":"A frissítés után térjen vissza ide a szerkesztés folytatásához.","store_as_new":"Tárolás új tranzakcióként frissítés helyett.","split_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","none_in_select_list":"(nincs)","no_piggy_bank":"(nincs malacpersely)","description":"Leírás","split_transaction_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","destination_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció célszámláját.","source_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció forrásszámláját.","budget":"Költségkeret","bill":"Számla","you_create_withdrawal":"Egy költség létrehozása.","you_create_transfer":"Egy átutalás létrehozása.","you_create_deposit":"Egy bevétel létrehozása.","edit":"Szerkesztés","delete":"Törlés","name":"Név","profile_whoops":"Hoppá!","profile_something_wrong":"Hiba történt!","profile_try_again":"Hiba történt. Kérjük, próbálja meg újra.","profile_oauth_clients":"OAuth kliensek","profile_oauth_no_clients":"Nincs létrehozva egyetlen OAuth kliens sem.","profile_oauth_clients_header":"Kliensek","profile_oauth_client_id":"Kliens ID","profile_oauth_client_name":"Megnevezés","profile_oauth_client_secret":"Titkos kód","profile_oauth_create_new_client":"Új kliens létrehozása","profile_oauth_create_client":"Kliens létrehozása","profile_oauth_edit_client":"Kliens szerkesztése","profile_oauth_name_help":"Segítség, hogy a felhasználók tudják mihez kapcsolódik.","profile_oauth_redirect_url":"Átirányítási URL","profile_oauth_redirect_url_help":"Az alkalmazásban használt autentikációs URL.","profile_authorized_apps":"Engedélyezett alkalmazások","profile_authorized_clients":"Engedélyezett kliensek","profile_scopes":"Hatáskörök","profile_revoke":"Visszavonás","profile_personal_access_tokens":"Személyes hozzáférési tokenek","profile_personal_access_token":"Személyes hozzáférési token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"Nincs létrehozva egyetlen személyes hozzáférési token sem.","profile_create_new_token":"Új token létrehozása","profile_create_token":"Token létrehozása","profile_create":"Létrehozás","profile_save_changes":"Módosítások mentése","default_group_title_name":"(nem csoportosított)","piggy_bank":"Malacpersely","profile_oauth_client_secret_title":"Kliens titkos kódja","profile_oauth_client_secret_expl":"Ez a kliens titkos kódja. Ez az egyetlen alkalom, amikor meg van jelenítve, ne hagyd el! Ezzel a kóddal végezhetsz API hívásokat.","profile_oauth_confidential":"Bizalmas","profile_oauth_confidential_help":"Titkos kód használata a kliens bejelentkezéséhez. Bizonyos kliensek biztonságosan tudnak hitelesítő adatokat tárolni, anélkül hogy jogosulatlan fél hozzáférhetne. Nyilvános kliensek, például mint asztali vagy JavaScript SPA alkalmazások nem tudnak biztonságosan titkos kódot tárolni.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Kamatfizetési időpont","book_date":"Könyvelés dátuma","process_date":"Feldolgozás dátuma","due_date":"Lejárati időpont","foreign_amount":"Külföldi összeg","payment_date":"Fizetés dátuma","invoice_date":"Számla dátuma","internal_reference":"Belső hivatkozás"},"config":{"html_language":"hu"}}')},3092:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"La tua situazione finanziaria","flash_error":"Errore!","flash_success":"Successo!","close":"Chiudi","split_transaction_title":"Descrizione della transazione suddivisa","errors_submission":"Errore durante l\'invio. Controlla gli errori segnalati qui sotto.","split":"Dividi","single_split":"Divisione","transaction_stored_link":"La transazione #{ID} (\\"{title}\\") è stata salvata.","transaction_updated_link":"La transazione #{ID} è stata aggiornata.","transaction_new_stored_link":"La transazione #{ID} è stata salvata.","transaction_journal_information":"Informazioni transazione","no_budget_pointer":"Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget. I budget possono aiutarti a tenere traccia delle spese.","no_bill_pointer":"Sembra che tu non abbia ancora delle bollette. Dovresti crearne alcune nella pagina delle bollette. Le bollette possono aiutarti a tenere traccia delle spese.","source_account":"Conto di origine","hidden_fields_preferences":"Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni.","destination_account":"Conto destinazione","add_another_split":"Aggiungi un\'altra divisione","submission":"Invio","create_another":"Dopo il salvataggio, torna qui per crearne un\'altra.","reset_after":"Resetta il modulo dopo l\'invio","submit":"Invia","amount":"Importo","date":"Data","tags":"Etichette","no_budget":"(nessun budget)","no_bill":"(nessuna bolletta)","category":"Categoria","attachments":"Allegati","notes":"Note","external_uri":"URL esterno","update_transaction":"Aggiorna transazione","after_update_create_another":"Dopo l\'aggiornamento, torna qui per continuare la modifica.","store_as_new":"Salva come nuova transazione invece di aggiornarla.","split_title_help":"Se crei una transazione suddivisa è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","none_in_select_list":"(nessuna)","no_piggy_bank":"(nessun salvadanaio)","description":"Descrizione","split_transaction_title_help":"Se crei una transazione suddivisa, è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","destination_account_reconciliation":"Non è possibile modificare il conto di destinazione di una transazione di riconciliazione.","source_account_reconciliation":"Non puoi modificare il conto di origine di una transazione di riconciliazione.","budget":"Budget","bill":"Bolletta","you_create_withdrawal":"Stai creando un prelievo.","you_create_transfer":"Stai creando un trasferimento.","you_create_deposit":"Stai creando un deposito.","edit":"Modifica","delete":"Elimina","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Qualcosa non ha funzionato!","profile_try_again":"Qualcosa non ha funzionato. Riprova.","profile_oauth_clients":"Client OAuth","profile_oauth_no_clients":"Non hai creato nessun client OAuth.","profile_oauth_clients_header":"Client","profile_oauth_client_id":"ID client","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segreto","profile_oauth_create_new_client":"Crea nuovo client","profile_oauth_create_client":"Crea client","profile_oauth_edit_client":"Modifica client","profile_oauth_name_help":"Qualcosa di cui i tuoi utenti potranno riconoscere e fidarsi.","profile_oauth_redirect_url":"URL di reindirizzamento","profile_oauth_redirect_url_help":"L\'URL di callback dell\'autorizzazione della tua applicazione.","profile_authorized_apps":"Applicazioni autorizzate","profile_authorized_clients":"Client autorizzati","profile_scopes":"Ambiti","profile_revoke":"Revoca","profile_personal_access_tokens":"Token di acceso personale","profile_personal_access_token":"Token di acceso personale","profile_personal_access_token_explanation":"Ecco il tuo nuovo token di accesso personale. Questa è l\'unica volta che ti viene mostrato per cui non perderlo! Da adesso puoi utilizzare questo token per effettuare delle richieste API.","profile_no_personal_access_token":"Non hai creato alcun token di accesso personale.","profile_create_new_token":"Crea nuovo token","profile_create_token":"Crea token","profile_create":"Crea","profile_save_changes":"Salva modifiche","default_group_title_name":"(non in un gruppo)","piggy_bank":"Salvadanaio","profile_oauth_client_secret_title":"Segreto del client","profile_oauth_client_secret_expl":"Ecco il segreto del nuovo client. Questa è l\'unica occasione in cui viene mostrato pertanto non perderlo! Ora puoi usare questo segreto per effettuare delle richieste alle API.","profile_oauth_confidential":"Riservato","profile_oauth_confidential_help":"Richiede al client di autenticarsi con un segreto. I client riservati possono conservare le credenziali in modo sicuro senza esporle a soggetti non autorizzati. Le applicazioni pubbliche, come le applicazioni desktop native o JavaScript SPA, non sono in grado di conservare i segreti in modo sicuro.","multi_account_warning_unknown":"A seconda del tipo di transazione che hai creato, il conto di origine e/o destinazione delle successive suddivisioni può essere sovrascritto da qualsiasi cosa sia definita nella prima suddivisione della transazione.","multi_account_warning_withdrawal":"Ricorda che il conto di origine delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del prelievo.","multi_account_warning_deposit":"Ricorda che il conto di destinazione delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del deposito.","multi_account_warning_transfer":"Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento."},"form":{"interest_date":"Data di valuta","book_date":"Data contabile","process_date":"Data elaborazione","due_date":"Data scadenza","foreign_amount":"Importo estero","payment_date":"Data pagamento","invoice_date":"Data fatturazione","internal_reference":"Riferimento interno"},"config":{"html_language":"it"}}')},2502:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Feil!","flash_success":"Suksess!","close":"Lukk","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Del opp","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaksjonsinformasjon","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Legg til en oppdeling til","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Send inn","amount":"Beløp","date":"Dato","tags":"Tagger","no_budget":"(ingen budsjett)","no_bill":"(no bill)","category":"Kategori","attachments":"Vedlegg","notes":"Notater","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(ingen)","no_piggy_bank":"(no piggy bank)","description":"Beskrivelse","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Busjett","bill":"Regning","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Rediger","delete":"Slett","name":"Navn","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Sparegris","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Rentedato","book_date":"Bokføringsdato","process_date":"Prosesseringsdato","due_date":"Forfallsdato","foreign_amount":"Utenlandske beløp","payment_date":"Betalingsdato","invoice_date":"Fakturadato","internal_reference":"Intern referanse"},"config":{"html_language":"nb"}}')},78:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Hoe staat het er voor?","flash_error":"Fout!","flash_success":"Gelukt!","close":"Sluiten","split_transaction_title":"Beschrijving van de gesplitste transactie","errors_submission":"Er ging iets mis. Check de errors.","split":"Splitsen","single_split":"Split","transaction_stored_link":"Transactie #{ID} (\\"{title}\\") is opgeslagen.","transaction_updated_link":"Transactie #{ID} is geüpdatet.","transaction_new_stored_link":"Transactie #{ID} is opgeslagen.","transaction_journal_information":"Transactieinformatie","no_budget_pointer":"Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.","no_bill_pointer":"Je hebt nog geen contracten. Maak er een aantal op de contracten-pagina. Met contracten kan je je uitgaven beter bijhouden.","source_account":"Bronrekening","hidden_fields_preferences":"Je kan meer transactieopties inschakelen in je instellingen.","destination_account":"Doelrekening","add_another_split":"Voeg een split toe","submission":"Indienen","create_another":"Terug naar deze pagina voor een nieuwe transactie.","reset_after":"Reset formulier na opslaan","submit":"Invoeren","amount":"Bedrag","date":"Datum","tags":"Tags","no_budget":"(geen budget)","no_bill":"(geen contract)","category":"Categorie","attachments":"Bijlagen","notes":"Notities","external_uri":"Externe URL","update_transaction":"Update transactie","after_update_create_another":"Na het opslaan terug om door te gaan met wijzigen.","store_as_new":"Opslaan als nieuwe transactie ipv de huidige bij te werken.","split_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","none_in_select_list":"(geen)","no_piggy_bank":"(geen spaarpotje)","description":"Omschrijving","split_transaction_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","destination_account_reconciliation":"Je kan de doelrekening van een afstemming niet wijzigen.","source_account_reconciliation":"Je kan de bronrekening van een afstemming niet wijzigen.","budget":"Budget","bill":"Contract","you_create_withdrawal":"Je maakt een uitgave.","you_create_transfer":"Je maakt een overschrijving.","you_create_deposit":"Je maakt inkomsten.","edit":"Wijzig","delete":"Verwijder","name":"Naam","profile_whoops":"Oeps!","profile_something_wrong":"Er is iets mis gegaan!","profile_try_again":"Er is iets misgegaan. Probeer het nogmaals.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Je hebt nog geen OAuth-clients aangemaakt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Naam","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Nieuwe client aanmaken","profile_oauth_create_client":"Client aanmaken","profile_oauth_edit_client":"Client bewerken","profile_oauth_name_help":"Iets dat je gebruikers herkennen en vertrouwen.","profile_oauth_redirect_url":"Redirect-URL","profile_oauth_redirect_url_help":"De authorisatie-callback-url van jouw applicatie.","profile_authorized_apps":"Geautoriseerde toepassingen","profile_authorized_clients":"Geautoriseerde clients","profile_scopes":"Scopes","profile_revoke":"Intrekken","profile_personal_access_tokens":"Persoonlijke toegangstokens","profile_personal_access_token":"Persoonlijk toegangstoken","profile_personal_access_token_explanation":"Hier is je nieuwe persoonlijke toegangstoken. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan deze toegangstoken gebruiken om API-aanvragen te maken.","profile_no_personal_access_token":"Je hebt nog geen persoonlijke toegangstokens aangemaakt.","profile_create_new_token":"Nieuwe token aanmaken","profile_create_token":"Token aanmaken","profile_create":"Creër","profile_save_changes":"Aanpassingen opslaan","default_group_title_name":"(ongegroepeerd)","piggy_bank":"Spaarpotje","profile_oauth_client_secret_title":"Client secret","profile_oauth_client_secret_expl":"Hier is je nieuwe client secret. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan dit secret gebruiken om API-aanvragen te maken.","profile_oauth_confidential":"Vertrouwelijk","profile_oauth_confidential_help":"Dit vinkje is bedoeld voor applicaties die geheimen kunnen bewaren. Applicaties zoals sommige desktop-apps en Javascript apps kunnen dit niet. In zo\'n geval haal je het vinkje weg.","multi_account_warning_unknown":"Afhankelijk van het type transactie wordt de bron- en/of doelrekening overschreven door wat er in de eerste split staat.","multi_account_warning_withdrawal":"De bronrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_deposit":"De doelrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_transfer":"De bron + doelrekening wordt overschreven door wat er in de eerste split staat."},"form":{"interest_date":"Rentedatum","book_date":"Boekdatum","process_date":"Verwerkingsdatum","due_date":"Vervaldatum","foreign_amount":"Bedrag in vreemde valuta","payment_date":"Betalingsdatum","invoice_date":"Factuurdatum","internal_reference":"Interne verwijzing"},"config":{"html_language":"nl"}}')},8691:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Co jest grane?","flash_error":"Błąd!","flash_success":"Sukces!","close":"Zamknij","split_transaction_title":"Opis podzielonej transakcji","errors_submission":"Coś poszło nie tak w czasie zapisu. Proszę sprawdź błędy.","split":"Podziel","single_split":"Podział","transaction_stored_link":"Transakcja #{ID} (\\"{title}\\") została zapisana.","transaction_updated_link":"Transakcja #{ID} została zaktualizowana.","transaction_new_stored_link":"Transakcja #{ID} została zapisana.","transaction_journal_information":"Informacje o transakcji","no_budget_pointer":"Wygląda na to, że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżetów. Budżety mogą Ci pomóc śledzić wydatki.","no_bill_pointer":"Wygląda na to, że nie masz jeszcze rachunków. Powinieneś utworzyć kilka na stronie rachunków. Rachunki mogą Ci pomóc śledzić wydatki.","source_account":"Konto źródłowe","hidden_fields_preferences":"Możesz włączyć więcej opcji transakcji w swoich ustawieniach.","destination_account":"Konto docelowe","add_another_split":"Dodaj kolejny podział","submission":"Zapisz","create_another":"Po zapisaniu wróć tutaj, aby utworzyć kolejny.","reset_after":"Wyczyść formularz po zapisaniu","submit":"Prześlij","amount":"Kwota","date":"Data","tags":"Tagi","no_budget":"(brak budżetu)","no_bill":"(brak rachunku)","category":"Kategoria","attachments":"Załączniki","notes":"Notatki","external_uri":"Zewnętrzny adres URL","update_transaction":"Zaktualizuj transakcję","after_update_create_another":"Po aktualizacji wróć tutaj, aby kontynuować edycję.","store_as_new":"Zapisz jako nową zamiast aktualizować.","split_title_help":"Podzielone transakcje muszą posiadać globalny opis.","none_in_select_list":"(żadne)","no_piggy_bank":"(brak skarbonki)","description":"Opis","split_transaction_title_help":"Jeśli tworzysz podzieloną transakcję, musi ona posiadać globalny opis dla wszystkich podziałów w transakcji.","destination_account_reconciliation":"Nie możesz edytować konta docelowego transakcji uzgadniania.","source_account_reconciliation":"Nie możesz edytować konta źródłowego transakcji uzgadniania.","budget":"Budżet","bill":"Rachunek","you_create_withdrawal":"Tworzysz wydatek.","you_create_transfer":"Tworzysz przelew.","you_create_deposit":"Tworzysz wpłatę.","edit":"Modyfikuj","delete":"Usuń","name":"Nazwa","profile_whoops":"Uuuups!","profile_something_wrong":"Coś poszło nie tak!","profile_try_again":"Coś poszło nie tak. Spróbuj ponownie.","profile_oauth_clients":"Klienci OAuth","profile_oauth_no_clients":"Nie utworzyłeś żadnych klientów OAuth.","profile_oauth_clients_header":"Klienci","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Nazwa","profile_oauth_client_secret":"Sekretny klucz","profile_oauth_create_new_client":"Utwórz nowego klienta","profile_oauth_create_client":"Utwórz klienta","profile_oauth_edit_client":"Edytuj klienta","profile_oauth_name_help":"Coś, co Twoi użytkownicy będą rozpoznawać i ufać.","profile_oauth_redirect_url":"Przekierowanie URL","profile_oauth_redirect_url_help":"Adres URL wywołania zwrotnego autoryzacji aplikacji.","profile_authorized_apps":"Autoryzowane aplikacje","profile_authorized_clients":"Autoryzowani klienci","profile_scopes":"Zakresy","profile_revoke":"Unieważnij","profile_personal_access_tokens":"Osobiste tokeny dostępu","profile_personal_access_token":"Osobisty token dostępu","profile_personal_access_token_explanation":"Oto twój nowy osobisty token dostępu. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego tokenu, aby wykonać zapytania API.","profile_no_personal_access_token":"Nie utworzyłeś żadnych osobistych tokenów.","profile_create_new_token":"Utwórz nowy token","profile_create_token":"Utwórz token","profile_create":"Utwórz","profile_save_changes":"Zapisz zmiany","default_group_title_name":"(bez grupy)","piggy_bank":"Skarbonka","profile_oauth_client_secret_title":"Sekret klienta","profile_oauth_client_secret_expl":"Oto twój nowy sekret klienta. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego sekretu, aby wykonać zapytania API.","profile_oauth_confidential":"Poufne","profile_oauth_confidential_help":"Wymagaj od klienta uwierzytelnienia za pomocą sekretu. Poufni klienci mogą przechowywać poświadczenia w bezpieczny sposób bez narażania ich na dostęp przez nieuprawnione strony. Publiczne aplikacje, takie jak natywne aplikacje desktopowe lub JavaScript SPA, nie są w stanie bezpiecznie trzymać sekretów.","multi_account_warning_unknown":"W zależności od rodzaju transakcji, którą tworzysz, konto źródłowe i/lub docelowe kolejnych podziałów może zostać ustawione na konto zdefiniowane w pierwszym podziale transakcji.","multi_account_warning_withdrawal":"Pamiętaj, że konto źródłowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wypłaty.","multi_account_warning_deposit":"Pamiętaj, że konto docelowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wpłaty.","multi_account_warning_transfer":"Pamiętaj, że konta źródłowe i docelowe kolejnych podziałów zostaną ustawione na konto zdefiniowane w pierwszym podziale transferu."},"form":{"interest_date":"Data odsetek","book_date":"Data księgowania","process_date":"Data przetworzenia","due_date":"Termin realizacji","foreign_amount":"Kwota zagraniczna","payment_date":"Data płatności","invoice_date":"Data faktury","internal_reference":"Wewnętrzny numer"},"config":{"html_language":"pl"}}')},122:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"O que está acontecendo?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transação dividida","errors_submission":"Há algo de errado com o seu envio. Por favor, verifique os erros abaixo.","split":"Dividir","single_split":"Divisão","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi salva.","transaction_updated_link":"Transação #{ID} foi atualizada.","transaction_new_stored_link":"Transação #{ID} foi salva.","transaction_journal_information":"Informação da transação","no_budget_pointer":"Parece que você ainda não tem orçamentos. Você deve criar alguns na página de orçamentos. Orçamentos podem ajudá-lo a manter o controle das despesas.","no_bill_pointer":"Parece que você ainda não tem contas. Você deve criar algumas em contas. Contas podem ajudar você a manter o controle de despesas.","source_account":"Conta origem","hidden_fields_preferences":"Você pode habilitar mais opções de transação em suas preferências.","destination_account":"Conta destino","add_another_split":"Adicionar outra divisão","submission":"Envio","create_another":"Depois de armazenar, retorne aqui para criar outro.","reset_after":"Resetar o formulário após o envio","submit":"Enviar","amount":"Valor","date":"Data","tags":"Tags","no_budget":"(sem orçamento)","no_bill":"(sem conta)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL externa","update_transaction":"Atualizar transação","after_update_create_another":"Depois de atualizar, retorne aqui para continuar editando.","store_as_new":"Armazene como uma nova transação em vez de atualizar.","split_title_help":"Se você criar uma transação dividida, é necessário haver uma descrição global para todas as partes da transação.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum cofrinho)","description":"Descrição","split_transaction_title_help":"Se você criar uma transação dividida, deve haver uma descrição global para todas as partes da transação.","destination_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","source_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","budget":"Orçamento","bill":"Fatura","you_create_withdrawal":"Você está criando uma saída.","you_create_transfer":"Você está criando uma transferência.","you_create_deposit":"Você está criando uma entrada.","edit":"Editar","delete":"Apagar","name":"Nome","profile_whoops":"Ops!","profile_something_wrong":"Alguma coisa deu errado!","profile_try_again":"Algo deu errado. Por favor tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Você não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segredo","profile_oauth_create_new_client":"Criar um novo cliente","profile_oauth_create_client":"Criar um cliente","profile_oauth_edit_client":"Editar cliente","profile_oauth_name_help":"Alguma coisa que seus usuários vão reconhecer e identificar.","profile_oauth_redirect_url":"URL de redirecionamento","profile_oauth_redirect_url_help":"A URL de retorno da sua solicitação de autorização.","profile_authorized_apps":"Aplicativos autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Escopos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está seu novo token de acesso pessoal. Esta é a única vez que ela será mostrada então não perca! Agora você pode usar esse token para fazer solicitações de API.","profile_no_personal_access_token":"Você não criou nenhum token de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Salvar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Cofrinho","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu novo segredo de cliente. Esta é a única vez que ela será mostrada, então não o perca! Agora você pode usar este segredo para fazer requisições de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exige que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expô-las à partes não autorizadas. Aplicações públicas, como aplicações de área de trabalho nativas ou JavaScript SPA, são incapazes de manter segredos com segurança.","multi_account_warning_unknown":"Dependendo do tipo de transação que você criar, a conta de origem e/ou de destino das divisões subsequentes pode ser sobrescrita pelo que estiver definido na primeira divisão da transação.","multi_account_warning_withdrawal":"Tenha em mente que a conta de origem das subsequentes divisões será sobrescrita pelo que estiver definido na primeira divisão da saída.","multi_account_warning_deposit":"Tenha em mente que a conta de destino das divisões subsequentes será sobrescrita pelo que estiver definido na primeira divisão da entrada.","multi_account_warning_transfer":"Tenha em mente que a conta de origem + de destino das divisões subsequentes será sobrescrita pelo que for definido na primeira divisão da transferência."},"form":{"interest_date":"Data de interesse","book_date":"Data reserva","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante em moeda estrangeira","payment_date":"Data de pagamento","invoice_date":"Data da Fatura","internal_reference":"Referência interna"},"config":{"html_language":"pt-br"}}')},4895:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Tudo bem?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transacção dividida","errors_submission":"Aconteceu algo errado com a sua submissão. Por favor, verifique os erros.","split":"Dividir","single_split":"Dividir","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi guardada.","transaction_updated_link":"Transação#{ID} foi atualizada.","transaction_new_stored_link":"Transação#{ID} foi guardada.","transaction_journal_information":"Informacao da transaccao","no_budget_pointer":"Parece que ainda não tem orçamentos. Pode criar-los na página de orçamentos. Orçamentos podem ajudá-lo a controlar as despesas.","no_bill_pointer":"Parece que ainda não tem contas. Pode criar-las na página de contas. Contas podem ajudá-lo a controlar as despesas.","source_account":"Conta de origem","hidden_fields_preferences":"Pode ativar mais opções de transações nas suas preferências.","destination_account":"Conta de destino","add_another_split":"Adicionar outra divisão","submission":"Submissão","create_another":"Depois de guardar, voltar aqui para criar outra.","reset_after":"Repor o formulário após o envio","submit":"Enviar","amount":"Montante","date":"Data","tags":"Tags","no_budget":"(sem orcamento)","no_bill":"(sem contas)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL Externo","update_transaction":"Actualizar transacção","after_update_create_another":"Após a atualização, regresse aqui para continuar a editar.","store_as_new":"Guarde como uma nova transação em vez de atualizar.","split_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum mealheiro)","description":"Descricao","split_transaction_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","destination_account_reconciliation":"Não pode editar a conta de destino de uma transacção de reconciliação.","source_account_reconciliation":"Não pode editar a conta de origem de uma transacção de reconciliação.","budget":"Orcamento","bill":"Conta","you_create_withdrawal":"Está a criar um levantamento.","you_create_transfer":"Está a criar uma transferência.","you_create_deposit":"Está a criar um deposito.","edit":"Alterar","delete":"Apagar","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Algo correu mal!","profile_try_again":"Algo correu mal. Por favor, tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Código secreto","profile_oauth_create_new_client":"Criar Novo Cliente","profile_oauth_create_client":"Criar Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que os utilizadores reconheçam e confiem.","profile_oauth_redirect_url":"URL de redireccionamento","profile_oauth_redirect_url_help":"URL de callback de autorização da aplicação.","profile_authorized_apps":"Aplicações autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Contextos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está o seu novo token de acesso pessoal. Esta é a única vês que o mesmo será mostrado portanto não o perca! Pode utiliza-lo para fazer pedidos de API.","profile_no_personal_access_token":"Você ainda não criou tokens de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Guardar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Mealheiro","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu segredo de cliente. Apenas estará visível uma vez portanto não o perca! Pode agora utilizar este segredo para fazer pedidos à API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exigir que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expor as mesmas a terceiros não autorizadas. Aplicações públicas, como por exemplo aplicações nativas de sistema operativo ou SPA JavaScript, são incapazes de garantir a segurança dos segredos.","multi_account_warning_unknown":"Dependendo do tipo de transição que quer criar, a conta de origem e/ou a destino de subsequentes divisões pode ser sub-escrita por quaisquer regra definida na primeira divisão da transação.","multi_account_warning_withdrawal":"Mantenha em mente que a conta de origem de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do levantamento.","multi_account_warning_deposit":"Mantenha em mente que a conta de destino de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do depósito.","multi_account_warning_transfer":"Mantenha em mente que a conta de origem + destino de divisões subsequentes serão sobre-escritas por quaisquer regras definidas na divisão da transferência."},"form":{"interest_date":"Data de juros","book_date":"Data de registo","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante estrangeiro","payment_date":"Data de pagamento","invoice_date":"Data da factura","internal_reference":"Referencia interna"},"config":{"html_language":"pt"}}')},403:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ce se redă?","flash_error":"Eroare!","flash_success":"Succes!","close":"Închide","split_transaction_title":"Descrierea tranzacției divizate","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Împarte","single_split":"Împarte","transaction_stored_link":"Tranzacția #{ID} (\\"{title}\\") a fost stocată.","transaction_updated_link":"Tranzacția #{ID} a fost actualizată.","transaction_new_stored_link":"Tranzacția #{ID} a fost stocată.","transaction_journal_information":"Informații despre tranzacții","no_budget_pointer":"Se pare că nu aveți încă bugete. Ar trebui să creați câteva pe pagina bugete. Bugetele vă pot ajuta să țineți evidența cheltuielilor.","no_bill_pointer":"Se pare că nu aveți încă facturi. Ar trebui să creați unele pe pagina facturi. Facturile vă pot ajuta să țineți evidența cheltuielilor.","source_account":"Contul sursă","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Contul de destinație","add_another_split":"Adăugați o divizare","submission":"Transmitere","create_another":"După stocare, reveniți aici pentru a crea alta.","reset_after":"Resetați formularul după trimitere","submit":"Trimite","amount":"Sumă","date":"Dată","tags":"Etichete","no_budget":"(nici un buget)","no_bill":"(no bill)","category":"Categorie","attachments":"Atașamente","notes":"Notițe","external_uri":"External URL","update_transaction":"Actualizați tranzacția","after_update_create_another":"După actualizare, reveniți aici pentru a continua editarea.","store_as_new":"Stocați ca o tranzacție nouă în loc să actualizați.","split_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","none_in_select_list":"(nici unul)","no_piggy_bank":"(nicio pușculiță)","description":"Descriere","split_transaction_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","destination_account_reconciliation":"Nu puteți edita contul de destinație al unei tranzacții de reconciliere.","source_account_reconciliation":"Nu puteți edita contul sursă al unei tranzacții de reconciliere.","budget":"Buget","bill":"Factură","you_create_withdrawal":"Creezi o retragere.","you_create_transfer":"Creezi un transfer.","you_create_deposit":"Creezi un depozit.","edit":"Editează","delete":"Șterge","name":"Nume","profile_whoops":"Hopaa!","profile_something_wrong":"A apărut o eroare!","profile_try_again":"A apărut o problemă. Încercați din nou.","profile_oauth_clients":"Clienți OAuth","profile_oauth_no_clients":"Nu ați creat niciun client OAuth.","profile_oauth_clients_header":"Clienți","profile_oauth_client_id":"ID Client","profile_oauth_client_name":"Nume","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Creare client nou","profile_oauth_create_client":"Creare client","profile_oauth_edit_client":"Editare client","profile_oauth_name_help":"Ceva ce utilizatorii vor recunoaște și vor avea încredere.","profile_oauth_redirect_url":"Redirectioneaza URL","profile_oauth_redirect_url_help":"URL-ul de retroapelare al aplicației dvs.","profile_authorized_apps":"Aplicațiile dvs autorizate","profile_authorized_clients":"Clienți autorizați","profile_scopes":"Domenii","profile_revoke":"Revocați","profile_personal_access_tokens":"Token de acces personal","profile_personal_access_token":"Token de acces personal","profile_personal_access_token_explanation":"Aici este noul dvs. token de acces personal. Este singura dată când va fi afișat așa că nu îl pierde! Acum poți folosi acest token pentru a face cereri API.","profile_no_personal_access_token":"Nu aţi creat nici un token personal de acces.","profile_create_new_token":"Crează un nou token","profile_create_token":"Crează token","profile_create":"Crează","profile_save_changes":"Salvează modificările","default_group_title_name":"(ungrouped)","piggy_bank":"Pușculiță","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Data de interes","book_date":"Rezervă dată","process_date":"Data procesării","due_date":"Data scadentă","foreign_amount":"Sumă străină","payment_date":"Data de plată","invoice_date":"Data facturii","internal_reference":"Referință internă"},"config":{"html_language":"ro"}}')},7448:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Что происходит с моими финансами?","flash_error":"Ошибка!","flash_success":"Успешно!","close":"Закрыть","split_transaction_title":"Описание разделённой транзакции","errors_submission":"При отправке что-то пошло не так. Пожалуйста, проверьте ошибки ниже.","split":"Разделить","single_split":"Разделённая транзакция","transaction_stored_link":"Транзакция #{ID} (\\"{title}\\") сохранена.","transaction_updated_link":"Транзакция #{ID} обновлена.","transaction_new_stored_link":"Транзакция #{ID} сохранена.","transaction_journal_information":"Информация о транзакции","no_budget_pointer":"Похоже, у вас пока нет бюджетов. Вы должны создать их на странице Бюджеты. Бюджеты могут помочь вам отслеживать расходы.","no_bill_pointer":"Похоже, у вас пока нет счетов на оплату. Вы должны создать их на странице Счета на оплату. Счета на оплату могут помочь вам отслеживать расходы.","source_account":"Счёт-источник","hidden_fields_preferences":"Вы можете включить больше параметров транзакции в настройках.","destination_account":"Счёт назначения","add_another_split":"Добавить еще одну часть","submission":"Отправить","create_another":"После сохранения вернуться сюда и создать ещё одну аналогичную запись.","reset_after":"Сбросить форму после отправки","submit":"Подтвердить","amount":"Сумма","date":"Дата","tags":"Метки","no_budget":"(вне бюджета)","no_bill":"(нет счёта на оплату)","category":"Категория","attachments":"Вложения","notes":"Заметки","external_uri":"External URL","update_transaction":"Обновить транзакцию","after_update_create_another":"После обновления вернитесь сюда, чтобы продолжить редактирование.","store_as_new":"Сохранить как новую транзакцию вместо обновления.","split_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание дле всех её составляющих.","none_in_select_list":"(нет)","no_piggy_bank":"(нет копилки)","description":"Описание","split_transaction_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание для всех её составляющих.","destination_account_reconciliation":"Вы не можете редактировать счёт назначения для сверяемой транзакции.","source_account_reconciliation":"Вы не можете редактировать счёт-источник для сверяемой транзакции.","budget":"Бюджет","bill":"Счёт к оплате","you_create_withdrawal":"Вы создаёте расход.","you_create_transfer":"Вы создаёте перевод.","you_create_deposit":"Вы создаёте доход.","edit":"Изменить","delete":"Удалить","name":"Название","profile_whoops":"Ууупс!","profile_something_wrong":"Что-то пошло не так!","profile_try_again":"Произошла ошибка. Пожалуйста, попробуйте снова.","profile_oauth_clients":"Клиенты OAuth","profile_oauth_no_clients":"У вас пока нет клиентов OAuth.","profile_oauth_clients_header":"Клиенты","profile_oauth_client_id":"ID клиента","profile_oauth_client_name":"Название","profile_oauth_client_secret":"Секретный ключ","profile_oauth_create_new_client":"Создать нового клиента","profile_oauth_create_client":"Создать клиента","profile_oauth_edit_client":"Изменить клиента","profile_oauth_name_help":"Что-то, что ваши пользователи знают, и чему доверяют.","profile_oauth_redirect_url":"URL редиректа","profile_oauth_redirect_url_help":"URL обратного вызова для вашего приложения.","profile_authorized_apps":"Авторизованные приложения","profile_authorized_clients":"Авторизованные клиенты","profile_scopes":"Разрешения","profile_revoke":"Отключить","profile_personal_access_tokens":"Персональные Access Tokens","profile_personal_access_token":"Персональный Access Token","profile_personal_access_token_explanation":"Вот ваш новый персональный токен доступа. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот токен, чтобы делать запросы по API.","profile_no_personal_access_token":"Вы не создали ни одного персонального токена доступа.","profile_create_new_token":"Создать новый токен","profile_create_token":"Создать токен","profile_create":"Создать","profile_save_changes":"Сохранить изменения","default_group_title_name":"(без группировки)","piggy_bank":"Копилка","profile_oauth_client_secret_title":"Ключ клиента","profile_oauth_client_secret_expl":"Вот ваш новый ключ клиента. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот ключ, чтобы делать запросы по API.","profile_oauth_confidential":"Конфиденциальный","profile_oauth_confidential_help":"Требовать, чтобы клиент аутентифицировался с секретным ключом. Конфиденциальные клиенты могут хранить учётные данные в надёжном виде, защищая их от несанкционированного доступа. Публичные приложения, такие как обычный рабочий стол или приложения JavaScript SPA, не могут надёжно хранить ваши ключи.","multi_account_warning_unknown":"В зависимости от типа транзакции, которую вы создаёте, счёт-источник и/или счёт назначения следующих частей разделённой транзакции могут быть заменены теми, которые указаны для первой части транзакции.","multi_account_warning_withdrawal":"Имейте в виду, что счёт-источник в других частях разделённой транзакции будет таким же, как в первой части расхода.","multi_account_warning_deposit":"Имейте в виду, что счёт назначения в других частях разделённой транзакции будет таким же, как в первой части дохода.","multi_account_warning_transfer":"Имейте в виду, что счёт-источник и счёт назначения в других частях разделённой транзакции будут такими же, как в первой части перевода."},"form":{"interest_date":"Дата начисления процентов","book_date":"Дата бронирования","process_date":"Дата обработки","due_date":"Срок оплаты","foreign_amount":"Сумма в иностранной валюте","payment_date":"Дата платежа","invoice_date":"Дата выставления счёта","internal_reference":"Внутренняя ссылка"},"config":{"html_language":"ru"}}')},6949:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ako to ide?","flash_error":"Chyba!","flash_success":"Hotovo!","close":"Zavrieť","split_transaction_title":"Popis rozúčtovania","errors_submission":"Pri odosielaní sa niečo nepodarilo. Skontrolujte prosím chyby.","split":"Rozúčtovať","single_split":"Rozúčtovať","transaction_stored_link":"Transakcia #{ID} (\\"{title}\\") bola uložená.","transaction_updated_link":"Transakcia #{ID} bola aktualizovaná.","transaction_new_stored_link":"Transakcia #{ID} bola uložená.","transaction_journal_information":"Informácie o transakcii","no_budget_pointer":"Zdá sa, že zatiaľ nemáte žiadne rozpočty. Na stránke rozpočty by ste si nejaké mali vytvoriť. Rozpočty môžu pomôcť udržať prehľad vo výdavkoch.","no_bill_pointer":"Zdá sa, že zatiaľ nemáte žiadne účty. Na stránke účty by ste mali nejaké vytvoriť. Účty môžu pomôcť udržať si prehľad vo výdavkoch.","source_account":"Zdrojový účet","hidden_fields_preferences":"Viac možností transakcií môžete povoliť vo svojich nastaveniach.","destination_account":"Cieľový účet","add_another_split":"Pridať ďalšie rozúčtovanie","submission":"Odoslanie","create_another":"Po uložení sa vrátiť späť sem a vytvoriť ďalší.","reset_after":"Po odoslaní vynulovať formulár","submit":"Odoslať","amount":"Suma","date":"Dátum","tags":"Štítky","no_budget":"(žiadny rozpočet)","no_bill":"(žiadny účet)","category":"Kategória","attachments":"Prílohy","notes":"Poznámky","external_uri":"Externá URL","update_transaction":"Upraviť transakciu","after_update_create_another":"Po aktualizácii sa vrátiť späť a pokračovať v úpravách.","store_as_new":"Namiesto aktualizácie uložiť ako novú transakciu.","split_title_help":"Ak vytvoríte rozúčtovanie transakcie, je potrebné, aby ste určili všeobecný popis pre všetky rozúčtovania danej transakcie.","none_in_select_list":"(žiadne)","no_piggy_bank":"(žiadna pokladnička)","description":"Popis","split_transaction_title_help":"Ak vytvoríte rozúčtovanú transakciu, musí existovať globálny popis všetkých rozúčtovaní transakcie.","destination_account_reconciliation":"Nemôžete upraviť cieľový účet zúčtovacej transakcie.","source_account_reconciliation":"Nemôžete upraviť zdrojový účet zúčtovacej transakcie.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"Vytvárate výber.","you_create_transfer":"Vytvárate prevod.","you_create_deposit":"Vytvárate vklad.","edit":"Upraviť","delete":"Odstrániť","name":"Názov","profile_whoops":"Ajaj!","profile_something_wrong":"Niečo sa pokazilo!","profile_try_again":"Niečo sa pokazilo. Prosím, skúste znova.","profile_oauth_clients":"OAuth klienti","profile_oauth_no_clients":"Zatiaľ ste nevytvorili žiadneho OAuth klienta.","profile_oauth_clients_header":"Klienti","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Meno/Názov","profile_oauth_client_secret":"Tajný kľúč","profile_oauth_create_new_client":"Vytvoriť nového klienta","profile_oauth_create_client":"Vytvoriť klienta","profile_oauth_edit_client":"Upraviť klienta","profile_oauth_name_help":"Niečo, čo vaši použivatelia poznajú a budú tomu dôverovať.","profile_oauth_redirect_url":"URL presmerovania","profile_oauth_redirect_url_help":"Spätná URL pre overenie autorizácie vašej aplikácie.","profile_authorized_apps":"Povolené aplikácie","profile_authorized_clients":"Autorizovaní klienti","profile_scopes":"Rozsahy","profile_revoke":"Odvolať","profile_personal_access_tokens":"Osobné prístupové tokeny","profile_personal_access_token":"Osobný prístupový token","profile_personal_access_token_explanation":"Toto je váš nový osobný prístupový token. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz ho môžete používať pre prístup k API.","profile_no_personal_access_token":"Ešte ste nevytvorili žiadne osobné prístupové tokeny.","profile_create_new_token":"Vytvoriť nový token","profile_create_token":"Vytvoriť token","profile_create":"Vytvoriť","profile_save_changes":"Uložiť zmeny","default_group_title_name":"(nezoskupené)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Tajný kľúč klienta","profile_oauth_client_secret_expl":"Toto je váš tajný kľúč klienta. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz môžete tento tajný kľúč používať pre prístup k API.","profile_oauth_confidential":"Dôverné","profile_oauth_confidential_help":"Vyžadujte od klienta autentifikáciu pomocou tajného kľúča. Dôverní klienti môžu uchovávať poverenia bezpečným spôsobom bez toho, aby boli vystavení neoprávneným stranám. Verejné aplikácie, ako napríklad natívna pracovná plocha alebo aplikácie Java SPA, nedokážu tajné kľúče bezpečne uchovať.","multi_account_warning_unknown":"V závislosti od typu vytvorenej transakcie, môže byť zdrojový a/alebo cieľový účet následných rozúčtovaní prepísaný údajmi v prvom rozdelení transakcie.","multi_account_warning_withdrawal":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozdelení výberu.","multi_account_warning_deposit":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní vkladu.","multi_account_warning_transfer":"Majte na pamäti, že zdrojový a cieľový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní prevodu."},"form":{"interest_date":"Úrokový dátum","book_date":"Dátum rezervácie","process_date":"Dátum spracovania","due_date":"Dátum splatnosti","foreign_amount":"Suma v cudzej mene","payment_date":"Dátum úhrady","invoice_date":"Dátum vystavenia","internal_reference":"Interná referencia"},"config":{"html_language":"sk"}}')},2285:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Vad spelas?","flash_error":"Fel!","flash_success":"Slutförd!","close":"Stäng","split_transaction_title":"Beskrivning av delad transaktion","errors_submission":"Något fel uppstod med inskickningen. Vänligen kontrollera felen nedan.","split":"Dela","single_split":"Dela","transaction_stored_link":"Transaktion #{ID} (\\"{title}\\") sparades.","transaction_updated_link":"Transaktion #{ID} uppdaterades.","transaction_new_stored_link":"Transaktion #{ID} sparades.","transaction_journal_information":"Transaktionsinformation","no_budget_pointer":"Du verkar inte ha några budgetar än. Du bör skapa några på budgetar-sidan. Budgetar kan hjälpa dig att hålla reda på utgifter.","no_bill_pointer":"Du verkar inte ha några räkningar ännu. Du bör skapa några på räkningar-sidan. Räkningar kan hjälpa dig att hålla reda på utgifter.","source_account":"Källkonto","hidden_fields_preferences":"Du kan aktivera fler transaktionsalternativ i dina inställningar.","destination_account":"Till konto","add_another_split":"Lägga till en annan delning","submission":"Inskickning","create_another":"Efter sparat, återkom hit för att skapa ytterligare en.","reset_after":"Återställ formulär efter inskickat","submit":"Skicka","amount":"Belopp","date":"Datum","tags":"Etiketter","no_budget":"(ingen budget)","no_bill":"(ingen räkning)","category":"Kategori","attachments":"Bilagor","notes":"Noteringar","external_uri":"External URL","update_transaction":"Uppdatera transaktion","after_update_create_another":"Efter uppdaterat, återkom hit för att fortsätta redigera.","store_as_new":"Spara en ny transaktion istället för att uppdatera.","split_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","none_in_select_list":"(Ingen)","no_piggy_bank":"(ingen spargris)","description":"Beskrivning","split_transaction_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","destination_account_reconciliation":"Du kan inte redigera destinationskontot för en avstämningstransaktion.","source_account_reconciliation":"Du kan inte redigera källkontot för en avstämningstransaktion.","budget":"Budget","bill":"Nota","you_create_withdrawal":"Du skapar ett uttag.","you_create_transfer":"Du skapar en överföring.","you_create_deposit":"Du skapar en insättning.","edit":"Redigera","delete":"Ta bort","name":"Namn","profile_whoops":"Hoppsan!","profile_something_wrong":"Något gick fel!","profile_try_again":"Något gick fel. Försök igen.","profile_oauth_clients":"OAuth klienter","profile_oauth_no_clients":"Du har inte skapat några OAuth klienter.","profile_oauth_clients_header":"Klienter","profile_oauth_client_id":"Klient ID","profile_oauth_client_name":"Namn","profile_oauth_client_secret":"Hemlighet","profile_oauth_create_new_client":"Skapa ny klient","profile_oauth_create_client":"Skapa klient","profile_oauth_edit_client":"Redigera klient","profile_oauth_name_help":"Något som dina användare kommer att känna igen och lita på.","profile_oauth_redirect_url":"Omdirigera URL","profile_oauth_redirect_url_help":"Din applikations auktorisering callback URL.","profile_authorized_apps":"Auktoriserade applikationer","profile_authorized_clients":"Auktoriserade klienter","profile_scopes":"Omfattningar","profile_revoke":"Återkalla","profile_personal_access_tokens":"Personliga åtkomst-Tokens","profile_personal_access_token":"Personlig åtkomsttoken","profile_personal_access_token_explanation":"Här är din nya personliga tillgångs token. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna token för att göra API-förfrågningar.","profile_no_personal_access_token":"Du har inte skapat några personliga åtkomsttokens.","profile_create_new_token":"Skapa ny token","profile_create_token":"Skapa token","profile_create":"Skapa","profile_save_changes":"Spara ändringar","default_group_title_name":"(ogrupperad)","piggy_bank":"Spargris","profile_oauth_client_secret_title":"Klienthemlighet","profile_oauth_client_secret_expl":"Här är din nya klient hemlighet. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna hemlighet för att göra API-förfrågningar.","profile_oauth_confidential":"Konfidentiell","profile_oauth_confidential_help":"Kräv att klienten autentiserar med en hemlighet. Konfidentiella klienter kan hålla autentiseringsuppgifter på ett säkert sätt utan att utsätta dem för obehöriga parter. Publika applikationer, som skrivbord eller JavaScript-SPA-applikationer, kan inte hålla hemligheter på ett säkert sätt.","multi_account_warning_unknown":"Beroende på vilken typ av transaktion du skapar, källan och/eller destinationskontot för efterföljande delningar kan åsidosättas av vad som än definieras i den första delningen av transaktionen.","multi_account_warning_withdrawal":"Tänk på att källkontot för efterföljande uppdelningar kommer att upphävas av vad som än definieras i den första uppdelningen av uttaget.","multi_account_warning_deposit":"Tänk på att destinationskontot för efterföljande uppdelningar kommer att styras av vad som än definieras i den första uppdelningen av insättningen.","multi_account_warning_transfer":"Tänk på att käll + destinationskonto av efterföljande delningar kommer att styras av vad som definieras i den första uppdelningen av överföringen."},"form":{"interest_date":"Räntedatum","book_date":"Bokföringsdatum","process_date":"Behandlingsdatum","due_date":"Förfallodatum","foreign_amount":"Utländskt belopp","payment_date":"Betalningsdatum","invoice_date":"Fakturadatum","internal_reference":"Intern referens"},"config":{"html_language":"sv"}}')},9783:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Chào mừng trở lại?","flash_error":"Lỗi!","flash_success":"Thành công!","close":"Đóng","split_transaction_title":"Mô tả giao dịch tách","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Chia ra","single_split":"Split","transaction_stored_link":"Giao dịch #{ID} (\\"{title}\\") đã được lưu trữ.","transaction_updated_link":"Giao dịch#{ID} đã được cập nhật.","transaction_new_stored_link":" Giao dịch #{ID} đã được lưu trữ.","transaction_journal_information":"Thông tin giao dịch","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Nguồn tài khoản","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Tài khoản đích","add_another_split":"Thêm một phân chia khác","submission":"Gửi","create_another":"Sau khi lưu trữ, quay trở lại đây để tạo một cái khác.","reset_after":"Đặt lại mẫu sau khi gửi","submit":"Gửi","amount":"Số tiền","date":"Ngày","tags":"Nhãn","no_budget":"(không có ngân sách)","no_bill":"(no bill)","category":"Danh mục","attachments":"Tệp đính kèm","notes":"Ghi chú","external_uri":"External URL","update_transaction":"Cập nhật giao dịch","after_update_create_another":"Sau khi cập nhật, quay lại đây để tiếp tục chỉnh sửa.","store_as_new":"Lưu trữ như một giao dịch mới thay vì cập nhật.","split_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","none_in_select_list":"(Trống)","no_piggy_bank":"(chưa có heo đất)","description":"Sự miêu tả","split_transaction_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","destination_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản đích của giao dịch đối chiếu.","source_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản nguồn của giao dịch đối chiếu.","budget":"Ngân sách","bill":"Hóa đơn","you_create_withdrawal":"Bạn đang tạo một rút tiền.","you_create_transfer":"Bạn đang tạo một chuyển khoản.","you_create_deposit":"Bạn đang tạo một tiền gửi.","edit":"Sửa","delete":"Xóa","name":"Tên","profile_whoops":"Rất tiếc!","profile_something_wrong":"Có lỗi xảy ra!","profile_try_again":"Xảy ra lỗi. Vui lòng thử lại.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Bạn đã không tạo ra bất kỳ OAuth clients nào.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Tên","profile_oauth_client_secret":"Mã bí mật","profile_oauth_create_new_client":"Tạo mới Client","profile_oauth_create_client":"Tạo Client","profile_oauth_edit_client":"Sửa Client","profile_oauth_name_help":"Một cái gì đó người dùng của bạn sẽ nhận ra và tin tưởng.","profile_oauth_redirect_url":"URL chuyển tiếp","profile_oauth_redirect_url_help":"URL gọi lại ủy quyền của ứng dụng của bạn.","profile_authorized_apps":"Uỷ quyền ứng dụng","profile_authorized_clients":"Client ủy quyền","profile_scopes":"Phạm vi","profile_revoke":"Thu hồi","profile_personal_access_tokens":"Mã truy cập cá nhân","profile_personal_access_token":"Mã truy cập cá nhân","profile_personal_access_token_explanation":"Đây là mã thông báo truy cập cá nhân mới của bạn. Đây là lần duy nhất nó sẽ được hiển thị vì vậy đừng đánh mất nó! Bây giờ bạn có thể sử dụng mã thông báo này để thực hiện API.","profile_no_personal_access_token":"Bạn chưa tạo bất kỳ mã thông báo truy cập cá nhân nào.","profile_create_new_token":"Tạo mã mới","profile_create_token":"Tạo mã","profile_create":"Tạo","profile_save_changes":"Lưu thay đổi","default_group_title_name":"(chưa nhóm)","piggy_bank":"Heo đất","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ngày lãi","book_date":"Ngày đặt sách","process_date":"Ngày xử lý","due_date":"Ngày đáo hạn","foreign_amount":"Ngoại tệ","payment_date":"Ngày thanh toán","invoice_date":"Ngày hóa đơn","internal_reference":"Tài liệu tham khảo nội bộ"},"config":{"html_language":"vi"}}')},1922:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"今天理财了吗?","flash_error":"错误!","flash_success":"成功!","close":"关闭","split_transaction_title":"拆分交易的描述","errors_submission":"您提交的内容有误,请检查错误信息。","split":"拆分","single_split":"拆分","transaction_stored_link":"交易 #{ID} (“{title}”) 已保存。","transaction_updated_link":"交易 #{ID} 已更新。","transaction_new_stored_link":"交易 #{ID} 已保存。","transaction_journal_information":"交易信息","no_budget_pointer":"您还没有预算,您应该在预算页面进行创建。预算可以帮助您追踪支出。","no_bill_pointer":"您还没有账单,您应该在账单页面进行创建。账单可以帮助您追踪支出。","source_account":"来源账户","hidden_fields_preferences":"您可以在偏好设定中启用更多交易选项。","destination_account":"目标账户","add_another_split":"增加另一笔拆分","submission":"提交","create_another":"保存后,返回此页面以创建新记录","reset_after":"提交后重置表单","submit":"提交","amount":"金额","date":"日期","tags":"标签","no_budget":"(无预算)","no_bill":"(无账单)","category":"分类","attachments":"附件","notes":"备注","external_uri":"外部链接","update_transaction":"更新交易","after_update_create_another":"更新后,返回此页面继续编辑。","store_as_new":"保存为新交易而不是更新此交易。","split_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","none_in_select_list":"(空)","no_piggy_bank":"(无存钱罐)","description":"描述","split_transaction_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","destination_account_reconciliation":"您不能编辑对账交易的目标账户","source_account_reconciliation":"您不能编辑对账交易的来源账户。","budget":"预算","bill":"账单","you_create_withdrawal":"您正在创建一笔支出","you_create_transfer":"您正在创建一笔转账","you_create_deposit":"您正在创建一笔收入","edit":"编辑","delete":"删除","name":"名称","profile_whoops":"很抱歉!","profile_something_wrong":"发生错误!","profile_try_again":"发生错误,请稍后再试。","profile_oauth_clients":"OAuth 客户端","profile_oauth_no_clients":"您尚未创建任何 OAuth 客户端。","profile_oauth_clients_header":"客户端","profile_oauth_client_id":"客户端 ID","profile_oauth_client_name":"名称","profile_oauth_client_secret":"密钥","profile_oauth_create_new_client":"创建新客户端","profile_oauth_create_client":"创建客户端","profile_oauth_edit_client":"编辑客户端","profile_oauth_name_help":"您的用户可以识别并信任的信息","profile_oauth_redirect_url":"跳转网址","profile_oauth_redirect_url_help":"您的应用程序的授权回调网址","profile_authorized_apps":"已授权应用","profile_authorized_clients":"已授权客户端","profile_scopes":"范围","profile_revoke":"撤消","profile_personal_access_tokens":"个人访问令牌","profile_personal_access_token":"个人访问令牌","profile_personal_access_token_explanation":"请妥善保存您的新个人访问令牌,此令牌仅会在这里展示一次。您现在已可以使用此令牌进行 API 请求。","profile_no_personal_access_token":"您还没有创建个人访问令牌。","profile_create_new_token":"创建新令牌","profile_create_token":"创建令牌","profile_create":"创建","profile_save_changes":"保存更改","default_group_title_name":"(未分组)","piggy_bank":"存钱罐","profile_oauth_client_secret_title":"客户端密钥","profile_oauth_client_secret_expl":"请妥善保存您的新客户端的密钥,此密钥仅会在这里展示一次。您现在已可以使用此密钥进行 API 请求。","profile_oauth_confidential":"使用加密","profile_oauth_confidential_help":"要求客户端使用密钥进行认证。加密客户端可以安全储存凭据且不将其泄露给未授权方,而公共应用程序(例如本地计算机或 JavaScript SPA 应用程序)无法保证凭据的安全性。","multi_account_warning_unknown":"根据您创建的交易类型,后续拆分的来源和/或目标账户可能被交易的首笔拆分的配置所覆盖。","multi_account_warning_withdrawal":"请注意,后续拆分的来源账户将会被支出的首笔拆分的配置所覆盖。","multi_account_warning_deposit":"请注意,后续拆分的目标账户将会被收入的首笔拆分的配置所覆盖。","multi_account_warning_transfer":"请注意,后续拆分的来源和目标账户将会被转账的首笔拆分的配置所覆盖。"},"form":{"interest_date":"利息日期","book_date":"登记日期","process_date":"处理日期","due_date":"到期日","foreign_amount":"外币金额","payment_date":"付款日期","invoice_date":"发票日期","internal_reference":"内部引用"},"config":{"html_language":"zh-cn"}}')},4963:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"錯誤!","flash_success":"成功!","close":"關閉","split_transaction_title":"拆分交易的描述","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"分割","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"交易資訊","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"增加拆分","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"送出","amount":"金額","date":"日期","tags":"標籤","no_budget":"(無預算)","no_bill":"(no bill)","category":"分類","attachments":"附加檔案","notes":"備註","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"若您建立一筆拆分交易,須有一個有關交易所有拆分的整體描述。","none_in_select_list":"(空)","no_piggy_bank":"(no piggy bank)","description":"描述","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"預算","bill":"帳單","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"編輯","delete":"刪除","name":"名稱","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"小豬撲滿","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"利率日期","book_date":"登記日期","process_date":"處理日期","due_date":"到期日","foreign_amount":"外幣金額","payment_date":"付款日期","invoice_date":"發票日期","internal_reference":"內部參考"},"config":{"html_language":"zh-tw"}}')}},t={};function n(a){var i=t[a];if(void 0!==i)return i.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(e,t,n,a,i,o,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),a&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):i&&(l=s?function(){i.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:i),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var d=c.beforeCreate;c.beforeCreate=d?[].concat(d,l):[l]}return{exports:e,options:c}}const t=e({name:"CustomAttachments",props:{title:String,name:String,error:Array},mounted:function(){var e=this;window.addEventListener("paste",(function(t){e.$refs.input.files=t.clipboardData.files}))},methods:{clearAtt:function(){this.$refs.input.value=""},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",multiple:"multiple",type:"file"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearAtt}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const a=e({name:"CreateTransaction",components:{},created:function(){var e=this;this.addTransactionToArray(),document.onreadystatechange=function(){"complete"===document.readyState&&(e.prefillSourceAccount(),e.prefillDestinationAccount())}},methods:{prefillSourceAccount:function(){0!==window.sourceId&&this.getAccount(window.sourceId,"source_account")},prefillDestinationAccount:function(){0!==destinationId&&this.getAccount(window.destinationId,"destination_account")},getAccount:function(e,t){var n=this,a="./api/v1/accounts/"+e+"?_token="+document.head.querySelector('meta[name="csrf-token"]').content;axios.get(a).then((function(e){var a=e.data.data.attributes;a.type=n.fullAccountType(a.type,a.liability_type),a.id=parseInt(e.data.data.id),"source_account"===t&&n.selectedSourceAccount(0,a),"destination_account"===t&&n.selectedDestinationAccount(0,a)})).catch((function(e){console.warn("Could not auto fill account"),console.warn(e)}))},fullAccountType:function(e,t){var n,a=e;"liabilities"===e&&(a=t);return null!==(n={asset:"Asset account",loan:"Loan",debt:"Debt",mortgage:"Mortgage"}[a])&&void 0!==n?n:a},convertData:function(){var e,t,n,a={transactions:[]};for(var i in this.transactions.length>1&&(a.group_title=this.group_title),e=this.transactionType?this.transactionType.toLowerCase():"invalid",t=this.transactions[0].source_account.type,n=this.transactions[0].destination_account.type,"invalid"===e&&["asset","Asset account","Loan","Debt","Mortgage"].includes(t)&&(e="withdrawal"),"invalid"===e&&["asset","Asset account","Loan","Debt","Mortgage"].includes(n)&&(e="deposit"),this.transactions)this.transactions.hasOwnProperty(i)&&/^0$|^[1-9]\d*$/.test(i)&&i<=4294967294&&a.transactions.push(this.convertDataRow(this.transactions[i],i,e));return""===a.group_title&&a.transactions.length>1&&(a.group_title=a.transactions[0].description),a},convertDataRow:function(e,t,n){var a,i,o,r,s,l,c=[],u=null,d=null;for(var p in i=e.source_account.id,o=e.source_account.name,r=e.destination_account.id,s=e.destination_account.name,l=e.date,t>0&&(l=this.transactions[0].date),"withdrawal"===n&&""===s&&(r=window.cashAccountId),"deposit"===n&&""===o&&(i=window.cashAccountId),t>0&&("withdrawal"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(i=this.transactions[0].source_account.id,o=this.transactions[0].source_account.name),t>0&&("deposit"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(r=this.transactions[0].destination_account.id,s=this.transactions[0].destination_account.name),c=[],u=null,d=null,e.tags)e.tags.hasOwnProperty(p)&&/^0$|^[1-9]\d*$/.test(p)&&p<=4294967294&&c.push(e.tags[p].text);return""!==e.foreign_amount.amount&&0!==parseFloat(e.foreign_amount.amount)&&(u=e.foreign_amount.amount,d=e.foreign_amount.currency_id),d===e.currency_id&&(u=null,d=null),0===r&&(r=null),0===i&&(i=null),1===(e.amount.match(/\,/g)||[]).length&&(e.amount=e.amount.replace(",",".")),a={type:n,date:l,amount:e.amount,currency_id:e.currency_id,description:e.description,source_id:i,source_name:o,destination_id:r,destination_name:s,category_name:e.category,interest_date:e.custom_fields.interest_date,book_date:e.custom_fields.book_date,process_date:e.custom_fields.process_date,due_date:e.custom_fields.due_date,payment_date:e.custom_fields.payment_date,invoice_date:e.custom_fields.invoice_date,internal_reference:e.custom_fields.internal_reference,notes:e.custom_fields.notes},c.length>0&&(a.tags=c),null!==u&&(a.foreign_amount=u,a.foreign_currency_id=d),parseInt(e.budget)>0&&(a.budget_id=parseInt(e.budget)),parseInt(e.bill)>0&&(a.bill_id=parseInt(e.bill)),parseInt(e.piggy_bank)>0&&(a.piggy_bank_id=parseInt(e.piggy_bank)),a},submit:function(e){var t=this,n="./api/v1/transactions?_token="+document.head.querySelector('meta[name="csrf-token"]').content,a=this.convertData(),i=$("#submitButton");i.prop("disabled",!0),axios.post(n,a).then((function(e){0===t.collectAttachmentData(e)&&t.redirectUser(e.data.data.id,e.data.data)})).catch((function(e){console.error("Error in transaction submission."),console.error(e),t.parseErrors(e.response.data),i.removeAttr("disabled")})),e&&e.preventDefault()},escapeHTML:function(e){var t=document.createElement("div");return t.innerText=e,t.innerHTML},redirectUser:function(e,t){var n=this,a=null===t.attributes.group_title?t.attributes.transactions[0].description:t.attributes.group_title;this.createAnother?(this.success_message=this.$t("firefly.transaction_stored_link",{ID:e,title:a}),this.error_message="",this.resetFormAfter&&(this.resetTransactions(),setTimeout((function(){return n.addTransactionToArray()}),50)),this.setDefaultErrors(),$("#submitButton").removeAttr("disabled")):window.location.href=window.previousUri+"?transaction_group_id="+e+"&message=created"},collectAttachmentData:function(e){var t=this,n=e.data.data.id;e.data.data.attributes.transactions=e.data.data.attributes.transactions.reverse();var a=[],i=[],o=$('input[name="attachments[]"]');for(var r in o)if(o.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294)for(var s in o[r].files)o[r].files.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294&&a.push({journal:e.data.data.attributes.transactions[r].transaction_journal_id,file:o[r].files[s]});var l=a.length,c=function(o){var r,s,c;a.hasOwnProperty(o)&&/^0$|^[1-9]\d*$/.test(o)&&o<=4294967294&&(r=a[o],s=t,(c=new FileReader).onloadend=function(t){t.target.readyState===FileReader.DONE&&(i.push({name:a[o].file.name,journal:a[o].journal,content:new Blob([t.target.result])}),i.length===l&&s.uploadFiles(i,n,e.data.data))},c.readAsArrayBuffer(r.file))};for(var u in a)c(u);return l},uploadFiles:function(e,t,n){var a=this,i=e.length,o=0,r=function(r){if(e.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294){var s={filename:e[r].name,attachable_type:"TransactionJournal",attachable_id:e[r].journal};axios.post("./api/v1/attachments",s).then((function(s){var l="./api/v1/attachments/"+s.data.data.id+"/upload";axios.post(l,e[r].content).then((function(e){return++o===i&&a.redirectUser(t,n),!0})).catch((function(e){return console.error("Could not upload"),console.error(e),++o===i&&a.redirectUser(t,n),!1}))})).catch((function(e){return console.error("Could not create upload."),console.error(e),++o===i&&a.redirectUser(t,n),!1}))}};for(var s in e)r(s)},setDefaultErrors:function(){for(var e in this.transactions)this.transactions.hasOwnProperty(e)&&/^0$|^[1-9]\d*$/.test(e)&&e<=4294967294&&(this.transactions[e].errors={source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}})},parseErrors:function(e){var t,n;for(var a in this.setDefaultErrors(),this.error_message="",void 0===e.errors?(this.success_message="",this.error_message=e.message):(this.success_message="",this.error_message=this.$t("firefly.errors_submission")),e.errors)if(e.errors.hasOwnProperty(a)){if("group_title"===a&&(this.group_title_errors=e.errors[a]),"group_title"!==a)switch(t=parseInt(a.split(".")[1]),n=a.split(".")[2]){case"amount":case"date":case"budget_id":case"bill_id":case"description":case"tags":this.transactions[t].errors[n]=e.errors[a];break;case"source_name":case"source_id":this.transactions[t].errors.source_account=this.transactions[t].errors.source_account.concat(e.errors[a]);break;case"destination_name":case"destination_id":this.transactions[t].errors.destination_account=this.transactions[t].errors.destination_account.concat(e.errors[a]);break;case"foreign_amount":case"foreign_currency_id":this.transactions[t].errors.foreign_amount=this.transactions[t].errors.foreign_amount.concat(e.errors[a])}void 0!==this.transactions[t]&&(this.transactions[t].errors.source_account=Array.from(new Set(this.transactions[t].errors.source_account)),this.transactions[t].errors.destination_account=Array.from(new Set(this.transactions[t].errors.destination_account)))}},resetTransactions:function(){this.transactions=[],this.group_title=""},addTransactionToArray:function(e){if(this.transactions.push({description:"",date:"",amount:"",category:"",piggy_bank:0,errors:{source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}},budget:0,bill:0,tags:[],custom_fields:{interest_date:"",book_date:"",process_date:"",due_date:"",payment_date:"",invoice_date:"",internal_reference:"",notes:"",attachments:[],external_uri:""},foreign_amount:{amount:"",currency_id:0},source_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:["Asset account","Revenue account","Loan","Debt","Mortgage"],default_allowed_types:["Asset account","Revenue account","Loan","Debt","Mortgage"]},destination_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:["Asset account","Expense account","Loan","Debt","Mortgage"],default_allowed_types:["Asset account","Expense account","Loan","Debt","Mortgage"]}}),1===this.transactions.length){var t=new Date;this.transactions[0].date=t.getFullYear()+"-"+("0"+(t.getMonth()+1)).slice(-2)+"-"+("0"+t.getDate()).slice(-2)}e&&e.preventDefault()},setTransactionType:function(e){this.transactionType=e},deleteTransaction:function(e,t){t.preventDefault(),this.transactions.splice(e,1)},limitSourceType:function(e){var t;for(t=0;t1?n("span",[e._v(e._s(e.$t("firefly.single_split"))+" "+e._s(a+1)+" / "+e._s(e.transactions.length))]):e._e(),e._v(" "),1===e.transactions.length?n("span",[e._v(e._s(e.$t("firefly.transaction_journal_information")))]):e._e()]),e._v(" "),e.transactions.length>1?n("div",{staticClass:"box-tools pull-right"},[n("button",{staticClass:"btn btn-xs btn-danger",attrs:{type:"button"},on:{click:function(t){return e.deleteTransaction(a,t)}}},[n("i",{staticClass:"fa fa-trash"})])]):e._e()]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-4",attrs:{id:"transaction-info"}},[n("transaction-description",{attrs:{error:t.errors.description,index:a},model:{value:t.description,callback:function(n){e.$set(t,"description",n)},expression:"transaction.description"}}),e._v(" "),n("account-select",{attrs:{accountName:t.source_account.name,accountTypeFilters:t.source_account.allowed_types,defaultAccountTypeFilters:t.source_account.default_allowed_types,error:t.errors.source_account,index:a,transactionType:e.transactionType,inputName:"source[]",inputDescription:e.$t("firefly.source_account")},on:{"clear:value":function(t){return e.clearSource(a)},"select:account":function(t){return e.selectedSourceAccount(a,t)}}}),e._v(" "),n("account-select",{attrs:{accountName:t.destination_account.name,accountTypeFilters:t.destination_account.allowed_types,defaultAccountTypeFilters:t.destination_account.default_allowed_types,error:t.errors.destination_account,index:a,transactionType:e.transactionType,inputName:"destination[]",inputDescription:e.$t("firefly.destination_account")},on:{"clear:value":function(t){return e.clearDestination(a)},"select:account":function(t){return e.selectedDestinationAccount(a,t)}}}),e._v(" "),0===a||null!==e.transactionType&&"invalid"!==e.transactionType&&""!==e.transactionType?e._e():n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_unknown"))+"\n ")]),e._v(" "),0!==a&&"Withdrawal"===e.transactionType?n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_withdrawal"))+"\n ")]):e._e(),e._v(" "),0!==a&&"Deposit"===e.transactionType?n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_deposit"))+"\n ")]):e._e(),e._v(" "),0!==a&&"Transfer"===e.transactionType?n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_transfer"))+"\n ")]):e._e(),e._v(" "),0===a?n("standard-date",{attrs:{error:t.errors.date,index:a},model:{value:t.date,callback:function(n){e.$set(t,"date",n)},expression:"transaction.date"}}):e._e(),e._v(" "),0===a?n("div",[n("transaction-type",{attrs:{destination:t.destination_account.type,source:t.source_account.type},on:{"set:transactionType":function(t){return e.setTransactionType(t)},"act:limitSourceType":function(t){return e.limitSourceType(t)},"act:limitDestinationType":function(t){return e.limitDestinationType(t)}}})],1):e._e()],1),e._v(" "),n("div",{staticClass:"col-lg-4",attrs:{id:"amount-info"}},[n("amount",{attrs:{destination:t.destination_account,error:t.errors.amount,source:t.source_account,transactionType:e.transactionType},model:{value:t.amount,callback:function(n){e.$set(t,"amount",n)},expression:"transaction.amount"}}),e._v(" "),n("foreign-amount",{attrs:{destination:t.destination_account,error:t.errors.foreign_amount,source:t.source_account,transactionType:e.transactionType,title:e.$t("form.foreign_amount")},model:{value:t.foreign_amount,callback:function(n){e.$set(t,"foreign_amount",n)},expression:"transaction.foreign_amount"}})],1),e._v(" "),n("div",{staticClass:"col-lg-4",attrs:{id:"optional-info"}},[n("budget",{attrs:{error:t.errors.budget_id,no_budget:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.budget,callback:function(n){e.$set(t,"budget",n)},expression:"transaction.budget"}}),e._v(" "),n("category",{attrs:{error:t.errors.category,transactionType:e.transactionType},model:{value:t.category,callback:function(n){e.$set(t,"category",n)},expression:"transaction.category"}}),e._v(" "),n("piggy-bank",{attrs:{error:t.errors.piggy_bank,no_piggy_bank:e.$t("firefly.no_piggy_bank"),transactionType:e.transactionType},model:{value:t.piggy_bank,callback:function(n){e.$set(t,"piggy_bank",n)},expression:"transaction.piggy_bank"}}),e._v(" "),n("tags",{attrs:{error:t.errors.tags},model:{value:t.tags,callback:function(n){e.$set(t,"tags",n)},expression:"transaction.tags"}}),e._v(" "),n("bill",{attrs:{error:t.errors.bill_id,no_bill:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.bill,callback:function(n){e.$set(t,"bill",n)},expression:"transaction.bill"}}),e._v(" "),n("custom-transaction-fields",{attrs:{error:t.errors.custom_errors},model:{value:t.custom_fields,callback:function(n){e.$set(t,"custom_fields",n)},expression:"transaction.custom_fields"}})],1)])]),e._v(" "),e.transactions.length-1===a?n("div",{staticClass:"box-footer"},[n("button",{staticClass:"split_add_btn btn btn-default",attrs:{type:"button"},on:{click:e.addTransactionToArray}},[e._v("\n "+e._s(e.$t("firefly.add_another_split"))+"\n ")])]):e._e()])])])})),0),e._v(" "),e.transactions.length>1?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("group-description",{attrs:{error:e.group_title_errors},model:{value:e.group_title,callback:function(t){e.group_title=t},expression:"group_title"}})],1)])])]):e._e(),e._v(" "),n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.submission"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"checkbox"},[n("label",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.createAnother,expression:"createAnother"}],attrs:{name:"create_another",type:"checkbox"},domProps:{checked:Array.isArray(e.createAnother)?e._i(e.createAnother,null)>-1:e.createAnother},on:{change:function(t){var n=e.createAnother,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.createAnother=n.concat([null])):o>-1&&(e.createAnother=n.slice(0,o).concat(n.slice(o+1)))}else e.createAnother=i}}}),e._v("\n "+e._s(e.$t("firefly.create_another"))+"\n ")])]),e._v(" "),n("div",{staticClass:"checkbox"},[n("label",{class:{"text-muted":!1===this.createAnother}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.resetFormAfter,expression:"resetFormAfter"}],attrs:{disabled:!1===this.createAnother,name:"reset_form",type:"checkbox"},domProps:{checked:Array.isArray(e.resetFormAfter)?e._i(e.resetFormAfter,null)>-1:e.resetFormAfter},on:{change:function(t){var n=e.resetFormAfter,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.resetFormAfter=n.concat([null])):o>-1&&(e.resetFormAfter=n.slice(0,o).concat(n.slice(o+1)))}else e.resetFormAfter=i}}}),e._v("\n "+e._s(e.$t("firefly.reset_after"))+"\n\n ")])])]),e._v(" "),n("div",{staticClass:"box-footer"},[n("div",{staticClass:"btn-group"},[n("button",{staticClass:"btn btn-success",attrs:{id:"submitButton"},on:{click:e.submit}},[e._v(e._s(e.$t("firefly.submit")))])]),e._v(" "),n("p",{staticClass:"text-success",domProps:{innerHTML:e._s(e.success_message)}}),e._v(" "),n("p",{staticClass:"text-danger",domProps:{innerHTML:e._s(e.error_message)}})])])])])])}),[],!1,null,null,null).exports;const i=e({name:"CustomDate",props:{value:String,title:String,name:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.date.value)},hasError:function(){return this.error.length>0},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"date"},domProps:{value:e.value?e.value.substr(0,10):""},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const o=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},clearField:function(){this.name="",this.$refs.str.value="",this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"text"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const r=e({name:"CustomTextarea",props:{title:String,name:String,value:String,error:Array},data:function(){return{textValue:this.value}},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.textValue,expression:"textValue"}],ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",rows:"8"},domProps:{value:e.textValue},on:{input:[function(t){t.target.composing||(e.textValue=t.target.value)},e.handleInput]}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const s=e({props:["error","value","index"],name:"StandardDate",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.date.value)},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value),this.$emit("clear:date")}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.date"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{disabled:e.index>0,autocomplete:"off",name:"date[]",type:"date",placeholder:e.$t("firefly.date"),title:e.$t("firefly.date")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const l=e({props:["error","value","index"],name:"GroupDescription",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},clearField:function(){this.name="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{autocomplete:"off",name:"group_title",type:"text",placeholder:e.$t("firefly.split_transaction_title"),title:e.$t("firefly.split_transaction_title")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),0===e.error.length?n("p",{staticClass:"help-block"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title_help"))+"\n ")]):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const c=e({props:["error","value","index"],name:"TransactionDescription",mounted:function(){this.target=this.$refs.descr,this.descriptionAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/transactions?query=",this.$refs.descr.focus()},components:{},data:function(){return{descriptionAutoCompleteURI:null,name:null,description:null,target:null}},methods:{aSyncFunction:function(e,t){axios.get(this.descriptionAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.descr.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.description).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},search:function(e){return["ab","cd"]},hasError:function(){return this.error.length>0},clearDescription:function(){this.description="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value),this.$emit("clear:description")},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},handleEnter:function(e){e.keyCode},selectedItem:function(e){void 0!==this.name&&"string"!=typeof this.name&&(this.$refs.descr.value=this.name.description,this.$emit("input",this.$refs.descr.value))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.description"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{title:e.$t("firefly.description"),autocomplete:"off",name:"description[]",type:"text",placeholder:e.$t("firefly.description")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDescription}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"description"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const u=e({name:"CustomTransactionFields",props:["value","error"],mounted:function(){this.getPreference()},data:function(){return{customInterestDate:null,fields:[{interest_date:!1,book_date:!1,process_date:!1,due_date:!1,payment_date:!1,invoice_date:!1,internal_reference:!1,notes:!1,attachments:!1,external_uri:!1}]}},computed:{dateComponent:function(){return"custom-date"},stringComponent:function(){return"custom-string"},attachmentComponent:function(){return"custom-attachments"},textareaComponent:function(){return"custom-textarea"},uriComponent:function(){return"custom-uri"}},methods:{handleInput:function(e){this.$emit("input",this.value)},getPreference:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/preferences/transaction_journal_optional_fields";axios.get(t).then((function(t){e.fields=t.data.data.attributes.data})).catch((function(){return console.warn("Oh. Something went wrong loading custom transaction fields.")}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.hidden_fields_preferences"))}}),e._v(" "),this.fields.interest_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.interest_date,name:"interest_date[]",title:e.$t("form.interest_date")},model:{value:e.value.interest_date,callback:function(t){e.$set(e.value,"interest_date",t)},expression:"value.interest_date"}}):e._e(),e._v(" "),this.fields.book_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.book_date,name:"book_date[]",title:e.$t("form.book_date")},model:{value:e.value.book_date,callback:function(t){e.$set(e.value,"book_date",t)},expression:"value.book_date"}}):e._e(),e._v(" "),this.fields.process_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.process_date,name:"process_date[]",title:e.$t("form.process_date")},model:{value:e.value.process_date,callback:function(t){e.$set(e.value,"process_date",t)},expression:"value.process_date"}}):e._e(),e._v(" "),this.fields.due_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.due_date,name:"due_date[]",title:e.$t("form.due_date")},model:{value:e.value.due_date,callback:function(t){e.$set(e.value,"due_date",t)},expression:"value.due_date"}}):e._e(),e._v(" "),this.fields.payment_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.payment_date,name:"payment_date[]",title:e.$t("form.payment_date")},model:{value:e.value.payment_date,callback:function(t){e.$set(e.value,"payment_date",t)},expression:"value.payment_date"}}):e._e(),e._v(" "),this.fields.invoice_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.invoice_date,name:"invoice_date[]",title:e.$t("form.invoice_date")},model:{value:e.value.invoice_date,callback:function(t){e.$set(e.value,"invoice_date",t)},expression:"value.invoice_date"}}):e._e(),e._v(" "),this.fields.internal_reference?n(e.stringComponent,{tag:"component",attrs:{error:e.error.internal_reference,name:"internal_reference[]",title:e.$t("form.internal_reference")},model:{value:e.value.internal_reference,callback:function(t){e.$set(e.value,"internal_reference",t)},expression:"value.internal_reference"}}):e._e(),e._v(" "),this.fields.attachments?n(e.attachmentComponent,{tag:"component",attrs:{error:e.error.attachments,name:"attachments[]",title:e.$t("firefly.attachments")},model:{value:e.value.attachments,callback:function(t){e.$set(e.value,"attachments",t)},expression:"value.attachments"}}):e._e(),e._v(" "),this.fields.external_uri?n(e.uriComponent,{tag:"component",attrs:{error:e.error.external_uri,name:"external_uri[]",title:e.$t("firefly.external_uri")},model:{value:e.value.external_uri,callback:function(t){e.$set(e.value,"external_uri",t)},expression:"value.external_uri"}}):e._e(),e._v(" "),this.fields.notes?n(e.textareaComponent,{tag:"component",attrs:{error:e.error.notes,name:"notes[]",title:e.$t("firefly.notes")},model:{value:e.value.notes,callback:function(t){e.$set(e.value,"notes",t)},expression:"value.notes"}}):e._e()],1)}),[],!1,null,null,null).exports;const d=e({name:"PiggyBank",props:["value","transactionType","error","no_piggy_bank"],mounted:function(){this.loadPiggies()},data:function(){return{piggies:[]}},methods:{handleInput:function(e){this.$emit("input",this.$refs.piggy.value)},hasError:function(){return this.error.length>0},loadPiggies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/piggy-banks-with-balance?limit=1337";axios.get(t,{}).then((function(t){var n={0:{group:{title:e.$t("firefly.default_group_title_name")},piggies:[{name_with_balance:e.no_piggy_bank,id:0}]}};for(var a in t.data)if(t.data.hasOwnProperty(a)&&/^0$|^[1-9]\d*$/.test(a)&&a<=4294967294){var i=t.data[a];if(i.objectGroup){var o=i.objectGroup.order;n[o]||(n[o]={group:{title:i.objectGroup.title},piggies:[]}),n[o].piggies.push({name_with_balance:i.name_with_balance,id:i.id})}i.objectGroup||n[0].piggies.push({name_with_balance:i.name_with_balance,id:i.id}),e.piggies.push(t.data[a])}var r={};Object.keys(n).sort().forEach((function(e){var t=n[e].group.title;r[t]=n[e]})),e.piggies=r}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0!==this.transactionType&&"Transfer"===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.piggy_bank"))+"\n\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("select",{ref:"piggy",staticClass:"form-control",attrs:{name:"piggy_bank[]"},on:{input:e.handleInput}},e._l(this.piggies,(function(t,a){return n("optgroup",{attrs:{label:a}},e._l(t.piggies,(function(t){return n("option",{attrs:{label:t.name_with_balance},domProps:{value:t.id}},[e._v("\n "+e._s(t.name_with_balance)+"\n ")])})),0)})),0),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;var p=n(9669),_=n.n(p),f=n(7010);const h=e({name:"Tags",components:{VueTagsInput:n.n(f)()},props:["value","error"],data:function(){return{tag:"",autocompleteItems:[],debounce:null,tags:this.value}},watch:{tag:"initItems"},methods:{update:function(e){this.autocompleteItems=[],this.tags=e,this.$emit("input",this.tags)},clearTags:function(){this.tags=[]},hasError:function(){return this.error.length>0},initItems:function(){var e=this;if(!(this.tag.length<2)){var t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/tags?query=".concat(this.tag);clearTimeout(this.debounce),this.debounce=setTimeout((function(){_().get(t).then((function(t){e.autocompleteItems=t.data.map((function(e){return{text:e.tag}}))})).catch((function(){return console.warn("Oh. Something went wrong loading tags.")}))}),600)}}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.tags"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("vue-tags-input",{attrs:{"add-only-from-autocomplete":!1,"autocomplete-items":e.autocompleteItems,tags:e.tags,title:e.$t("firefly.tags"),classes:"form-input",placeholder:e.$t("firefly.tags")},on:{"tags-changed":e.update},model:{value:e.tag,callback:function(t){e.tag=t},expression:"tag"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearTags}},[n("i",{staticClass:"fa fa-trash-o"})])])],1)]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const A=e({name:"Category",props:{value:String,inputName:String,error:Array,accountName:{type:String,default:""}},data:function(){return{categoryAutoCompleteURI:null,name:null,target:null,acKey:null}},ready:function(){this.name=this.accountName,this.acKey="name"},mounted:function(){this.target=this.$refs.input,this.categoryAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/categories?query="},methods:{hasError:function(){return this.error.length>0},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name).replace(new RegExp(""+t,"i"),"$&")},aSyncFunction:function(e,t){axios.get(this.categoryAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},handleInput:function(e){"string"!=typeof this.$refs.input.value?this.$emit("input",this.$refs.input.value.name):this.$emit("input",this.$refs.input.value)},clearCategory:function(){this.name="",this.$refs.input.value="",this.$emit("input",this.$refs.input.value),this.$emit("clear:category")},selectedItem:function(e){void 0!==this.name&&(this.$emit("select:category",this.name),"string"!=typeof this.name?this.$emit("input",this.name.name):this.$emit("input",this.name))},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.category"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{autocomplete:"off","data-role":"input",name:"category[]",type:"text",placeholder:e.$t("firefly.category"),title:e.$t("firefly.category")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearCategory}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{ref:"typea",attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const g=e({name:"Amount",props:["source","destination","transactionType","value","error"],data:function(){return{sourceAccount:this.source,destinationAccount:this.destination,type:this.transactionType}},methods:{handleInput:function(e){this.$emit("input",this.$refs.amount.value)},clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},changeData:function(){var e=this.transactionType;e||this.source.name||this.destination.name?(null===e&&(e=""),""!==e||""===this.source.currency_name?""!==e||""===this.destination.currency_name?"withdrawal"!==e.toLowerCase()&&"reconciliation"!==e.toLowerCase()&&"transfer"!==e.toLowerCase()?("deposit"===e.toLowerCase()&&"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()&&$(this.$refs.cur).text(this.destination.currency_name),"deposit"!==e.toLowerCase()||"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()||$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text(this.source.currency_name):$(this.$refs.cur).text(this.destination.currency_name):$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text("")}},watch:{source:function(){this.changeData()},value:function(){},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},mounted:function(){this.changeData()}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("firefly.amount"))+"\n ")]),e._v(" "),n("label",{ref:"cur",staticClass:"col-sm-4 control-label"}),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[n("input",{ref:"amount",staticClass:"form-control",attrs:{title:e.$t("firefly.amount"),autocomplete:"off",name:"amount[]",step:"any",type:"number",placeholder:e.$t("firefly.amount")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const m=e({name:"ForeignAmountSelect",props:["source","destination","transactionType","value","error","no_currency","title"],mounted:function(){this.liability=!1,this.loadCurrencies()},data:function(){return{currencies:[],enabledCurrencies:[],exclude:null,liability:!1}},watch:{source:function(){this.changeData()},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},methods:{clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},handleInput:function(e){var t={amount:this.$refs.amount.value,currency_id:this.$refs.currency_select.value};this.$emit("input",t)},changeData:function(){this.enabledCurrencies=[];var e=this.destination.type?this.destination.type.toLowerCase():"invalid",t=this.source.type?this.source.type.toLowerCase():"invalid",n=this.transactionType?this.transactionType.toLowerCase():"invalid",a=["loan","debt","mortgage"],i=-1!==a.indexOf(t),o=-1!==a.indexOf(e);if("transfer"===n||o||i)for(var r in this.liability=!0,this.currencies)this.currencies.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294&&parseInt(this.currencies[r].id)===parseInt(this.destination.currency_id)&&this.enabledCurrencies.push(this.currencies[r]);else if("withdrawal"===n&&this.source&&!1===i)for(var s in this.currencies)this.currencies.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294&&this.source.currency_id!==this.currencies[s].id&&this.enabledCurrencies.push(this.currencies[s]);else if("deposit"===n&&this.destination)for(var l in this.currencies)this.currencies.hasOwnProperty(l)&&/^0$|^[1-9]\d*$/.test(l)&&l<=4294967294&&this.destination.currency_id!==this.currencies[l].id&&this.enabledCurrencies.push(this.currencies[l]);else for(var c in this.currencies)this.currencies.hasOwnProperty(c)&&/^0$|^[1-9]\d*$/.test(c)&&c<=4294967294&&this.enabledCurrencies.push(this.currencies[c])},loadCurrencies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/currencies";axios.get(t,{}).then((function(t){for(var n in e.currencies=[{id:0,attributes:{name:e.no_currency,enabled:!0}}],e.enabledCurrencies=[{attributes:{name:e.no_currency,enabled:!0},id:0}],t.data.data)t.data.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&t.data.data[n].attributes.enabled&&(e.currencies.push(t.data.data[n]),e.enabledCurrencies.push(t.data.data[n]))}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return this.enabledCurrencies.length>=1?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("form.foreign_amount"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-4"},[n("select",{ref:"currency_select",staticClass:"form-control",attrs:{name:"foreign_currency[]"},on:{input:e.handleInput}},e._l(this.enabledCurrencies,(function(t){return n("option",{attrs:{label:t.attributes.name},domProps:{selected:parseInt(e.value.currency_id)===parseInt(t.id),value:t.id}},[e._v("\n "+e._s(t.attributes.name)+"\n ")])})),0)]),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[this.enabledCurrencies.length>0?n("input",{ref:"amount",staticClass:"form-control",attrs:{placeholder:this.title,title:this.title,autocomplete:"off",name:"foreign_amount[]",step:"any",type:"number"},domProps:{value:e.value.amount},on:{input:e.handleInput}}):e._e(),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const v=e({props:{source:String,destination:String,type:String},methods:{changeValue:function(){if(this.source&&this.destination){var e="";window.accountToTypes[this.source]?window.accountToTypes[this.source][this.destination]?e=window.accountToTypes[this.source][this.destination]:console.warn("User selected an impossible destination."):console.warn("User selected an impossible source."),""!==e&&(this.transactionType=e,this.sentence=this.$t("firefly.you_create_"+e.toLowerCase()),this.$emit("act:limitSourceType",this.source),this.$emit("act:limitDestinationType",this.destination))}else this.sentence="",this.transactionType="";this.$emit("set:transactionType",this.transactionType)}},data:function(){return{transactionType:this.type,sentence:""}},watch:{source:function(){this.changeValue()},destination:function(){this.changeValue()}},name:"TransactionType"},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[""!==e.sentence?n("label",{staticClass:"control-label text-info"},[e._v("\n "+e._s(e.sentence)+"\n ")]):e._e()])])}),[],!1,null,null,null).exports;const b=e({props:{inputName:String,inputDescription:String,index:Number,transactionType:String,error:Array,accountName:{type:String,default:""},accountTypeFilters:{type:Array,default:function(){return[]}},defaultAccountTypeFilters:{type:Array,default:function(){return[]}}},data:function(){return{accountAutoCompleteURI:null,name:null,trType:this.transactionType,target:null,inputDisabled:!1,allowedTypes:this.accountTypeFilters,defaultAllowedTypes:this.defaultAccountTypeFilters}},ready:function(){this.name=this.accountName},mounted:function(){this.target=this.$refs.input,this.updateACURI(this.allowedTypes.join(",")),this.name=this.accountName,this.triggerTransactionType()},watch:{transactionType:function(){this.triggerTransactionType()},accountName:function(){this.name=this.accountName},accountTypeFilters:function(){var e=this.accountTypeFilters.join(",");0===this.accountTypeFilters.length&&(e=this.defaultAccountTypeFilters.join(",")),this.updateACURI(e)}},methods:{aSyncFunction:function(e,t){axios.get(this.accountAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name_with_balance).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},updateACURI:function(e){this.accountAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/accounts?types="+e+"&query="},hasError:function(){return this.error.length>0},triggerTransactionType:function(){if(this.name,null!==this.transactionType&&""!==this.transactionType&&(this.inputDisabled=!1,""!==this.transactionType.toString()&&this.index>0)){if("transfer"===this.transactionType.toString().toLowerCase())return void(this.inputDisabled=!0);if("withdrawal"===this.transactionType.toString().toLowerCase()&&"source"===this.inputName.substr(0,6).toLowerCase())return void(this.inputDisabled=!0);"deposit"===this.transactionType.toString().toLowerCase()&&"destination"===this.inputName.substr(0,11).toLowerCase()&&(this.inputDisabled=!0)}},selectedItem:function(e){void 0!==this.name&&("string"==typeof this.name&&this.$emit("clear:value"),this.$emit("select:account",this.name))},clearSource:function(e){this.name="",this.$emit("clear:value")},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.inputDescription)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{"data-index":e.index,disabled:e.inputDisabled,name:e.inputName,placeholder:e.inputDescription,title:e.inputDescription,autocomplete:"off","data-role":"input",type:"text"},on:{keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearSource}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name_with_balance"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const y=e({name:"Budget",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_budget:String},mounted:function(){this.loadBudgets()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,budgets:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.budget.value)},handleInput:function(e){this.$emit("input",this.$refs.budget.value)},hasError:function(){return this.error.length>0},loadBudgets:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/budgets?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.budgets=[{name:e.no_budget,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.budgets.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.budget"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.budgets.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"budget",staticClass:"form-control",attrs:{title:e.$t("firefly.budget"),name:"budget[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.budgets,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.budgets.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_budget_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const k=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.uri.value)},clearField:function(){this.name="",this.$refs.uri.value="",this.$emit("input",this.$refs.uri.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"uri",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"url"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const w=e({name:"Bill",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_bill:String},mounted:function(){this.loadBills()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,bills:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.bill.value)},handleInput:function(e){this.$emit("input",this.$refs.bill.value)},hasError:function(){return this.error.length>0},loadBills:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/bills?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.bills=[{name:e.no_bill,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.bills.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.bill"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.bills.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"bill",staticClass:"form-control",attrs:{title:e.$t("firefly.bill"),name:"bill[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.bills,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.bills.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_bill_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;n(9703),Vue.component("budget",y),Vue.component("bill",w),Vue.component("custom-date",i),Vue.component("custom-string",o),Vue.component("custom-attachments",t),Vue.component("custom-textarea",r),Vue.component("custom-uri",k),Vue.component("standard-date",s),Vue.component("group-description",l),Vue.component("transaction-description",c),Vue.component("custom-transaction-fields",u),Vue.component("piggy-bank",d),Vue.component("tags",h),Vue.component("category",A),Vue.component("amount",g),Vue.component("foreign-amount",m),Vue.component("transaction-type",v),Vue.component("account-select",b),Vue.component("create-transaction",a);var C=n(5299),z={};new Vue({i18n:C,el:"#create_transaction",render:function(e){return e(a,{props:z})}})})()})(); \ No newline at end of file +(()=>{var e={7010:e=>{window,e.exports=function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=6)}([function(e,t,n){var a=n(8);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("7ec05f6c",a,!1,{})},function(e,t,n){var a=n(10);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("3453d19d",a,!1,{})},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n,a=e[1]||"",i=e[3];if(!i)return a;if(t&&"function"==typeof btoa){var o=(n=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),r=i.sources.map((function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"}));return[a].concat(r).concat([o]).join("\n")}return[a].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},i=0;in.parts.length&&(a.parts.length=n.parts.length)}else{var r=[];for(i=0;i div[data-v-61d92e31] {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%;\n}\n.ti-selected-item[data-v-61d92e31] {\n background-color: #5C6BC0;\n color: #fff;\n}\n',"",{version:3,sources:["C:/Users/johan/dev/vue-tags-input/vue-tags-input/C:/Users/johan/dev/vue-tags-input/vue-tags-input/vue-tags-input.scss"],names:[],mappings:"AAAA;EACE,uBAAuB;EACvB,mCAA8C;EAC9C,+JAAuM;EACvM,oBAAoB;EACpB,mBAAmB;CAAE;AAEvB;EACE,kCAAkC;EAClC,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;EACf,oCAAoC;EACpC,mCAAmC;CAAE;AAEvC;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,YAAY;EACZ,aAAa;EACb,sBAAsB;CAAE;AAE1B;EACE,uBAAuB;CAAE;AAE3B;EACE,cAAc;CAAE;AAElB;EACE,8BAA8B;CAAE;AAElC;EACE,iBAAiB;EACjB,mBAAmB;EACnB,uBAAuB;CAAE;AAE3B;EACE,aAAa;CAAE;AACf;IACE,gBAAgB;CAAE;AAEtB;EACE,uBAAuB;EACvB,cAAc;EACd,aAAa;EACb,gBAAgB;CAAE;AAEpB;EACE,cAAc;EACd,gBAAgB;EAChB,YAAY;EACZ,iBAAiB;CAAE;AAErB;EACE,0BAA0B;EAC1B,YAAY;EACZ,mBAAmB;EACnB,cAAc;EACd,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,cAAc;CAAE;AAClB;IACE,cAAc;IACd,oBAAoB;CAAE;AACxB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;IACnB,mBAAmB;IACnB,YAAY;IACZ,iBAAiB;CAAE;AACrB;IACE,iBAAiB;IACjB,cAAc;IACd,oBAAoB;IACpB,kBAAkB;CAAE;AACpB;MACE,gBAAgB;CAAE;AACtB;IACE,kBAAkB;CAAE;AACtB;IACE,0BAA0B;CAAE;AAEhC;EACE,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,aAAa;IACb,YAAY;CAAE;AAElB;EACE,qBAAqB;CAAE;AAEzB;EACE,uBAAuB;EACvB,iBAAiB;EACjB,mBAAmB;EACnB,YAAY;EACZ,uBAAuB;EACvB,YAAY;CAAE;AAEhB;EACE,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CAAE;AAEhB;EACE,0BAA0B;EAC1B,YAAY;CAAE",file:"vue-tags-input.scss?vue&type=style&index=0&id=61d92e31&lang=scss&scoped=true&",sourcesContent:['@font-face {\n font-family: \'icomoon\';\n src: url("./assets/fonts/icomoon.eot?7grlse");\n src: url("./assets/fonts/icomoon.eot?7grlse#iefix") format("embedded-opentype"), url("./assets/fonts/icomoon.ttf?7grlse") format("truetype"), url("./assets/fonts/icomoon.woff?7grlse") format("woff");\n font-weight: normal;\n font-style: normal; }\n\n[class^="ti-icon-"], [class*=" ti-icon-"] {\n font-family: \'icomoon\' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.ti-icon-check:before {\n content: "\\e902"; }\n\n.ti-icon-close:before {\n content: "\\e901"; }\n\n.ti-icon-undo:before {\n content: "\\e900"; }\n\nul {\n margin: 0px;\n padding: 0px;\n list-style-type: none; }\n\n*, *:before, *:after {\n box-sizing: border-box; }\n\ninput:focus {\n outline: none; }\n\ninput[disabled] {\n background-color: transparent; }\n\n.vue-tags-input {\n max-width: 450px;\n position: relative;\n background-color: #fff; }\n\ndiv.vue-tags-input.disabled {\n opacity: 0.5; }\n div.vue-tags-input.disabled * {\n cursor: default; }\n\n.ti-input {\n border: 1px solid #ccc;\n display: flex;\n padding: 4px;\n flex-wrap: wrap; }\n\n.ti-tags {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n line-height: 1em; }\n\n.ti-tag {\n background-color: #5C6BC0;\n color: #fff;\n border-radius: 2px;\n display: flex;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-tag:focus {\n outline: none; }\n .ti-tag .ti-content {\n display: flex;\n align-items: center; }\n .ti-tag .ti-tag-center {\n position: relative; }\n .ti-tag span {\n line-height: .85em; }\n .ti-tag span.ti-hidden {\n padding-left: 14px;\n visibility: hidden;\n height: 0px;\n white-space: pre; }\n .ti-tag .ti-actions {\n margin-left: 2px;\n display: flex;\n align-items: center;\n font-size: 1.15em; }\n .ti-tag .ti-actions i {\n cursor: pointer; }\n .ti-tag:last-child {\n margin-right: 4px; }\n .ti-tag.ti-invalid, .ti-tag.ti-tag.ti-deletion-mark {\n background-color: #e54d42; }\n\n.ti-new-tag-input-wrapper {\n display: flex;\n flex: 1 0 auto;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-new-tag-input-wrapper input {\n flex: 1 0 auto;\n min-width: 100px;\n border: none;\n padding: 0px;\n margin: 0px; }\n\n.ti-new-tag-input {\n line-height: initial; }\n\n.ti-autocomplete {\n border: 1px solid #ccc;\n border-top: none;\n position: absolute;\n width: 100%;\n background-color: #fff;\n z-index: 20; }\n\n.ti-item > div {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%; }\n\n.ti-selected-item {\n background-color: #5C6BC0;\n color: #fff; }\n'],sourceRoot:""}])},function(e,t,n){"use strict";e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t){e.exports="data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg8SBawAAAC8AAAAYGNtYXAXVtKJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZqWfozAAAAF4AAAA/GhlYWQPxZgIAAACdAAAADZoaGVhB4ADyAAAAqwAAAAkaG10eBIAAb4AAALQAAAAHGxvY2EAkgDiAAAC7AAAABBtYXhwAAkAHwAAAvwAAAAgbmFtZZlKCfsAAAMcAAABhnBvc3QAAwAAAAAEpAAAACAAAwOAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6QL//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAFYBAQO+AoEAHAAAATIXHgEXFhcHJicuAScmIyIGBxchERc2Nz4BNzYCFkpDQ28pKRdkECAfVTM0OT9wLZz+gJgdIiJLKSgCVRcYUjg5QiAzKys+ERIrJZoBgJoZFRQcCAgAAQDWAIEDKgLVAAsAAAEHFwcnByc3JzcXNwMq7u487u487u487u4Cme7uPO7uPO7uPO7uAAEAkgCBA4ACvQAFAAAlARcBJzcBgAHEPP4A7jz5AcQ8/gDuPAAAAAABAAAAAAAAH8nTUV8PPPUACwQAAAAAANZ1KhsAAAAA1nUqGwAAAAADvgLVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAO+AAEAAAAAAAAAAAAAAAAAAAAHBAAAAAAAAAAAAAAAAgAAAAQAAFYEAADWBAAAkgAAAAAACgAUAB4AUABqAH4AAQAAAAcAHQABAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},function(e,t){e.exports="data:font/woff;base64,d09GRgABAAAAAAUQAAsAAAAABMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIFrGNtYXAAAAFoAAAAVAAAAFQXVtKJZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAAAPwAAAD8pZ+jMGhlYWQAAALAAAAANgAAADYPxZgIaGhlYQAAAvgAAAAkAAAAJAeAA8hobXR4AAADHAAAABwAAAAcEgABvmxvY2EAAAM4AAAAEAAAABAAkgDibWF4cAAAA0gAAAAgAAAAIAAJAB9uYW1lAAADaAAAAYYAAAGGmUoJ+3Bvc3QAAATwAAAAIAAAACAAAwAAAAMDgAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6QIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOkC//3//wAAAAAAIOkA//3//wAB/+MXBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQBWAQEDvgKBABwAAAEyFx4BFxYXByYnLgEnJiMiBgcXIREXNjc+ATc2AhZKQ0NvKSkXZBAgH1UzNDk/cC2c/oCYHSIiSykoAlUXGFI4OUIgMysrPhESKyWaAYCaGRUUHAgIAAEA1gCBAyoC1QALAAABBxcHJwcnNyc3FzcDKu7uPO7uPO7uPO7uApnu7jzu7jzu7jzu7gABAJIAgQOAAr0ABQAAJQEXASc3AYABxDz+AO48+QHEPP4A7jwAAAAAAQAAAAAAAB/J01FfDzz1AAsEAAAAAADWdSobAAAAANZ1KhsAAAAAA74C1QAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADvgABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABWBAAA1gQAAJIAAAAAAAoAFAAeAFAAagB+AAEAAAAHAB0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},function(e,t,n){"use strict";n.r(t);var a=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vue-tags-input",class:[{"ti-disabled":e.disabled},{"ti-focus":e.focused}]},[n("div",{staticClass:"ti-input"},[e.tagsCopy?n("ul",{staticClass:"ti-tags"},[e._l(e.tagsCopy,(function(t,a){return n("li",{key:a,staticClass:"ti-tag",class:[{"ti-editing":e.tagsEditStatus[a]},t.tiClasses,t.classes,{"ti-deletion-mark":e.isMarked(a)}],style:t.style,attrs:{tabindex:"0"},on:{click:function(n){return e.$emit("tag-clicked",{tag:t,index:a})}}},[n("div",{staticClass:"ti-content"},[e.$scopedSlots["tag-left"]?n("div",{staticClass:"ti-tag-left"},[e._t("tag-left",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e(),e._v(" "),n("div",{ref:"tagCenter",refInFor:!0,staticClass:"ti-tag-center"},[e.$scopedSlots["tag-center"]?e._e():n("span",{class:{"ti-hidden":e.tagsEditStatus[a]},on:{click:function(t){return e.performEditTag(a)}}},[e._v(e._s(t.text))]),e._v(" "),e.$scopedSlots["tag-center"]?e._e():n("tag-input",{attrs:{scope:{edit:e.tagsEditStatus[a],maxlength:e.maxlength,tag:t,index:a,validateTag:e.createChangedTag,performCancelEdit:e.cancelEdit,performSaveEdit:e.performSaveTag}}}),e._v(" "),e._t("tag-center",null,{tag:t,index:a,maxlength:e.maxlength,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,validateTag:e.createChangedTag,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2),e._v(" "),e.$scopedSlots["tag-right"]?n("div",{staticClass:"ti-tag-right"},[e._t("tag-right",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e()]),e._v(" "),n("div",{staticClass:"ti-actions"},[e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:e.tagsEditStatus[a],expression:"tagsEditStatus[index]"}],staticClass:"ti-icon-undo",on:{click:function(t){return e.cancelEdit(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:!e.tagsEditStatus[a],expression:"!tagsEditStatus[index]"}],staticClass:"ti-icon-close",on:{click:function(t){return e.performDeleteTag(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._t("tag-actions",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)}):e._e()],2)])})),e._v(" "),n("li",{staticClass:"ti-new-tag-input-wrapper"},[n("input",e._b({ref:"newTagInput",staticClass:"ti-new-tag-input",class:[e.createClasses(e.newTag,e.tags,e.validation,e.isDuplicate)],attrs:{placeholder:e.placeholder,maxlength:e.maxlength,disabled:e.disabled,type:"text",size:"1"},domProps:{value:e.newTag},on:{keydown:[function(t){return e.performAddTags(e.filteredAutocompleteItems[e.selectedItem]||e.newTag,t)},function(t){return t.type.indexOf("key")||8===t.keyCode?e.invokeDelete(t):null},function(t){return t.type.indexOf("key")||9===t.keyCode?e.performBlur(t):null},function(t){return t.type.indexOf("key")||38===t.keyCode?e.selectItem(t,"before"):null},function(t){return t.type.indexOf("key")||40===t.keyCode?e.selectItem(t,"after"):null}],paste:e.addTagsFromPaste,input:e.updateNewTag,blur:function(t){return e.$emit("blur",t)},focus:function(t){e.focused=!0,e.$emit("focus",t)},click:function(t){!e.addOnlyFromAutocomplete&&(e.selectedItem=null)}}},"input",e.$attrs,!1))])],2):e._e()]),e._v(" "),e._t("between-elements"),e._v(" "),e.autocompleteOpen?n("div",{staticClass:"ti-autocomplete",on:{mouseout:function(t){e.selectedItem=null}}},[e._t("autocomplete-header"),e._v(" "),n("ul",e._l(e.filteredAutocompleteItems,(function(t,a){return n("li",{key:a,staticClass:"ti-item",class:[t.tiClasses,t.classes,{"ti-selected-item":e.isSelected(a)}],style:t.style,on:{mouseover:function(t){!e.disabled&&(e.selectedItem=a)}}},[e.$scopedSlots["autocomplete-item"]?e._t("autocomplete-item",null,{item:t,index:a,performAdd:function(t){return e.performAddTags(t,void 0,"autocomplete")},selected:e.isSelected(a)}):n("div",{on:{click:function(n){return e.performAddTags(t,void 0,"autocomplete")}}},[e._v("\n "+e._s(t.text)+"\n ")])],2)})),0),e._v(" "),e._t("autocomplete-footer")],2):e._e()],2)};a._withStripped=!0;var i=n(5),o=n.n(i),r=function(e){return JSON.parse(JSON.stringify(e))},s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3?arguments[3]:void 0;void 0===e.text&&(e={text:e});var i=function(e,t){return t.filter((function(t){var n=e.text;return"string"==typeof t.rule?!new RegExp(t.rule).test(n):t.rule instanceof RegExp?!t.rule.test(n):"[object Function]"==={}.toString.call(t.rule)?t.rule(e):void 0})).map((function(e){return e.classes}))}(e,n),o=function(e,t){for(var n=0;n1?n-1:0),i=1;i1?t-1:0),a=1;a=this.autocompleteMinLength&&this.filteredAutocompleteItems.length>0&&this.focused},filteredAutocompleteItems:function(){var e=this,t=this.autocompleteItems.map((function(t){return l(t,e.tags,e.validation,e.isDuplicate)}));return this.autocompleteFilterDuplicates?t.filter(this.duplicateFilter):t}},methods:{createClasses:s,getSelectedIndex:function(e){var t=this.filteredAutocompleteItems,n=this.selectedItem,a=t.length-1;if(0!==t.length)return null===n?0:"before"===e&&0===n?a:"after"===e&&n===a?0:"after"===e?n+1:n-1},selectDefaultItem:function(){this.addOnlyFromAutocomplete&&this.filteredAutocompleteItems.length>0?this.selectedItem=0:this.selectedItem=null},selectItem:function(e,t){e.preventDefault(),this.selectedItem=this.getSelectedIndex(t)},isSelected:function(e){return this.selectedItem===e},isMarked:function(e){return this.deletionMark===e},invokeDelete:function(){var e=this;if(this.deleteOnBackspace&&!(this.newTag.length>0)){var t=this.tagsCopy.length-1;null===this.deletionMark?(this.deletionMarkTime=setTimeout((function(){return e.deletionMark=null}),1e3),this.deletionMark=t):this.performDeleteTag(t)}},addTagsFromPaste:function(){var e=this;this.addFromPaste&&setTimeout((function(){return e.performAddTags(e.newTag)}),10)},performEditTag:function(e){var t=this;this.allowEditTags&&(this._events["before-editing-tag"]||this.editTag(e),this.$emit("before-editing-tag",{index:e,tag:this.tagsCopy[e],editTag:function(){return t.editTag(e)}}))},editTag:function(e){this.allowEditTags&&(this.toggleEditMode(e),this.focus(e))},toggleEditMode:function(e){this.allowEditTags&&!this.disabled&&this.$set(this.tagsEditStatus,e,!this.tagsEditStatus[e])},createChangedTag:function(e,t){var n=this.tagsCopy[e];n.text=t?t.target.value:this.tagsCopy[e].text,this.$set(this.tagsCopy,e,l(n,this.tagsCopy,this.validation,this.isDuplicate))},focus:function(e){var t=this;this.$nextTick((function(){var n=t.$refs.tagCenter[e].querySelector("input.ti-tag-input");n&&n.focus()}))},quote:function(e){return e.replace(/([()[{*+.$^\\|?])/g,"\\$1")},cancelEdit:function(e){this.tags[e]&&(this.tagsCopy[e]=r(l(this.tags[e],this.tags,this.validation,this.isDuplicate)),this.$set(this.tagsEditStatus,e,!1))},hasForbiddingAddRule:function(e){var t=this;return e.some((function(e){var n=t.validation.find((function(t){return e===t.classes}));return!!n&&n.disableAdd}))},createTagTexts:function(e){var t=this,n=new RegExp(this.separators.map((function(e){return t.quote(e)})).join("|"));return e.split(n).map((function(e){return{text:e}}))},performDeleteTag:function(e){var t=this;this._events["before-deleting-tag"]||this.deleteTag(e),this.$emit("before-deleting-tag",{index:e,tag:this.tagsCopy[e],deleteTag:function(){return t.deleteTag(e)}})},deleteTag:function(e){this.disabled||(this.deletionMark=null,clearTimeout(this.deletionMarkTime),this.tagsCopy.splice(e,1),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},noTriggerKey:function(e,t){var n=-1!==this[t].indexOf(e.keyCode)||-1!==this[t].indexOf(e.key);return n&&e.preventDefault(),!n},performAddTags:function(e,t,n){var a=this;if(!(this.disabled||t&&this.noTriggerKey(t,"addOnKey"))){var i=[];"object"===m(e)&&(i=[e]),"string"==typeof e&&(i=this.createTagTexts(e)),(i=i.filter((function(e){return e.text.trim().length>0}))).forEach((function(e){e=l(e,a.tags,a.validation,a.isDuplicate),a._events["before-adding-tag"]||a.addTag(e,n),a.$emit("before-adding-tag",{tag:e,addTag:function(){return a.addTag(e,n)}})}))}},duplicateFilter:function(e){return this.isDuplicate?!this.isDuplicate(this.tagsCopy,e):!this.tagsCopy.find((function(t){return t.text===e.text}))},addTag:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"new-tag-input",a=this.filteredAutocompleteItems.map((function(e){return e.text}));this.addOnlyFromAutocomplete&&-1===a.indexOf(e.text)||this.$nextTick((function(){return t.maxTags&&t.maxTags<=t.tagsCopy.length?t.$emit("max-tags-reached",e):t.avoidAddingDuplicates&&!t.duplicateFilter(e)?t.$emit("adding-duplicate",e):void(t.hasForbiddingAddRule(e.tiClasses)||(t.$emit("input",""),t.tagsCopy.push(e),t._events["update:tags"]&&t.$emit("update:tags",t.tagsCopy),"autocomplete"===n&&t.$refs.newTagInput.focus(),t.$emit("tags-changed",t.tagsCopy)))}))},performSaveTag:function(e,t){var n=this,a=this.tagsCopy[e];this.disabled||t&&this.noTriggerKey(t,"addOnKey")||0!==a.text.trim().length&&(this._events["before-saving-tag"]||this.saveTag(e,a),this.$emit("before-saving-tag",{index:e,tag:a,saveTag:function(){return n.saveTag(e,a)}}))},saveTag:function(e,t){if(this.avoidAddingDuplicates){var n=r(this.tagsCopy),a=n.splice(e,1)[0];if(this.isDuplicate?this.isDuplicate(n,a):-1!==n.map((function(e){return e.text})).indexOf(a.text))return this.$emit("saving-duplicate",t)}this.hasForbiddingAddRule(t.tiClasses)||(this.$set(this.tagsCopy,e,t),this.toggleEditMode(e),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},tagsEqual:function(){var e=this;return!this.tagsCopy.some((function(t,n){return!o()(t,e.tags[n])}))},updateNewTag:function(e){var t=e.target.value;this.newTag=t,this.$emit("input",t)},initTags:function(){this.tagsCopy=c(this.tags,this.validation,this.isDuplicate),this.tagsEditStatus=r(this.tags).map((function(){return!1})),this._events["update:tags"]&&!this.tagsEqual()&&this.$emit("update:tags",this.tagsCopy)},blurredOnClick:function(e){this.$el.contains(e.target)||this.$el.contains(document.activeElement)||this.performBlur(e)},performBlur:function(){this.addOnBlur&&this.focused&&this.performAddTags(this.newTag),this.focused=!1}},watch:{value:function(e){this.addOnlyFromAutocomplete||(this.selectedItem=null),this.newTag=e},tags:{handler:function(){this.initTags()},deep:!0},autocompleteOpen:"selectDefaultItem"},created:function(){this.newTag=this.value,this.initTags()},mounted:function(){this.selectDefaultItem(),document.addEventListener("click",this.blurredOnClick)},destroyed:function(){document.removeEventListener("click",this.blurredOnClick)}},b=(n(9),p(v,a,[],!1,null,"61d92e31",null));b.options.__file="vue-tags-input/vue-tags-input.vue";var y=b.exports;n.d(t,"VueTagsInput",(function(){return y})),n.d(t,"createClasses",(function(){return s})),n.d(t,"createTag",(function(){return l})),n.d(t,"createTags",(function(){return c})),n.d(t,"TagInput",(function(){return f})),y.install=function(e){return e.component(y.name,y)},"undefined"!=typeof window&&window.Vue&&window.Vue.use(y),t.default=y}])},9669:(e,t,n)=>{e.exports=n(1609)},5448:(e,t,n)=>{"use strict";var a=n(4867),i=n(6026),o=n(4372),r=n(5327),s=n(4097),l=n(4109),c=n(7985),u=n(5061);e.exports=function(e){return new Promise((function(t,n){var d=e.data,p=e.headers;a.isFormData(d)&&delete p["Content-Type"];var _=new XMLHttpRequest;if(e.auth){var f=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";p.Authorization="Basic "+btoa(f+":"+h)}var A=s(e.baseURL,e.url);if(_.open(e.method.toUpperCase(),r(A,e.params,e.paramsSerializer),!0),_.timeout=e.timeout,_.onreadystatechange=function(){if(_&&4===_.readyState&&(0!==_.status||_.responseURL&&0===_.responseURL.indexOf("file:"))){var a="getAllResponseHeaders"in _?l(_.getAllResponseHeaders()):null,o={data:e.responseType&&"text"!==e.responseType?_.response:_.responseText,status:_.status,statusText:_.statusText,headers:a,config:e,request:_};i(t,n,o),_=null}},_.onabort=function(){_&&(n(u("Request aborted",e,"ECONNABORTED",_)),_=null)},_.onerror=function(){n(u("Network Error",e,null,_)),_=null},_.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(u(t,e,"ECONNABORTED",_)),_=null},a.isStandardBrowserEnv()){var g=(e.withCredentials||c(A))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;g&&(p[e.xsrfHeaderName]=g)}if("setRequestHeader"in _&&a.forEach(p,(function(e,t){void 0===d&&"content-type"===t.toLowerCase()?delete p[t]:_.setRequestHeader(t,e)})),a.isUndefined(e.withCredentials)||(_.withCredentials=!!e.withCredentials),e.responseType)try{_.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&_.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&_.upload&&_.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){_&&(_.abort(),n(e),_=null)})),d||(d=null),_.send(d)}))}},1609:(e,t,n)=>{"use strict";var a=n(4867),i=n(1849),o=n(321),r=n(7185);function s(e){var t=new o(e),n=i(o.prototype.request,t);return a.extend(n,o.prototype,t),a.extend(n,t),n}var l=s(n(5655));l.Axios=o,l.create=function(e){return s(r(l.defaults,e))},l.Cancel=n(5263),l.CancelToken=n(4972),l.isCancel=n(6502),l.all=function(e){return Promise.all(e)},l.spread=n(8713),l.isAxiosError=n(6268),e.exports=l,e.exports.default=l},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,n)=>{"use strict";var a=n(5263);function i(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new a(e),t(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var e;return{token:new i((function(t){e=t})),cancel:e}},e.exports=i},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,n)=>{"use strict";var a=n(4867),i=n(5327),o=n(782),r=n(3572),s=n(7185);function l(e){this.defaults=e,this.interceptors={request:new o,response:new o}}l.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[r,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)n=n.then(t.shift(),t.shift());return n},l.prototype.getUri=function(e){return e=s(this.defaults,e),i(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},a.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),a.forEach(["post","put","patch"],(function(e){l.prototype[e]=function(t,n,a){return this.request(s(a||{},{method:e,url:t,data:n}))}})),e.exports=l},782:(e,t,n)=>{"use strict";var a=n(4867);function i(){this.handlers=[]}i.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},i.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},i.prototype.forEach=function(e){a.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=i},4097:(e,t,n)=>{"use strict";var a=n(1793),i=n(7303);e.exports=function(e,t){return e&&!a(t)?i(e,t):t}},5061:(e,t,n)=>{"use strict";var a=n(481);e.exports=function(e,t,n,i,o){var r=new Error(e);return a(r,t,n,i,o)}},3572:(e,t,n)=>{"use strict";var a=n(4867),i=n(8527),o=n(6502),r=n(5655);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=i(e.data,e.headers,e.transformRequest),e.headers=a.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),a.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||r.adapter)(e).then((function(t){return s(e),t.data=i(t.data,t.headers,e.transformResponse),t}),(function(t){return o(t)||(s(e),t&&t.response&&(t.response.data=i(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,n,a,i){return e.config=t,n&&(e.code=n),e.request=a,e.response=i,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){t=t||{};var n={},i=["url","method","data"],o=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function l(e,t){return a.isPlainObject(e)&&a.isPlainObject(t)?a.merge(e,t):a.isPlainObject(t)?a.merge({},t):a.isArray(t)?t.slice():t}function c(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(e[i],t[i])}a.forEach(i,(function(e){a.isUndefined(t[e])||(n[e]=l(void 0,t[e]))})),a.forEach(o,c),a.forEach(r,(function(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(void 0,t[i])})),a.forEach(s,(function(a){a in t?n[a]=l(e[a],t[a]):a in e&&(n[a]=l(void 0,e[a]))}));var u=i.concat(o).concat(r).concat(s),d=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===u.indexOf(e)}));return a.forEach(d,c),n}},6026:(e,t,n)=>{"use strict";var a=n(5061);e.exports=function(e,t,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?t(a("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},8527:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t,n){return a.forEach(n,(function(n){e=n(e,t)})),e}},5655:(e,t,n)=>{"use strict";var a=n(4155),i=n(4867),o=n(6016),r={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==a&&"[object process]"===Object.prototype.toString.call(a))&&(l=n(5448)),l),transformRequest:[function(e,t){return o(t,"Accept"),o(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(s(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),i.forEach(["post","put","patch"],(function(e){c.headers[e]=i.merge(r)})),e.exports=c},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),a=0;a{"use strict";var a=n(4867);function i(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var o;if(n)o=n(t);else if(a.isURLSearchParams(t))o=t.toString();else{var r=[];a.forEach(t,(function(e,t){null!=e&&(a.isArray(e)?t+="[]":e=[e],a.forEach(e,(function(e){a.isDate(e)?e=e.toISOString():a.isObject(e)&&(e=JSON.stringify(e)),r.push(i(t)+"="+i(e))})))})),o=r.join("&")}if(o){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?{write:function(e,t,n,i,o,r){var s=[];s.push(e+"="+encodeURIComponent(t)),a.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),a.isString(i)&&s.push("path="+i),a.isString(o)&&s.push("domain="+o),!0===r&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(e){var a=e;return t&&(n.setAttribute("href",a),a=n.href),n.setAttribute("href",a),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=i(window.location.href),function(t){var n=a.isString(t)?i(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},6016:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){a.forEach(e,(function(n,a){a!==t&&a.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[a])}))}},4109:(e,t,n)=>{"use strict";var a=n(4867),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,o,r={};return e?(a.forEach(e.split("\n"),(function(e){if(o=e.indexOf(":"),t=a.trim(e.substr(0,o)).toLowerCase(),n=a.trim(e.substr(o+1)),t){if(r[t]&&i.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([n]):r[t]?r[t]+", "+n:n}})),r):r}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4867:(e,t,n)=>{"use strict";var a=n(1849),i=Object.prototype.toString;function o(e){return"[object Array]"===i.call(e)}function r(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==i.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===i.call(e)}function u(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),o(e))for(var n=0,a=e.length;n{window.axios=n(9669),window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var a=document.head.querySelector('meta[name="csrf-token"]');a?window.axios.defaults.headers.common["X-CSRF-TOKEN"]=a.content:console.error("CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token")},5299:(e,t,n)=>{e.exports=new vuei18n({locale:document.documentElement.lang,fallbackLocale:"en",messages:{bg:n(987),cs:n(6054),de:n(7062),en:n(6886),"en-us":n(6886),"en-gb":n(5642),es:n(2360),el:n(1410),fr:n(6833),hu:n(6477),it:n(3092),nl:n(78),nb:n(2502),pl:n(8691),fi:n(3684),"pt-br":n(122),"pt-pt":n(4895),ro:n(403),ru:n(7448),"zh-tw":n(4963),"zh-cn":n(1922),sk:n(6949),sv:n(2285),vi:n(9783)}})},4155:e=>{var t,n,a=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var s,l=[],c=!1,u=-1;function d(){c&&s&&(c=!1,s.length?l=s.concat(l):u=-1,l.length&&p())}function p(){if(!c){var e=r(d);c=!0;for(var t=l.length;t;){for(s=l,l=[];++u1)for(var n=1;n{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Какво се случва?","flash_error":"Грешка!","flash_success":"Успех!","close":"Затвори","split_transaction_title":"Описание на разделена транзакция","errors_submission":"Имаше нещо нередно с вашите данни. Моля, проверете грешките.","split":"Раздели","single_split":"Раздел","transaction_stored_link":"Транзакция #{ID}(\\"{title}\\") беше записана.","transaction_updated_link":"Транзакция #{ID} беше обновена.","transaction_new_stored_link":"Транзакция #{ID} беше записана.","transaction_journal_information":"Информация за транзакция","no_budget_pointer":"Изглежда все още нямате бюджети. Трябва да създадете някои на страницата Бюджети . Бюджетите могат да ви помогнат да следите разходите си.","no_bill_pointer":"Изглежда все още нямате сметки. Трябва да създадете някои на страницата Сметки . Сметките могат да ви помогнат да следите разходите си.","source_account":"Разходна сметка","hidden_fields_preferences":"Можете да активирате повече опции за транзакции във вашите настройки.","destination_account":"Приходна сметка","add_another_split":"Добавяне на друг раздел","submission":"Изпращане","create_another":"След съхраняването се върнете тук, за да създадете нова.","reset_after":"Изчистване на формуляра след изпращане","submit":"Потвърди","amount":"Сума","date":"Дата","tags":"Етикети","no_budget":"(без бюджет)","no_bill":"(няма сметка)","category":"Категория","attachments":"Прикачени файлове","notes":"Бележки","external_uri":"External URL","update_transaction":"Обнови транзакцията","after_update_create_another":"След обновяването се върнете тук, за да продължите с редакцията.","store_as_new":"Съхранете като нова транзакция, вместо да я актуализирате.","split_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","none_in_select_list":"(нищо)","no_piggy_bank":"(без касичка)","description":"Описание","split_transaction_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","destination_account_reconciliation":"Не може да редактирате приходната сметка на транзакция за съгласуване.","source_account_reconciliation":"Не може да редактирате разходната сметка на транзакция за съгласуване.","budget":"Бюджет","bill":"Сметка","you_create_withdrawal":"Създавате теглене.","you_create_transfer":"Създавате прехвърляне.","you_create_deposit":"Създавате депозит.","edit":"Промени","delete":"Изтрий","name":"Име","profile_whoops":"Опаааа!","profile_something_wrong":"Нещо се обърка!","profile_try_again":"Нещо се обърка. Моля, опитайте отново.","profile_oauth_clients":"OAuth клиенти","profile_oauth_no_clients":"Не сте създали клиенти на OAuth.","profile_oauth_clients_header":"Клиенти","profile_oauth_client_id":"ИД (ID) на клиент","profile_oauth_client_name":"Име","profile_oauth_client_secret":"Тайна","profile_oauth_create_new_client":"Създай нов клиент","profile_oauth_create_client":"Създай клиент","profile_oauth_edit_client":"Редактирай клиент","profile_oauth_name_help":"Нещо, което вашите потребители ще разпознаят и ще се доверят.","profile_oauth_redirect_url":"Линк на препратката","profile_oauth_redirect_url_help":"URL адрес за обратно извикване на оторизацията на вашето приложение.","profile_authorized_apps":"Удостоверени приложения","profile_authorized_clients":"Удостоверени клиенти","profile_scopes":"Сфери","profile_revoke":"Анулирай","profile_personal_access_tokens":"Персонални маркери за достъп","profile_personal_access_token":"Персонален маркер за достъп","profile_personal_access_token_explanation":"Това е новия ви персонален маркер за достъп. Това е единственият път, когато ще бъде показан, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_no_personal_access_token":"Не сте създали никакви лични маркери за достъп.","profile_create_new_token":"Създай нов маркер","profile_create_token":"Създай маркер","profile_create":"Създай","profile_save_changes":"Запазване на промените","default_group_title_name":"(без група)","piggy_bank":"Касичка","profile_oauth_client_secret_title":"Тайна на клиента","profile_oauth_client_secret_expl":"Това е новата ви \\"тайна на клиента\\". Това е единственият път, когато ще бъде показана, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_oauth_confidential":"Поверително","profile_oauth_confidential_help":"Изисквайте клиента да се удостоверява с тайна. Поверителните клиенти могат да притежават идентификационни данни по защитен начин, без да ги излагат на неоторизирани страни. Публичните приложения, като например десктопа или JavaScript SPA приложения, не могат да пазят тайни по сигурен начин.","multi_account_warning_unknown":"В зависимост от вида на транзакцията която създавате, източникът и / или целевата сметка на следващите разделяния може да бъде променена от това което е дефинирано в първото разделение на транзакцията.","multi_account_warning_withdrawal":"Имайте предвид, че разходна сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на тегленето.","multi_account_warning_deposit":"Имайте предвид, че приходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на депозита.","multi_account_warning_transfer":"Имайте предвид, че приходната + разходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на прехвърлянето."},"form":{"interest_date":"Падеж на лихва","book_date":"Дата на осчетоводяване","process_date":"Дата на обработка","due_date":"Дата на падеж","foreign_amount":"Сума във валута","payment_date":"Дата на плащане","invoice_date":"Дата на фактура","internal_reference":"Вътрешна референция"},"config":{"html_language":"bg"}}')},6054:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Jak to jde?","flash_error":"Chyba!","flash_success":"Úspěšně dokončeno!","close":"Zavřít","split_transaction_title":"Popis rozúčtování","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Rozdělit","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Informace o transakci","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Zdrojový účet","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Cílový účet","add_another_split":"Přidat další rozúčtování","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Odeslat","amount":"Částka","date":"Datum","tags":"Štítky","no_budget":"(žádný rozpočet)","no_bill":"(no bill)","category":"Kategorie","attachments":"Přílohy","notes":"Poznámky","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.","none_in_select_list":"(žádné)","no_piggy_bank":"(žádná pokladnička)","description":"Popis","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Upravit","delete":"Odstranit","name":"Název","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Úrokové datum","book_date":"Datum rezervace","process_date":"Datum zpracování","due_date":"Datum splatnosti","foreign_amount":"Částka v cizí měně","payment_date":"Datum zaplacení","invoice_date":"Datum vystavení","internal_reference":"Interní reference"},"config":{"html_language":"cs"}}')},7062:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Überblick","flash_error":"Fehler!","flash_success":"Geschafft!","close":"Schließen","split_transaction_title":"Beschreibung der Splittbuchung","errors_submission":"Ihre Übermittlung ist fehlgeschlagen. Bitte überprüfen Sie die Fehler.","split":"Teilen","single_split":"Teil","transaction_stored_link":"Buchung #{ID} (\\"{title}\\") wurde gespeichert.","transaction_updated_link":"Buchung#{ID} wurde aktualisiert.","transaction_new_stored_link":"Buchung #{ID} wurde gespeichert.","transaction_journal_information":"Transaktionsinformationen","no_budget_pointer":"Sie scheinen noch keine Kostenrahmen festgelegt zu haben. Sie sollten einige davon auf der Seite Kostenrahmen- anlegen. Kostenrahmen können Ihnen dabei helfen, den Überblick über die Ausgaben zu behalten.","no_bill_pointer":"Sie scheinen noch keine Rechnungen zu haben. Sie sollten einige auf der Seite Rechnungen erstellen. Anhand der Rechnungen können Sie den Überblick über Ihre Ausgaben behalten.","source_account":"Quellkonto","hidden_fields_preferences":"Sie können weitere Buchungsoptionen in Ihren Einstellungen aktivieren.","destination_account":"Zielkonto","add_another_split":"Eine weitere Aufteilung hinzufügen","submission":"Übermittlung","create_another":"Nach dem Speichern hierher zurückkehren, um ein weiteres zu erstellen.","reset_after":"Formular nach der Übermittlung zurücksetzen","submit":"Absenden","amount":"Betrag","date":"Datum","tags":"Schlagwörter","no_budget":"(kein Budget)","no_bill":"(keine Belege)","category":"Kategorie","attachments":"Anhänge","notes":"Notizen","external_uri":"Externe URL","update_transaction":"Buchung aktualisieren","after_update_create_another":"Nach dem Aktualisieren hierher zurückkehren, um weiter zu bearbeiten.","store_as_new":"Als neue Buchung speichern statt zu aktualisieren.","split_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.","none_in_select_list":"(Keine)","no_piggy_bank":"(kein Sparschwein)","description":"Beschreibung","split_transaction_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchung geben.","destination_account_reconciliation":"Sie können das Zielkonto einer Kontenausgleichsbuchung nicht bearbeiten.","source_account_reconciliation":"Sie können das Quellkonto einer Kontenausgleichsbuchung nicht bearbeiten.","budget":"Budget","bill":"Rechnung","you_create_withdrawal":"Sie haben eine Auszahlung erstellt.","you_create_transfer":"Sie haben eine Buchung erstellt.","you_create_deposit":"Sie haben eine Einzahlung erstellt.","edit":"Bearbeiten","delete":"Löschen","name":"Name","profile_whoops":"Huch!","profile_something_wrong":"Ein Problem ist aufgetreten!","profile_try_again":"Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.","profile_oauth_clients":"OAuth-Clients","profile_oauth_no_clients":"Sie haben noch keine OAuth-Clients erstellt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client-ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Geheimnis","profile_oauth_create_new_client":"Neuen Client erstellen","profile_oauth_create_client":"Client erstellen","profile_oauth_edit_client":"Client bearbeiten","profile_oauth_name_help":"Etwas das Ihre Nutzer erkennen und dem sie vertrauen.","profile_oauth_redirect_url":"Weiterleitungs-URL","profile_oauth_redirect_url_help":"Die Authorisierungs-Callback-URL Ihrer Anwendung.","profile_authorized_apps":"Autorisierte Anwendungen","profile_authorized_clients":"Autorisierte Clients","profile_scopes":"Bereiche","profile_revoke":"Widerrufen","profile_personal_access_tokens":"Persönliche Zugangs-Tokens","profile_personal_access_token":"Persönlicher Zugangs-Token","profile_personal_access_token_explanation":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_no_personal_access_token":"Sie haben keine persönlichen Zugangsschlüssel erstellt.","profile_create_new_token":"Neuen Schlüssel erstellen","profile_create_token":"Schlüssel erstellen","profile_create":"Erstellen","profile_save_changes":"Änderungen speichern","default_group_title_name":"(ohne Gruppierung)","piggy_bank":"Sparschwein","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_oauth_confidential":"Vertraulich","profile_oauth_confidential_help":"Der Client muss sich mit einem Secret authentifizieren. Vertrauliche Clients können die Anmeldedaten speichern, ohne diese unautorisierten Akteuren mitzuteilen. Öffentliche Anwendungen wie native Desktop- oder JavaScript-SPA-Anwendungen können Geheimnisse nicht sicher speichern.","multi_account_warning_unknown":"Abhängig von der Art der Buchung, die Sie anlegen, kann das Quell- und/oder Zielkonto nachfolgender Aufteilungen durch das überschrieben werden, was in der ersten Aufteilung der Buchung definiert wurde.","multi_account_warning_withdrawal":"Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_deposit":"Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einzahlung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_transfer":"Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der Übertragung definiert ist, außer Kraft gesetzt wird."},"form":{"interest_date":"Zinstermin","book_date":"Buchungsdatum","process_date":"Bearbeitungsdatum","due_date":"Fälligkeitstermin","foreign_amount":"Ausländischer Betrag","payment_date":"Zahlungsdatum","invoice_date":"Rechnungsdatum","internal_reference":"Interner Verweis"},"config":{"html_language":"de"}}')},1410:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Τι παίζει;","flash_error":"Σφάλμα!","flash_success":"Επιτυχία!","close":"Κλείσιμο","split_transaction_title":"Περιγραφή της συναλλαγής με διαχωρισμό","errors_submission":"Υπήρξε κάποιο λάθος με την υποβολή σας. Παρακαλώ ελέγξτε τα σφάλματα.","split":"Διαχωρισμός","single_split":"Διαχωρισμός","transaction_stored_link":"Η συναλλαγή #{ID} (\\"{title}\\") έχει αποθηκευτεί.","transaction_updated_link":"Η συναλλαγή #{ID} έχει ενημερωθεί.","transaction_new_stored_link":"Η συναλλαγή #{ID} έχει αποθηκευτεί.","transaction_journal_information":"Πληροφορίες συναλλαγής","no_budget_pointer":"Φαίνεται πως δεν έχετε ορίσει προϋπολογισμούς ακόμη. Πρέπει να δημιουργήσετε κάποιον στη σελίδα προϋπολογισμών. Οι προϋπολογισμοί σας βοηθούν να επιβλέπετε τις δαπάνες σας.","no_bill_pointer":"Φαίνεται πως δεν έχετε ορίσει πάγια έξοδα ακόμη. Πρέπει να δημιουργήσετε κάποιο στη σελίδα πάγιων εξόδων. Τα πάγια έξοδα σας βοηθούν να επιβλέπετε τις δαπάνες σας.","source_account":"Λογαριασμός προέλευσης","hidden_fields_preferences":"Μπορείτε να ενεργοποιήσετε περισσότερες επιλογές συναλλαγών στις προτιμήσεις.","destination_account":"Λογαριασμός προορισμού","add_another_split":"Προσθήκη ενός ακόμα διαχωρισμού","submission":"Υποβολή","create_another":"Μετά την αποθήκευση, επιστρέψτε εδώ για να δημιουργήσετε ακόμη ένα.","reset_after":"Επαναφορά φόρμας μετά την υποβολή","submit":"Υποβολή","amount":"Ποσό","date":"Ημερομηνία","tags":"Ετικέτες","no_budget":"(χωρίς προϋπολογισμό)","no_bill":"(χωρίς πάγιο έξοδο)","category":"Κατηγορία","attachments":"Συνημμένα","notes":"Σημειώσεις","external_uri":"External URL","update_transaction":"Ενημέρωση συναλλαγής","after_update_create_another":"Μετά την ενημέρωση, επιστρέψτε εδώ για να συνεχίσετε την επεξεργασία.","store_as_new":"Αποθήκευση ως νέα συναλλαγή αντί για ενημέρωση.","split_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","none_in_select_list":"(τίποτα)","no_piggy_bank":"(χωρίς κουμπαρά)","description":"Περιγραφή","split_transaction_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","destination_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προορισμού σε μια συναλλαγή τακτοποίησης.","source_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προέλευσης σε μια συναλλαγή τακτοποίησης.","budget":"Προϋπολογισμός","bill":"Πάγιο έξοδο","you_create_withdrawal":"Δημιουργείτε μια ανάληψη.","you_create_transfer":"Δημιουργείτε μια μεταφορά.","you_create_deposit":"Δημιουργείτε μια κατάθεση.","edit":"Επεξεργασία","delete":"Διαγραφή","name":"Όνομα","profile_whoops":"Ούπς!","profile_something_wrong":"Κάτι πήγε στραβά!","profile_try_again":"Κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά.","profile_oauth_clients":"Πελάτες OAuth","profile_oauth_no_clients":"Δεν έχετε δημιουργήσει πελάτες OAuth.","profile_oauth_clients_header":"Πελάτες","profile_oauth_client_id":"Αναγνωριστικό πελάτη","profile_oauth_client_name":"Όνομα","profile_oauth_client_secret":"Μυστικό","profile_oauth_create_new_client":"Δημιουργία νέου πελάτη","profile_oauth_create_client":"Δημιουργία πελάτη","profile_oauth_edit_client":"Επεξεργασία πελάτη","profile_oauth_name_help":"Κάτι που οι χρήστες σας θα αναγνωρίζουν και θα εμπιστεύονται.","profile_oauth_redirect_url":"URL ανακατεύθυνσης","profile_oauth_redirect_url_help":"To authorization callback URL της εφαρμογής σας.","profile_authorized_apps":"Εξουσιοδοτημένες εφαρμογές","profile_authorized_clients":"Εξουσιοδοτημένοι πελάτες","profile_scopes":"Πεδία εφαρμογής","profile_revoke":"Ανάκληση","profile_personal_access_tokens":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token_explanation":"Εδώ είναι το νέο διακριτικό προσωπικής πρόσβασης. Αυτή είναι η μόνη φορά που θα εμφανιστεί, οπότε μη το χάσετε! Μπορείτε να χρησιμοποιείτε αυτό το διακριτικό για να κάνετε κλήσεις API.","profile_no_personal_access_token":"Δεν έχετε δημιουργήσει προσωπικά διακριτικά πρόσβασης.","profile_create_new_token":"Δημιουργία νέου διακριτικού","profile_create_token":"Δημιουργία διακριτικού","profile_create":"Δημιουργία","profile_save_changes":"Αποθήκευση αλλαγών","default_group_title_name":"(χωρίς ομάδα)","piggy_bank":"Κουμπαράς","profile_oauth_client_secret_title":"Μυστικό Πελάτη","profile_oauth_client_secret_expl":"Εδώ είναι το νέο σας μυστικό πελάτη. Αυτή είναι η μόνη φορά που θα σας εμφανιστεί, οπότε μην το χάσετε! Μπορείτε να το χρησιμοποιείτε για να κάνετε αιτήματα API.","profile_oauth_confidential":"Εμπιστευτικό","profile_oauth_confidential_help":"Απαιτήστε από το πρόγραμμα πελάτη να πραγματοποιήσει έλεγχο ταυτότητας με ένα μυστικό. Οι έμπιστοι πελάτες μπορούν να διατηρούν διαπιστευτήρια με ασφαλή τρόπο χωρίς να τα εκθέτουν σε μη εξουσιοδοτημένα μέρη. Οι δημόσιες εφαρμογές, όπως οι εγγενείς εφαρμογές για επιτραπέζιους υπολογιστές ή JavaScript SPA, δεν μπορούν να κρατήσουν μυστικά με ασφάλεια.","multi_account_warning_unknown":"Ανάλογα με τον τύπο της συναλλαγής που δημιουργείτε, ο λογαριασμός προέλευσης ή/και προορισμού των επόμενων διαχωρισμών ενδέχεται να παρακαμφθεί από αυτό που ορίζεται στο πρώτο διαχωρισμό της συναλλαγής.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ημερομηνία τοκισμού","book_date":"Ημερομηνία εγγραφής","process_date":"Ημερομηνία επεξεργασίας","due_date":"Ημερομηνία προθεσμίας","foreign_amount":"Ποσό σε ξένο νόμισμα","payment_date":"Ημερομηνία πληρωμής","invoice_date":"Ημερομηνία τιμολόγησης","internal_reference":"Εσωτερική αναφορά"},"config":{"html_language":"el"}}')},5642:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en-gb"}}')},6886:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en"}}')},2360:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"¿Qué está pasando?","flash_error":"¡Error!","flash_success":"¡Operación correcta!","close":"Cerrar","split_transaction_title":"Descripción de la transacción dividida","errors_submission":"Hubo un problema con su envío. Por favor, compruebe los errores.","split":"Separar","single_split":"División","transaction_stored_link":"La transacción #{ID} (\\"{title}\\") ha sido almacenada.","transaction_updated_link":"La transacción #{ID} ha sido actualizada.","transaction_new_stored_link":"La transacción #{ID} ha sido guardada.","transaction_journal_information":"Información de transacción","no_budget_pointer":"Parece que aún no tienes presupuestos. Debes crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.","no_bill_pointer":"Parece que aún no tienes facturas. Deberías crear algunas en la página de facturas. Las facturas pueden ayudarte a llevar un seguimiento de los gastos.","source_account":"Cuenta origen","hidden_fields_preferences":"Puede habilitar más opciones de transacción en sus ajustes .","destination_account":"Cuenta destino","add_another_split":"Añadir otra división","submission":"Envío","create_another":"Después de guardar, vuelve aquí para crear otro.","reset_after":"Restablecer formulario después del envío","submit":"Enviar","amount":"Cantidad","date":"Fecha","tags":"Etiquetas","no_budget":"(sin presupuesto)","no_bill":"(sin factura)","category":"Categoria","attachments":"Archivos adjuntos","notes":"Notas","external_uri":"External URL","update_transaction":"Actualizar transacción","after_update_create_another":"Después de actualizar, vuelve aquí para continuar editando.","store_as_new":"Almacenar como una nueva transacción en lugar de actualizar.","split_title_help":"Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.","none_in_select_list":"(ninguno)","no_piggy_bank":"(sin hucha)","description":"Descripción","split_transaction_title_help":"Si crea una transacción dividida, debe existir una descripción global para todas las divisiones de la transacción.","destination_account_reconciliation":"No puedes editar la cuenta de destino de una transacción de reconciliación.","source_account_reconciliation":"No puedes editar la cuenta de origen de una transacción de reconciliación.","budget":"Presupuesto","bill":"Factura","you_create_withdrawal":"Está creando un retiro.","you_create_transfer":"Está creando una transferencia.","you_create_deposit":"Está creando un depósito.","edit":"Editar","delete":"Eliminar","name":"Nombre","profile_whoops":"¡Ups!","profile_something_wrong":"¡Algo salió mal!","profile_try_again":"Algo salió mal. Por favor, vuelva a intentarlo.","profile_oauth_clients":"Clientes de OAuth","profile_oauth_no_clients":"No ha creado ningún cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID del cliente","profile_oauth_client_name":"Nombre","profile_oauth_client_secret":"Secreto","profile_oauth_create_new_client":"Crear un Nuevo Cliente","profile_oauth_create_client":"Crear Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que sus usuarios reconocerán y confiarán.","profile_oauth_redirect_url":"Redirigir URL","profile_oauth_redirect_url_help":"La URL de devolución de autorización de su aplicación.","profile_authorized_apps":"Aplicaciones autorizadas","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Ámbitos","profile_revoke":"Revocar","profile_personal_access_tokens":"Tokens de acceso personal","profile_personal_access_token":"Token de acceso personal","profile_personal_access_token_explanation":"Aquí está su nuevo token de acceso personal. Esta es la única vez que se mostrará así que ¡no lo pierda! Ahora puede usar este token para hacer solicitudes de la API.","profile_no_personal_access_token":"No ha creado ningún token de acceso personal.","profile_create_new_token":"Crear nuevo token","profile_create_token":"Crear token","profile_create":"Crear","profile_save_changes":"Guardar cambios","default_group_title_name":"(sin agrupación)","piggy_bank":"Hucha","profile_oauth_client_secret_title":"Secreto del Cliente","profile_oauth_client_secret_expl":"Aquí está su nuevo secreto de cliente. Esta es la única vez que se mostrará así que no lo pierda! Ahora puede usar este secreto para hacer solicitudes de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Requerir que el cliente se autentifique con un secreto. Los clientes confidenciales pueden mantener las credenciales de forma segura sin exponerlas a partes no autorizadas. Las aplicaciones públicas, como aplicaciones de escritorio nativo o SPA de JavaScript, no pueden guardar secretos de forma segura.","multi_account_warning_unknown":"Dependiendo del tipo de transacción que cree, la cuenta de origen y/o destino de divisiones posteriores puede ser anulada por lo que se define en la primera división de la transacción.","multi_account_warning_withdrawal":"Tenga en cuenta que la cuenta de origen de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_deposit":"Tenga en cuenta que la cuenta de destino de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_transfer":"Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores será anulada por lo que se defina en la primera división de la transferencia."},"form":{"interest_date":"Fecha de interés","book_date":"Fecha de registro","process_date":"Fecha de procesamiento","due_date":"Fecha de vencimiento","foreign_amount":"Cantidad extranjera","payment_date":"Fecha de pago","invoice_date":"Fecha de la factura","internal_reference":"Referencia interna"},"config":{"html_language":"es"}}')},3684:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mitä kuuluu?","flash_error":"Virhe!","flash_success":"Valmista tuli!","close":"Sulje","split_transaction_title":"Jaetun tapahtuman kuvaus","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Jaa","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Tapahtumatiedot","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Lähdetili","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Kohdetili","add_another_split":"Lisää tapahtumaan uusi osa","submission":"Vahvistus","create_another":"Tallennuksen jälkeen, palaa takaisin luomaan uusi tapahtuma.","reset_after":"Tyhjennä lomake lähetyksen jälkeen","submit":"Vahvista","amount":"Summa","date":"Päivämäärä","tags":"Tägit","no_budget":"(ei budjettia)","no_bill":"(no bill)","category":"Kategoria","attachments":"Liitteet","notes":"Muistiinpanot","external_uri":"External URL","update_transaction":"Päivitä tapahtuma","after_update_create_another":"Päivityksen jälkeen, palaa takaisin jatkamaan muokkausta.","store_as_new":"Tallenna uutena tapahtumana päivityksen sijaan.","split_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","none_in_select_list":"(ei mitään)","no_piggy_bank":"(ei säästöpossu)","description":"Kuvaus","split_transaction_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","destination_account_reconciliation":"Et voi muokata täsmäytystapahtuman kohdetiliä.","source_account_reconciliation":"Et voi muokata täsmäytystapahtuman lähdetiliä.","budget":"Budjetti","bill":"Lasku","you_create_withdrawal":"Olet luomassa nostoa.","you_create_transfer":"Olet luomassa siirtoa.","you_create_deposit":"Olet luomassa talletusta.","edit":"Muokkaa","delete":"Poista","name":"Nimi","profile_whoops":"Hupsis!","profile_something_wrong":"Jokin meni vikaan!","profile_try_again":"Jokin meni vikaan. Yritä uudelleen.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Asiakasohjelmat","profile_oauth_client_id":"Asiakastunnus","profile_oauth_client_name":"Nimi","profile_oauth_client_secret":"Salaisuus","profile_oauth_create_new_client":"Luo Uusi Asiakas","profile_oauth_create_client":"Luo Asiakas","profile_oauth_edit_client":"Muokkaa asiakasta","profile_oauth_name_help":"Jotain käyttäjillesi tuttua ja luotettavaa.","profile_oauth_redirect_url":"URL:n uudelleenohjaus","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Peruuta","profile_personal_access_tokens":"Henkilökohtaiset Käyttöoikeuskoodit","profile_personal_access_token":"Henkilökohtainen Käyttöoikeuskoodi","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Luo uusi tunnus","profile_create_token":"Luo tunnus","profile_create":"Luo","profile_save_changes":"Tallenna muutokset","default_group_title_name":"(ryhmittelemättömät)","piggy_bank":"Säästöpossu","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Korkopäivä","book_date":"Kirjauspäivä","process_date":"Käsittelypäivä","due_date":"Eräpäivä","foreign_amount":"Ulkomaan summa","payment_date":"Maksupäivä","invoice_date":"Laskun päivämäärä","internal_reference":"Sisäinen viite"},"config":{"html_language":"fi"}}')},6833:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Quoi de neuf ?","flash_error":"Erreur !","flash_success":"Super !","close":"Fermer","split_transaction_title":"Description de l\'opération ventilée","errors_submission":"Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs.","split":"Ventiler","single_split":"Ventilation","transaction_stored_link":"L\'opération n°{ID} (\\"{title}\\") a été enregistrée.","transaction_updated_link":"L\'opération n°{ID} a été mise à jour.","transaction_new_stored_link":"L\'opération n°{ID} a été enregistrée.","transaction_journal_information":"Informations sur l\'opération","no_budget_pointer":"Vous semblez n’avoir encore aucun budget. Vous devriez en créer un sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.","no_bill_pointer":"Vous semblez n\'avoir encore aucune facture. Vous devriez en créer une sur la page factures-. Les factures peuvent vous aider à garder une trace des dépenses.","source_account":"Compte source","hidden_fields_preferences":"Vous pouvez activer plus d\'options d\'opérations dans vos paramètres.","destination_account":"Compte de destination","add_another_split":"Ajouter une autre fraction","submission":"Soumission","create_another":"Après enregistrement, revenir ici pour en créer un nouveau.","reset_after":"Réinitialiser le formulaire après soumission","submit":"Soumettre","amount":"Montant","date":"Date","tags":"Tags","no_budget":"(pas de budget)","no_bill":"(aucune facture)","category":"Catégorie","attachments":"Pièces jointes","notes":"Notes","external_uri":"URL externe","update_transaction":"Mettre à jour l\'opération","after_update_create_another":"Après la mise à jour, revenir ici pour continuer l\'édition.","store_as_new":"Enregistrer comme une nouvelle opération au lieu de mettre à jour.","split_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.","none_in_select_list":"(aucun)","no_piggy_bank":"(aucune tirelire)","description":"Description","split_transaction_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fraction de l\'opération.","destination_account_reconciliation":"Vous ne pouvez pas modifier le compte de destination d\'une opération de rapprochement.","source_account_reconciliation":"Vous ne pouvez pas modifier le compte source d\'une opération de rapprochement.","budget":"Budget","bill":"Facture","you_create_withdrawal":"Vous saisissez une dépense.","you_create_transfer":"Vous saisissez un transfert.","you_create_deposit":"Vous saisissez un dépôt.","edit":"Modifier","delete":"Supprimer","name":"Nom","profile_whoops":"Oups !","profile_something_wrong":"Une erreur s\'est produite !","profile_try_again":"Une erreur s’est produite. Merci d’essayer à nouveau.","profile_oauth_clients":"Clients OAuth","profile_oauth_no_clients":"Vous n’avez pas encore créé de client OAuth.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Identifiant","profile_oauth_client_name":"Nom","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Créer un nouveau client","profile_oauth_create_client":"Créer un client","profile_oauth_edit_client":"Modifier le client","profile_oauth_name_help":"Quelque chose que vos utilisateurs reconnaîtront et qui inspirera confiance.","profile_oauth_redirect_url":"URL de redirection","profile_oauth_redirect_url_help":"URL de callback de votre application.","profile_authorized_apps":"Applications autorisées","profile_authorized_clients":"Clients autorisés","profile_scopes":"Permissions","profile_revoke":"Révoquer","profile_personal_access_tokens":"Jetons d\'accès personnels","profile_personal_access_token":"Jeton d\'accès personnel","profile_personal_access_token_explanation":"Voici votre nouveau jeton d’accès personnel. Ceci est la seule fois où vous pourrez le voir, ne le perdez pas ! Vous pouvez dès à présent utiliser ce jeton pour lancer des requêtes avec l’API.","profile_no_personal_access_token":"Vous n’avez pas encore créé de jeton d’accès personnel.","profile_create_new_token":"Créer un nouveau jeton","profile_create_token":"Créer un jeton","profile_create":"Créer","profile_save_changes":"Enregistrer les modifications","default_group_title_name":"(Sans groupement)","piggy_bank":"Tirelire","profile_oauth_client_secret_title":"Secret du client","profile_oauth_client_secret_expl":"Voici votre nouveau secret de client. C\'est la seule fois qu\'il sera affiché, donc ne le perdez pas ! Vous pouvez maintenant utiliser ce secret pour faire des requêtes d\'API.","profile_oauth_confidential":"Confidentiel","profile_oauth_confidential_help":"Exiger que le client s\'authentifie avec un secret. Les clients confidentiels peuvent détenir des informations d\'identification de manière sécurisée sans les exposer à des tiers non autorisés. Les applications publiques, telles que les applications de bureau natif ou les SPA JavaScript, ne peuvent pas tenir des secrets en toute sécurité.","multi_account_warning_unknown":"Selon le type d\'opération que vous créez, le(s) compte(s) source et/ou de destination des ventilations suivantes peuvent être remplacés par celui de la première ventilation de l\'opération.","multi_account_warning_withdrawal":"Gardez en tête que le compte source des ventilations suivantes peut être remplacé par celui de la première ventilation de la dépense.","multi_account_warning_deposit":"Gardez en tête que le compte de destination des ventilations suivantes peut être remplacé par celui de la première ventilation du dépôt.","multi_account_warning_transfer":"Gardez en tête que les comptes source et de destination des ventilations suivantes peuvent être remplacés par ceux de la première ventilation du transfert."},"form":{"interest_date":"Date de valeur (intérêts)","book_date":"Date de réservation","process_date":"Date de traitement","due_date":"Échéance","foreign_amount":"Montant en devise étrangère","payment_date":"Date de paiement","invoice_date":"Date de facturation","internal_reference":"Référence interne"},"config":{"html_language":"fr"}}')},6477:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mi a helyzet?","flash_error":"Hiba!","flash_success":"Siker!","close":"Bezárás","split_transaction_title":"Felosztott tranzakció leírása","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Felosztás","single_split":"Felosztás","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") mentve.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} mentve.","transaction_journal_information":"Tranzakciós információk","no_budget_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","no_bill_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","source_account":"Forrás számla","hidden_fields_preferences":"A beállításokban több mező is engedélyezhető.","destination_account":"Célszámla","add_another_split":"Másik felosztás hozzáadása","submission":"Feliratkozás","create_another":"A tárolás után térjen vissza ide új létrehozásához.","reset_after":"Űrlap törlése a beküldés után","submit":"Beküldés","amount":"Összeg","date":"Dátum","tags":"Címkék","no_budget":"(nincs költségkeret)","no_bill":"(no bill)","category":"Kategória","attachments":"Mellékletek","notes":"Megjegyzések","external_uri":"External URL","update_transaction":"Tranzakció frissítése","after_update_create_another":"A frissítés után térjen vissza ide a szerkesztés folytatásához.","store_as_new":"Tárolás új tranzakcióként frissítés helyett.","split_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","none_in_select_list":"(nincs)","no_piggy_bank":"(nincs malacpersely)","description":"Leírás","split_transaction_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","destination_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció célszámláját.","source_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció forrásszámláját.","budget":"Költségkeret","bill":"Számla","you_create_withdrawal":"Egy költség létrehozása.","you_create_transfer":"Egy átutalás létrehozása.","you_create_deposit":"Egy bevétel létrehozása.","edit":"Szerkesztés","delete":"Törlés","name":"Név","profile_whoops":"Hoppá!","profile_something_wrong":"Hiba történt!","profile_try_again":"Hiba történt. Kérjük, próbálja meg újra.","profile_oauth_clients":"OAuth kliensek","profile_oauth_no_clients":"Nincs létrehozva egyetlen OAuth kliens sem.","profile_oauth_clients_header":"Kliensek","profile_oauth_client_id":"Kliens ID","profile_oauth_client_name":"Megnevezés","profile_oauth_client_secret":"Titkos kód","profile_oauth_create_new_client":"Új kliens létrehozása","profile_oauth_create_client":"Kliens létrehozása","profile_oauth_edit_client":"Kliens szerkesztése","profile_oauth_name_help":"Segítség, hogy a felhasználók tudják mihez kapcsolódik.","profile_oauth_redirect_url":"Átirányítási URL","profile_oauth_redirect_url_help":"Az alkalmazásban használt autentikációs URL.","profile_authorized_apps":"Engedélyezett alkalmazások","profile_authorized_clients":"Engedélyezett kliensek","profile_scopes":"Hatáskörök","profile_revoke":"Visszavonás","profile_personal_access_tokens":"Személyes hozzáférési tokenek","profile_personal_access_token":"Személyes hozzáférési token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"Nincs létrehozva egyetlen személyes hozzáférési token sem.","profile_create_new_token":"Új token létrehozása","profile_create_token":"Token létrehozása","profile_create":"Létrehozás","profile_save_changes":"Módosítások mentése","default_group_title_name":"(nem csoportosított)","piggy_bank":"Malacpersely","profile_oauth_client_secret_title":"Kliens titkos kódja","profile_oauth_client_secret_expl":"Ez a kliens titkos kódja. Ez az egyetlen alkalom, amikor meg van jelenítve, ne hagyd el! Ezzel a kóddal végezhetsz API hívásokat.","profile_oauth_confidential":"Bizalmas","profile_oauth_confidential_help":"Titkos kód használata a kliens bejelentkezéséhez. Bizonyos kliensek biztonságosan tudnak hitelesítő adatokat tárolni, anélkül hogy jogosulatlan fél hozzáférhetne. Nyilvános kliensek, például mint asztali vagy JavaScript SPA alkalmazások nem tudnak biztonságosan titkos kódot tárolni.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Kamatfizetési időpont","book_date":"Könyvelés dátuma","process_date":"Feldolgozás dátuma","due_date":"Lejárati időpont","foreign_amount":"Külföldi összeg","payment_date":"Fizetés dátuma","invoice_date":"Számla dátuma","internal_reference":"Belső hivatkozás"},"config":{"html_language":"hu"}}')},3092:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"La tua situazione finanziaria","flash_error":"Errore!","flash_success":"Successo!","close":"Chiudi","split_transaction_title":"Descrizione della transazione suddivisa","errors_submission":"Errore durante l\'invio. Controlla gli errori segnalati qui sotto.","split":"Dividi","single_split":"Divisione","transaction_stored_link":"La transazione #{ID} (\\"{title}\\") è stata salvata.","transaction_updated_link":"La transazione #{ID} è stata aggiornata.","transaction_new_stored_link":"La transazione #{ID} è stata salvata.","transaction_journal_information":"Informazioni transazione","no_budget_pointer":"Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget. I budget possono aiutarti a tenere traccia delle spese.","no_bill_pointer":"Sembra che tu non abbia ancora delle bollette. Dovresti crearne alcune nella pagina delle bollette. Le bollette possono aiutarti a tenere traccia delle spese.","source_account":"Conto di origine","hidden_fields_preferences":"Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni.","destination_account":"Conto destinazione","add_another_split":"Aggiungi un\'altra divisione","submission":"Invio","create_another":"Dopo il salvataggio, torna qui per crearne un\'altra.","reset_after":"Resetta il modulo dopo l\'invio","submit":"Invia","amount":"Importo","date":"Data","tags":"Etichette","no_budget":"(nessun budget)","no_bill":"(nessuna bolletta)","category":"Categoria","attachments":"Allegati","notes":"Note","external_uri":"URL esterno","update_transaction":"Aggiorna transazione","after_update_create_another":"Dopo l\'aggiornamento, torna qui per continuare la modifica.","store_as_new":"Salva come nuova transazione invece di aggiornarla.","split_title_help":"Se crei una transazione suddivisa è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","none_in_select_list":"(nessuna)","no_piggy_bank":"(nessun salvadanaio)","description":"Descrizione","split_transaction_title_help":"Se crei una transazione suddivisa, è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","destination_account_reconciliation":"Non è possibile modificare il conto di destinazione di una transazione di riconciliazione.","source_account_reconciliation":"Non puoi modificare il conto di origine di una transazione di riconciliazione.","budget":"Budget","bill":"Bolletta","you_create_withdrawal":"Stai creando un prelievo.","you_create_transfer":"Stai creando un trasferimento.","you_create_deposit":"Stai creando un deposito.","edit":"Modifica","delete":"Elimina","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Qualcosa non ha funzionato!","profile_try_again":"Qualcosa non ha funzionato. Riprova.","profile_oauth_clients":"Client OAuth","profile_oauth_no_clients":"Non hai creato nessun client OAuth.","profile_oauth_clients_header":"Client","profile_oauth_client_id":"ID client","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segreto","profile_oauth_create_new_client":"Crea nuovo client","profile_oauth_create_client":"Crea client","profile_oauth_edit_client":"Modifica client","profile_oauth_name_help":"Qualcosa di cui i tuoi utenti potranno riconoscere e fidarsi.","profile_oauth_redirect_url":"URL di reindirizzamento","profile_oauth_redirect_url_help":"L\'URL di callback dell\'autorizzazione della tua applicazione.","profile_authorized_apps":"Applicazioni autorizzate","profile_authorized_clients":"Client autorizzati","profile_scopes":"Ambiti","profile_revoke":"Revoca","profile_personal_access_tokens":"Token di acceso personale","profile_personal_access_token":"Token di acceso personale","profile_personal_access_token_explanation":"Ecco il tuo nuovo token di accesso personale. Questa è l\'unica volta che ti viene mostrato per cui non perderlo! Da adesso puoi utilizzare questo token per effettuare delle richieste API.","profile_no_personal_access_token":"Non hai creato alcun token di accesso personale.","profile_create_new_token":"Crea nuovo token","profile_create_token":"Crea token","profile_create":"Crea","profile_save_changes":"Salva modifiche","default_group_title_name":"(non in un gruppo)","piggy_bank":"Salvadanaio","profile_oauth_client_secret_title":"Segreto del client","profile_oauth_client_secret_expl":"Ecco il segreto del nuovo client. Questa è l\'unica occasione in cui viene mostrato pertanto non perderlo! Ora puoi usare questo segreto per effettuare delle richieste alle API.","profile_oauth_confidential":"Riservato","profile_oauth_confidential_help":"Richiede al client di autenticarsi con un segreto. I client riservati possono conservare le credenziali in modo sicuro senza esporle a soggetti non autorizzati. Le applicazioni pubbliche, come le applicazioni desktop native o JavaScript SPA, non sono in grado di conservare i segreti in modo sicuro.","multi_account_warning_unknown":"A seconda del tipo di transazione che hai creato, il conto di origine e/o destinazione delle successive suddivisioni può essere sovrascritto da qualsiasi cosa sia definita nella prima suddivisione della transazione.","multi_account_warning_withdrawal":"Ricorda che il conto di origine delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del prelievo.","multi_account_warning_deposit":"Ricorda che il conto di destinazione delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del deposito.","multi_account_warning_transfer":"Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento."},"form":{"interest_date":"Data di valuta","book_date":"Data contabile","process_date":"Data elaborazione","due_date":"Data scadenza","foreign_amount":"Importo estero","payment_date":"Data pagamento","invoice_date":"Data fatturazione","internal_reference":"Riferimento interno"},"config":{"html_language":"it"}}')},2502:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Feil!","flash_success":"Suksess!","close":"Lukk","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Del opp","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaksjonsinformasjon","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Legg til en oppdeling til","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Send inn","amount":"Beløp","date":"Dato","tags":"Tagger","no_budget":"(ingen budsjett)","no_bill":"(no bill)","category":"Kategori","attachments":"Vedlegg","notes":"Notater","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(ingen)","no_piggy_bank":"(no piggy bank)","description":"Beskrivelse","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Busjett","bill":"Regning","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Rediger","delete":"Slett","name":"Navn","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Sparegris","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Rentedato","book_date":"Bokføringsdato","process_date":"Prosesseringsdato","due_date":"Forfallsdato","foreign_amount":"Utenlandske beløp","payment_date":"Betalingsdato","invoice_date":"Fakturadato","internal_reference":"Intern referanse"},"config":{"html_language":"nb"}}')},78:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Hoe staat het er voor?","flash_error":"Fout!","flash_success":"Gelukt!","close":"Sluiten","split_transaction_title":"Beschrijving van de gesplitste transactie","errors_submission":"Er ging iets mis. Check de errors.","split":"Splitsen","single_split":"Split","transaction_stored_link":"Transactie #{ID} (\\"{title}\\") is opgeslagen.","transaction_updated_link":"Transactie #{ID} is geüpdatet.","transaction_new_stored_link":"Transactie #{ID} is opgeslagen.","transaction_journal_information":"Transactieinformatie","no_budget_pointer":"Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.","no_bill_pointer":"Je hebt nog geen contracten. Maak er een aantal op de contracten-pagina. Met contracten kan je je uitgaven beter bijhouden.","source_account":"Bronrekening","hidden_fields_preferences":"Je kan meer transactieopties inschakelen in je instellingen.","destination_account":"Doelrekening","add_another_split":"Voeg een split toe","submission":"Indienen","create_another":"Terug naar deze pagina voor een nieuwe transactie.","reset_after":"Reset formulier na opslaan","submit":"Invoeren","amount":"Bedrag","date":"Datum","tags":"Tags","no_budget":"(geen budget)","no_bill":"(geen contract)","category":"Categorie","attachments":"Bijlagen","notes":"Notities","external_uri":"Externe URL","update_transaction":"Update transactie","after_update_create_another":"Na het opslaan terug om door te gaan met wijzigen.","store_as_new":"Opslaan als nieuwe transactie ipv de huidige bij te werken.","split_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","none_in_select_list":"(geen)","no_piggy_bank":"(geen spaarpotje)","description":"Omschrijving","split_transaction_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","destination_account_reconciliation":"Je kan de doelrekening van een afstemming niet wijzigen.","source_account_reconciliation":"Je kan de bronrekening van een afstemming niet wijzigen.","budget":"Budget","bill":"Contract","you_create_withdrawal":"Je maakt een uitgave.","you_create_transfer":"Je maakt een overschrijving.","you_create_deposit":"Je maakt inkomsten.","edit":"Wijzig","delete":"Verwijder","name":"Naam","profile_whoops":"Oeps!","profile_something_wrong":"Er is iets mis gegaan!","profile_try_again":"Er is iets misgegaan. Probeer het nogmaals.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Je hebt nog geen OAuth-clients aangemaakt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Naam","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Nieuwe client aanmaken","profile_oauth_create_client":"Client aanmaken","profile_oauth_edit_client":"Client bewerken","profile_oauth_name_help":"Iets dat je gebruikers herkennen en vertrouwen.","profile_oauth_redirect_url":"Redirect-URL","profile_oauth_redirect_url_help":"De authorisatie-callback-url van jouw applicatie.","profile_authorized_apps":"Geautoriseerde toepassingen","profile_authorized_clients":"Geautoriseerde clients","profile_scopes":"Scopes","profile_revoke":"Intrekken","profile_personal_access_tokens":"Persoonlijke toegangstokens","profile_personal_access_token":"Persoonlijk toegangstoken","profile_personal_access_token_explanation":"Hier is je nieuwe persoonlijke toegangstoken. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan deze toegangstoken gebruiken om API-aanvragen te maken.","profile_no_personal_access_token":"Je hebt nog geen persoonlijke toegangstokens aangemaakt.","profile_create_new_token":"Nieuwe token aanmaken","profile_create_token":"Token aanmaken","profile_create":"Creër","profile_save_changes":"Aanpassingen opslaan","default_group_title_name":"(ongegroepeerd)","piggy_bank":"Spaarpotje","profile_oauth_client_secret_title":"Client secret","profile_oauth_client_secret_expl":"Hier is je nieuwe client secret. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan dit secret gebruiken om API-aanvragen te maken.","profile_oauth_confidential":"Vertrouwelijk","profile_oauth_confidential_help":"Dit vinkje is bedoeld voor applicaties die geheimen kunnen bewaren. Applicaties zoals sommige desktop-apps en Javascript apps kunnen dit niet. In zo\'n geval haal je het vinkje weg.","multi_account_warning_unknown":"Afhankelijk van het type transactie wordt de bron- en/of doelrekening overschreven door wat er in de eerste split staat.","multi_account_warning_withdrawal":"De bronrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_deposit":"De doelrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_transfer":"De bron + doelrekening wordt overschreven door wat er in de eerste split staat."},"form":{"interest_date":"Rentedatum","book_date":"Boekdatum","process_date":"Verwerkingsdatum","due_date":"Vervaldatum","foreign_amount":"Bedrag in vreemde valuta","payment_date":"Betalingsdatum","invoice_date":"Factuurdatum","internal_reference":"Interne verwijzing"},"config":{"html_language":"nl"}}')},8691:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Co jest grane?","flash_error":"Błąd!","flash_success":"Sukces!","close":"Zamknij","split_transaction_title":"Opis podzielonej transakcji","errors_submission":"Coś poszło nie tak w czasie zapisu. Proszę sprawdź błędy.","split":"Podziel","single_split":"Podział","transaction_stored_link":"Transakcja #{ID} (\\"{title}\\") została zapisana.","transaction_updated_link":"Transakcja #{ID} została zaktualizowana.","transaction_new_stored_link":"Transakcja #{ID} została zapisana.","transaction_journal_information":"Informacje o transakcji","no_budget_pointer":"Wygląda na to, że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżetów. Budżety mogą Ci pomóc śledzić wydatki.","no_bill_pointer":"Wygląda na to, że nie masz jeszcze rachunków. Powinieneś utworzyć kilka na stronie rachunków. Rachunki mogą Ci pomóc śledzić wydatki.","source_account":"Konto źródłowe","hidden_fields_preferences":"Możesz włączyć więcej opcji transakcji w swoich ustawieniach.","destination_account":"Konto docelowe","add_another_split":"Dodaj kolejny podział","submission":"Zapisz","create_another":"Po zapisaniu wróć tutaj, aby utworzyć kolejny.","reset_after":"Wyczyść formularz po zapisaniu","submit":"Prześlij","amount":"Kwota","date":"Data","tags":"Tagi","no_budget":"(brak budżetu)","no_bill":"(brak rachunku)","category":"Kategoria","attachments":"Załączniki","notes":"Notatki","external_uri":"Zewnętrzny adres URL","update_transaction":"Zaktualizuj transakcję","after_update_create_another":"Po aktualizacji wróć tutaj, aby kontynuować edycję.","store_as_new":"Zapisz jako nową zamiast aktualizować.","split_title_help":"Podzielone transakcje muszą posiadać globalny opis.","none_in_select_list":"(żadne)","no_piggy_bank":"(brak skarbonki)","description":"Opis","split_transaction_title_help":"Jeśli tworzysz podzieloną transakcję, musi ona posiadać globalny opis dla wszystkich podziałów w transakcji.","destination_account_reconciliation":"Nie możesz edytować konta docelowego transakcji uzgadniania.","source_account_reconciliation":"Nie możesz edytować konta źródłowego transakcji uzgadniania.","budget":"Budżet","bill":"Rachunek","you_create_withdrawal":"Tworzysz wydatek.","you_create_transfer":"Tworzysz przelew.","you_create_deposit":"Tworzysz wpłatę.","edit":"Modyfikuj","delete":"Usuń","name":"Nazwa","profile_whoops":"Uuuups!","profile_something_wrong":"Coś poszło nie tak!","profile_try_again":"Coś poszło nie tak. Spróbuj ponownie.","profile_oauth_clients":"Klienci OAuth","profile_oauth_no_clients":"Nie utworzyłeś żadnych klientów OAuth.","profile_oauth_clients_header":"Klienci","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Nazwa","profile_oauth_client_secret":"Sekretny klucz","profile_oauth_create_new_client":"Utwórz nowego klienta","profile_oauth_create_client":"Utwórz klienta","profile_oauth_edit_client":"Edytuj klienta","profile_oauth_name_help":"Coś, co Twoi użytkownicy będą rozpoznawać i ufać.","profile_oauth_redirect_url":"Przekierowanie URL","profile_oauth_redirect_url_help":"Adres URL wywołania zwrotnego autoryzacji aplikacji.","profile_authorized_apps":"Autoryzowane aplikacje","profile_authorized_clients":"Autoryzowani klienci","profile_scopes":"Zakresy","profile_revoke":"Unieważnij","profile_personal_access_tokens":"Osobiste tokeny dostępu","profile_personal_access_token":"Osobisty token dostępu","profile_personal_access_token_explanation":"Oto twój nowy osobisty token dostępu. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego tokenu, aby wykonać zapytania API.","profile_no_personal_access_token":"Nie utworzyłeś żadnych osobistych tokenów.","profile_create_new_token":"Utwórz nowy token","profile_create_token":"Utwórz token","profile_create":"Utwórz","profile_save_changes":"Zapisz zmiany","default_group_title_name":"(bez grupy)","piggy_bank":"Skarbonka","profile_oauth_client_secret_title":"Sekret klienta","profile_oauth_client_secret_expl":"Oto twój nowy sekret klienta. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego sekretu, aby wykonać zapytania API.","profile_oauth_confidential":"Poufne","profile_oauth_confidential_help":"Wymagaj od klienta uwierzytelnienia za pomocą sekretu. Poufni klienci mogą przechowywać poświadczenia w bezpieczny sposób bez narażania ich na dostęp przez nieuprawnione strony. Publiczne aplikacje, takie jak natywne aplikacje desktopowe lub JavaScript SPA, nie są w stanie bezpiecznie trzymać sekretów.","multi_account_warning_unknown":"W zależności od rodzaju transakcji, którą tworzysz, konto źródłowe i/lub docelowe kolejnych podziałów może zostać ustawione na konto zdefiniowane w pierwszym podziale transakcji.","multi_account_warning_withdrawal":"Pamiętaj, że konto źródłowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wypłaty.","multi_account_warning_deposit":"Pamiętaj, że konto docelowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wpłaty.","multi_account_warning_transfer":"Pamiętaj, że konta źródłowe i docelowe kolejnych podziałów zostaną ustawione na konto zdefiniowane w pierwszym podziale transferu."},"form":{"interest_date":"Data odsetek","book_date":"Data księgowania","process_date":"Data przetworzenia","due_date":"Termin realizacji","foreign_amount":"Kwota zagraniczna","payment_date":"Data płatności","invoice_date":"Data faktury","internal_reference":"Wewnętrzny numer"},"config":{"html_language":"pl"}}')},122:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"O que está acontecendo?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transação dividida","errors_submission":"Há algo de errado com o seu envio. Por favor, verifique os erros abaixo.","split":"Dividir","single_split":"Divisão","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi salva.","transaction_updated_link":"Transação #{ID} foi atualizada.","transaction_new_stored_link":"Transação #{ID} foi salva.","transaction_journal_information":"Informação da transação","no_budget_pointer":"Parece que você ainda não tem orçamentos. Você deve criar alguns na página de orçamentos. Orçamentos podem ajudá-lo a manter o controle das despesas.","no_bill_pointer":"Parece que você ainda não tem contas. Você deve criar algumas em contas. Contas podem ajudar você a manter o controle de despesas.","source_account":"Conta origem","hidden_fields_preferences":"Você pode habilitar mais opções de transação em suas preferências.","destination_account":"Conta destino","add_another_split":"Adicionar outra divisão","submission":"Envio","create_another":"Depois de armazenar, retorne aqui para criar outro.","reset_after":"Resetar o formulário após o envio","submit":"Enviar","amount":"Valor","date":"Data","tags":"Tags","no_budget":"(sem orçamento)","no_bill":"(sem conta)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL externa","update_transaction":"Atualizar transação","after_update_create_another":"Depois de atualizar, retorne aqui para continuar editando.","store_as_new":"Armazene como uma nova transação em vez de atualizar.","split_title_help":"Se você criar uma transação dividida, é necessário haver uma descrição global para todas as partes da transação.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum cofrinho)","description":"Descrição","split_transaction_title_help":"Se você criar uma transação dividida, deve haver uma descrição global para todas as partes da transação.","destination_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","source_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","budget":"Orçamento","bill":"Fatura","you_create_withdrawal":"Você está criando uma saída.","you_create_transfer":"Você está criando uma transferência.","you_create_deposit":"Você está criando uma entrada.","edit":"Editar","delete":"Apagar","name":"Nome","profile_whoops":"Ops!","profile_something_wrong":"Alguma coisa deu errado!","profile_try_again":"Algo deu errado. Por favor tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Você não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segredo","profile_oauth_create_new_client":"Criar um novo cliente","profile_oauth_create_client":"Criar um cliente","profile_oauth_edit_client":"Editar cliente","profile_oauth_name_help":"Alguma coisa que seus usuários vão reconhecer e identificar.","profile_oauth_redirect_url":"URL de redirecionamento","profile_oauth_redirect_url_help":"A URL de retorno da sua solicitação de autorização.","profile_authorized_apps":"Aplicativos autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Escopos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está seu novo token de acesso pessoal. Esta é a única vez que ela será mostrada então não perca! Agora você pode usar esse token para fazer solicitações de API.","profile_no_personal_access_token":"Você não criou nenhum token de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Salvar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Cofrinho","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu novo segredo de cliente. Esta é a única vez que ela será mostrada, então não o perca! Agora você pode usar este segredo para fazer requisições de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exige que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expô-las à partes não autorizadas. Aplicações públicas, como aplicações de área de trabalho nativas ou JavaScript SPA, são incapazes de manter segredos com segurança.","multi_account_warning_unknown":"Dependendo do tipo de transação que você criar, a conta de origem e/ou de destino das divisões subsequentes pode ser sobrescrita pelo que estiver definido na primeira divisão da transação.","multi_account_warning_withdrawal":"Tenha em mente que a conta de origem das subsequentes divisões será sobrescrita pelo que estiver definido na primeira divisão da saída.","multi_account_warning_deposit":"Tenha em mente que a conta de destino das divisões subsequentes será sobrescrita pelo que estiver definido na primeira divisão da entrada.","multi_account_warning_transfer":"Tenha em mente que a conta de origem + de destino das divisões subsequentes será sobrescrita pelo que for definido na primeira divisão da transferência."},"form":{"interest_date":"Data de interesse","book_date":"Data reserva","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante em moeda estrangeira","payment_date":"Data de pagamento","invoice_date":"Data da Fatura","internal_reference":"Referência interna"},"config":{"html_language":"pt-br"}}')},4895:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Tudo bem?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transacção dividida","errors_submission":"Aconteceu algo errado com a sua submissão. Por favor, verifique os erros.","split":"Dividir","single_split":"Dividir","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi guardada.","transaction_updated_link":"Transação#{ID} foi atualizada.","transaction_new_stored_link":"Transação#{ID} foi guardada.","transaction_journal_information":"Informacao da transaccao","no_budget_pointer":"Parece que ainda não tem orçamentos. Pode criar-los na página de orçamentos. Orçamentos podem ajudá-lo a controlar as despesas.","no_bill_pointer":"Parece que ainda não tem contas. Pode criar-las na página de contas. Contas podem ajudá-lo a controlar as despesas.","source_account":"Conta de origem","hidden_fields_preferences":"Pode ativar mais opções de transações nas suas preferências.","destination_account":"Conta de destino","add_another_split":"Adicionar outra divisão","submission":"Submissão","create_another":"Depois de guardar, voltar aqui para criar outra.","reset_after":"Repor o formulário após o envio","submit":"Enviar","amount":"Montante","date":"Data","tags":"Tags","no_budget":"(sem orcamento)","no_bill":"(sem contas)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL Externo","update_transaction":"Actualizar transacção","after_update_create_another":"Após a atualização, regresse aqui para continuar a editar.","store_as_new":"Guarde como uma nova transação em vez de atualizar.","split_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum mealheiro)","description":"Descricao","split_transaction_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","destination_account_reconciliation":"Não pode editar a conta de destino de uma transacção de reconciliação.","source_account_reconciliation":"Não pode editar a conta de origem de uma transacção de reconciliação.","budget":"Orcamento","bill":"Conta","you_create_withdrawal":"Está a criar um levantamento.","you_create_transfer":"Está a criar uma transferência.","you_create_deposit":"Está a criar um deposito.","edit":"Alterar","delete":"Apagar","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Algo correu mal!","profile_try_again":"Algo correu mal. Por favor, tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Código secreto","profile_oauth_create_new_client":"Criar Novo Cliente","profile_oauth_create_client":"Criar Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que os utilizadores reconheçam e confiem.","profile_oauth_redirect_url":"URL de redireccionamento","profile_oauth_redirect_url_help":"URL de callback de autorização da aplicação.","profile_authorized_apps":"Aplicações autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Contextos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está o seu novo token de acesso pessoal. Esta é a única vês que o mesmo será mostrado portanto não o perca! Pode utiliza-lo para fazer pedidos de API.","profile_no_personal_access_token":"Você ainda não criou tokens de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Guardar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Mealheiro","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu segredo de cliente. Apenas estará visível uma vez portanto não o perca! Pode agora utilizar este segredo para fazer pedidos à API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exigir que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expor as mesmas a terceiros não autorizadas. Aplicações públicas, como por exemplo aplicações nativas de sistema operativo ou SPA JavaScript, são incapazes de garantir a segurança dos segredos.","multi_account_warning_unknown":"Dependendo do tipo de transição que quer criar, a conta de origem e/ou a destino de subsequentes divisões pode ser sub-escrita por quaisquer regra definida na primeira divisão da transação.","multi_account_warning_withdrawal":"Mantenha em mente que a conta de origem de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do levantamento.","multi_account_warning_deposit":"Mantenha em mente que a conta de destino de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do depósito.","multi_account_warning_transfer":"Mantenha em mente que a conta de origem + destino de divisões subsequentes serão sobre-escritas por quaisquer regras definidas na divisão da transferência."},"form":{"interest_date":"Data de juros","book_date":"Data de registo","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante estrangeiro","payment_date":"Data de pagamento","invoice_date":"Data da factura","internal_reference":"Referencia interna"},"config":{"html_language":"pt"}}')},403:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ce se redă?","flash_error":"Eroare!","flash_success":"Succes!","close":"Închide","split_transaction_title":"Descrierea tranzacției divizate","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Împarte","single_split":"Împarte","transaction_stored_link":"Tranzacția #{ID} (\\"{title}\\") a fost stocată.","transaction_updated_link":"Tranzacția #{ID} a fost actualizată.","transaction_new_stored_link":"Tranzacția #{ID} a fost stocată.","transaction_journal_information":"Informații despre tranzacții","no_budget_pointer":"Se pare că nu aveți încă bugete. Ar trebui să creați câteva pe pagina bugete. Bugetele vă pot ajuta să țineți evidența cheltuielilor.","no_bill_pointer":"Se pare că nu aveți încă facturi. Ar trebui să creați unele pe pagina facturi. Facturile vă pot ajuta să țineți evidența cheltuielilor.","source_account":"Contul sursă","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Contul de destinație","add_another_split":"Adăugați o divizare","submission":"Transmitere","create_another":"După stocare, reveniți aici pentru a crea alta.","reset_after":"Resetați formularul după trimitere","submit":"Trimite","amount":"Sumă","date":"Dată","tags":"Etichete","no_budget":"(nici un buget)","no_bill":"(no bill)","category":"Categorie","attachments":"Atașamente","notes":"Notițe","external_uri":"External URL","update_transaction":"Actualizați tranzacția","after_update_create_another":"După actualizare, reveniți aici pentru a continua editarea.","store_as_new":"Stocați ca o tranzacție nouă în loc să actualizați.","split_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","none_in_select_list":"(nici unul)","no_piggy_bank":"(nicio pușculiță)","description":"Descriere","split_transaction_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","destination_account_reconciliation":"Nu puteți edita contul de destinație al unei tranzacții de reconciliere.","source_account_reconciliation":"Nu puteți edita contul sursă al unei tranzacții de reconciliere.","budget":"Buget","bill":"Factură","you_create_withdrawal":"Creezi o retragere.","you_create_transfer":"Creezi un transfer.","you_create_deposit":"Creezi un depozit.","edit":"Editează","delete":"Șterge","name":"Nume","profile_whoops":"Hopaa!","profile_something_wrong":"A apărut o eroare!","profile_try_again":"A apărut o problemă. Încercați din nou.","profile_oauth_clients":"Clienți OAuth","profile_oauth_no_clients":"Nu ați creat niciun client OAuth.","profile_oauth_clients_header":"Clienți","profile_oauth_client_id":"ID Client","profile_oauth_client_name":"Nume","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Creare client nou","profile_oauth_create_client":"Creare client","profile_oauth_edit_client":"Editare client","profile_oauth_name_help":"Ceva ce utilizatorii vor recunoaște și vor avea încredere.","profile_oauth_redirect_url":"Redirectioneaza URL","profile_oauth_redirect_url_help":"URL-ul de retroapelare al aplicației dvs.","profile_authorized_apps":"Aplicațiile dvs autorizate","profile_authorized_clients":"Clienți autorizați","profile_scopes":"Domenii","profile_revoke":"Revocați","profile_personal_access_tokens":"Token de acces personal","profile_personal_access_token":"Token de acces personal","profile_personal_access_token_explanation":"Aici este noul dvs. token de acces personal. Este singura dată când va fi afișat așa că nu îl pierde! Acum poți folosi acest token pentru a face cereri API.","profile_no_personal_access_token":"Nu aţi creat nici un token personal de acces.","profile_create_new_token":"Crează un nou token","profile_create_token":"Crează token","profile_create":"Crează","profile_save_changes":"Salvează modificările","default_group_title_name":"(ungrouped)","piggy_bank":"Pușculiță","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Data de interes","book_date":"Rezervă dată","process_date":"Data procesării","due_date":"Data scadentă","foreign_amount":"Sumă străină","payment_date":"Data de plată","invoice_date":"Data facturii","internal_reference":"Referință internă"},"config":{"html_language":"ro"}}')},7448:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Что происходит с моими финансами?","flash_error":"Ошибка!","flash_success":"Успешно!","close":"Закрыть","split_transaction_title":"Описание разделённой транзакции","errors_submission":"При отправке что-то пошло не так. Пожалуйста, проверьте ошибки ниже.","split":"Разделить","single_split":"Разделённая транзакция","transaction_stored_link":"Транзакция #{ID} (\\"{title}\\") сохранена.","transaction_updated_link":"Транзакция #{ID} обновлена.","transaction_new_stored_link":"Транзакция #{ID} сохранена.","transaction_journal_information":"Информация о транзакции","no_budget_pointer":"Похоже, у вас пока нет бюджетов. Вы должны создать их на странице Бюджеты. Бюджеты могут помочь вам отслеживать расходы.","no_bill_pointer":"Похоже, у вас пока нет счетов на оплату. Вы должны создать их на странице Счета на оплату. Счета на оплату могут помочь вам отслеживать расходы.","source_account":"Счёт-источник","hidden_fields_preferences":"Вы можете включить больше параметров транзакции в настройках.","destination_account":"Счёт назначения","add_another_split":"Добавить еще одну часть","submission":"Отправить","create_another":"После сохранения вернуться сюда и создать ещё одну аналогичную запись.","reset_after":"Сбросить форму после отправки","submit":"Подтвердить","amount":"Сумма","date":"Дата","tags":"Метки","no_budget":"(вне бюджета)","no_bill":"(нет счёта на оплату)","category":"Категория","attachments":"Вложения","notes":"Заметки","external_uri":"Внешний URL","update_transaction":"Обновить транзакцию","after_update_create_another":"После обновления вернитесь сюда, чтобы продолжить редактирование.","store_as_new":"Сохранить как новую транзакцию вместо обновления.","split_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание дле всех её составляющих.","none_in_select_list":"(нет)","no_piggy_bank":"(нет копилки)","description":"Описание","split_transaction_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание для всех её составляющих.","destination_account_reconciliation":"Вы не можете редактировать счёт назначения для сверяемой транзакции.","source_account_reconciliation":"Вы не можете редактировать счёт-источник для сверяемой транзакции.","budget":"Бюджет","bill":"Счёт к оплате","you_create_withdrawal":"Вы создаёте расход.","you_create_transfer":"Вы создаёте перевод.","you_create_deposit":"Вы создаёте доход.","edit":"Изменить","delete":"Удалить","name":"Название","profile_whoops":"Ууупс!","profile_something_wrong":"Что-то пошло не так!","profile_try_again":"Произошла ошибка. Пожалуйста, попробуйте снова.","profile_oauth_clients":"Клиенты OAuth","profile_oauth_no_clients":"У вас пока нет клиентов OAuth.","profile_oauth_clients_header":"Клиенты","profile_oauth_client_id":"ID клиента","profile_oauth_client_name":"Название","profile_oauth_client_secret":"Секретный ключ","profile_oauth_create_new_client":"Создать нового клиента","profile_oauth_create_client":"Создать клиента","profile_oauth_edit_client":"Изменить клиента","profile_oauth_name_help":"Что-то, что ваши пользователи знают, и чему доверяют.","profile_oauth_redirect_url":"URL редиректа","profile_oauth_redirect_url_help":"URL обратного вызова для вашего приложения.","profile_authorized_apps":"Авторизованные приложения","profile_authorized_clients":"Авторизованные клиенты","profile_scopes":"Разрешения","profile_revoke":"Отключить","profile_personal_access_tokens":"Персональные Access Tokens","profile_personal_access_token":"Персональный Access Token","profile_personal_access_token_explanation":"Вот ваш новый персональный токен доступа. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот токен, чтобы делать запросы по API.","profile_no_personal_access_token":"Вы не создали ни одного персонального токена доступа.","profile_create_new_token":"Создать новый токен","profile_create_token":"Создать токен","profile_create":"Создать","profile_save_changes":"Сохранить изменения","default_group_title_name":"(без группировки)","piggy_bank":"Копилка","profile_oauth_client_secret_title":"Ключ клиента","profile_oauth_client_secret_expl":"Вот ваш новый ключ клиента. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот ключ, чтобы делать запросы по API.","profile_oauth_confidential":"Конфиденциальный","profile_oauth_confidential_help":"Требовать, чтобы клиент аутентифицировался с секретным ключом. Конфиденциальные клиенты могут хранить учётные данные в надёжном виде, защищая их от несанкционированного доступа. Публичные приложения, такие как обычный рабочий стол или приложения JavaScript SPA, не могут надёжно хранить ваши ключи.","multi_account_warning_unknown":"В зависимости от типа транзакции, которую вы создаёте, счёт-источник и/или счёт назначения следующих частей разделённой транзакции могут быть заменены теми, которые указаны для первой части транзакции.","multi_account_warning_withdrawal":"Имейте в виду, что счёт-источник в других частях разделённой транзакции будет таким же, как в первой части расхода.","multi_account_warning_deposit":"Имейте в виду, что счёт назначения в других частях разделённой транзакции будет таким же, как в первой части дохода.","multi_account_warning_transfer":"Имейте в виду, что счёт-источник и счёт назначения в других частях разделённой транзакции будут такими же, как в первой части перевода."},"form":{"interest_date":"Дата начисления процентов","book_date":"Дата бронирования","process_date":"Дата обработки","due_date":"Срок оплаты","foreign_amount":"Сумма в иностранной валюте","payment_date":"Дата платежа","invoice_date":"Дата выставления счёта","internal_reference":"Внутренняя ссылка"},"config":{"html_language":"ru"}}')},6949:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ako to ide?","flash_error":"Chyba!","flash_success":"Hotovo!","close":"Zavrieť","split_transaction_title":"Popis rozúčtovania","errors_submission":"Pri odosielaní sa niečo nepodarilo. Skontrolujte prosím chyby.","split":"Rozúčtovať","single_split":"Rozúčtovať","transaction_stored_link":"Transakcia #{ID} (\\"{title}\\") bola uložená.","transaction_updated_link":"Transakcia #{ID} bola aktualizovaná.","transaction_new_stored_link":"Transakcia #{ID} bola uložená.","transaction_journal_information":"Informácie o transakcii","no_budget_pointer":"Zdá sa, že zatiaľ nemáte žiadne rozpočty. Na stránke rozpočty by ste si nejaké mali vytvoriť. Rozpočty môžu pomôcť udržať prehľad vo výdavkoch.","no_bill_pointer":"Zdá sa, že zatiaľ nemáte žiadne účty. Na stránke účty by ste mali nejaké vytvoriť. Účty môžu pomôcť udržať si prehľad vo výdavkoch.","source_account":"Zdrojový účet","hidden_fields_preferences":"Viac možností transakcií môžete povoliť vo svojich nastaveniach.","destination_account":"Cieľový účet","add_another_split":"Pridať ďalšie rozúčtovanie","submission":"Odoslanie","create_another":"Po uložení sa vrátiť späť sem a vytvoriť ďalší.","reset_after":"Po odoslaní vynulovať formulár","submit":"Odoslať","amount":"Suma","date":"Dátum","tags":"Štítky","no_budget":"(žiadny rozpočet)","no_bill":"(žiadny účet)","category":"Kategória","attachments":"Prílohy","notes":"Poznámky","external_uri":"Externá URL","update_transaction":"Upraviť transakciu","after_update_create_another":"Po aktualizácii sa vrátiť späť a pokračovať v úpravách.","store_as_new":"Namiesto aktualizácie uložiť ako novú transakciu.","split_title_help":"Ak vytvoríte rozúčtovanie transakcie, je potrebné, aby ste určili všeobecný popis pre všetky rozúčtovania danej transakcie.","none_in_select_list":"(žiadne)","no_piggy_bank":"(žiadna pokladnička)","description":"Popis","split_transaction_title_help":"Ak vytvoríte rozúčtovanú transakciu, musí existovať globálny popis všetkých rozúčtovaní transakcie.","destination_account_reconciliation":"Nemôžete upraviť cieľový účet zúčtovacej transakcie.","source_account_reconciliation":"Nemôžete upraviť zdrojový účet zúčtovacej transakcie.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"Vytvárate výber.","you_create_transfer":"Vytvárate prevod.","you_create_deposit":"Vytvárate vklad.","edit":"Upraviť","delete":"Odstrániť","name":"Názov","profile_whoops":"Ajaj!","profile_something_wrong":"Niečo sa pokazilo!","profile_try_again":"Niečo sa pokazilo. Prosím, skúste znova.","profile_oauth_clients":"OAuth klienti","profile_oauth_no_clients":"Zatiaľ ste nevytvorili žiadneho OAuth klienta.","profile_oauth_clients_header":"Klienti","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Meno/Názov","profile_oauth_client_secret":"Tajný kľúč","profile_oauth_create_new_client":"Vytvoriť nového klienta","profile_oauth_create_client":"Vytvoriť klienta","profile_oauth_edit_client":"Upraviť klienta","profile_oauth_name_help":"Niečo, čo vaši použivatelia poznajú a budú tomu dôverovať.","profile_oauth_redirect_url":"URL presmerovania","profile_oauth_redirect_url_help":"Spätná URL pre overenie autorizácie vašej aplikácie.","profile_authorized_apps":"Povolené aplikácie","profile_authorized_clients":"Autorizovaní klienti","profile_scopes":"Rozsahy","profile_revoke":"Odvolať","profile_personal_access_tokens":"Osobné prístupové tokeny","profile_personal_access_token":"Osobný prístupový token","profile_personal_access_token_explanation":"Toto je váš nový osobný prístupový token. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz ho môžete používať pre prístup k API.","profile_no_personal_access_token":"Ešte ste nevytvorili žiadne osobné prístupové tokeny.","profile_create_new_token":"Vytvoriť nový token","profile_create_token":"Vytvoriť token","profile_create":"Vytvoriť","profile_save_changes":"Uložiť zmeny","default_group_title_name":"(nezoskupené)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Tajný kľúč klienta","profile_oauth_client_secret_expl":"Toto je váš tajný kľúč klienta. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz môžete tento tajný kľúč používať pre prístup k API.","profile_oauth_confidential":"Dôverné","profile_oauth_confidential_help":"Vyžadujte od klienta autentifikáciu pomocou tajného kľúča. Dôverní klienti môžu uchovávať poverenia bezpečným spôsobom bez toho, aby boli vystavení neoprávneným stranám. Verejné aplikácie, ako napríklad natívna pracovná plocha alebo aplikácie Java SPA, nedokážu tajné kľúče bezpečne uchovať.","multi_account_warning_unknown":"V závislosti od typu vytvorenej transakcie, môže byť zdrojový a/alebo cieľový účet následných rozúčtovaní prepísaný údajmi v prvom rozdelení transakcie.","multi_account_warning_withdrawal":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozdelení výberu.","multi_account_warning_deposit":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní vkladu.","multi_account_warning_transfer":"Majte na pamäti, že zdrojový a cieľový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní prevodu."},"form":{"interest_date":"Úrokový dátum","book_date":"Dátum rezervácie","process_date":"Dátum spracovania","due_date":"Dátum splatnosti","foreign_amount":"Suma v cudzej mene","payment_date":"Dátum úhrady","invoice_date":"Dátum vystavenia","internal_reference":"Interná referencia"},"config":{"html_language":"sk"}}')},2285:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Vad spelas?","flash_error":"Fel!","flash_success":"Slutförd!","close":"Stäng","split_transaction_title":"Beskrivning av delad transaktion","errors_submission":"Något fel uppstod med inskickningen. Vänligen kontrollera felen nedan.","split":"Dela","single_split":"Dela","transaction_stored_link":"Transaktion #{ID} (\\"{title}\\") sparades.","transaction_updated_link":"Transaktion #{ID} uppdaterades.","transaction_new_stored_link":"Transaktion #{ID} sparades.","transaction_journal_information":"Transaktionsinformation","no_budget_pointer":"Du verkar inte ha några budgetar än. Du bör skapa några på budgetar-sidan. Budgetar kan hjälpa dig att hålla reda på utgifter.","no_bill_pointer":"Du verkar inte ha några räkningar ännu. Du bör skapa några på räkningar-sidan. Räkningar kan hjälpa dig att hålla reda på utgifter.","source_account":"Källkonto","hidden_fields_preferences":"Du kan aktivera fler transaktionsalternativ i dina inställningar.","destination_account":"Till konto","add_another_split":"Lägga till en annan delning","submission":"Inskickning","create_another":"Efter sparat, återkom hit för att skapa ytterligare en.","reset_after":"Återställ formulär efter inskickat","submit":"Skicka","amount":"Belopp","date":"Datum","tags":"Etiketter","no_budget":"(ingen budget)","no_bill":"(ingen räkning)","category":"Kategori","attachments":"Bilagor","notes":"Noteringar","external_uri":"External URL","update_transaction":"Uppdatera transaktion","after_update_create_another":"Efter uppdaterat, återkom hit för att fortsätta redigera.","store_as_new":"Spara en ny transaktion istället för att uppdatera.","split_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","none_in_select_list":"(Ingen)","no_piggy_bank":"(ingen spargris)","description":"Beskrivning","split_transaction_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","destination_account_reconciliation":"Du kan inte redigera destinationskontot för en avstämningstransaktion.","source_account_reconciliation":"Du kan inte redigera källkontot för en avstämningstransaktion.","budget":"Budget","bill":"Nota","you_create_withdrawal":"Du skapar ett uttag.","you_create_transfer":"Du skapar en överföring.","you_create_deposit":"Du skapar en insättning.","edit":"Redigera","delete":"Ta bort","name":"Namn","profile_whoops":"Hoppsan!","profile_something_wrong":"Något gick fel!","profile_try_again":"Något gick fel. Försök igen.","profile_oauth_clients":"OAuth klienter","profile_oauth_no_clients":"Du har inte skapat några OAuth klienter.","profile_oauth_clients_header":"Klienter","profile_oauth_client_id":"Klient ID","profile_oauth_client_name":"Namn","profile_oauth_client_secret":"Hemlighet","profile_oauth_create_new_client":"Skapa ny klient","profile_oauth_create_client":"Skapa klient","profile_oauth_edit_client":"Redigera klient","profile_oauth_name_help":"Något som dina användare kommer att känna igen och lita på.","profile_oauth_redirect_url":"Omdirigera URL","profile_oauth_redirect_url_help":"Din applikations auktorisering callback URL.","profile_authorized_apps":"Auktoriserade applikationer","profile_authorized_clients":"Auktoriserade klienter","profile_scopes":"Omfattningar","profile_revoke":"Återkalla","profile_personal_access_tokens":"Personliga åtkomst-Tokens","profile_personal_access_token":"Personlig åtkomsttoken","profile_personal_access_token_explanation":"Här är din nya personliga tillgångs token. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna token för att göra API-förfrågningar.","profile_no_personal_access_token":"Du har inte skapat några personliga åtkomsttokens.","profile_create_new_token":"Skapa ny token","profile_create_token":"Skapa token","profile_create":"Skapa","profile_save_changes":"Spara ändringar","default_group_title_name":"(ogrupperad)","piggy_bank":"Spargris","profile_oauth_client_secret_title":"Klienthemlighet","profile_oauth_client_secret_expl":"Här är din nya klient hemlighet. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna hemlighet för att göra API-förfrågningar.","profile_oauth_confidential":"Konfidentiell","profile_oauth_confidential_help":"Kräv att klienten autentiserar med en hemlighet. Konfidentiella klienter kan hålla autentiseringsuppgifter på ett säkert sätt utan att utsätta dem för obehöriga parter. Publika applikationer, som skrivbord eller JavaScript-SPA-applikationer, kan inte hålla hemligheter på ett säkert sätt.","multi_account_warning_unknown":"Beroende på vilken typ av transaktion du skapar, källan och/eller destinationskontot för efterföljande delningar kan åsidosättas av vad som än definieras i den första delningen av transaktionen.","multi_account_warning_withdrawal":"Tänk på att källkontot för efterföljande uppdelningar kommer att upphävas av vad som än definieras i den första uppdelningen av uttaget.","multi_account_warning_deposit":"Tänk på att destinationskontot för efterföljande uppdelningar kommer att styras av vad som än definieras i den första uppdelningen av insättningen.","multi_account_warning_transfer":"Tänk på att käll + destinationskonto av efterföljande delningar kommer att styras av vad som definieras i den första uppdelningen av överföringen."},"form":{"interest_date":"Räntedatum","book_date":"Bokföringsdatum","process_date":"Behandlingsdatum","due_date":"Förfallodatum","foreign_amount":"Utländskt belopp","payment_date":"Betalningsdatum","invoice_date":"Fakturadatum","internal_reference":"Intern referens"},"config":{"html_language":"sv"}}')},9783:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Chào mừng trở lại?","flash_error":"Lỗi!","flash_success":"Thành công!","close":"Đóng","split_transaction_title":"Mô tả giao dịch tách","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Chia ra","single_split":"Split","transaction_stored_link":"Giao dịch #{ID} (\\"{title}\\") đã được lưu trữ.","transaction_updated_link":"Giao dịch#{ID} đã được cập nhật.","transaction_new_stored_link":" Giao dịch #{ID} đã được lưu trữ.","transaction_journal_information":"Thông tin giao dịch","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Nguồn tài khoản","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Tài khoản đích","add_another_split":"Thêm một phân chia khác","submission":"Gửi","create_another":"Sau khi lưu trữ, quay trở lại đây để tạo một cái khác.","reset_after":"Đặt lại mẫu sau khi gửi","submit":"Gửi","amount":"Số tiền","date":"Ngày","tags":"Nhãn","no_budget":"(không có ngân sách)","no_bill":"(no bill)","category":"Danh mục","attachments":"Tệp đính kèm","notes":"Ghi chú","external_uri":"External URL","update_transaction":"Cập nhật giao dịch","after_update_create_another":"Sau khi cập nhật, quay lại đây để tiếp tục chỉnh sửa.","store_as_new":"Lưu trữ như một giao dịch mới thay vì cập nhật.","split_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","none_in_select_list":"(Trống)","no_piggy_bank":"(chưa có heo đất)","description":"Sự miêu tả","split_transaction_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","destination_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản đích của giao dịch đối chiếu.","source_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản nguồn của giao dịch đối chiếu.","budget":"Ngân sách","bill":"Hóa đơn","you_create_withdrawal":"Bạn đang tạo một rút tiền.","you_create_transfer":"Bạn đang tạo một chuyển khoản.","you_create_deposit":"Bạn đang tạo một tiền gửi.","edit":"Sửa","delete":"Xóa","name":"Tên","profile_whoops":"Rất tiếc!","profile_something_wrong":"Có lỗi xảy ra!","profile_try_again":"Xảy ra lỗi. Vui lòng thử lại.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Bạn đã không tạo ra bất kỳ OAuth clients nào.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Tên","profile_oauth_client_secret":"Mã bí mật","profile_oauth_create_new_client":"Tạo mới Client","profile_oauth_create_client":"Tạo Client","profile_oauth_edit_client":"Sửa Client","profile_oauth_name_help":"Một cái gì đó người dùng của bạn sẽ nhận ra và tin tưởng.","profile_oauth_redirect_url":"URL chuyển tiếp","profile_oauth_redirect_url_help":"URL gọi lại ủy quyền của ứng dụng của bạn.","profile_authorized_apps":"Uỷ quyền ứng dụng","profile_authorized_clients":"Client ủy quyền","profile_scopes":"Phạm vi","profile_revoke":"Thu hồi","profile_personal_access_tokens":"Mã truy cập cá nhân","profile_personal_access_token":"Mã truy cập cá nhân","profile_personal_access_token_explanation":"Đây là mã thông báo truy cập cá nhân mới của bạn. Đây là lần duy nhất nó sẽ được hiển thị vì vậy đừng đánh mất nó! Bây giờ bạn có thể sử dụng mã thông báo này để thực hiện API.","profile_no_personal_access_token":"Bạn chưa tạo bất kỳ mã thông báo truy cập cá nhân nào.","profile_create_new_token":"Tạo mã mới","profile_create_token":"Tạo mã","profile_create":"Tạo","profile_save_changes":"Lưu thay đổi","default_group_title_name":"(chưa nhóm)","piggy_bank":"Heo đất","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ngày lãi","book_date":"Ngày đặt sách","process_date":"Ngày xử lý","due_date":"Ngày đáo hạn","foreign_amount":"Ngoại tệ","payment_date":"Ngày thanh toán","invoice_date":"Ngày hóa đơn","internal_reference":"Tài liệu tham khảo nội bộ"},"config":{"html_language":"vi"}}')},1922:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"今天理财了吗?","flash_error":"错误!","flash_success":"成功!","close":"关闭","split_transaction_title":"拆分交易的描述","errors_submission":"您提交的内容有误,请检查错误信息。","split":"拆分","single_split":"拆分","transaction_stored_link":"交易 #{ID} (“{title}”) 已保存。","transaction_updated_link":"交易 #{ID} 已更新。","transaction_new_stored_link":"交易 #{ID} 已保存。","transaction_journal_information":"交易信息","no_budget_pointer":"您还没有预算,您应该在预算页面进行创建。预算可以帮助您追踪支出。","no_bill_pointer":"您还没有账单,您应该在账单页面进行创建。账单可以帮助您追踪支出。","source_account":"来源账户","hidden_fields_preferences":"您可以在偏好设定中启用更多交易选项。","destination_account":"目标账户","add_another_split":"增加另一笔拆分","submission":"提交","create_another":"保存后,返回此页面以创建新记录","reset_after":"提交后重置表单","submit":"提交","amount":"金额","date":"日期","tags":"标签","no_budget":"(无预算)","no_bill":"(无账单)","category":"分类","attachments":"附件","notes":"备注","external_uri":"外部链接","update_transaction":"更新交易","after_update_create_another":"更新后,返回此页面继续编辑。","store_as_new":"保存为新交易而不是更新此交易。","split_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","none_in_select_list":"(空)","no_piggy_bank":"(无存钱罐)","description":"描述","split_transaction_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","destination_account_reconciliation":"您不能编辑对账交易的目标账户","source_account_reconciliation":"您不能编辑对账交易的来源账户。","budget":"预算","bill":"账单","you_create_withdrawal":"您正在创建一笔支出","you_create_transfer":"您正在创建一笔转账","you_create_deposit":"您正在创建一笔收入","edit":"编辑","delete":"删除","name":"名称","profile_whoops":"很抱歉!","profile_something_wrong":"发生错误!","profile_try_again":"发生错误,请稍后再试。","profile_oauth_clients":"OAuth 客户端","profile_oauth_no_clients":"您尚未创建任何 OAuth 客户端。","profile_oauth_clients_header":"客户端","profile_oauth_client_id":"客户端 ID","profile_oauth_client_name":"名称","profile_oauth_client_secret":"密钥","profile_oauth_create_new_client":"创建新客户端","profile_oauth_create_client":"创建客户端","profile_oauth_edit_client":"编辑客户端","profile_oauth_name_help":"您的用户可以识别并信任的信息","profile_oauth_redirect_url":"跳转网址","profile_oauth_redirect_url_help":"您的应用程序的授权回调网址","profile_authorized_apps":"已授权应用","profile_authorized_clients":"已授权客户端","profile_scopes":"范围","profile_revoke":"撤消","profile_personal_access_tokens":"个人访问令牌","profile_personal_access_token":"个人访问令牌","profile_personal_access_token_explanation":"请妥善保存您的新个人访问令牌,此令牌仅会在这里展示一次。您现在已可以使用此令牌进行 API 请求。","profile_no_personal_access_token":"您还没有创建个人访问令牌。","profile_create_new_token":"创建新令牌","profile_create_token":"创建令牌","profile_create":"创建","profile_save_changes":"保存更改","default_group_title_name":"(未分组)","piggy_bank":"存钱罐","profile_oauth_client_secret_title":"客户端密钥","profile_oauth_client_secret_expl":"请妥善保存您的新客户端的密钥,此密钥仅会在这里展示一次。您现在已可以使用此密钥进行 API 请求。","profile_oauth_confidential":"使用加密","profile_oauth_confidential_help":"要求客户端使用密钥进行认证。加密客户端可以安全储存凭据且不将其泄露给未授权方,而公共应用程序(例如本地计算机或 JavaScript SPA 应用程序)无法保证凭据的安全性。","multi_account_warning_unknown":"根据您创建的交易类型,后续拆分的来源和/或目标账户可能被交易的首笔拆分的配置所覆盖。","multi_account_warning_withdrawal":"请注意,后续拆分的来源账户将会被支出的首笔拆分的配置所覆盖。","multi_account_warning_deposit":"请注意,后续拆分的目标账户将会被收入的首笔拆分的配置所覆盖。","multi_account_warning_transfer":"请注意,后续拆分的来源和目标账户将会被转账的首笔拆分的配置所覆盖。"},"form":{"interest_date":"利息日期","book_date":"登记日期","process_date":"处理日期","due_date":"到期日","foreign_amount":"外币金额","payment_date":"付款日期","invoice_date":"发票日期","internal_reference":"内部引用"},"config":{"html_language":"zh-cn"}}')},4963:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"錯誤!","flash_success":"成功!","close":"關閉","split_transaction_title":"拆分交易的描述","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"分割","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"交易資訊","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"增加拆分","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"送出","amount":"金額","date":"日期","tags":"標籤","no_budget":"(無預算)","no_bill":"(no bill)","category":"分類","attachments":"附加檔案","notes":"備註","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"若您建立一筆拆分交易,須有一個有關交易所有拆分的整體描述。","none_in_select_list":"(空)","no_piggy_bank":"(no piggy bank)","description":"描述","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"預算","bill":"帳單","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"編輯","delete":"刪除","name":"名稱","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"小豬撲滿","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"利率日期","book_date":"登記日期","process_date":"處理日期","due_date":"到期日","foreign_amount":"外幣金額","payment_date":"付款日期","invoice_date":"發票日期","internal_reference":"內部參考"},"config":{"html_language":"zh-tw"}}')}},t={};function n(a){var i=t[a];if(void 0!==i)return i.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(e,t,n,a,i,o,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),a&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):i&&(l=s?function(){i.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:i),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var d=c.beforeCreate;c.beforeCreate=d?[].concat(d,l):[l]}return{exports:e,options:c}}const t=e({name:"CustomAttachments",props:{title:String,name:String,error:Array},mounted:function(){var e=this;window.addEventListener("paste",(function(t){e.$refs.input.files=t.clipboardData.files}))},methods:{clearAtt:function(){this.$refs.input.value=""},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",multiple:"multiple",type:"file"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearAtt}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const a=e({name:"CreateTransaction",components:{},created:function(){var e=this;this.addTransactionToArray(),document.onreadystatechange=function(){"complete"===document.readyState&&(e.prefillSourceAccount(),e.prefillDestinationAccount())}},methods:{prefillSourceAccount:function(){0!==window.sourceId&&this.getAccount(window.sourceId,"source_account")},prefillDestinationAccount:function(){0!==destinationId&&this.getAccount(window.destinationId,"destination_account")},getAccount:function(e,t){var n=this,a="./api/v1/accounts/"+e+"?_token="+document.head.querySelector('meta[name="csrf-token"]').content;axios.get(a).then((function(e){var a=e.data.data.attributes;a.type=n.fullAccountType(a.type,a.liability_type),a.id=parseInt(e.data.data.id),"source_account"===t&&n.selectedSourceAccount(0,a),"destination_account"===t&&n.selectedDestinationAccount(0,a)})).catch((function(e){console.warn("Could not auto fill account"),console.warn(e)}))},fullAccountType:function(e,t){var n,a=e;"liabilities"===e&&(a=t);return null!==(n={asset:"Asset account",loan:"Loan",debt:"Debt",mortgage:"Mortgage"}[a])&&void 0!==n?n:a},convertData:function(){var e,t,n,a={transactions:[]};for(var i in this.transactions.length>1&&(a.group_title=this.group_title),e=this.transactionType?this.transactionType.toLowerCase():"invalid",t=this.transactions[0].source_account.type,n=this.transactions[0].destination_account.type,"invalid"===e&&["asset","Asset account","Loan","Debt","Mortgage"].includes(t)&&(e="withdrawal"),"invalid"===e&&["asset","Asset account","Loan","Debt","Mortgage"].includes(n)&&(e="deposit"),this.transactions)this.transactions.hasOwnProperty(i)&&/^0$|^[1-9]\d*$/.test(i)&&i<=4294967294&&a.transactions.push(this.convertDataRow(this.transactions[i],i,e));return""===a.group_title&&a.transactions.length>1&&(a.group_title=a.transactions[0].description),a},convertDataRow:function(e,t,n){var a,i,o,r,s,l,c=[],u=null,d=null;for(var p in i=e.source_account.id,o=e.source_account.name,r=e.destination_account.id,s=e.destination_account.name,l=e.date,t>0&&(l=this.transactions[0].date),"withdrawal"===n&&""===s&&(r=window.cashAccountId),"deposit"===n&&""===o&&(i=window.cashAccountId),t>0&&("withdrawal"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(i=this.transactions[0].source_account.id,o=this.transactions[0].source_account.name),t>0&&("deposit"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(r=this.transactions[0].destination_account.id,s=this.transactions[0].destination_account.name),c=[],u=null,d=null,e.tags)e.tags.hasOwnProperty(p)&&/^0$|^[1-9]\d*$/.test(p)&&p<=4294967294&&c.push(e.tags[p].text);return""!==e.foreign_amount.amount&&0!==parseFloat(e.foreign_amount.amount)&&(u=e.foreign_amount.amount,d=e.foreign_amount.currency_id),d===e.currency_id&&(u=null,d=null),0===r&&(r=null),0===i&&(i=null),1===(e.amount.match(/\,/g)||[]).length&&(e.amount=e.amount.replace(",",".")),a={type:n,date:l,amount:e.amount,currency_id:e.currency_id,description:e.description,source_id:i,source_name:o,destination_id:r,destination_name:s,category_name:e.category,interest_date:e.custom_fields.interest_date,book_date:e.custom_fields.book_date,process_date:e.custom_fields.process_date,due_date:e.custom_fields.due_date,payment_date:e.custom_fields.payment_date,invoice_date:e.custom_fields.invoice_date,internal_reference:e.custom_fields.internal_reference,notes:e.custom_fields.notes},c.length>0&&(a.tags=c),null!==u&&(a.foreign_amount=u,a.foreign_currency_id=d),parseInt(e.budget)>0&&(a.budget_id=parseInt(e.budget)),parseInt(e.bill)>0&&(a.bill_id=parseInt(e.bill)),parseInt(e.piggy_bank)>0&&(a.piggy_bank_id=parseInt(e.piggy_bank)),a},submit:function(e){var t=this,n="./api/v1/transactions?_token="+document.head.querySelector('meta[name="csrf-token"]').content,a=this.convertData(),i=$("#submitButton");i.prop("disabled",!0),axios.post(n,a).then((function(e){0===t.collectAttachmentData(e)&&t.redirectUser(e.data.data.id,e.data.data)})).catch((function(e){console.error("Error in transaction submission."),console.error(e),t.parseErrors(e.response.data),i.removeAttr("disabled")})),e&&e.preventDefault()},escapeHTML:function(e){var t=document.createElement("div");return t.innerText=e,t.innerHTML},redirectUser:function(e,t){var n=this,a=null===t.attributes.group_title?t.attributes.transactions[0].description:t.attributes.group_title;this.createAnother?(this.success_message=this.$t("firefly.transaction_stored_link",{ID:e,title:a}),this.error_message="",this.resetFormAfter&&(this.resetTransactions(),setTimeout((function(){return n.addTransactionToArray()}),50)),this.setDefaultErrors(),$("#submitButton").removeAttr("disabled")):window.location.href=window.previousUri+"?transaction_group_id="+e+"&message=created"},collectAttachmentData:function(e){var t=this,n=e.data.data.id;e.data.data.attributes.transactions=e.data.data.attributes.transactions.reverse();var a=[],i=[],o=$('input[name="attachments[]"]');for(var r in o)if(o.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294)for(var s in o[r].files)o[r].files.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294&&a.push({journal:e.data.data.attributes.transactions[r].transaction_journal_id,file:o[r].files[s]});var l=a.length,c=function(o){var r,s,c;a.hasOwnProperty(o)&&/^0$|^[1-9]\d*$/.test(o)&&o<=4294967294&&(r=a[o],s=t,(c=new FileReader).onloadend=function(t){t.target.readyState===FileReader.DONE&&(i.push({name:a[o].file.name,journal:a[o].journal,content:new Blob([t.target.result])}),i.length===l&&s.uploadFiles(i,n,e.data.data))},c.readAsArrayBuffer(r.file))};for(var u in a)c(u);return l},uploadFiles:function(e,t,n){var a=this,i=e.length,o=0,r=function(r){if(e.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294){var s={filename:e[r].name,attachable_type:"TransactionJournal",attachable_id:e[r].journal};axios.post("./api/v1/attachments",s).then((function(s){var l="./api/v1/attachments/"+s.data.data.id+"/upload";axios.post(l,e[r].content).then((function(e){return++o===i&&a.redirectUser(t,n),!0})).catch((function(e){return console.error("Could not upload"),console.error(e),++o===i&&a.redirectUser(t,n),!1}))})).catch((function(e){return console.error("Could not create upload."),console.error(e),++o===i&&a.redirectUser(t,n),!1}))}};for(var s in e)r(s)},setDefaultErrors:function(){for(var e in this.transactions)this.transactions.hasOwnProperty(e)&&/^0$|^[1-9]\d*$/.test(e)&&e<=4294967294&&(this.transactions[e].errors={source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}})},parseErrors:function(e){var t,n;for(var a in this.setDefaultErrors(),this.error_message="",void 0===e.errors?(this.success_message="",this.error_message=e.message):(this.success_message="",this.error_message=this.$t("firefly.errors_submission")),e.errors)if(e.errors.hasOwnProperty(a)){if("group_title"===a&&(this.group_title_errors=e.errors[a]),"group_title"!==a)switch(t=parseInt(a.split(".")[1]),n=a.split(".")[2]){case"amount":case"date":case"budget_id":case"bill_id":case"description":case"tags":this.transactions[t].errors[n]=e.errors[a];break;case"source_name":case"source_id":this.transactions[t].errors.source_account=this.transactions[t].errors.source_account.concat(e.errors[a]);break;case"destination_name":case"destination_id":this.transactions[t].errors.destination_account=this.transactions[t].errors.destination_account.concat(e.errors[a]);break;case"foreign_amount":case"foreign_currency_id":this.transactions[t].errors.foreign_amount=this.transactions[t].errors.foreign_amount.concat(e.errors[a])}void 0!==this.transactions[t]&&(this.transactions[t].errors.source_account=Array.from(new Set(this.transactions[t].errors.source_account)),this.transactions[t].errors.destination_account=Array.from(new Set(this.transactions[t].errors.destination_account)))}},resetTransactions:function(){this.transactions=[],this.group_title=""},addTransactionToArray:function(e){if(this.transactions.push({description:"",date:"",amount:"",category:"",piggy_bank:0,errors:{source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}},budget:0,bill:0,tags:[],custom_fields:{interest_date:"",book_date:"",process_date:"",due_date:"",payment_date:"",invoice_date:"",internal_reference:"",notes:"",attachments:[],external_uri:""},foreign_amount:{amount:"",currency_id:0},source_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:["Asset account","Revenue account","Loan","Debt","Mortgage"],default_allowed_types:["Asset account","Revenue account","Loan","Debt","Mortgage"]},destination_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:["Asset account","Expense account","Loan","Debt","Mortgage"],default_allowed_types:["Asset account","Expense account","Loan","Debt","Mortgage"]}}),1===this.transactions.length){var t=new Date;this.transactions[0].date=t.getFullYear()+"-"+("0"+(t.getMonth()+1)).slice(-2)+"-"+("0"+t.getDate()).slice(-2)}e&&e.preventDefault()},setTransactionType:function(e){this.transactionType=e},deleteTransaction:function(e,t){t.preventDefault(),this.transactions.splice(e,1)},limitSourceType:function(e){var t;for(t=0;t1?n("span",[e._v(e._s(e.$t("firefly.single_split"))+" "+e._s(a+1)+" / "+e._s(e.transactions.length))]):e._e(),e._v(" "),1===e.transactions.length?n("span",[e._v(e._s(e.$t("firefly.transaction_journal_information")))]):e._e()]),e._v(" "),e.transactions.length>1?n("div",{staticClass:"box-tools pull-right"},[n("button",{staticClass:"btn btn-xs btn-danger",attrs:{type:"button"},on:{click:function(t){return e.deleteTransaction(a,t)}}},[n("i",{staticClass:"fa fa-trash"})])]):e._e()]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-4",attrs:{id:"transaction-info"}},[n("transaction-description",{attrs:{error:t.errors.description,index:a},model:{value:t.description,callback:function(n){e.$set(t,"description",n)},expression:"transaction.description"}}),e._v(" "),n("account-select",{attrs:{accountName:t.source_account.name,accountTypeFilters:t.source_account.allowed_types,defaultAccountTypeFilters:t.source_account.default_allowed_types,error:t.errors.source_account,index:a,transactionType:e.transactionType,inputName:"source[]",inputDescription:e.$t("firefly.source_account")},on:{"clear:value":function(t){return e.clearSource(a)},"select:account":function(t){return e.selectedSourceAccount(a,t)}}}),e._v(" "),n("account-select",{attrs:{accountName:t.destination_account.name,accountTypeFilters:t.destination_account.allowed_types,defaultAccountTypeFilters:t.destination_account.default_allowed_types,error:t.errors.destination_account,index:a,transactionType:e.transactionType,inputName:"destination[]",inputDescription:e.$t("firefly.destination_account")},on:{"clear:value":function(t){return e.clearDestination(a)},"select:account":function(t){return e.selectedDestinationAccount(a,t)}}}),e._v(" "),0===a||null!==e.transactionType&&"invalid"!==e.transactionType&&""!==e.transactionType?e._e():n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_unknown"))+"\n ")]),e._v(" "),0!==a&&"Withdrawal"===e.transactionType?n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_withdrawal"))+"\n ")]):e._e(),e._v(" "),0!==a&&"Deposit"===e.transactionType?n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_deposit"))+"\n ")]):e._e(),e._v(" "),0!==a&&"Transfer"===e.transactionType?n("p",{staticClass:"text-warning"},[e._v("\n "+e._s(e.$t("firefly.multi_account_warning_transfer"))+"\n ")]):e._e(),e._v(" "),0===a?n("standard-date",{attrs:{error:t.errors.date,index:a},model:{value:t.date,callback:function(n){e.$set(t,"date",n)},expression:"transaction.date"}}):e._e(),e._v(" "),0===a?n("div",[n("transaction-type",{attrs:{destination:t.destination_account.type,source:t.source_account.type},on:{"set:transactionType":function(t){return e.setTransactionType(t)},"act:limitSourceType":function(t){return e.limitSourceType(t)},"act:limitDestinationType":function(t){return e.limitDestinationType(t)}}})],1):e._e()],1),e._v(" "),n("div",{staticClass:"col-lg-4",attrs:{id:"amount-info"}},[n("amount",{attrs:{destination:t.destination_account,error:t.errors.amount,source:t.source_account,transactionType:e.transactionType},model:{value:t.amount,callback:function(n){e.$set(t,"amount",n)},expression:"transaction.amount"}}),e._v(" "),n("foreign-amount",{attrs:{destination:t.destination_account,error:t.errors.foreign_amount,source:t.source_account,transactionType:e.transactionType,title:e.$t("form.foreign_amount")},model:{value:t.foreign_amount,callback:function(n){e.$set(t,"foreign_amount",n)},expression:"transaction.foreign_amount"}})],1),e._v(" "),n("div",{staticClass:"col-lg-4",attrs:{id:"optional-info"}},[n("budget",{attrs:{error:t.errors.budget_id,no_budget:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.budget,callback:function(n){e.$set(t,"budget",n)},expression:"transaction.budget"}}),e._v(" "),n("category",{attrs:{error:t.errors.category,transactionType:e.transactionType},model:{value:t.category,callback:function(n){e.$set(t,"category",n)},expression:"transaction.category"}}),e._v(" "),n("piggy-bank",{attrs:{error:t.errors.piggy_bank,no_piggy_bank:e.$t("firefly.no_piggy_bank"),transactionType:e.transactionType},model:{value:t.piggy_bank,callback:function(n){e.$set(t,"piggy_bank",n)},expression:"transaction.piggy_bank"}}),e._v(" "),n("tags",{attrs:{error:t.errors.tags},model:{value:t.tags,callback:function(n){e.$set(t,"tags",n)},expression:"transaction.tags"}}),e._v(" "),n("bill",{attrs:{error:t.errors.bill_id,no_bill:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.bill,callback:function(n){e.$set(t,"bill",n)},expression:"transaction.bill"}}),e._v(" "),n("custom-transaction-fields",{attrs:{error:t.errors.custom_errors},model:{value:t.custom_fields,callback:function(n){e.$set(t,"custom_fields",n)},expression:"transaction.custom_fields"}})],1)])]),e._v(" "),e.transactions.length-1===a?n("div",{staticClass:"box-footer"},[n("button",{staticClass:"split_add_btn btn btn-default",attrs:{type:"button"},on:{click:e.addTransactionToArray}},[e._v("\n "+e._s(e.$t("firefly.add_another_split"))+"\n ")])]):e._e()])])])})),0),e._v(" "),e.transactions.length>1?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("group-description",{attrs:{error:e.group_title_errors},model:{value:e.group_title,callback:function(t){e.group_title=t},expression:"group_title"}})],1)])])]):e._e(),e._v(" "),n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.submission"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"checkbox"},[n("label",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.createAnother,expression:"createAnother"}],attrs:{name:"create_another",type:"checkbox"},domProps:{checked:Array.isArray(e.createAnother)?e._i(e.createAnother,null)>-1:e.createAnother},on:{change:function(t){var n=e.createAnother,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.createAnother=n.concat([null])):o>-1&&(e.createAnother=n.slice(0,o).concat(n.slice(o+1)))}else e.createAnother=i}}}),e._v("\n "+e._s(e.$t("firefly.create_another"))+"\n ")])]),e._v(" "),n("div",{staticClass:"checkbox"},[n("label",{class:{"text-muted":!1===this.createAnother}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.resetFormAfter,expression:"resetFormAfter"}],attrs:{disabled:!1===this.createAnother,name:"reset_form",type:"checkbox"},domProps:{checked:Array.isArray(e.resetFormAfter)?e._i(e.resetFormAfter,null)>-1:e.resetFormAfter},on:{change:function(t){var n=e.resetFormAfter,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.resetFormAfter=n.concat([null])):o>-1&&(e.resetFormAfter=n.slice(0,o).concat(n.slice(o+1)))}else e.resetFormAfter=i}}}),e._v("\n "+e._s(e.$t("firefly.reset_after"))+"\n\n ")])])]),e._v(" "),n("div",{staticClass:"box-footer"},[n("div",{staticClass:"btn-group"},[n("button",{staticClass:"btn btn-success",attrs:{id:"submitButton"},on:{click:e.submit}},[e._v(e._s(e.$t("firefly.submit")))])]),e._v(" "),n("p",{staticClass:"text-success",domProps:{innerHTML:e._s(e.success_message)}}),e._v(" "),n("p",{staticClass:"text-danger",domProps:{innerHTML:e._s(e.error_message)}})])])])])])}),[],!1,null,null,null).exports;const i=e({name:"CustomDate",props:{value:String,title:String,name:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.date.value)},hasError:function(){return this.error.length>0},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"date"},domProps:{value:e.value?e.value.substr(0,10):""},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const o=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},clearField:function(){this.name="",this.$refs.str.value="",this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"text"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const r=e({name:"CustomTextarea",props:{title:String,name:String,value:String,error:Array},data:function(){return{textValue:this.value}},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.textValue,expression:"textValue"}],ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",rows:"8"},domProps:{value:e.textValue},on:{input:[function(t){t.target.composing||(e.textValue=t.target.value)},e.handleInput]}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const s=e({props:["error","value","index"],name:"StandardDate",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.date.value)},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value),this.$emit("clear:date")}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.date"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{disabled:e.index>0,autocomplete:"off",name:"date[]",type:"date",placeholder:e.$t("firefly.date"),title:e.$t("firefly.date")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const l=e({props:["error","value","index"],name:"GroupDescription",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},clearField:function(){this.name="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{autocomplete:"off",name:"group_title",type:"text",placeholder:e.$t("firefly.split_transaction_title"),title:e.$t("firefly.split_transaction_title")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),0===e.error.length?n("p",{staticClass:"help-block"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title_help"))+"\n ")]):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const c=e({props:["error","value","index"],name:"TransactionDescription",mounted:function(){this.target=this.$refs.descr,this.descriptionAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/transactions?query=",this.$refs.descr.focus()},components:{},data:function(){return{descriptionAutoCompleteURI:null,name:null,description:null,target:null}},methods:{aSyncFunction:function(e,t){axios.get(this.descriptionAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.descr.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.description).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},search:function(e){return["ab","cd"]},hasError:function(){return this.error.length>0},clearDescription:function(){this.description="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value),this.$emit("clear:description")},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},handleEnter:function(e){e.keyCode},selectedItem:function(e){void 0!==this.name&&"string"!=typeof this.name&&(this.$refs.descr.value=this.name.description,this.$emit("input",this.$refs.descr.value))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.description"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{title:e.$t("firefly.description"),autocomplete:"off",name:"description[]",type:"text",placeholder:e.$t("firefly.description")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDescription}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"description"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const u=e({name:"CustomTransactionFields",props:["value","error"],mounted:function(){this.getPreference()},data:function(){return{customInterestDate:null,fields:[{interest_date:!1,book_date:!1,process_date:!1,due_date:!1,payment_date:!1,invoice_date:!1,internal_reference:!1,notes:!1,attachments:!1,external_uri:!1}]}},computed:{dateComponent:function(){return"custom-date"},stringComponent:function(){return"custom-string"},attachmentComponent:function(){return"custom-attachments"},textareaComponent:function(){return"custom-textarea"},uriComponent:function(){return"custom-uri"}},methods:{handleInput:function(e){this.$emit("input",this.value)},getPreference:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/preferences/transaction_journal_optional_fields";axios.get(t).then((function(t){e.fields=t.data.data.attributes.data})).catch((function(){return console.warn("Oh. Something went wrong loading custom transaction fields.")}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.hidden_fields_preferences"))}}),e._v(" "),this.fields.interest_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.interest_date,name:"interest_date[]",title:e.$t("form.interest_date")},model:{value:e.value.interest_date,callback:function(t){e.$set(e.value,"interest_date",t)},expression:"value.interest_date"}}):e._e(),e._v(" "),this.fields.book_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.book_date,name:"book_date[]",title:e.$t("form.book_date")},model:{value:e.value.book_date,callback:function(t){e.$set(e.value,"book_date",t)},expression:"value.book_date"}}):e._e(),e._v(" "),this.fields.process_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.process_date,name:"process_date[]",title:e.$t("form.process_date")},model:{value:e.value.process_date,callback:function(t){e.$set(e.value,"process_date",t)},expression:"value.process_date"}}):e._e(),e._v(" "),this.fields.due_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.due_date,name:"due_date[]",title:e.$t("form.due_date")},model:{value:e.value.due_date,callback:function(t){e.$set(e.value,"due_date",t)},expression:"value.due_date"}}):e._e(),e._v(" "),this.fields.payment_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.payment_date,name:"payment_date[]",title:e.$t("form.payment_date")},model:{value:e.value.payment_date,callback:function(t){e.$set(e.value,"payment_date",t)},expression:"value.payment_date"}}):e._e(),e._v(" "),this.fields.invoice_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.invoice_date,name:"invoice_date[]",title:e.$t("form.invoice_date")},model:{value:e.value.invoice_date,callback:function(t){e.$set(e.value,"invoice_date",t)},expression:"value.invoice_date"}}):e._e(),e._v(" "),this.fields.internal_reference?n(e.stringComponent,{tag:"component",attrs:{error:e.error.internal_reference,name:"internal_reference[]",title:e.$t("form.internal_reference")},model:{value:e.value.internal_reference,callback:function(t){e.$set(e.value,"internal_reference",t)},expression:"value.internal_reference"}}):e._e(),e._v(" "),this.fields.attachments?n(e.attachmentComponent,{tag:"component",attrs:{error:e.error.attachments,name:"attachments[]",title:e.$t("firefly.attachments")},model:{value:e.value.attachments,callback:function(t){e.$set(e.value,"attachments",t)},expression:"value.attachments"}}):e._e(),e._v(" "),this.fields.external_uri?n(e.uriComponent,{tag:"component",attrs:{error:e.error.external_uri,name:"external_uri[]",title:e.$t("firefly.external_uri")},model:{value:e.value.external_uri,callback:function(t){e.$set(e.value,"external_uri",t)},expression:"value.external_uri"}}):e._e(),e._v(" "),this.fields.notes?n(e.textareaComponent,{tag:"component",attrs:{error:e.error.notes,name:"notes[]",title:e.$t("firefly.notes")},model:{value:e.value.notes,callback:function(t){e.$set(e.value,"notes",t)},expression:"value.notes"}}):e._e()],1)}),[],!1,null,null,null).exports;const d=e({name:"PiggyBank",props:["value","transactionType","error","no_piggy_bank"],mounted:function(){this.loadPiggies()},data:function(){return{piggies:[]}},methods:{handleInput:function(e){this.$emit("input",this.$refs.piggy.value)},hasError:function(){return this.error.length>0},loadPiggies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/piggy-banks-with-balance?limit=1337";axios.get(t,{}).then((function(t){var n={0:{group:{title:e.$t("firefly.default_group_title_name")},piggies:[{name_with_balance:e.no_piggy_bank,id:0}]}};for(var a in t.data)if(t.data.hasOwnProperty(a)&&/^0$|^[1-9]\d*$/.test(a)&&a<=4294967294){var i=t.data[a];if(i.objectGroup){var o=i.objectGroup.order;n[o]||(n[o]={group:{title:i.objectGroup.title},piggies:[]}),n[o].piggies.push({name_with_balance:i.name_with_balance,id:i.id})}i.objectGroup||n[0].piggies.push({name_with_balance:i.name_with_balance,id:i.id}),e.piggies.push(t.data[a])}var r={};Object.keys(n).sort().forEach((function(e){var t=n[e].group.title;r[t]=n[e]})),e.piggies=r}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0!==this.transactionType&&"Transfer"===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.piggy_bank"))+"\n\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("select",{ref:"piggy",staticClass:"form-control",attrs:{name:"piggy_bank[]"},on:{input:e.handleInput}},e._l(this.piggies,(function(t,a){return n("optgroup",{attrs:{label:a}},e._l(t.piggies,(function(t){return n("option",{attrs:{label:t.name_with_balance},domProps:{value:t.id}},[e._v("\n "+e._s(t.name_with_balance)+"\n ")])})),0)})),0),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;var p=n(9669),_=n.n(p),f=n(7010);const h=e({name:"Tags",components:{VueTagsInput:n.n(f)()},props:["value","error"],data:function(){return{tag:"",autocompleteItems:[],debounce:null,tags:this.value}},watch:{tag:"initItems"},methods:{update:function(e){this.autocompleteItems=[],this.tags=e,this.$emit("input",this.tags)},clearTags:function(){this.tags=[]},hasError:function(){return this.error.length>0},initItems:function(){var e=this;if(!(this.tag.length<2)){var t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/tags?query=".concat(this.tag);clearTimeout(this.debounce),this.debounce=setTimeout((function(){_().get(t).then((function(t){e.autocompleteItems=t.data.map((function(e){return{text:e.tag}}))})).catch((function(){return console.warn("Oh. Something went wrong loading tags.")}))}),600)}}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.tags"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("vue-tags-input",{attrs:{"add-only-from-autocomplete":!1,"autocomplete-items":e.autocompleteItems,tags:e.tags,title:e.$t("firefly.tags"),classes:"form-input",placeholder:e.$t("firefly.tags")},on:{"tags-changed":e.update},model:{value:e.tag,callback:function(t){e.tag=t},expression:"tag"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearTags}},[n("i",{staticClass:"fa fa-trash-o"})])])],1)]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const A=e({name:"Category",props:{value:String,inputName:String,error:Array,accountName:{type:String,default:""}},data:function(){return{categoryAutoCompleteURI:null,name:null,target:null,acKey:null}},ready:function(){this.name=this.accountName,this.acKey="name"},mounted:function(){this.target=this.$refs.input,this.categoryAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/categories?query="},methods:{hasError:function(){return this.error.length>0},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name).replace(new RegExp(""+t,"i"),"$&")},aSyncFunction:function(e,t){axios.get(this.categoryAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},handleInput:function(e){"string"!=typeof this.$refs.input.value?this.$emit("input",this.$refs.input.value.name):this.$emit("input",this.$refs.input.value)},clearCategory:function(){this.name="",this.$refs.input.value="",this.$emit("input",this.$refs.input.value),this.$emit("clear:category")},selectedItem:function(e){void 0!==this.name&&(this.$emit("select:category",this.name),"string"!=typeof this.name?this.$emit("input",this.name.name):this.$emit("input",this.name))},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.category"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{autocomplete:"off","data-role":"input",name:"category[]",type:"text",placeholder:e.$t("firefly.category"),title:e.$t("firefly.category")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearCategory}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{ref:"typea",attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const g=e({name:"Amount",props:["source","destination","transactionType","value","error"],data:function(){return{sourceAccount:this.source,destinationAccount:this.destination,type:this.transactionType}},methods:{handleInput:function(e){this.$emit("input",this.$refs.amount.value)},clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},changeData:function(){var e=this.transactionType;e||this.source.name||this.destination.name?(null===e&&(e=""),""!==e||""===this.source.currency_name?""!==e||""===this.destination.currency_name?"withdrawal"!==e.toLowerCase()&&"reconciliation"!==e.toLowerCase()&&"transfer"!==e.toLowerCase()?("deposit"===e.toLowerCase()&&"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()&&$(this.$refs.cur).text(this.destination.currency_name),"deposit"!==e.toLowerCase()||"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()||$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text(this.source.currency_name):$(this.$refs.cur).text(this.destination.currency_name):$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text("")}},watch:{source:function(){this.changeData()},value:function(){},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},mounted:function(){this.changeData()}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("firefly.amount"))+"\n ")]),e._v(" "),n("label",{ref:"cur",staticClass:"col-sm-4 control-label"}),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[n("input",{ref:"amount",staticClass:"form-control",attrs:{title:e.$t("firefly.amount"),autocomplete:"off",name:"amount[]",step:"any",type:"number",placeholder:e.$t("firefly.amount")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const m=e({name:"ForeignAmountSelect",props:["source","destination","transactionType","value","error","no_currency","title"],mounted:function(){this.liability=!1,this.loadCurrencies()},data:function(){return{currencies:[],enabledCurrencies:[],exclude:null,liability:!1}},watch:{source:function(){this.changeData()},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},methods:{clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},handleInput:function(e){var t={amount:this.$refs.amount.value,currency_id:this.$refs.currency_select.value};this.$emit("input",t)},changeData:function(){this.enabledCurrencies=[];var e=this.destination.type?this.destination.type.toLowerCase():"invalid",t=this.source.type?this.source.type.toLowerCase():"invalid",n=this.transactionType?this.transactionType.toLowerCase():"invalid",a=["loan","debt","mortgage"],i=-1!==a.indexOf(t),o=-1!==a.indexOf(e);if("transfer"===n||o||i)for(var r in this.liability=!0,this.currencies)this.currencies.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294&&parseInt(this.currencies[r].id)===parseInt(this.destination.currency_id)&&this.enabledCurrencies.push(this.currencies[r]);else if("withdrawal"===n&&this.source&&!1===i)for(var s in this.currencies)this.currencies.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294&&this.source.currency_id!==this.currencies[s].id&&this.enabledCurrencies.push(this.currencies[s]);else if("deposit"===n&&this.destination)for(var l in this.currencies)this.currencies.hasOwnProperty(l)&&/^0$|^[1-9]\d*$/.test(l)&&l<=4294967294&&this.destination.currency_id!==this.currencies[l].id&&this.enabledCurrencies.push(this.currencies[l]);else for(var c in this.currencies)this.currencies.hasOwnProperty(c)&&/^0$|^[1-9]\d*$/.test(c)&&c<=4294967294&&this.enabledCurrencies.push(this.currencies[c])},loadCurrencies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/currencies";axios.get(t,{}).then((function(t){for(var n in e.currencies=[{id:0,attributes:{name:e.no_currency,enabled:!0}}],e.enabledCurrencies=[{attributes:{name:e.no_currency,enabled:!0},id:0}],t.data.data)t.data.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&t.data.data[n].attributes.enabled&&(e.currencies.push(t.data.data[n]),e.enabledCurrencies.push(t.data.data[n]))}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return this.enabledCurrencies.length>=1?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("form.foreign_amount"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-4"},[n("select",{ref:"currency_select",staticClass:"form-control",attrs:{name:"foreign_currency[]"},on:{input:e.handleInput}},e._l(this.enabledCurrencies,(function(t){return n("option",{attrs:{label:t.attributes.name},domProps:{selected:parseInt(e.value.currency_id)===parseInt(t.id),value:t.id}},[e._v("\n "+e._s(t.attributes.name)+"\n ")])})),0)]),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[this.enabledCurrencies.length>0?n("input",{ref:"amount",staticClass:"form-control",attrs:{placeholder:this.title,title:this.title,autocomplete:"off",name:"foreign_amount[]",step:"any",type:"number"},domProps:{value:e.value.amount},on:{input:e.handleInput}}):e._e(),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const v=e({props:{source:String,destination:String,type:String},methods:{changeValue:function(){if(this.source&&this.destination){var e="";window.accountToTypes[this.source]?window.accountToTypes[this.source][this.destination]?e=window.accountToTypes[this.source][this.destination]:console.warn("User selected an impossible destination."):console.warn("User selected an impossible source."),""!==e&&(this.transactionType=e,this.sentence=this.$t("firefly.you_create_"+e.toLowerCase()),this.$emit("act:limitSourceType",this.source),this.$emit("act:limitDestinationType",this.destination))}else this.sentence="",this.transactionType="";this.$emit("set:transactionType",this.transactionType)}},data:function(){return{transactionType:this.type,sentence:""}},watch:{source:function(){this.changeValue()},destination:function(){this.changeValue()}},name:"TransactionType"},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[""!==e.sentence?n("label",{staticClass:"control-label text-info"},[e._v("\n "+e._s(e.sentence)+"\n ")]):e._e()])])}),[],!1,null,null,null).exports;const b=e({props:{inputName:String,inputDescription:String,index:Number,transactionType:String,error:Array,accountName:{type:String,default:""},accountTypeFilters:{type:Array,default:function(){return[]}},defaultAccountTypeFilters:{type:Array,default:function(){return[]}}},data:function(){return{accountAutoCompleteURI:null,name:null,trType:this.transactionType,target:null,inputDisabled:!1,allowedTypes:this.accountTypeFilters,defaultAllowedTypes:this.defaultAccountTypeFilters}},ready:function(){this.name=this.accountName},mounted:function(){this.target=this.$refs.input,this.updateACURI(this.allowedTypes.join(",")),this.name=this.accountName,this.triggerTransactionType()},watch:{transactionType:function(){this.triggerTransactionType()},accountName:function(){this.name=this.accountName},accountTypeFilters:function(){var e=this.accountTypeFilters.join(",");0===this.accountTypeFilters.length&&(e=this.defaultAccountTypeFilters.join(",")),this.updateACURI(e)}},methods:{aSyncFunction:function(e,t){axios.get(this.accountAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name_with_balance).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},updateACURI:function(e){this.accountAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/accounts?types="+e+"&query="},hasError:function(){return this.error.length>0},triggerTransactionType:function(){if(this.name,null!==this.transactionType&&""!==this.transactionType&&(this.inputDisabled=!1,""!==this.transactionType.toString()&&this.index>0)){if("transfer"===this.transactionType.toString().toLowerCase())return void(this.inputDisabled=!0);if("withdrawal"===this.transactionType.toString().toLowerCase()&&"source"===this.inputName.substr(0,6).toLowerCase())return void(this.inputDisabled=!0);"deposit"===this.transactionType.toString().toLowerCase()&&"destination"===this.inputName.substr(0,11).toLowerCase()&&(this.inputDisabled=!0)}},selectedItem:function(e){void 0!==this.name&&("string"==typeof this.name&&this.$emit("clear:value"),this.$emit("select:account",this.name))},clearSource:function(e){this.name="",this.$emit("clear:value")},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.inputDescription)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{"data-index":e.index,disabled:e.inputDisabled,name:e.inputName,placeholder:e.inputDescription,title:e.inputDescription,autocomplete:"off","data-role":"input",type:"text"},on:{keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearSource}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name_with_balance"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const y=e({name:"Budget",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_budget:String},mounted:function(){this.loadBudgets()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,budgets:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.budget.value)},handleInput:function(e){this.$emit("input",this.$refs.budget.value)},hasError:function(){return this.error.length>0},loadBudgets:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/budgets?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.budgets=[{name:e.no_budget,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.budgets.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.budget"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.budgets.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"budget",staticClass:"form-control",attrs:{title:e.$t("firefly.budget"),name:"budget[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.budgets,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.budgets.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_budget_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const k=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.uri.value)},clearField:function(){this.name="",this.$refs.uri.value="",this.$emit("input",this.$refs.uri.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"uri",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"url"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const w=e({name:"Bill",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_bill:String},mounted:function(){this.loadBills()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,bills:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.bill.value)},handleInput:function(e){this.$emit("input",this.$refs.bill.value)},hasError:function(){return this.error.length>0},loadBills:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/bills?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.bills=[{name:e.no_bill,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.bills.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.bill"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.bills.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"bill",staticClass:"form-control",attrs:{title:e.$t("firefly.bill"),name:"bill[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.bills,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.bills.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_bill_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;n(9703),Vue.component("budget",y),Vue.component("bill",w),Vue.component("custom-date",i),Vue.component("custom-string",o),Vue.component("custom-attachments",t),Vue.component("custom-textarea",r),Vue.component("custom-uri",k),Vue.component("standard-date",s),Vue.component("group-description",l),Vue.component("transaction-description",c),Vue.component("custom-transaction-fields",u),Vue.component("piggy-bank",d),Vue.component("tags",h),Vue.component("category",A),Vue.component("amount",g),Vue.component("foreign-amount",m),Vue.component("transaction-type",v),Vue.component("account-select",b),Vue.component("create-transaction",a);var C=n(5299),z={};new Vue({i18n:C,el:"#create_transaction",render:function(e){return e(a,{props:z})}})})()})(); \ No newline at end of file diff --git a/public/v1/js/edit_transaction.js b/public/v1/js/edit_transaction.js index c4652df4c1..6b8b0dc72b 100644 --- a/public/v1/js/edit_transaction.js +++ b/public/v1/js/edit_transaction.js @@ -1 +1 @@ -(()=>{var e={7010:e=>{window,e.exports=function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=6)}([function(e,t,n){var a=n(8);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("7ec05f6c",a,!1,{})},function(e,t,n){var a=n(10);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("3453d19d",a,!1,{})},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n,a=e[1]||"",i=e[3];if(!i)return a;if(t&&"function"==typeof btoa){var o=(n=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),r=i.sources.map((function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"}));return[a].concat(r).concat([o]).join("\n")}return[a].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},i=0;in.parts.length&&(a.parts.length=n.parts.length)}else{var r=[];for(i=0;i div[data-v-61d92e31] {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%;\n}\n.ti-selected-item[data-v-61d92e31] {\n background-color: #5C6BC0;\n color: #fff;\n}\n',"",{version:3,sources:["C:/Users/johan/dev/vue-tags-input/vue-tags-input/C:/Users/johan/dev/vue-tags-input/vue-tags-input/vue-tags-input.scss"],names:[],mappings:"AAAA;EACE,uBAAuB;EACvB,mCAA8C;EAC9C,+JAAuM;EACvM,oBAAoB;EACpB,mBAAmB;CAAE;AAEvB;EACE,kCAAkC;EAClC,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;EACf,oCAAoC;EACpC,mCAAmC;CAAE;AAEvC;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,YAAY;EACZ,aAAa;EACb,sBAAsB;CAAE;AAE1B;EACE,uBAAuB;CAAE;AAE3B;EACE,cAAc;CAAE;AAElB;EACE,8BAA8B;CAAE;AAElC;EACE,iBAAiB;EACjB,mBAAmB;EACnB,uBAAuB;CAAE;AAE3B;EACE,aAAa;CAAE;AACf;IACE,gBAAgB;CAAE;AAEtB;EACE,uBAAuB;EACvB,cAAc;EACd,aAAa;EACb,gBAAgB;CAAE;AAEpB;EACE,cAAc;EACd,gBAAgB;EAChB,YAAY;EACZ,iBAAiB;CAAE;AAErB;EACE,0BAA0B;EAC1B,YAAY;EACZ,mBAAmB;EACnB,cAAc;EACd,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,cAAc;CAAE;AAClB;IACE,cAAc;IACd,oBAAoB;CAAE;AACxB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;IACnB,mBAAmB;IACnB,YAAY;IACZ,iBAAiB;CAAE;AACrB;IACE,iBAAiB;IACjB,cAAc;IACd,oBAAoB;IACpB,kBAAkB;CAAE;AACpB;MACE,gBAAgB;CAAE;AACtB;IACE,kBAAkB;CAAE;AACtB;IACE,0BAA0B;CAAE;AAEhC;EACE,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,aAAa;IACb,YAAY;CAAE;AAElB;EACE,qBAAqB;CAAE;AAEzB;EACE,uBAAuB;EACvB,iBAAiB;EACjB,mBAAmB;EACnB,YAAY;EACZ,uBAAuB;EACvB,YAAY;CAAE;AAEhB;EACE,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CAAE;AAEhB;EACE,0BAA0B;EAC1B,YAAY;CAAE",file:"vue-tags-input.scss?vue&type=style&index=0&id=61d92e31&lang=scss&scoped=true&",sourcesContent:['@font-face {\n font-family: \'icomoon\';\n src: url("./assets/fonts/icomoon.eot?7grlse");\n src: url("./assets/fonts/icomoon.eot?7grlse#iefix") format("embedded-opentype"), url("./assets/fonts/icomoon.ttf?7grlse") format("truetype"), url("./assets/fonts/icomoon.woff?7grlse") format("woff");\n font-weight: normal;\n font-style: normal; }\n\n[class^="ti-icon-"], [class*=" ti-icon-"] {\n font-family: \'icomoon\' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.ti-icon-check:before {\n content: "\\e902"; }\n\n.ti-icon-close:before {\n content: "\\e901"; }\n\n.ti-icon-undo:before {\n content: "\\e900"; }\n\nul {\n margin: 0px;\n padding: 0px;\n list-style-type: none; }\n\n*, *:before, *:after {\n box-sizing: border-box; }\n\ninput:focus {\n outline: none; }\n\ninput[disabled] {\n background-color: transparent; }\n\n.vue-tags-input {\n max-width: 450px;\n position: relative;\n background-color: #fff; }\n\ndiv.vue-tags-input.disabled {\n opacity: 0.5; }\n div.vue-tags-input.disabled * {\n cursor: default; }\n\n.ti-input {\n border: 1px solid #ccc;\n display: flex;\n padding: 4px;\n flex-wrap: wrap; }\n\n.ti-tags {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n line-height: 1em; }\n\n.ti-tag {\n background-color: #5C6BC0;\n color: #fff;\n border-radius: 2px;\n display: flex;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-tag:focus {\n outline: none; }\n .ti-tag .ti-content {\n display: flex;\n align-items: center; }\n .ti-tag .ti-tag-center {\n position: relative; }\n .ti-tag span {\n line-height: .85em; }\n .ti-tag span.ti-hidden {\n padding-left: 14px;\n visibility: hidden;\n height: 0px;\n white-space: pre; }\n .ti-tag .ti-actions {\n margin-left: 2px;\n display: flex;\n align-items: center;\n font-size: 1.15em; }\n .ti-tag .ti-actions i {\n cursor: pointer; }\n .ti-tag:last-child {\n margin-right: 4px; }\n .ti-tag.ti-invalid, .ti-tag.ti-tag.ti-deletion-mark {\n background-color: #e54d42; }\n\n.ti-new-tag-input-wrapper {\n display: flex;\n flex: 1 0 auto;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-new-tag-input-wrapper input {\n flex: 1 0 auto;\n min-width: 100px;\n border: none;\n padding: 0px;\n margin: 0px; }\n\n.ti-new-tag-input {\n line-height: initial; }\n\n.ti-autocomplete {\n border: 1px solid #ccc;\n border-top: none;\n position: absolute;\n width: 100%;\n background-color: #fff;\n z-index: 20; }\n\n.ti-item > div {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%; }\n\n.ti-selected-item {\n background-color: #5C6BC0;\n color: #fff; }\n'],sourceRoot:""}])},function(e,t,n){"use strict";e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t){e.exports="data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg8SBawAAAC8AAAAYGNtYXAXVtKJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZqWfozAAAAF4AAAA/GhlYWQPxZgIAAACdAAAADZoaGVhB4ADyAAAAqwAAAAkaG10eBIAAb4AAALQAAAAHGxvY2EAkgDiAAAC7AAAABBtYXhwAAkAHwAAAvwAAAAgbmFtZZlKCfsAAAMcAAABhnBvc3QAAwAAAAAEpAAAACAAAwOAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6QL//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAFYBAQO+AoEAHAAAATIXHgEXFhcHJicuAScmIyIGBxchERc2Nz4BNzYCFkpDQ28pKRdkECAfVTM0OT9wLZz+gJgdIiJLKSgCVRcYUjg5QiAzKys+ERIrJZoBgJoZFRQcCAgAAQDWAIEDKgLVAAsAAAEHFwcnByc3JzcXNwMq7u487u487u487u4Cme7uPO7uPO7uPO7uAAEAkgCBA4ACvQAFAAAlARcBJzcBgAHEPP4A7jz5AcQ8/gDuPAAAAAABAAAAAAAAH8nTUV8PPPUACwQAAAAAANZ1KhsAAAAA1nUqGwAAAAADvgLVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAO+AAEAAAAAAAAAAAAAAAAAAAAHBAAAAAAAAAAAAAAAAgAAAAQAAFYEAADWBAAAkgAAAAAACgAUAB4AUABqAH4AAQAAAAcAHQABAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},function(e,t){e.exports="data:font/woff;base64,d09GRgABAAAAAAUQAAsAAAAABMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIFrGNtYXAAAAFoAAAAVAAAAFQXVtKJZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAAAPwAAAD8pZ+jMGhlYWQAAALAAAAANgAAADYPxZgIaGhlYQAAAvgAAAAkAAAAJAeAA8hobXR4AAADHAAAABwAAAAcEgABvmxvY2EAAAM4AAAAEAAAABAAkgDibWF4cAAAA0gAAAAgAAAAIAAJAB9uYW1lAAADaAAAAYYAAAGGmUoJ+3Bvc3QAAATwAAAAIAAAACAAAwAAAAMDgAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6QIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOkC//3//wAAAAAAIOkA//3//wAB/+MXBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQBWAQEDvgKBABwAAAEyFx4BFxYXByYnLgEnJiMiBgcXIREXNjc+ATc2AhZKQ0NvKSkXZBAgH1UzNDk/cC2c/oCYHSIiSykoAlUXGFI4OUIgMysrPhESKyWaAYCaGRUUHAgIAAEA1gCBAyoC1QALAAABBxcHJwcnNyc3FzcDKu7uPO7uPO7uPO7uApnu7jzu7jzu7jzu7gABAJIAgQOAAr0ABQAAJQEXASc3AYABxDz+AO48+QHEPP4A7jwAAAAAAQAAAAAAAB/J01FfDzz1AAsEAAAAAADWdSobAAAAANZ1KhsAAAAAA74C1QAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADvgABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABWBAAA1gQAAJIAAAAAAAoAFAAeAFAAagB+AAEAAAAHAB0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},function(e,t,n){"use strict";n.r(t);var a=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vue-tags-input",class:[{"ti-disabled":e.disabled},{"ti-focus":e.focused}]},[n("div",{staticClass:"ti-input"},[e.tagsCopy?n("ul",{staticClass:"ti-tags"},[e._l(e.tagsCopy,(function(t,a){return n("li",{key:a,staticClass:"ti-tag",class:[{"ti-editing":e.tagsEditStatus[a]},t.tiClasses,t.classes,{"ti-deletion-mark":e.isMarked(a)}],style:t.style,attrs:{tabindex:"0"},on:{click:function(n){return e.$emit("tag-clicked",{tag:t,index:a})}}},[n("div",{staticClass:"ti-content"},[e.$scopedSlots["tag-left"]?n("div",{staticClass:"ti-tag-left"},[e._t("tag-left",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e(),e._v(" "),n("div",{ref:"tagCenter",refInFor:!0,staticClass:"ti-tag-center"},[e.$scopedSlots["tag-center"]?e._e():n("span",{class:{"ti-hidden":e.tagsEditStatus[a]},on:{click:function(t){return e.performEditTag(a)}}},[e._v(e._s(t.text))]),e._v(" "),e.$scopedSlots["tag-center"]?e._e():n("tag-input",{attrs:{scope:{edit:e.tagsEditStatus[a],maxlength:e.maxlength,tag:t,index:a,validateTag:e.createChangedTag,performCancelEdit:e.cancelEdit,performSaveEdit:e.performSaveTag}}}),e._v(" "),e._t("tag-center",null,{tag:t,index:a,maxlength:e.maxlength,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,validateTag:e.createChangedTag,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2),e._v(" "),e.$scopedSlots["tag-right"]?n("div",{staticClass:"ti-tag-right"},[e._t("tag-right",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e()]),e._v(" "),n("div",{staticClass:"ti-actions"},[e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:e.tagsEditStatus[a],expression:"tagsEditStatus[index]"}],staticClass:"ti-icon-undo",on:{click:function(t){return e.cancelEdit(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:!e.tagsEditStatus[a],expression:"!tagsEditStatus[index]"}],staticClass:"ti-icon-close",on:{click:function(t){return e.performDeleteTag(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._t("tag-actions",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)}):e._e()],2)])})),e._v(" "),n("li",{staticClass:"ti-new-tag-input-wrapper"},[n("input",e._b({ref:"newTagInput",staticClass:"ti-new-tag-input",class:[e.createClasses(e.newTag,e.tags,e.validation,e.isDuplicate)],attrs:{placeholder:e.placeholder,maxlength:e.maxlength,disabled:e.disabled,type:"text",size:"1"},domProps:{value:e.newTag},on:{keydown:[function(t){return e.performAddTags(e.filteredAutocompleteItems[e.selectedItem]||e.newTag,t)},function(t){return t.type.indexOf("key")||8===t.keyCode?e.invokeDelete(t):null},function(t){return t.type.indexOf("key")||9===t.keyCode?e.performBlur(t):null},function(t){return t.type.indexOf("key")||38===t.keyCode?e.selectItem(t,"before"):null},function(t){return t.type.indexOf("key")||40===t.keyCode?e.selectItem(t,"after"):null}],paste:e.addTagsFromPaste,input:e.updateNewTag,blur:function(t){return e.$emit("blur",t)},focus:function(t){e.focused=!0,e.$emit("focus",t)},click:function(t){!e.addOnlyFromAutocomplete&&(e.selectedItem=null)}}},"input",e.$attrs,!1))])],2):e._e()]),e._v(" "),e._t("between-elements"),e._v(" "),e.autocompleteOpen?n("div",{staticClass:"ti-autocomplete",on:{mouseout:function(t){e.selectedItem=null}}},[e._t("autocomplete-header"),e._v(" "),n("ul",e._l(e.filteredAutocompleteItems,(function(t,a){return n("li",{key:a,staticClass:"ti-item",class:[t.tiClasses,t.classes,{"ti-selected-item":e.isSelected(a)}],style:t.style,on:{mouseover:function(t){!e.disabled&&(e.selectedItem=a)}}},[e.$scopedSlots["autocomplete-item"]?e._t("autocomplete-item",null,{item:t,index:a,performAdd:function(t){return e.performAddTags(t,void 0,"autocomplete")},selected:e.isSelected(a)}):n("div",{on:{click:function(n){return e.performAddTags(t,void 0,"autocomplete")}}},[e._v("\n "+e._s(t.text)+"\n ")])],2)})),0),e._v(" "),e._t("autocomplete-footer")],2):e._e()],2)};a._withStripped=!0;var i=n(5),o=n.n(i),r=function(e){return JSON.parse(JSON.stringify(e))},s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3?arguments[3]:void 0;void 0===e.text&&(e={text:e});var i=function(e,t){return t.filter((function(t){var n=e.text;return"string"==typeof t.rule?!new RegExp(t.rule).test(n):t.rule instanceof RegExp?!t.rule.test(n):"[object Function]"==={}.toString.call(t.rule)?t.rule(e):void 0})).map((function(e){return e.classes}))}(e,n),o=function(e,t){for(var n=0;n1?n-1:0),i=1;i1?t-1:0),a=1;a=this.autocompleteMinLength&&this.filteredAutocompleteItems.length>0&&this.focused},filteredAutocompleteItems:function(){var e=this,t=this.autocompleteItems.map((function(t){return l(t,e.tags,e.validation,e.isDuplicate)}));return this.autocompleteFilterDuplicates?t.filter(this.duplicateFilter):t}},methods:{createClasses:s,getSelectedIndex:function(e){var t=this.filteredAutocompleteItems,n=this.selectedItem,a=t.length-1;if(0!==t.length)return null===n?0:"before"===e&&0===n?a:"after"===e&&n===a?0:"after"===e?n+1:n-1},selectDefaultItem:function(){this.addOnlyFromAutocomplete&&this.filteredAutocompleteItems.length>0?this.selectedItem=0:this.selectedItem=null},selectItem:function(e,t){e.preventDefault(),this.selectedItem=this.getSelectedIndex(t)},isSelected:function(e){return this.selectedItem===e},isMarked:function(e){return this.deletionMark===e},invokeDelete:function(){var e=this;if(this.deleteOnBackspace&&!(this.newTag.length>0)){var t=this.tagsCopy.length-1;null===this.deletionMark?(this.deletionMarkTime=setTimeout((function(){return e.deletionMark=null}),1e3),this.deletionMark=t):this.performDeleteTag(t)}},addTagsFromPaste:function(){var e=this;this.addFromPaste&&setTimeout((function(){return e.performAddTags(e.newTag)}),10)},performEditTag:function(e){var t=this;this.allowEditTags&&(this._events["before-editing-tag"]||this.editTag(e),this.$emit("before-editing-tag",{index:e,tag:this.tagsCopy[e],editTag:function(){return t.editTag(e)}}))},editTag:function(e){this.allowEditTags&&(this.toggleEditMode(e),this.focus(e))},toggleEditMode:function(e){this.allowEditTags&&!this.disabled&&this.$set(this.tagsEditStatus,e,!this.tagsEditStatus[e])},createChangedTag:function(e,t){var n=this.tagsCopy[e];n.text=t?t.target.value:this.tagsCopy[e].text,this.$set(this.tagsCopy,e,l(n,this.tagsCopy,this.validation,this.isDuplicate))},focus:function(e){var t=this;this.$nextTick((function(){var n=t.$refs.tagCenter[e].querySelector("input.ti-tag-input");n&&n.focus()}))},quote:function(e){return e.replace(/([()[{*+.$^\\|?])/g,"\\$1")},cancelEdit:function(e){this.tags[e]&&(this.tagsCopy[e]=r(l(this.tags[e],this.tags,this.validation,this.isDuplicate)),this.$set(this.tagsEditStatus,e,!1))},hasForbiddingAddRule:function(e){var t=this;return e.some((function(e){var n=t.validation.find((function(t){return e===t.classes}));return!!n&&n.disableAdd}))},createTagTexts:function(e){var t=this,n=new RegExp(this.separators.map((function(e){return t.quote(e)})).join("|"));return e.split(n).map((function(e){return{text:e}}))},performDeleteTag:function(e){var t=this;this._events["before-deleting-tag"]||this.deleteTag(e),this.$emit("before-deleting-tag",{index:e,tag:this.tagsCopy[e],deleteTag:function(){return t.deleteTag(e)}})},deleteTag:function(e){this.disabled||(this.deletionMark=null,clearTimeout(this.deletionMarkTime),this.tagsCopy.splice(e,1),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},noTriggerKey:function(e,t){var n=-1!==this[t].indexOf(e.keyCode)||-1!==this[t].indexOf(e.key);return n&&e.preventDefault(),!n},performAddTags:function(e,t,n){var a=this;if(!(this.disabled||t&&this.noTriggerKey(t,"addOnKey"))){var i=[];"object"===m(e)&&(i=[e]),"string"==typeof e&&(i=this.createTagTexts(e)),(i=i.filter((function(e){return e.text.trim().length>0}))).forEach((function(e){e=l(e,a.tags,a.validation,a.isDuplicate),a._events["before-adding-tag"]||a.addTag(e,n),a.$emit("before-adding-tag",{tag:e,addTag:function(){return a.addTag(e,n)}})}))}},duplicateFilter:function(e){return this.isDuplicate?!this.isDuplicate(this.tagsCopy,e):!this.tagsCopy.find((function(t){return t.text===e.text}))},addTag:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"new-tag-input",a=this.filteredAutocompleteItems.map((function(e){return e.text}));this.addOnlyFromAutocomplete&&-1===a.indexOf(e.text)||this.$nextTick((function(){return t.maxTags&&t.maxTags<=t.tagsCopy.length?t.$emit("max-tags-reached",e):t.avoidAddingDuplicates&&!t.duplicateFilter(e)?t.$emit("adding-duplicate",e):void(t.hasForbiddingAddRule(e.tiClasses)||(t.$emit("input",""),t.tagsCopy.push(e),t._events["update:tags"]&&t.$emit("update:tags",t.tagsCopy),"autocomplete"===n&&t.$refs.newTagInput.focus(),t.$emit("tags-changed",t.tagsCopy)))}))},performSaveTag:function(e,t){var n=this,a=this.tagsCopy[e];this.disabled||t&&this.noTriggerKey(t,"addOnKey")||0!==a.text.trim().length&&(this._events["before-saving-tag"]||this.saveTag(e,a),this.$emit("before-saving-tag",{index:e,tag:a,saveTag:function(){return n.saveTag(e,a)}}))},saveTag:function(e,t){if(this.avoidAddingDuplicates){var n=r(this.tagsCopy),a=n.splice(e,1)[0];if(this.isDuplicate?this.isDuplicate(n,a):-1!==n.map((function(e){return e.text})).indexOf(a.text))return this.$emit("saving-duplicate",t)}this.hasForbiddingAddRule(t.tiClasses)||(this.$set(this.tagsCopy,e,t),this.toggleEditMode(e),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},tagsEqual:function(){var e=this;return!this.tagsCopy.some((function(t,n){return!o()(t,e.tags[n])}))},updateNewTag:function(e){var t=e.target.value;this.newTag=t,this.$emit("input",t)},initTags:function(){this.tagsCopy=c(this.tags,this.validation,this.isDuplicate),this.tagsEditStatus=r(this.tags).map((function(){return!1})),this._events["update:tags"]&&!this.tagsEqual()&&this.$emit("update:tags",this.tagsCopy)},blurredOnClick:function(e){this.$el.contains(e.target)||this.$el.contains(document.activeElement)||this.performBlur(e)},performBlur:function(){this.addOnBlur&&this.focused&&this.performAddTags(this.newTag),this.focused=!1}},watch:{value:function(e){this.addOnlyFromAutocomplete||(this.selectedItem=null),this.newTag=e},tags:{handler:function(){this.initTags()},deep:!0},autocompleteOpen:"selectDefaultItem"},created:function(){this.newTag=this.value,this.initTags()},mounted:function(){this.selectDefaultItem(),document.addEventListener("click",this.blurredOnClick)},destroyed:function(){document.removeEventListener("click",this.blurredOnClick)}},b=(n(9),_(v,a,[],!1,null,"61d92e31",null));b.options.__file="vue-tags-input/vue-tags-input.vue";var y=b.exports;n.d(t,"VueTagsInput",(function(){return y})),n.d(t,"createClasses",(function(){return s})),n.d(t,"createTag",(function(){return l})),n.d(t,"createTags",(function(){return c})),n.d(t,"TagInput",(function(){return f})),y.install=function(e){return e.component(y.name,y)},"undefined"!=typeof window&&window.Vue&&window.Vue.use(y),t.default=y}])},9669:(e,t,n)=>{e.exports=n(1609)},5448:(e,t,n)=>{"use strict";var a=n(4867),i=n(6026),o=n(4372),r=n(5327),s=n(4097),l=n(4109),c=n(7985),u=n(5061);e.exports=function(e){return new Promise((function(t,n){var d=e.data,_=e.headers;a.isFormData(d)&&delete _["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var f=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";_.Authorization="Basic "+btoa(f+":"+h)}var A=s(e.baseURL,e.url);if(p.open(e.method.toUpperCase(),r(A,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var a="getAllResponseHeaders"in p?l(p.getAllResponseHeaders()):null,o={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:a,config:e,request:p};i(t,n,o),p=null}},p.onabort=function(){p&&(n(u("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){n(u("Network Error",e,null,p)),p=null},p.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(u(t,e,"ECONNABORTED",p)),p=null},a.isStandardBrowserEnv()){var g=(e.withCredentials||c(A))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;g&&(_[e.xsrfHeaderName]=g)}if("setRequestHeader"in p&&a.forEach(_,(function(e,t){void 0===d&&"content-type"===t.toLowerCase()?delete _[t]:p.setRequestHeader(t,e)})),a.isUndefined(e.withCredentials)||(p.withCredentials=!!e.withCredentials),e.responseType)try{p.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),n(e),p=null)})),d||(d=null),p.send(d)}))}},1609:(e,t,n)=>{"use strict";var a=n(4867),i=n(1849),o=n(321),r=n(7185);function s(e){var t=new o(e),n=i(o.prototype.request,t);return a.extend(n,o.prototype,t),a.extend(n,t),n}var l=s(n(5655));l.Axios=o,l.create=function(e){return s(r(l.defaults,e))},l.Cancel=n(5263),l.CancelToken=n(4972),l.isCancel=n(6502),l.all=function(e){return Promise.all(e)},l.spread=n(8713),l.isAxiosError=n(6268),e.exports=l,e.exports.default=l},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,n)=>{"use strict";var a=n(5263);function i(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new a(e),t(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var e;return{token:new i((function(t){e=t})),cancel:e}},e.exports=i},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,n)=>{"use strict";var a=n(4867),i=n(5327),o=n(782),r=n(3572),s=n(7185);function l(e){this.defaults=e,this.interceptors={request:new o,response:new o}}l.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[r,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)n=n.then(t.shift(),t.shift());return n},l.prototype.getUri=function(e){return e=s(this.defaults,e),i(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},a.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),a.forEach(["post","put","patch"],(function(e){l.prototype[e]=function(t,n,a){return this.request(s(a||{},{method:e,url:t,data:n}))}})),e.exports=l},782:(e,t,n)=>{"use strict";var a=n(4867);function i(){this.handlers=[]}i.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},i.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},i.prototype.forEach=function(e){a.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=i},4097:(e,t,n)=>{"use strict";var a=n(1793),i=n(7303);e.exports=function(e,t){return e&&!a(t)?i(e,t):t}},5061:(e,t,n)=>{"use strict";var a=n(481);e.exports=function(e,t,n,i,o){var r=new Error(e);return a(r,t,n,i,o)}},3572:(e,t,n)=>{"use strict";var a=n(4867),i=n(8527),o=n(6502),r=n(5655);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=i(e.data,e.headers,e.transformRequest),e.headers=a.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),a.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||r.adapter)(e).then((function(t){return s(e),t.data=i(t.data,t.headers,e.transformResponse),t}),(function(t){return o(t)||(s(e),t&&t.response&&(t.response.data=i(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,n,a,i){return e.config=t,n&&(e.code=n),e.request=a,e.response=i,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){t=t||{};var n={},i=["url","method","data"],o=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function l(e,t){return a.isPlainObject(e)&&a.isPlainObject(t)?a.merge(e,t):a.isPlainObject(t)?a.merge({},t):a.isArray(t)?t.slice():t}function c(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(e[i],t[i])}a.forEach(i,(function(e){a.isUndefined(t[e])||(n[e]=l(void 0,t[e]))})),a.forEach(o,c),a.forEach(r,(function(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(void 0,t[i])})),a.forEach(s,(function(a){a in t?n[a]=l(e[a],t[a]):a in e&&(n[a]=l(void 0,e[a]))}));var u=i.concat(o).concat(r).concat(s),d=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===u.indexOf(e)}));return a.forEach(d,c),n}},6026:(e,t,n)=>{"use strict";var a=n(5061);e.exports=function(e,t,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?t(a("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},8527:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t,n){return a.forEach(n,(function(n){e=n(e,t)})),e}},5655:(e,t,n)=>{"use strict";var a=n(4155),i=n(4867),o=n(6016),r={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==a&&"[object process]"===Object.prototype.toString.call(a))&&(l=n(5448)),l),transformRequest:[function(e,t){return o(t,"Accept"),o(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(s(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),i.forEach(["post","put","patch"],(function(e){c.headers[e]=i.merge(r)})),e.exports=c},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),a=0;a{"use strict";var a=n(4867);function i(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var o;if(n)o=n(t);else if(a.isURLSearchParams(t))o=t.toString();else{var r=[];a.forEach(t,(function(e,t){null!=e&&(a.isArray(e)?t+="[]":e=[e],a.forEach(e,(function(e){a.isDate(e)?e=e.toISOString():a.isObject(e)&&(e=JSON.stringify(e)),r.push(i(t)+"="+i(e))})))})),o=r.join("&")}if(o){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?{write:function(e,t,n,i,o,r){var s=[];s.push(e+"="+encodeURIComponent(t)),a.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),a.isString(i)&&s.push("path="+i),a.isString(o)&&s.push("domain="+o),!0===r&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(e){var a=e;return t&&(n.setAttribute("href",a),a=n.href),n.setAttribute("href",a),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=i(window.location.href),function(t){var n=a.isString(t)?i(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},6016:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){a.forEach(e,(function(n,a){a!==t&&a.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[a])}))}},4109:(e,t,n)=>{"use strict";var a=n(4867),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,o,r={};return e?(a.forEach(e.split("\n"),(function(e){if(o=e.indexOf(":"),t=a.trim(e.substr(0,o)).toLowerCase(),n=a.trim(e.substr(o+1)),t){if(r[t]&&i.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([n]):r[t]?r[t]+", "+n:n}})),r):r}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4867:(e,t,n)=>{"use strict";var a=n(1849),i=Object.prototype.toString;function o(e){return"[object Array]"===i.call(e)}function r(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==i.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===i.call(e)}function u(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),o(e))for(var n=0,a=e.length;n{window.axios=n(9669),window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var a=document.head.querySelector('meta[name="csrf-token"]');a?window.axios.defaults.headers.common["X-CSRF-TOKEN"]=a.content:console.error("CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token")},5299:(e,t,n)=>{e.exports=new vuei18n({locale:document.documentElement.lang,fallbackLocale:"en",messages:{bg:n(987),cs:n(6054),de:n(7062),en:n(6886),"en-us":n(6886),"en-gb":n(5642),es:n(2360),el:n(1410),fr:n(6833),hu:n(6477),it:n(3092),nl:n(78),nb:n(2502),pl:n(8691),fi:n(3684),"pt-br":n(122),"pt-pt":n(4895),ro:n(403),ru:n(7448),"zh-tw":n(4963),"zh-cn":n(1922),sk:n(6949),sv:n(2285),vi:n(9783)}})},4155:e=>{var t,n,a=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var s,l=[],c=!1,u=-1;function d(){c&&s&&(c=!1,s.length?l=s.concat(l):u=-1,l.length&&_())}function _(){if(!c){var e=r(d);c=!0;for(var t=l.length;t;){for(s=l,l=[];++u1)for(var n=1;n{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Какво се случва?","flash_error":"Грешка!","flash_success":"Успех!","close":"Затвори","split_transaction_title":"Описание на разделена транзакция","errors_submission":"Имаше нещо нередно с вашите данни. Моля, проверете грешките.","split":"Раздели","single_split":"Раздел","transaction_stored_link":"Транзакция #{ID}(\\"{title}\\") беше записана.","transaction_updated_link":"Транзакция #{ID} беше обновена.","transaction_new_stored_link":"Транзакция #{ID} беше записана.","transaction_journal_information":"Информация за транзакция","no_budget_pointer":"Изглежда все още нямате бюджети. Трябва да създадете някои на страницата Бюджети . Бюджетите могат да ви помогнат да следите разходите си.","no_bill_pointer":"Изглежда все още нямате сметки. Трябва да създадете някои на страницата Сметки . Сметките могат да ви помогнат да следите разходите си.","source_account":"Разходна сметка","hidden_fields_preferences":"Можете да активирате повече опции за транзакции във вашите настройки.","destination_account":"Приходна сметка","add_another_split":"Добавяне на друг раздел","submission":"Изпращане","create_another":"След съхраняването се върнете тук, за да създадете нова.","reset_after":"Изчистване на формуляра след изпращане","submit":"Потвърди","amount":"Сума","date":"Дата","tags":"Етикети","no_budget":"(без бюджет)","no_bill":"(няма сметка)","category":"Категория","attachments":"Прикачени файлове","notes":"Бележки","external_uri":"External URL","update_transaction":"Обнови транзакцията","after_update_create_another":"След обновяването се върнете тук, за да продължите с редакцията.","store_as_new":"Съхранете като нова транзакция, вместо да я актуализирате.","split_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","none_in_select_list":"(нищо)","no_piggy_bank":"(без касичка)","description":"Описание","split_transaction_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","destination_account_reconciliation":"Не може да редактирате приходната сметка на транзакция за съгласуване.","source_account_reconciliation":"Не може да редактирате разходната сметка на транзакция за съгласуване.","budget":"Бюджет","bill":"Сметка","you_create_withdrawal":"Създавате теглене.","you_create_transfer":"Създавате прехвърляне.","you_create_deposit":"Създавате депозит.","edit":"Промени","delete":"Изтрий","name":"Име","profile_whoops":"Опаааа!","profile_something_wrong":"Нещо се обърка!","profile_try_again":"Нещо се обърка. Моля, опитайте отново.","profile_oauth_clients":"OAuth клиенти","profile_oauth_no_clients":"Не сте създали клиенти на OAuth.","profile_oauth_clients_header":"Клиенти","profile_oauth_client_id":"ИД (ID) на клиент","profile_oauth_client_name":"Име","profile_oauth_client_secret":"Тайна","profile_oauth_create_new_client":"Създай нов клиент","profile_oauth_create_client":"Създай клиент","profile_oauth_edit_client":"Редактирай клиент","profile_oauth_name_help":"Нещо, което вашите потребители ще разпознаят и ще се доверят.","profile_oauth_redirect_url":"Линк на препратката","profile_oauth_redirect_url_help":"URL адрес за обратно извикване на оторизацията на вашето приложение.","profile_authorized_apps":"Удостоверени приложения","profile_authorized_clients":"Удостоверени клиенти","profile_scopes":"Сфери","profile_revoke":"Анулирай","profile_personal_access_tokens":"Персонални маркери за достъп","profile_personal_access_token":"Персонален маркер за достъп","profile_personal_access_token_explanation":"Това е новия ви персонален маркер за достъп. Това е единственият път, когато ще бъде показан, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_no_personal_access_token":"Не сте създали никакви лични маркери за достъп.","profile_create_new_token":"Създай нов маркер","profile_create_token":"Създай маркер","profile_create":"Създай","profile_save_changes":"Запазване на промените","default_group_title_name":"(без група)","piggy_bank":"Касичка","profile_oauth_client_secret_title":"Тайна на клиента","profile_oauth_client_secret_expl":"Това е новата ви \\"тайна на клиента\\". Това е единственият път, когато ще бъде показана, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_oauth_confidential":"Поверително","profile_oauth_confidential_help":"Изисквайте клиента да се удостоверява с тайна. Поверителните клиенти могат да притежават идентификационни данни по защитен начин, без да ги излагат на неоторизирани страни. Публичните приложения, като например десктопа или JavaScript SPA приложения, не могат да пазят тайни по сигурен начин.","multi_account_warning_unknown":"В зависимост от вида на транзакцията която създавате, източникът и / или целевата сметка на следващите разделяния може да бъде променена от това което е дефинирано в първото разделение на транзакцията.","multi_account_warning_withdrawal":"Имайте предвид, че разходна сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на тегленето.","multi_account_warning_deposit":"Имайте предвид, че приходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на депозита.","multi_account_warning_transfer":"Имайте предвид, че приходната + разходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на прехвърлянето."},"form":{"interest_date":"Падеж на лихва","book_date":"Дата на осчетоводяване","process_date":"Дата на обработка","due_date":"Дата на падеж","foreign_amount":"Сума във валута","payment_date":"Дата на плащане","invoice_date":"Дата на фактура","internal_reference":"Вътрешна референция"},"config":{"html_language":"bg"}}')},6054:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Jak to jde?","flash_error":"Chyba!","flash_success":"Úspěšně dokončeno!","close":"Zavřít","split_transaction_title":"Popis rozúčtování","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Rozdělit","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Informace o transakci","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Zdrojový účet","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Cílový účet","add_another_split":"Přidat další rozúčtování","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Odeslat","amount":"Částka","date":"Datum","tags":"Štítky","no_budget":"(žádný rozpočet)","no_bill":"(no bill)","category":"Kategorie","attachments":"Přílohy","notes":"Poznámky","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.","none_in_select_list":"(žádné)","no_piggy_bank":"(žádná pokladnička)","description":"Popis","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Upravit","delete":"Odstranit","name":"Název","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Úrokové datum","book_date":"Datum rezervace","process_date":"Datum zpracování","due_date":"Datum splatnosti","foreign_amount":"Částka v cizí měně","payment_date":"Datum zaplacení","invoice_date":"Datum vystavení","internal_reference":"Interní reference"},"config":{"html_language":"cs"}}')},7062:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Überblick","flash_error":"Fehler!","flash_success":"Geschafft!","close":"Schließen","split_transaction_title":"Beschreibung der Splittbuchung","errors_submission":"Ihre Übermittlung ist fehlgeschlagen. Bitte überprüfen Sie die Fehler.","split":"Teilen","single_split":"Teil","transaction_stored_link":"Buchung #{ID} (\\"{title}\\") wurde gespeichert.","transaction_updated_link":"Buchung#{ID} wurde aktualisiert.","transaction_new_stored_link":"Buchung #{ID} wurde gespeichert.","transaction_journal_information":"Transaktionsinformationen","no_budget_pointer":"Sie scheinen noch keine Kostenrahmen festgelegt zu haben. Sie sollten einige davon auf der Seite Kostenrahmen- anlegen. Kostenrahmen können Ihnen dabei helfen, den Überblick über die Ausgaben zu behalten.","no_bill_pointer":"Sie scheinen noch keine Rechnungen zu haben. Sie sollten einige auf der Seite Rechnungen erstellen. Anhand der Rechnungen können Sie den Überblick über Ihre Ausgaben behalten.","source_account":"Quellkonto","hidden_fields_preferences":"Sie können weitere Buchungsoptionen in Ihren Einstellungen aktivieren.","destination_account":"Zielkonto","add_another_split":"Eine weitere Aufteilung hinzufügen","submission":"Übermittlung","create_another":"Nach dem Speichern hierher zurückkehren, um ein weiteres zu erstellen.","reset_after":"Formular nach der Übermittlung zurücksetzen","submit":"Absenden","amount":"Betrag","date":"Datum","tags":"Schlagwörter","no_budget":"(kein Budget)","no_bill":"(keine Belege)","category":"Kategorie","attachments":"Anhänge","notes":"Notizen","external_uri":"Externe URL","update_transaction":"Buchung aktualisieren","after_update_create_another":"Nach dem Aktualisieren hierher zurückkehren, um weiter zu bearbeiten.","store_as_new":"Als neue Buchung speichern statt zu aktualisieren.","split_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.","none_in_select_list":"(Keine)","no_piggy_bank":"(kein Sparschwein)","description":"Beschreibung","split_transaction_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchung geben.","destination_account_reconciliation":"Sie können das Zielkonto einer Kontenausgleichsbuchung nicht bearbeiten.","source_account_reconciliation":"Sie können das Quellkonto einer Kontenausgleichsbuchung nicht bearbeiten.","budget":"Budget","bill":"Rechnung","you_create_withdrawal":"Sie haben eine Auszahlung erstellt.","you_create_transfer":"Sie haben eine Buchung erstellt.","you_create_deposit":"Sie haben eine Einzahlung erstellt.","edit":"Bearbeiten","delete":"Löschen","name":"Name","profile_whoops":"Huch!","profile_something_wrong":"Ein Problem ist aufgetreten!","profile_try_again":"Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.","profile_oauth_clients":"OAuth-Clients","profile_oauth_no_clients":"Sie haben noch keine OAuth-Clients erstellt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client-ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Geheimnis","profile_oauth_create_new_client":"Neuen Client erstellen","profile_oauth_create_client":"Client erstellen","profile_oauth_edit_client":"Client bearbeiten","profile_oauth_name_help":"Etwas das Ihre Nutzer erkennen und dem sie vertrauen.","profile_oauth_redirect_url":"Weiterleitungs-URL","profile_oauth_redirect_url_help":"Die Authorisierungs-Callback-URL Ihrer Anwendung.","profile_authorized_apps":"Autorisierte Anwendungen","profile_authorized_clients":"Autorisierte Clients","profile_scopes":"Bereiche","profile_revoke":"Widerrufen","profile_personal_access_tokens":"Persönliche Zugangs-Tokens","profile_personal_access_token":"Persönlicher Zugangs-Token","profile_personal_access_token_explanation":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_no_personal_access_token":"Sie haben keine persönlichen Zugangsschlüssel erstellt.","profile_create_new_token":"Neuen Schlüssel erstellen","profile_create_token":"Schlüssel erstellen","profile_create":"Erstellen","profile_save_changes":"Änderungen speichern","default_group_title_name":"(ohne Gruppierung)","piggy_bank":"Sparschwein","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_oauth_confidential":"Vertraulich","profile_oauth_confidential_help":"Der Client muss sich mit einem Secret authentifizieren. Vertrauliche Clients können die Anmeldedaten speichern, ohne diese unautorisierten Akteuren mitzuteilen. Öffentliche Anwendungen wie native Desktop- oder JavaScript-SPA-Anwendungen können Geheimnisse nicht sicher speichern.","multi_account_warning_unknown":"Abhängig von der Art der Buchung, die Sie anlegen, kann das Quell- und/oder Zielkonto nachfolgender Aufteilungen durch das überschrieben werden, was in der ersten Aufteilung der Buchung definiert wurde.","multi_account_warning_withdrawal":"Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_deposit":"Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einzahlung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_transfer":"Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der Übertragung definiert ist, außer Kraft gesetzt wird."},"form":{"interest_date":"Zinstermin","book_date":"Buchungsdatum","process_date":"Bearbeitungsdatum","due_date":"Fälligkeitstermin","foreign_amount":"Ausländischer Betrag","payment_date":"Zahlungsdatum","invoice_date":"Rechnungsdatum","internal_reference":"Interner Verweis"},"config":{"html_language":"de"}}')},1410:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Τι παίζει;","flash_error":"Σφάλμα!","flash_success":"Επιτυχία!","close":"Κλείσιμο","split_transaction_title":"Περιγραφή της συναλλαγής με διαχωρισμό","errors_submission":"Υπήρξε κάποιο λάθος με την υποβολή σας. Παρακαλώ ελέγξτε τα σφάλματα.","split":"Διαχωρισμός","single_split":"Διαχωρισμός","transaction_stored_link":"Η συναλλαγή #{ID} (\\"{title}\\") έχει αποθηκευτεί.","transaction_updated_link":"Η συναλλαγή #{ID} έχει ενημερωθεί.","transaction_new_stored_link":"Η συναλλαγή #{ID} έχει αποθηκευτεί.","transaction_journal_information":"Πληροφορίες συναλλαγής","no_budget_pointer":"Φαίνεται πως δεν έχετε ορίσει προϋπολογισμούς ακόμη. Πρέπει να δημιουργήσετε κάποιον στη σελίδα προϋπολογισμών. Οι προϋπολογισμοί σας βοηθούν να επιβλέπετε τις δαπάνες σας.","no_bill_pointer":"Φαίνεται πως δεν έχετε ορίσει πάγια έξοδα ακόμη. Πρέπει να δημιουργήσετε κάποιο στη σελίδα πάγιων εξόδων. Τα πάγια έξοδα σας βοηθούν να επιβλέπετε τις δαπάνες σας.","source_account":"Λογαριασμός προέλευσης","hidden_fields_preferences":"Μπορείτε να ενεργοποιήσετε περισσότερες επιλογές συναλλαγών στις προτιμήσεις.","destination_account":"Λογαριασμός προορισμού","add_another_split":"Προσθήκη ενός ακόμα διαχωρισμού","submission":"Υποβολή","create_another":"Μετά την αποθήκευση, επιστρέψτε εδώ για να δημιουργήσετε ακόμη ένα.","reset_after":"Επαναφορά φόρμας μετά την υποβολή","submit":"Υποβολή","amount":"Ποσό","date":"Ημερομηνία","tags":"Ετικέτες","no_budget":"(χωρίς προϋπολογισμό)","no_bill":"(χωρίς πάγιο έξοδο)","category":"Κατηγορία","attachments":"Συνημμένα","notes":"Σημειώσεις","external_uri":"External URL","update_transaction":"Ενημέρωση συναλλαγής","after_update_create_another":"Μετά την ενημέρωση, επιστρέψτε εδώ για να συνεχίσετε την επεξεργασία.","store_as_new":"Αποθήκευση ως νέα συναλλαγή αντί για ενημέρωση.","split_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","none_in_select_list":"(τίποτα)","no_piggy_bank":"(χωρίς κουμπαρά)","description":"Περιγραφή","split_transaction_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","destination_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προορισμού σε μια συναλλαγή τακτοποίησης.","source_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προέλευσης σε μια συναλλαγή τακτοποίησης.","budget":"Προϋπολογισμός","bill":"Πάγιο έξοδο","you_create_withdrawal":"Δημιουργείτε μια ανάληψη.","you_create_transfer":"Δημιουργείτε μια μεταφορά.","you_create_deposit":"Δημιουργείτε μια κατάθεση.","edit":"Επεξεργασία","delete":"Διαγραφή","name":"Όνομα","profile_whoops":"Ούπς!","profile_something_wrong":"Κάτι πήγε στραβά!","profile_try_again":"Κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά.","profile_oauth_clients":"Πελάτες OAuth","profile_oauth_no_clients":"Δεν έχετε δημιουργήσει πελάτες OAuth.","profile_oauth_clients_header":"Πελάτες","profile_oauth_client_id":"Αναγνωριστικό πελάτη","profile_oauth_client_name":"Όνομα","profile_oauth_client_secret":"Μυστικό","profile_oauth_create_new_client":"Δημιουργία νέου πελάτη","profile_oauth_create_client":"Δημιουργία πελάτη","profile_oauth_edit_client":"Επεξεργασία πελάτη","profile_oauth_name_help":"Κάτι που οι χρήστες σας θα αναγνωρίζουν και θα εμπιστεύονται.","profile_oauth_redirect_url":"URL ανακατεύθυνσης","profile_oauth_redirect_url_help":"To authorization callback URL της εφαρμογής σας.","profile_authorized_apps":"Εξουσιοδοτημένες εφαρμογές","profile_authorized_clients":"Εξουσιοδοτημένοι πελάτες","profile_scopes":"Πεδία εφαρμογής","profile_revoke":"Ανάκληση","profile_personal_access_tokens":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token_explanation":"Εδώ είναι το νέο διακριτικό προσωπικής πρόσβασης. Αυτή είναι η μόνη φορά που θα εμφανιστεί, οπότε μη το χάσετε! Μπορείτε να χρησιμοποιείτε αυτό το διακριτικό για να κάνετε κλήσεις API.","profile_no_personal_access_token":"Δεν έχετε δημιουργήσει προσωπικά διακριτικά πρόσβασης.","profile_create_new_token":"Δημιουργία νέου διακριτικού","profile_create_token":"Δημιουργία διακριτικού","profile_create":"Δημιουργία","profile_save_changes":"Αποθήκευση αλλαγών","default_group_title_name":"(χωρίς ομάδα)","piggy_bank":"Κουμπαράς","profile_oauth_client_secret_title":"Μυστικό Πελάτη","profile_oauth_client_secret_expl":"Εδώ είναι το νέο σας μυστικό πελάτη. Αυτή είναι η μόνη φορά που θα σας εμφανιστεί, οπότε μην το χάσετε! Μπορείτε να το χρησιμοποιείτε για να κάνετε αιτήματα API.","profile_oauth_confidential":"Εμπιστευτικό","profile_oauth_confidential_help":"Απαιτήστε από το πρόγραμμα πελάτη να πραγματοποιήσει έλεγχο ταυτότητας με ένα μυστικό. Οι έμπιστοι πελάτες μπορούν να διατηρούν διαπιστευτήρια με ασφαλή τρόπο χωρίς να τα εκθέτουν σε μη εξουσιοδοτημένα μέρη. Οι δημόσιες εφαρμογές, όπως οι εγγενείς εφαρμογές για επιτραπέζιους υπολογιστές ή JavaScript SPA, δεν μπορούν να κρατήσουν μυστικά με ασφάλεια.","multi_account_warning_unknown":"Ανάλογα με τον τύπο της συναλλαγής που δημιουργείτε, ο λογαριασμός προέλευσης ή/και προορισμού των επόμενων διαχωρισμών ενδέχεται να παρακαμφθεί από αυτό που ορίζεται στο πρώτο διαχωρισμό της συναλλαγής.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ημερομηνία τοκισμού","book_date":"Ημερομηνία εγγραφής","process_date":"Ημερομηνία επεξεργασίας","due_date":"Ημερομηνία προθεσμίας","foreign_amount":"Ποσό σε ξένο νόμισμα","payment_date":"Ημερομηνία πληρωμής","invoice_date":"Ημερομηνία τιμολόγησης","internal_reference":"Εσωτερική αναφορά"},"config":{"html_language":"el"}}')},5642:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en-gb"}}')},6886:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en"}}')},2360:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"¿Qué está pasando?","flash_error":"¡Error!","flash_success":"¡Operación correcta!","close":"Cerrar","split_transaction_title":"Descripción de la transacción dividida","errors_submission":"Hubo un problema con su envío. Por favor, compruebe los errores.","split":"Separar","single_split":"División","transaction_stored_link":"La transacción #{ID} (\\"{title}\\") ha sido almacenada.","transaction_updated_link":"La transacción #{ID} ha sido actualizada.","transaction_new_stored_link":"La transacción #{ID} ha sido guardada.","transaction_journal_information":"Información de transacción","no_budget_pointer":"Parece que aún no tienes presupuestos. Debes crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.","no_bill_pointer":"Parece que aún no tienes facturas. Deberías crear algunas en la página de facturas. Las facturas pueden ayudarte a llevar un seguimiento de los gastos.","source_account":"Cuenta origen","hidden_fields_preferences":"Puede habilitar más opciones de transacción en sus ajustes .","destination_account":"Cuenta destino","add_another_split":"Añadir otra división","submission":"Envío","create_another":"Después de guardar, vuelve aquí para crear otro.","reset_after":"Restablecer formulario después del envío","submit":"Enviar","amount":"Cantidad","date":"Fecha","tags":"Etiquetas","no_budget":"(sin presupuesto)","no_bill":"(sin factura)","category":"Categoria","attachments":"Archivos adjuntos","notes":"Notas","external_uri":"External URL","update_transaction":"Actualizar transacción","after_update_create_another":"Después de actualizar, vuelve aquí para continuar editando.","store_as_new":"Almacenar como una nueva transacción en lugar de actualizar.","split_title_help":"Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.","none_in_select_list":"(ninguno)","no_piggy_bank":"(sin hucha)","description":"Descripción","split_transaction_title_help":"Si crea una transacción dividida, debe existir una descripción global para todas las divisiones de la transacción.","destination_account_reconciliation":"No puedes editar la cuenta de destino de una transacción de reconciliación.","source_account_reconciliation":"No puedes editar la cuenta de origen de una transacción de reconciliación.","budget":"Presupuesto","bill":"Factura","you_create_withdrawal":"Está creando un retiro.","you_create_transfer":"Está creando una transferencia.","you_create_deposit":"Está creando un depósito.","edit":"Editar","delete":"Eliminar","name":"Nombre","profile_whoops":"¡Ups!","profile_something_wrong":"¡Algo salió mal!","profile_try_again":"Algo salió mal. Por favor, vuelva a intentarlo.","profile_oauth_clients":"Clientes de OAuth","profile_oauth_no_clients":"No ha creado ningún cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID del cliente","profile_oauth_client_name":"Nombre","profile_oauth_client_secret":"Secreto","profile_oauth_create_new_client":"Crear un Nuevo Cliente","profile_oauth_create_client":"Crear Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que sus usuarios reconocerán y confiarán.","profile_oauth_redirect_url":"Redirigir URL","profile_oauth_redirect_url_help":"La URL de devolución de autorización de su aplicación.","profile_authorized_apps":"Aplicaciones autorizadas","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Ámbitos","profile_revoke":"Revocar","profile_personal_access_tokens":"Tokens de acceso personal","profile_personal_access_token":"Token de acceso personal","profile_personal_access_token_explanation":"Aquí está su nuevo token de acceso personal. Esta es la única vez que se mostrará así que ¡no lo pierda! Ahora puede usar este token para hacer solicitudes de la API.","profile_no_personal_access_token":"No ha creado ningún token de acceso personal.","profile_create_new_token":"Crear nuevo token","profile_create_token":"Crear token","profile_create":"Crear","profile_save_changes":"Guardar cambios","default_group_title_name":"(sin agrupación)","piggy_bank":"Hucha","profile_oauth_client_secret_title":"Secreto del Cliente","profile_oauth_client_secret_expl":"Aquí está su nuevo secreto de cliente. Esta es la única vez que se mostrará así que no lo pierda! Ahora puede usar este secreto para hacer solicitudes de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Requerir que el cliente se autentifique con un secreto. Los clientes confidenciales pueden mantener las credenciales de forma segura sin exponerlas a partes no autorizadas. Las aplicaciones públicas, como aplicaciones de escritorio nativo o SPA de JavaScript, no pueden guardar secretos de forma segura.","multi_account_warning_unknown":"Dependiendo del tipo de transacción que cree, la cuenta de origen y/o destino de divisiones posteriores puede ser anulada por lo que se define en la primera división de la transacción.","multi_account_warning_withdrawal":"Tenga en cuenta que la cuenta de origen de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_deposit":"Tenga en cuenta que la cuenta de destino de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_transfer":"Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores será anulada por lo que se defina en la primera división de la transferencia."},"form":{"interest_date":"Fecha de interés","book_date":"Fecha de registro","process_date":"Fecha de procesamiento","due_date":"Fecha de vencimiento","foreign_amount":"Cantidad extranjera","payment_date":"Fecha de pago","invoice_date":"Fecha de la factura","internal_reference":"Referencia interna"},"config":{"html_language":"es"}}')},3684:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mitä kuuluu?","flash_error":"Virhe!","flash_success":"Valmista tuli!","close":"Sulje","split_transaction_title":"Jaetun tapahtuman kuvaus","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Jaa","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Tapahtumatiedot","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Lähdetili","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Kohdetili","add_another_split":"Lisää tapahtumaan uusi osa","submission":"Vahvistus","create_another":"Tallennuksen jälkeen, palaa takaisin luomaan uusi tapahtuma.","reset_after":"Tyhjennä lomake lähetyksen jälkeen","submit":"Vahvista","amount":"Summa","date":"Päivämäärä","tags":"Tägit","no_budget":"(ei budjettia)","no_bill":"(no bill)","category":"Kategoria","attachments":"Liitteet","notes":"Muistiinpanot","external_uri":"External URL","update_transaction":"Päivitä tapahtuma","after_update_create_another":"Päivityksen jälkeen, palaa takaisin jatkamaan muokkausta.","store_as_new":"Tallenna uutena tapahtumana päivityksen sijaan.","split_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","none_in_select_list":"(ei mitään)","no_piggy_bank":"(ei säästöpossu)","description":"Kuvaus","split_transaction_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","destination_account_reconciliation":"Et voi muokata täsmäytystapahtuman kohdetiliä.","source_account_reconciliation":"Et voi muokata täsmäytystapahtuman lähdetiliä.","budget":"Budjetti","bill":"Lasku","you_create_withdrawal":"Olet luomassa nostoa.","you_create_transfer":"Olet luomassa siirtoa.","you_create_deposit":"Olet luomassa talletusta.","edit":"Muokkaa","delete":"Poista","name":"Nimi","profile_whoops":"Hupsis!","profile_something_wrong":"Jokin meni vikaan!","profile_try_again":"Jokin meni vikaan. Yritä uudelleen.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Asiakasohjelmat","profile_oauth_client_id":"Asiakastunnus","profile_oauth_client_name":"Nimi","profile_oauth_client_secret":"Salaisuus","profile_oauth_create_new_client":"Luo Uusi Asiakas","profile_oauth_create_client":"Luo Asiakas","profile_oauth_edit_client":"Muokkaa asiakasta","profile_oauth_name_help":"Jotain käyttäjillesi tuttua ja luotettavaa.","profile_oauth_redirect_url":"URL:n uudelleenohjaus","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Peruuta","profile_personal_access_tokens":"Henkilökohtaiset Käyttöoikeuskoodit","profile_personal_access_token":"Henkilökohtainen Käyttöoikeuskoodi","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Luo uusi tunnus","profile_create_token":"Luo tunnus","profile_create":"Luo","profile_save_changes":"Tallenna muutokset","default_group_title_name":"(ryhmittelemättömät)","piggy_bank":"Säästöpossu","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Korkopäivä","book_date":"Kirjauspäivä","process_date":"Käsittelypäivä","due_date":"Eräpäivä","foreign_amount":"Ulkomaan summa","payment_date":"Maksupäivä","invoice_date":"Laskun päivämäärä","internal_reference":"Sisäinen viite"},"config":{"html_language":"fi"}}')},6833:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Quoi de neuf ?","flash_error":"Erreur !","flash_success":"Super !","close":"Fermer","split_transaction_title":"Description de l\'opération ventilée","errors_submission":"Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs.","split":"Ventiler","single_split":"Ventilation","transaction_stored_link":"L\'opération n°{ID} (\\"{title}\\") a été enregistrée.","transaction_updated_link":"L\'opération n°{ID} a été mise à jour.","transaction_new_stored_link":"L\'opération n°{ID} a été enregistrée.","transaction_journal_information":"Informations sur l\'opération","no_budget_pointer":"Vous semblez n’avoir encore aucun budget. Vous devriez en créer un sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.","no_bill_pointer":"Vous semblez n\'avoir encore aucune facture. Vous devriez en créer une sur la page factures-. Les factures peuvent vous aider à garder une trace des dépenses.","source_account":"Compte source","hidden_fields_preferences":"Vous pouvez activer plus d\'options d\'opérations dans vos paramètres.","destination_account":"Compte de destination","add_another_split":"Ajouter une autre fraction","submission":"Soumission","create_another":"Après enregistrement, revenir ici pour en créer un nouveau.","reset_after":"Réinitialiser le formulaire après soumission","submit":"Soumettre","amount":"Montant","date":"Date","tags":"Tags","no_budget":"(pas de budget)","no_bill":"(aucune facture)","category":"Catégorie","attachments":"Pièces jointes","notes":"Notes","external_uri":"URL externe","update_transaction":"Mettre à jour l\'opération","after_update_create_another":"Après la mise à jour, revenir ici pour continuer l\'édition.","store_as_new":"Enregistrer comme une nouvelle opération au lieu de mettre à jour.","split_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.","none_in_select_list":"(aucun)","no_piggy_bank":"(aucune tirelire)","description":"Description","split_transaction_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fraction de l\'opération.","destination_account_reconciliation":"Vous ne pouvez pas modifier le compte de destination d\'une opération de rapprochement.","source_account_reconciliation":"Vous ne pouvez pas modifier le compte source d\'une opération de rapprochement.","budget":"Budget","bill":"Facture","you_create_withdrawal":"Vous saisissez une dépense.","you_create_transfer":"Vous saisissez un transfert.","you_create_deposit":"Vous saisissez un dépôt.","edit":"Modifier","delete":"Supprimer","name":"Nom","profile_whoops":"Oups !","profile_something_wrong":"Une erreur s\'est produite !","profile_try_again":"Une erreur s’est produite. Merci d’essayer à nouveau.","profile_oauth_clients":"Clients OAuth","profile_oauth_no_clients":"Vous n’avez pas encore créé de client OAuth.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Identifiant","profile_oauth_client_name":"Nom","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Créer un nouveau client","profile_oauth_create_client":"Créer un client","profile_oauth_edit_client":"Modifier le client","profile_oauth_name_help":"Quelque chose que vos utilisateurs reconnaîtront et qui inspirera confiance.","profile_oauth_redirect_url":"URL de redirection","profile_oauth_redirect_url_help":"URL de callback de votre application.","profile_authorized_apps":"Applications autorisées","profile_authorized_clients":"Clients autorisés","profile_scopes":"Permissions","profile_revoke":"Révoquer","profile_personal_access_tokens":"Jetons d\'accès personnels","profile_personal_access_token":"Jeton d\'accès personnel","profile_personal_access_token_explanation":"Voici votre nouveau jeton d’accès personnel. Ceci est la seule fois où vous pourrez le voir, ne le perdez pas ! Vous pouvez dès à présent utiliser ce jeton pour lancer des requêtes avec l’API.","profile_no_personal_access_token":"Vous n’avez pas encore créé de jeton d’accès personnel.","profile_create_new_token":"Créer un nouveau jeton","profile_create_token":"Créer un jeton","profile_create":"Créer","profile_save_changes":"Enregistrer les modifications","default_group_title_name":"(Sans groupement)","piggy_bank":"Tirelire","profile_oauth_client_secret_title":"Secret du client","profile_oauth_client_secret_expl":"Voici votre nouveau secret de client. C\'est la seule fois qu\'il sera affiché, donc ne le perdez pas ! Vous pouvez maintenant utiliser ce secret pour faire des requêtes d\'API.","profile_oauth_confidential":"Confidentiel","profile_oauth_confidential_help":"Exiger que le client s\'authentifie avec un secret. Les clients confidentiels peuvent détenir des informations d\'identification de manière sécurisée sans les exposer à des tiers non autorisés. Les applications publiques, telles que les applications de bureau natif ou les SPA JavaScript, ne peuvent pas tenir des secrets en toute sécurité.","multi_account_warning_unknown":"Selon le type d\'opération que vous créez, le(s) compte(s) source et/ou de destination des ventilations suivantes peuvent être remplacés par celui de la première ventilation de l\'opération.","multi_account_warning_withdrawal":"Gardez en tête que le compte source des ventilations suivantes peut être remplacé par celui de la première ventilation de la dépense.","multi_account_warning_deposit":"Gardez en tête que le compte de destination des ventilations suivantes peut être remplacé par celui de la première ventilation du dépôt.","multi_account_warning_transfer":"Gardez en tête que les comptes source et de destination des ventilations suivantes peuvent être remplacés par ceux de la première ventilation du transfert."},"form":{"interest_date":"Date de valeur (intérêts)","book_date":"Date de réservation","process_date":"Date de traitement","due_date":"Échéance","foreign_amount":"Montant en devise étrangère","payment_date":"Date de paiement","invoice_date":"Date de facturation","internal_reference":"Référence interne"},"config":{"html_language":"fr"}}')},6477:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mi a helyzet?","flash_error":"Hiba!","flash_success":"Siker!","close":"Bezárás","split_transaction_title":"Felosztott tranzakció leírása","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Felosztás","single_split":"Felosztás","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") mentve.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} mentve.","transaction_journal_information":"Tranzakciós információk","no_budget_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","no_bill_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","source_account":"Forrás számla","hidden_fields_preferences":"A beállításokban több mező is engedélyezhető.","destination_account":"Célszámla","add_another_split":"Másik felosztás hozzáadása","submission":"Feliratkozás","create_another":"A tárolás után térjen vissza ide új létrehozásához.","reset_after":"Űrlap törlése a beküldés után","submit":"Beküldés","amount":"Összeg","date":"Dátum","tags":"Címkék","no_budget":"(nincs költségkeret)","no_bill":"(no bill)","category":"Kategória","attachments":"Mellékletek","notes":"Megjegyzések","external_uri":"External URL","update_transaction":"Tranzakció frissítése","after_update_create_another":"A frissítés után térjen vissza ide a szerkesztés folytatásához.","store_as_new":"Tárolás új tranzakcióként frissítés helyett.","split_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","none_in_select_list":"(nincs)","no_piggy_bank":"(nincs malacpersely)","description":"Leírás","split_transaction_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","destination_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció célszámláját.","source_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció forrásszámláját.","budget":"Költségkeret","bill":"Számla","you_create_withdrawal":"Egy költség létrehozása.","you_create_transfer":"Egy átutalás létrehozása.","you_create_deposit":"Egy bevétel létrehozása.","edit":"Szerkesztés","delete":"Törlés","name":"Név","profile_whoops":"Hoppá!","profile_something_wrong":"Hiba történt!","profile_try_again":"Hiba történt. Kérjük, próbálja meg újra.","profile_oauth_clients":"OAuth kliensek","profile_oauth_no_clients":"Nincs létrehozva egyetlen OAuth kliens sem.","profile_oauth_clients_header":"Kliensek","profile_oauth_client_id":"Kliens ID","profile_oauth_client_name":"Megnevezés","profile_oauth_client_secret":"Titkos kód","profile_oauth_create_new_client":"Új kliens létrehozása","profile_oauth_create_client":"Kliens létrehozása","profile_oauth_edit_client":"Kliens szerkesztése","profile_oauth_name_help":"Segítség, hogy a felhasználók tudják mihez kapcsolódik.","profile_oauth_redirect_url":"Átirányítási URL","profile_oauth_redirect_url_help":"Az alkalmazásban használt autentikációs URL.","profile_authorized_apps":"Engedélyezett alkalmazások","profile_authorized_clients":"Engedélyezett kliensek","profile_scopes":"Hatáskörök","profile_revoke":"Visszavonás","profile_personal_access_tokens":"Személyes hozzáférési tokenek","profile_personal_access_token":"Személyes hozzáférési token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"Nincs létrehozva egyetlen személyes hozzáférési token sem.","profile_create_new_token":"Új token létrehozása","profile_create_token":"Token létrehozása","profile_create":"Létrehozás","profile_save_changes":"Módosítások mentése","default_group_title_name":"(nem csoportosított)","piggy_bank":"Malacpersely","profile_oauth_client_secret_title":"Kliens titkos kódja","profile_oauth_client_secret_expl":"Ez a kliens titkos kódja. Ez az egyetlen alkalom, amikor meg van jelenítve, ne hagyd el! Ezzel a kóddal végezhetsz API hívásokat.","profile_oauth_confidential":"Bizalmas","profile_oauth_confidential_help":"Titkos kód használata a kliens bejelentkezéséhez. Bizonyos kliensek biztonságosan tudnak hitelesítő adatokat tárolni, anélkül hogy jogosulatlan fél hozzáférhetne. Nyilvános kliensek, például mint asztali vagy JavaScript SPA alkalmazások nem tudnak biztonságosan titkos kódot tárolni.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Kamatfizetési időpont","book_date":"Könyvelés dátuma","process_date":"Feldolgozás dátuma","due_date":"Lejárati időpont","foreign_amount":"Külföldi összeg","payment_date":"Fizetés dátuma","invoice_date":"Számla dátuma","internal_reference":"Belső hivatkozás"},"config":{"html_language":"hu"}}')},3092:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"La tua situazione finanziaria","flash_error":"Errore!","flash_success":"Successo!","close":"Chiudi","split_transaction_title":"Descrizione della transazione suddivisa","errors_submission":"Errore durante l\'invio. Controlla gli errori segnalati qui sotto.","split":"Dividi","single_split":"Divisione","transaction_stored_link":"La transazione #{ID} (\\"{title}\\") è stata salvata.","transaction_updated_link":"La transazione #{ID} è stata aggiornata.","transaction_new_stored_link":"La transazione #{ID} è stata salvata.","transaction_journal_information":"Informazioni transazione","no_budget_pointer":"Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget. I budget possono aiutarti a tenere traccia delle spese.","no_bill_pointer":"Sembra che tu non abbia ancora delle bollette. Dovresti crearne alcune nella pagina delle bollette. Le bollette possono aiutarti a tenere traccia delle spese.","source_account":"Conto di origine","hidden_fields_preferences":"Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni.","destination_account":"Conto destinazione","add_another_split":"Aggiungi un\'altra divisione","submission":"Invio","create_another":"Dopo il salvataggio, torna qui per crearne un\'altra.","reset_after":"Resetta il modulo dopo l\'invio","submit":"Invia","amount":"Importo","date":"Data","tags":"Etichette","no_budget":"(nessun budget)","no_bill":"(nessuna bolletta)","category":"Categoria","attachments":"Allegati","notes":"Note","external_uri":"URL esterno","update_transaction":"Aggiorna transazione","after_update_create_another":"Dopo l\'aggiornamento, torna qui per continuare la modifica.","store_as_new":"Salva come nuova transazione invece di aggiornarla.","split_title_help":"Se crei una transazione suddivisa è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","none_in_select_list":"(nessuna)","no_piggy_bank":"(nessun salvadanaio)","description":"Descrizione","split_transaction_title_help":"Se crei una transazione suddivisa, è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","destination_account_reconciliation":"Non è possibile modificare il conto di destinazione di una transazione di riconciliazione.","source_account_reconciliation":"Non puoi modificare il conto di origine di una transazione di riconciliazione.","budget":"Budget","bill":"Bolletta","you_create_withdrawal":"Stai creando un prelievo.","you_create_transfer":"Stai creando un trasferimento.","you_create_deposit":"Stai creando un deposito.","edit":"Modifica","delete":"Elimina","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Qualcosa non ha funzionato!","profile_try_again":"Qualcosa non ha funzionato. Riprova.","profile_oauth_clients":"Client OAuth","profile_oauth_no_clients":"Non hai creato nessun client OAuth.","profile_oauth_clients_header":"Client","profile_oauth_client_id":"ID client","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segreto","profile_oauth_create_new_client":"Crea nuovo client","profile_oauth_create_client":"Crea client","profile_oauth_edit_client":"Modifica client","profile_oauth_name_help":"Qualcosa di cui i tuoi utenti potranno riconoscere e fidarsi.","profile_oauth_redirect_url":"URL di reindirizzamento","profile_oauth_redirect_url_help":"L\'URL di callback dell\'autorizzazione della tua applicazione.","profile_authorized_apps":"Applicazioni autorizzate","profile_authorized_clients":"Client autorizzati","profile_scopes":"Ambiti","profile_revoke":"Revoca","profile_personal_access_tokens":"Token di acceso personale","profile_personal_access_token":"Token di acceso personale","profile_personal_access_token_explanation":"Ecco il tuo nuovo token di accesso personale. Questa è l\'unica volta che ti viene mostrato per cui non perderlo! Da adesso puoi utilizzare questo token per effettuare delle richieste API.","profile_no_personal_access_token":"Non hai creato alcun token di accesso personale.","profile_create_new_token":"Crea nuovo token","profile_create_token":"Crea token","profile_create":"Crea","profile_save_changes":"Salva modifiche","default_group_title_name":"(non in un gruppo)","piggy_bank":"Salvadanaio","profile_oauth_client_secret_title":"Segreto del client","profile_oauth_client_secret_expl":"Ecco il segreto del nuovo client. Questa è l\'unica occasione in cui viene mostrato pertanto non perderlo! Ora puoi usare questo segreto per effettuare delle richieste alle API.","profile_oauth_confidential":"Riservato","profile_oauth_confidential_help":"Richiede al client di autenticarsi con un segreto. I client riservati possono conservare le credenziali in modo sicuro senza esporle a soggetti non autorizzati. Le applicazioni pubbliche, come le applicazioni desktop native o JavaScript SPA, non sono in grado di conservare i segreti in modo sicuro.","multi_account_warning_unknown":"A seconda del tipo di transazione che hai creato, il conto di origine e/o destinazione delle successive suddivisioni può essere sovrascritto da qualsiasi cosa sia definita nella prima suddivisione della transazione.","multi_account_warning_withdrawal":"Ricorda che il conto di origine delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del prelievo.","multi_account_warning_deposit":"Ricorda che il conto di destinazione delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del deposito.","multi_account_warning_transfer":"Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento."},"form":{"interest_date":"Data di valuta","book_date":"Data contabile","process_date":"Data elaborazione","due_date":"Data scadenza","foreign_amount":"Importo estero","payment_date":"Data pagamento","invoice_date":"Data fatturazione","internal_reference":"Riferimento interno"},"config":{"html_language":"it"}}')},2502:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Feil!","flash_success":"Suksess!","close":"Lukk","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Del opp","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaksjonsinformasjon","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Legg til en oppdeling til","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Send inn","amount":"Beløp","date":"Dato","tags":"Tagger","no_budget":"(ingen budsjett)","no_bill":"(no bill)","category":"Kategori","attachments":"Vedlegg","notes":"Notater","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(ingen)","no_piggy_bank":"(no piggy bank)","description":"Beskrivelse","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Busjett","bill":"Regning","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Rediger","delete":"Slett","name":"Navn","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Sparegris","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Rentedato","book_date":"Bokføringsdato","process_date":"Prosesseringsdato","due_date":"Forfallsdato","foreign_amount":"Utenlandske beløp","payment_date":"Betalingsdato","invoice_date":"Fakturadato","internal_reference":"Intern referanse"},"config":{"html_language":"nb"}}')},78:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Hoe staat het er voor?","flash_error":"Fout!","flash_success":"Gelukt!","close":"Sluiten","split_transaction_title":"Beschrijving van de gesplitste transactie","errors_submission":"Er ging iets mis. Check de errors.","split":"Splitsen","single_split":"Split","transaction_stored_link":"Transactie #{ID} (\\"{title}\\") is opgeslagen.","transaction_updated_link":"Transactie #{ID} is geüpdatet.","transaction_new_stored_link":"Transactie #{ID} is opgeslagen.","transaction_journal_information":"Transactieinformatie","no_budget_pointer":"Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.","no_bill_pointer":"Je hebt nog geen contracten. Maak er een aantal op de contracten-pagina. Met contracten kan je je uitgaven beter bijhouden.","source_account":"Bronrekening","hidden_fields_preferences":"Je kan meer transactieopties inschakelen in je instellingen.","destination_account":"Doelrekening","add_another_split":"Voeg een split toe","submission":"Indienen","create_another":"Terug naar deze pagina voor een nieuwe transactie.","reset_after":"Reset formulier na opslaan","submit":"Invoeren","amount":"Bedrag","date":"Datum","tags":"Tags","no_budget":"(geen budget)","no_bill":"(geen contract)","category":"Categorie","attachments":"Bijlagen","notes":"Notities","external_uri":"Externe URL","update_transaction":"Update transactie","after_update_create_another":"Na het opslaan terug om door te gaan met wijzigen.","store_as_new":"Opslaan als nieuwe transactie ipv de huidige bij te werken.","split_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","none_in_select_list":"(geen)","no_piggy_bank":"(geen spaarpotje)","description":"Omschrijving","split_transaction_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","destination_account_reconciliation":"Je kan de doelrekening van een afstemming niet wijzigen.","source_account_reconciliation":"Je kan de bronrekening van een afstemming niet wijzigen.","budget":"Budget","bill":"Contract","you_create_withdrawal":"Je maakt een uitgave.","you_create_transfer":"Je maakt een overschrijving.","you_create_deposit":"Je maakt inkomsten.","edit":"Wijzig","delete":"Verwijder","name":"Naam","profile_whoops":"Oeps!","profile_something_wrong":"Er is iets mis gegaan!","profile_try_again":"Er is iets misgegaan. Probeer het nogmaals.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Je hebt nog geen OAuth-clients aangemaakt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Naam","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Nieuwe client aanmaken","profile_oauth_create_client":"Client aanmaken","profile_oauth_edit_client":"Client bewerken","profile_oauth_name_help":"Iets dat je gebruikers herkennen en vertrouwen.","profile_oauth_redirect_url":"Redirect-URL","profile_oauth_redirect_url_help":"De authorisatie-callback-url van jouw applicatie.","profile_authorized_apps":"Geautoriseerde toepassingen","profile_authorized_clients":"Geautoriseerde clients","profile_scopes":"Scopes","profile_revoke":"Intrekken","profile_personal_access_tokens":"Persoonlijke toegangstokens","profile_personal_access_token":"Persoonlijk toegangstoken","profile_personal_access_token_explanation":"Hier is je nieuwe persoonlijke toegangstoken. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan deze toegangstoken gebruiken om API-aanvragen te maken.","profile_no_personal_access_token":"Je hebt nog geen persoonlijke toegangstokens aangemaakt.","profile_create_new_token":"Nieuwe token aanmaken","profile_create_token":"Token aanmaken","profile_create":"Creër","profile_save_changes":"Aanpassingen opslaan","default_group_title_name":"(ongegroepeerd)","piggy_bank":"Spaarpotje","profile_oauth_client_secret_title":"Client secret","profile_oauth_client_secret_expl":"Hier is je nieuwe client secret. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan dit secret gebruiken om API-aanvragen te maken.","profile_oauth_confidential":"Vertrouwelijk","profile_oauth_confidential_help":"Dit vinkje is bedoeld voor applicaties die geheimen kunnen bewaren. Applicaties zoals sommige desktop-apps en Javascript apps kunnen dit niet. In zo\'n geval haal je het vinkje weg.","multi_account_warning_unknown":"Afhankelijk van het type transactie wordt de bron- en/of doelrekening overschreven door wat er in de eerste split staat.","multi_account_warning_withdrawal":"De bronrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_deposit":"De doelrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_transfer":"De bron + doelrekening wordt overschreven door wat er in de eerste split staat."},"form":{"interest_date":"Rentedatum","book_date":"Boekdatum","process_date":"Verwerkingsdatum","due_date":"Vervaldatum","foreign_amount":"Bedrag in vreemde valuta","payment_date":"Betalingsdatum","invoice_date":"Factuurdatum","internal_reference":"Interne verwijzing"},"config":{"html_language":"nl"}}')},8691:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Co jest grane?","flash_error":"Błąd!","flash_success":"Sukces!","close":"Zamknij","split_transaction_title":"Opis podzielonej transakcji","errors_submission":"Coś poszło nie tak w czasie zapisu. Proszę sprawdź błędy.","split":"Podziel","single_split":"Podział","transaction_stored_link":"Transakcja #{ID} (\\"{title}\\") została zapisana.","transaction_updated_link":"Transakcja #{ID} została zaktualizowana.","transaction_new_stored_link":"Transakcja #{ID} została zapisana.","transaction_journal_information":"Informacje o transakcji","no_budget_pointer":"Wygląda na to, że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżetów. Budżety mogą Ci pomóc śledzić wydatki.","no_bill_pointer":"Wygląda na to, że nie masz jeszcze rachunków. Powinieneś utworzyć kilka na stronie rachunków. Rachunki mogą Ci pomóc śledzić wydatki.","source_account":"Konto źródłowe","hidden_fields_preferences":"Możesz włączyć więcej opcji transakcji w swoich ustawieniach.","destination_account":"Konto docelowe","add_another_split":"Dodaj kolejny podział","submission":"Zapisz","create_another":"Po zapisaniu wróć tutaj, aby utworzyć kolejny.","reset_after":"Wyczyść formularz po zapisaniu","submit":"Prześlij","amount":"Kwota","date":"Data","tags":"Tagi","no_budget":"(brak budżetu)","no_bill":"(brak rachunku)","category":"Kategoria","attachments":"Załączniki","notes":"Notatki","external_uri":"Zewnętrzny adres URL","update_transaction":"Zaktualizuj transakcję","after_update_create_another":"Po aktualizacji wróć tutaj, aby kontynuować edycję.","store_as_new":"Zapisz jako nową zamiast aktualizować.","split_title_help":"Podzielone transakcje muszą posiadać globalny opis.","none_in_select_list":"(żadne)","no_piggy_bank":"(brak skarbonki)","description":"Opis","split_transaction_title_help":"Jeśli tworzysz podzieloną transakcję, musi ona posiadać globalny opis dla wszystkich podziałów w transakcji.","destination_account_reconciliation":"Nie możesz edytować konta docelowego transakcji uzgadniania.","source_account_reconciliation":"Nie możesz edytować konta źródłowego transakcji uzgadniania.","budget":"Budżet","bill":"Rachunek","you_create_withdrawal":"Tworzysz wydatek.","you_create_transfer":"Tworzysz przelew.","you_create_deposit":"Tworzysz wpłatę.","edit":"Modyfikuj","delete":"Usuń","name":"Nazwa","profile_whoops":"Uuuups!","profile_something_wrong":"Coś poszło nie tak!","profile_try_again":"Coś poszło nie tak. Spróbuj ponownie.","profile_oauth_clients":"Klienci OAuth","profile_oauth_no_clients":"Nie utworzyłeś żadnych klientów OAuth.","profile_oauth_clients_header":"Klienci","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Nazwa","profile_oauth_client_secret":"Sekretny klucz","profile_oauth_create_new_client":"Utwórz nowego klienta","profile_oauth_create_client":"Utwórz klienta","profile_oauth_edit_client":"Edytuj klienta","profile_oauth_name_help":"Coś, co Twoi użytkownicy będą rozpoznawać i ufać.","profile_oauth_redirect_url":"Przekierowanie URL","profile_oauth_redirect_url_help":"Adres URL wywołania zwrotnego autoryzacji aplikacji.","profile_authorized_apps":"Autoryzowane aplikacje","profile_authorized_clients":"Autoryzowani klienci","profile_scopes":"Zakresy","profile_revoke":"Unieważnij","profile_personal_access_tokens":"Osobiste tokeny dostępu","profile_personal_access_token":"Osobisty token dostępu","profile_personal_access_token_explanation":"Oto twój nowy osobisty token dostępu. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego tokenu, aby wykonać zapytania API.","profile_no_personal_access_token":"Nie utworzyłeś żadnych osobistych tokenów.","profile_create_new_token":"Utwórz nowy token","profile_create_token":"Utwórz token","profile_create":"Utwórz","profile_save_changes":"Zapisz zmiany","default_group_title_name":"(bez grupy)","piggy_bank":"Skarbonka","profile_oauth_client_secret_title":"Sekret klienta","profile_oauth_client_secret_expl":"Oto twój nowy sekret klienta. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego sekretu, aby wykonać zapytania API.","profile_oauth_confidential":"Poufne","profile_oauth_confidential_help":"Wymagaj od klienta uwierzytelnienia za pomocą sekretu. Poufni klienci mogą przechowywać poświadczenia w bezpieczny sposób bez narażania ich na dostęp przez nieuprawnione strony. Publiczne aplikacje, takie jak natywne aplikacje desktopowe lub JavaScript SPA, nie są w stanie bezpiecznie trzymać sekretów.","multi_account_warning_unknown":"W zależności od rodzaju transakcji, którą tworzysz, konto źródłowe i/lub docelowe kolejnych podziałów może zostać ustawione na konto zdefiniowane w pierwszym podziale transakcji.","multi_account_warning_withdrawal":"Pamiętaj, że konto źródłowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wypłaty.","multi_account_warning_deposit":"Pamiętaj, że konto docelowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wpłaty.","multi_account_warning_transfer":"Pamiętaj, że konta źródłowe i docelowe kolejnych podziałów zostaną ustawione na konto zdefiniowane w pierwszym podziale transferu."},"form":{"interest_date":"Data odsetek","book_date":"Data księgowania","process_date":"Data przetworzenia","due_date":"Termin realizacji","foreign_amount":"Kwota zagraniczna","payment_date":"Data płatności","invoice_date":"Data faktury","internal_reference":"Wewnętrzny numer"},"config":{"html_language":"pl"}}')},122:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"O que está acontecendo?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transação dividida","errors_submission":"Há algo de errado com o seu envio. Por favor, verifique os erros abaixo.","split":"Dividir","single_split":"Divisão","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi salva.","transaction_updated_link":"Transação #{ID} foi atualizada.","transaction_new_stored_link":"Transação #{ID} foi salva.","transaction_journal_information":"Informação da transação","no_budget_pointer":"Parece que você ainda não tem orçamentos. Você deve criar alguns na página de orçamentos. Orçamentos podem ajudá-lo a manter o controle das despesas.","no_bill_pointer":"Parece que você ainda não tem contas. Você deve criar algumas em contas. Contas podem ajudar você a manter o controle de despesas.","source_account":"Conta origem","hidden_fields_preferences":"Você pode habilitar mais opções de transação em suas preferências.","destination_account":"Conta destino","add_another_split":"Adicionar outra divisão","submission":"Envio","create_another":"Depois de armazenar, retorne aqui para criar outro.","reset_after":"Resetar o formulário após o envio","submit":"Enviar","amount":"Valor","date":"Data","tags":"Tags","no_budget":"(sem orçamento)","no_bill":"(sem conta)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL externa","update_transaction":"Atualizar transação","after_update_create_another":"Depois de atualizar, retorne aqui para continuar editando.","store_as_new":"Armazene como uma nova transação em vez de atualizar.","split_title_help":"Se você criar uma transação dividida, é necessário haver uma descrição global para todas as partes da transação.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum cofrinho)","description":"Descrição","split_transaction_title_help":"Se você criar uma transação dividida, deve haver uma descrição global para todas as partes da transação.","destination_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","source_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","budget":"Orçamento","bill":"Fatura","you_create_withdrawal":"Você está criando uma saída.","you_create_transfer":"Você está criando uma transferência.","you_create_deposit":"Você está criando uma entrada.","edit":"Editar","delete":"Apagar","name":"Nome","profile_whoops":"Ops!","profile_something_wrong":"Alguma coisa deu errado!","profile_try_again":"Algo deu errado. Por favor tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Você não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segredo","profile_oauth_create_new_client":"Criar um novo cliente","profile_oauth_create_client":"Criar um cliente","profile_oauth_edit_client":"Editar cliente","profile_oauth_name_help":"Alguma coisa que seus usuários vão reconhecer e identificar.","profile_oauth_redirect_url":"URL de redirecionamento","profile_oauth_redirect_url_help":"A URL de retorno da sua solicitação de autorização.","profile_authorized_apps":"Aplicativos autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Escopos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está seu novo token de acesso pessoal. Esta é a única vez que ela será mostrada então não perca! Agora você pode usar esse token para fazer solicitações de API.","profile_no_personal_access_token":"Você não criou nenhum token de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Salvar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Cofrinho","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu novo segredo de cliente. Esta é a única vez que ela será mostrada, então não o perca! Agora você pode usar este segredo para fazer requisições de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exige que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expô-las à partes não autorizadas. Aplicações públicas, como aplicações de área de trabalho nativas ou JavaScript SPA, são incapazes de manter segredos com segurança.","multi_account_warning_unknown":"Dependendo do tipo de transação que você criar, a conta de origem e/ou de destino das divisões subsequentes pode ser sobrescrita pelo que estiver definido na primeira divisão da transação.","multi_account_warning_withdrawal":"Tenha em mente que a conta de origem das subsequentes divisões será sobrescrita pelo que estiver definido na primeira divisão da saída.","multi_account_warning_deposit":"Tenha em mente que a conta de destino das divisões subsequentes será sobrescrita pelo que estiver definido na primeira divisão da entrada.","multi_account_warning_transfer":"Tenha em mente que a conta de origem + de destino das divisões subsequentes será sobrescrita pelo que for definido na primeira divisão da transferência."},"form":{"interest_date":"Data de interesse","book_date":"Data reserva","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante em moeda estrangeira","payment_date":"Data de pagamento","invoice_date":"Data da Fatura","internal_reference":"Referência interna"},"config":{"html_language":"pt-br"}}')},4895:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Tudo bem?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transacção dividida","errors_submission":"Aconteceu algo errado com a sua submissão. Por favor, verifique os erros.","split":"Dividir","single_split":"Dividir","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi guardada.","transaction_updated_link":"Transação#{ID} foi atualizada.","transaction_new_stored_link":"Transação#{ID} foi guardada.","transaction_journal_information":"Informacao da transaccao","no_budget_pointer":"Parece que ainda não tem orçamentos. Pode criar-los na página de orçamentos. Orçamentos podem ajudá-lo a controlar as despesas.","no_bill_pointer":"Parece que ainda não tem contas. Pode criar-las na página de contas. Contas podem ajudá-lo a controlar as despesas.","source_account":"Conta de origem","hidden_fields_preferences":"Pode ativar mais opções de transações nas suas preferências.","destination_account":"Conta de destino","add_another_split":"Adicionar outra divisão","submission":"Submissão","create_another":"Depois de guardar, voltar aqui para criar outra.","reset_after":"Repor o formulário após o envio","submit":"Enviar","amount":"Montante","date":"Data","tags":"Tags","no_budget":"(sem orcamento)","no_bill":"(sem contas)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL Externo","update_transaction":"Actualizar transacção","after_update_create_another":"Após a atualização, regresse aqui para continuar a editar.","store_as_new":"Guarde como uma nova transação em vez de atualizar.","split_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum mealheiro)","description":"Descricao","split_transaction_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","destination_account_reconciliation":"Não pode editar a conta de destino de uma transacção de reconciliação.","source_account_reconciliation":"Não pode editar a conta de origem de uma transacção de reconciliação.","budget":"Orcamento","bill":"Conta","you_create_withdrawal":"Está a criar um levantamento.","you_create_transfer":"Está a criar uma transferência.","you_create_deposit":"Está a criar um deposito.","edit":"Alterar","delete":"Apagar","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Algo correu mal!","profile_try_again":"Algo correu mal. Por favor, tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Código secreto","profile_oauth_create_new_client":"Criar Novo Cliente","profile_oauth_create_client":"Criar Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que os utilizadores reconheçam e confiem.","profile_oauth_redirect_url":"URL de redireccionamento","profile_oauth_redirect_url_help":"URL de callback de autorização da aplicação.","profile_authorized_apps":"Aplicações autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Contextos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está o seu novo token de acesso pessoal. Esta é a única vês que o mesmo será mostrado portanto não o perca! Pode utiliza-lo para fazer pedidos de API.","profile_no_personal_access_token":"Você ainda não criou tokens de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Guardar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Mealheiro","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu segredo de cliente. Apenas estará visível uma vez portanto não o perca! Pode agora utilizar este segredo para fazer pedidos à API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exigir que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expor as mesmas a terceiros não autorizadas. Aplicações públicas, como por exemplo aplicações nativas de sistema operativo ou SPA JavaScript, são incapazes de garantir a segurança dos segredos.","multi_account_warning_unknown":"Dependendo do tipo de transição que quer criar, a conta de origem e/ou a destino de subsequentes divisões pode ser sub-escrita por quaisquer regra definida na primeira divisão da transação.","multi_account_warning_withdrawal":"Mantenha em mente que a conta de origem de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do levantamento.","multi_account_warning_deposit":"Mantenha em mente que a conta de destino de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do depósito.","multi_account_warning_transfer":"Mantenha em mente que a conta de origem + destino de divisões subsequentes serão sobre-escritas por quaisquer regras definidas na divisão da transferência."},"form":{"interest_date":"Data de juros","book_date":"Data de registo","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante estrangeiro","payment_date":"Data de pagamento","invoice_date":"Data da factura","internal_reference":"Referencia interna"},"config":{"html_language":"pt"}}')},403:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ce se redă?","flash_error":"Eroare!","flash_success":"Succes!","close":"Închide","split_transaction_title":"Descrierea tranzacției divizate","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Împarte","single_split":"Împarte","transaction_stored_link":"Tranzacția #{ID} (\\"{title}\\") a fost stocată.","transaction_updated_link":"Tranzacția #{ID} a fost actualizată.","transaction_new_stored_link":"Tranzacția #{ID} a fost stocată.","transaction_journal_information":"Informații despre tranzacții","no_budget_pointer":"Se pare că nu aveți încă bugete. Ar trebui să creați câteva pe pagina bugete. Bugetele vă pot ajuta să țineți evidența cheltuielilor.","no_bill_pointer":"Se pare că nu aveți încă facturi. Ar trebui să creați unele pe pagina facturi. Facturile vă pot ajuta să țineți evidența cheltuielilor.","source_account":"Contul sursă","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Contul de destinație","add_another_split":"Adăugați o divizare","submission":"Transmitere","create_another":"După stocare, reveniți aici pentru a crea alta.","reset_after":"Resetați formularul după trimitere","submit":"Trimite","amount":"Sumă","date":"Dată","tags":"Etichete","no_budget":"(nici un buget)","no_bill":"(no bill)","category":"Categorie","attachments":"Atașamente","notes":"Notițe","external_uri":"External URL","update_transaction":"Actualizați tranzacția","after_update_create_another":"După actualizare, reveniți aici pentru a continua editarea.","store_as_new":"Stocați ca o tranzacție nouă în loc să actualizați.","split_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","none_in_select_list":"(nici unul)","no_piggy_bank":"(nicio pușculiță)","description":"Descriere","split_transaction_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","destination_account_reconciliation":"Nu puteți edita contul de destinație al unei tranzacții de reconciliere.","source_account_reconciliation":"Nu puteți edita contul sursă al unei tranzacții de reconciliere.","budget":"Buget","bill":"Factură","you_create_withdrawal":"Creezi o retragere.","you_create_transfer":"Creezi un transfer.","you_create_deposit":"Creezi un depozit.","edit":"Editează","delete":"Șterge","name":"Nume","profile_whoops":"Hopaa!","profile_something_wrong":"A apărut o eroare!","profile_try_again":"A apărut o problemă. Încercați din nou.","profile_oauth_clients":"Clienți OAuth","profile_oauth_no_clients":"Nu ați creat niciun client OAuth.","profile_oauth_clients_header":"Clienți","profile_oauth_client_id":"ID Client","profile_oauth_client_name":"Nume","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Creare client nou","profile_oauth_create_client":"Creare client","profile_oauth_edit_client":"Editare client","profile_oauth_name_help":"Ceva ce utilizatorii vor recunoaște și vor avea încredere.","profile_oauth_redirect_url":"Redirectioneaza URL","profile_oauth_redirect_url_help":"URL-ul de retroapelare al aplicației dvs.","profile_authorized_apps":"Aplicațiile dvs autorizate","profile_authorized_clients":"Clienți autorizați","profile_scopes":"Domenii","profile_revoke":"Revocați","profile_personal_access_tokens":"Token de acces personal","profile_personal_access_token":"Token de acces personal","profile_personal_access_token_explanation":"Aici este noul dvs. token de acces personal. Este singura dată când va fi afișat așa că nu îl pierde! Acum poți folosi acest token pentru a face cereri API.","profile_no_personal_access_token":"Nu aţi creat nici un token personal de acces.","profile_create_new_token":"Crează un nou token","profile_create_token":"Crează token","profile_create":"Crează","profile_save_changes":"Salvează modificările","default_group_title_name":"(ungrouped)","piggy_bank":"Pușculiță","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Data de interes","book_date":"Rezervă dată","process_date":"Data procesării","due_date":"Data scadentă","foreign_amount":"Sumă străină","payment_date":"Data de plată","invoice_date":"Data facturii","internal_reference":"Referință internă"},"config":{"html_language":"ro"}}')},7448:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Что происходит с моими финансами?","flash_error":"Ошибка!","flash_success":"Успешно!","close":"Закрыть","split_transaction_title":"Описание разделённой транзакции","errors_submission":"При отправке что-то пошло не так. Пожалуйста, проверьте ошибки ниже.","split":"Разделить","single_split":"Разделённая транзакция","transaction_stored_link":"Транзакция #{ID} (\\"{title}\\") сохранена.","transaction_updated_link":"Транзакция #{ID} обновлена.","transaction_new_stored_link":"Транзакция #{ID} сохранена.","transaction_journal_information":"Информация о транзакции","no_budget_pointer":"Похоже, у вас пока нет бюджетов. Вы должны создать их на странице Бюджеты. Бюджеты могут помочь вам отслеживать расходы.","no_bill_pointer":"Похоже, у вас пока нет счетов на оплату. Вы должны создать их на странице Счета на оплату. Счета на оплату могут помочь вам отслеживать расходы.","source_account":"Счёт-источник","hidden_fields_preferences":"Вы можете включить больше параметров транзакции в настройках.","destination_account":"Счёт назначения","add_another_split":"Добавить еще одну часть","submission":"Отправить","create_another":"После сохранения вернуться сюда и создать ещё одну аналогичную запись.","reset_after":"Сбросить форму после отправки","submit":"Подтвердить","amount":"Сумма","date":"Дата","tags":"Метки","no_budget":"(вне бюджета)","no_bill":"(нет счёта на оплату)","category":"Категория","attachments":"Вложения","notes":"Заметки","external_uri":"External URL","update_transaction":"Обновить транзакцию","after_update_create_another":"После обновления вернитесь сюда, чтобы продолжить редактирование.","store_as_new":"Сохранить как новую транзакцию вместо обновления.","split_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание дле всех её составляющих.","none_in_select_list":"(нет)","no_piggy_bank":"(нет копилки)","description":"Описание","split_transaction_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание для всех её составляющих.","destination_account_reconciliation":"Вы не можете редактировать счёт назначения для сверяемой транзакции.","source_account_reconciliation":"Вы не можете редактировать счёт-источник для сверяемой транзакции.","budget":"Бюджет","bill":"Счёт к оплате","you_create_withdrawal":"Вы создаёте расход.","you_create_transfer":"Вы создаёте перевод.","you_create_deposit":"Вы создаёте доход.","edit":"Изменить","delete":"Удалить","name":"Название","profile_whoops":"Ууупс!","profile_something_wrong":"Что-то пошло не так!","profile_try_again":"Произошла ошибка. Пожалуйста, попробуйте снова.","profile_oauth_clients":"Клиенты OAuth","profile_oauth_no_clients":"У вас пока нет клиентов OAuth.","profile_oauth_clients_header":"Клиенты","profile_oauth_client_id":"ID клиента","profile_oauth_client_name":"Название","profile_oauth_client_secret":"Секретный ключ","profile_oauth_create_new_client":"Создать нового клиента","profile_oauth_create_client":"Создать клиента","profile_oauth_edit_client":"Изменить клиента","profile_oauth_name_help":"Что-то, что ваши пользователи знают, и чему доверяют.","profile_oauth_redirect_url":"URL редиректа","profile_oauth_redirect_url_help":"URL обратного вызова для вашего приложения.","profile_authorized_apps":"Авторизованные приложения","profile_authorized_clients":"Авторизованные клиенты","profile_scopes":"Разрешения","profile_revoke":"Отключить","profile_personal_access_tokens":"Персональные Access Tokens","profile_personal_access_token":"Персональный Access Token","profile_personal_access_token_explanation":"Вот ваш новый персональный токен доступа. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот токен, чтобы делать запросы по API.","profile_no_personal_access_token":"Вы не создали ни одного персонального токена доступа.","profile_create_new_token":"Создать новый токен","profile_create_token":"Создать токен","profile_create":"Создать","profile_save_changes":"Сохранить изменения","default_group_title_name":"(без группировки)","piggy_bank":"Копилка","profile_oauth_client_secret_title":"Ключ клиента","profile_oauth_client_secret_expl":"Вот ваш новый ключ клиента. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот ключ, чтобы делать запросы по API.","profile_oauth_confidential":"Конфиденциальный","profile_oauth_confidential_help":"Требовать, чтобы клиент аутентифицировался с секретным ключом. Конфиденциальные клиенты могут хранить учётные данные в надёжном виде, защищая их от несанкционированного доступа. Публичные приложения, такие как обычный рабочий стол или приложения JavaScript SPA, не могут надёжно хранить ваши ключи.","multi_account_warning_unknown":"В зависимости от типа транзакции, которую вы создаёте, счёт-источник и/или счёт назначения следующих частей разделённой транзакции могут быть заменены теми, которые указаны для первой части транзакции.","multi_account_warning_withdrawal":"Имейте в виду, что счёт-источник в других частях разделённой транзакции будет таким же, как в первой части расхода.","multi_account_warning_deposit":"Имейте в виду, что счёт назначения в других частях разделённой транзакции будет таким же, как в первой части дохода.","multi_account_warning_transfer":"Имейте в виду, что счёт-источник и счёт назначения в других частях разделённой транзакции будут такими же, как в первой части перевода."},"form":{"interest_date":"Дата начисления процентов","book_date":"Дата бронирования","process_date":"Дата обработки","due_date":"Срок оплаты","foreign_amount":"Сумма в иностранной валюте","payment_date":"Дата платежа","invoice_date":"Дата выставления счёта","internal_reference":"Внутренняя ссылка"},"config":{"html_language":"ru"}}')},6949:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ako to ide?","flash_error":"Chyba!","flash_success":"Hotovo!","close":"Zavrieť","split_transaction_title":"Popis rozúčtovania","errors_submission":"Pri odosielaní sa niečo nepodarilo. Skontrolujte prosím chyby.","split":"Rozúčtovať","single_split":"Rozúčtovať","transaction_stored_link":"Transakcia #{ID} (\\"{title}\\") bola uložená.","transaction_updated_link":"Transakcia #{ID} bola aktualizovaná.","transaction_new_stored_link":"Transakcia #{ID} bola uložená.","transaction_journal_information":"Informácie o transakcii","no_budget_pointer":"Zdá sa, že zatiaľ nemáte žiadne rozpočty. Na stránke rozpočty by ste si nejaké mali vytvoriť. Rozpočty môžu pomôcť udržať prehľad vo výdavkoch.","no_bill_pointer":"Zdá sa, že zatiaľ nemáte žiadne účty. Na stránke účty by ste mali nejaké vytvoriť. Účty môžu pomôcť udržať si prehľad vo výdavkoch.","source_account":"Zdrojový účet","hidden_fields_preferences":"Viac možností transakcií môžete povoliť vo svojich nastaveniach.","destination_account":"Cieľový účet","add_another_split":"Pridať ďalšie rozúčtovanie","submission":"Odoslanie","create_another":"Po uložení sa vrátiť späť sem a vytvoriť ďalší.","reset_after":"Po odoslaní vynulovať formulár","submit":"Odoslať","amount":"Suma","date":"Dátum","tags":"Štítky","no_budget":"(žiadny rozpočet)","no_bill":"(žiadny účet)","category":"Kategória","attachments":"Prílohy","notes":"Poznámky","external_uri":"Externá URL","update_transaction":"Upraviť transakciu","after_update_create_another":"Po aktualizácii sa vrátiť späť a pokračovať v úpravách.","store_as_new":"Namiesto aktualizácie uložiť ako novú transakciu.","split_title_help":"Ak vytvoríte rozúčtovanie transakcie, je potrebné, aby ste určili všeobecný popis pre všetky rozúčtovania danej transakcie.","none_in_select_list":"(žiadne)","no_piggy_bank":"(žiadna pokladnička)","description":"Popis","split_transaction_title_help":"Ak vytvoríte rozúčtovanú transakciu, musí existovať globálny popis všetkých rozúčtovaní transakcie.","destination_account_reconciliation":"Nemôžete upraviť cieľový účet zúčtovacej transakcie.","source_account_reconciliation":"Nemôžete upraviť zdrojový účet zúčtovacej transakcie.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"Vytvárate výber.","you_create_transfer":"Vytvárate prevod.","you_create_deposit":"Vytvárate vklad.","edit":"Upraviť","delete":"Odstrániť","name":"Názov","profile_whoops":"Ajaj!","profile_something_wrong":"Niečo sa pokazilo!","profile_try_again":"Niečo sa pokazilo. Prosím, skúste znova.","profile_oauth_clients":"OAuth klienti","profile_oauth_no_clients":"Zatiaľ ste nevytvorili žiadneho OAuth klienta.","profile_oauth_clients_header":"Klienti","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Meno/Názov","profile_oauth_client_secret":"Tajný kľúč","profile_oauth_create_new_client":"Vytvoriť nového klienta","profile_oauth_create_client":"Vytvoriť klienta","profile_oauth_edit_client":"Upraviť klienta","profile_oauth_name_help":"Niečo, čo vaši použivatelia poznajú a budú tomu dôverovať.","profile_oauth_redirect_url":"URL presmerovania","profile_oauth_redirect_url_help":"Spätná URL pre overenie autorizácie vašej aplikácie.","profile_authorized_apps":"Povolené aplikácie","profile_authorized_clients":"Autorizovaní klienti","profile_scopes":"Rozsahy","profile_revoke":"Odvolať","profile_personal_access_tokens":"Osobné prístupové tokeny","profile_personal_access_token":"Osobný prístupový token","profile_personal_access_token_explanation":"Toto je váš nový osobný prístupový token. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz ho môžete používať pre prístup k API.","profile_no_personal_access_token":"Ešte ste nevytvorili žiadne osobné prístupové tokeny.","profile_create_new_token":"Vytvoriť nový token","profile_create_token":"Vytvoriť token","profile_create":"Vytvoriť","profile_save_changes":"Uložiť zmeny","default_group_title_name":"(nezoskupené)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Tajný kľúč klienta","profile_oauth_client_secret_expl":"Toto je váš tajný kľúč klienta. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz môžete tento tajný kľúč používať pre prístup k API.","profile_oauth_confidential":"Dôverné","profile_oauth_confidential_help":"Vyžadujte od klienta autentifikáciu pomocou tajného kľúča. Dôverní klienti môžu uchovávať poverenia bezpečným spôsobom bez toho, aby boli vystavení neoprávneným stranám. Verejné aplikácie, ako napríklad natívna pracovná plocha alebo aplikácie Java SPA, nedokážu tajné kľúče bezpečne uchovať.","multi_account_warning_unknown":"V závislosti od typu vytvorenej transakcie, môže byť zdrojový a/alebo cieľový účet následných rozúčtovaní prepísaný údajmi v prvom rozdelení transakcie.","multi_account_warning_withdrawal":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozdelení výberu.","multi_account_warning_deposit":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní vkladu.","multi_account_warning_transfer":"Majte na pamäti, že zdrojový a cieľový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní prevodu."},"form":{"interest_date":"Úrokový dátum","book_date":"Dátum rezervácie","process_date":"Dátum spracovania","due_date":"Dátum splatnosti","foreign_amount":"Suma v cudzej mene","payment_date":"Dátum úhrady","invoice_date":"Dátum vystavenia","internal_reference":"Interná referencia"},"config":{"html_language":"sk"}}')},2285:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Vad spelas?","flash_error":"Fel!","flash_success":"Slutförd!","close":"Stäng","split_transaction_title":"Beskrivning av delad transaktion","errors_submission":"Något fel uppstod med inskickningen. Vänligen kontrollera felen nedan.","split":"Dela","single_split":"Dela","transaction_stored_link":"Transaktion #{ID} (\\"{title}\\") sparades.","transaction_updated_link":"Transaktion #{ID} uppdaterades.","transaction_new_stored_link":"Transaktion #{ID} sparades.","transaction_journal_information":"Transaktionsinformation","no_budget_pointer":"Du verkar inte ha några budgetar än. Du bör skapa några på budgetar-sidan. Budgetar kan hjälpa dig att hålla reda på utgifter.","no_bill_pointer":"Du verkar inte ha några räkningar ännu. Du bör skapa några på räkningar-sidan. Räkningar kan hjälpa dig att hålla reda på utgifter.","source_account":"Källkonto","hidden_fields_preferences":"Du kan aktivera fler transaktionsalternativ i dina inställningar.","destination_account":"Till konto","add_another_split":"Lägga till en annan delning","submission":"Inskickning","create_another":"Efter sparat, återkom hit för att skapa ytterligare en.","reset_after":"Återställ formulär efter inskickat","submit":"Skicka","amount":"Belopp","date":"Datum","tags":"Etiketter","no_budget":"(ingen budget)","no_bill":"(ingen räkning)","category":"Kategori","attachments":"Bilagor","notes":"Noteringar","external_uri":"External URL","update_transaction":"Uppdatera transaktion","after_update_create_another":"Efter uppdaterat, återkom hit för att fortsätta redigera.","store_as_new":"Spara en ny transaktion istället för att uppdatera.","split_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","none_in_select_list":"(Ingen)","no_piggy_bank":"(ingen spargris)","description":"Beskrivning","split_transaction_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","destination_account_reconciliation":"Du kan inte redigera destinationskontot för en avstämningstransaktion.","source_account_reconciliation":"Du kan inte redigera källkontot för en avstämningstransaktion.","budget":"Budget","bill":"Nota","you_create_withdrawal":"Du skapar ett uttag.","you_create_transfer":"Du skapar en överföring.","you_create_deposit":"Du skapar en insättning.","edit":"Redigera","delete":"Ta bort","name":"Namn","profile_whoops":"Hoppsan!","profile_something_wrong":"Något gick fel!","profile_try_again":"Något gick fel. Försök igen.","profile_oauth_clients":"OAuth klienter","profile_oauth_no_clients":"Du har inte skapat några OAuth klienter.","profile_oauth_clients_header":"Klienter","profile_oauth_client_id":"Klient ID","profile_oauth_client_name":"Namn","profile_oauth_client_secret":"Hemlighet","profile_oauth_create_new_client":"Skapa ny klient","profile_oauth_create_client":"Skapa klient","profile_oauth_edit_client":"Redigera klient","profile_oauth_name_help":"Något som dina användare kommer att känna igen och lita på.","profile_oauth_redirect_url":"Omdirigera URL","profile_oauth_redirect_url_help":"Din applikations auktorisering callback URL.","profile_authorized_apps":"Auktoriserade applikationer","profile_authorized_clients":"Auktoriserade klienter","profile_scopes":"Omfattningar","profile_revoke":"Återkalla","profile_personal_access_tokens":"Personliga åtkomst-Tokens","profile_personal_access_token":"Personlig åtkomsttoken","profile_personal_access_token_explanation":"Här är din nya personliga tillgångs token. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna token för att göra API-förfrågningar.","profile_no_personal_access_token":"Du har inte skapat några personliga åtkomsttokens.","profile_create_new_token":"Skapa ny token","profile_create_token":"Skapa token","profile_create":"Skapa","profile_save_changes":"Spara ändringar","default_group_title_name":"(ogrupperad)","piggy_bank":"Spargris","profile_oauth_client_secret_title":"Klienthemlighet","profile_oauth_client_secret_expl":"Här är din nya klient hemlighet. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna hemlighet för att göra API-förfrågningar.","profile_oauth_confidential":"Konfidentiell","profile_oauth_confidential_help":"Kräv att klienten autentiserar med en hemlighet. Konfidentiella klienter kan hålla autentiseringsuppgifter på ett säkert sätt utan att utsätta dem för obehöriga parter. Publika applikationer, som skrivbord eller JavaScript-SPA-applikationer, kan inte hålla hemligheter på ett säkert sätt.","multi_account_warning_unknown":"Beroende på vilken typ av transaktion du skapar, källan och/eller destinationskontot för efterföljande delningar kan åsidosättas av vad som än definieras i den första delningen av transaktionen.","multi_account_warning_withdrawal":"Tänk på att källkontot för efterföljande uppdelningar kommer att upphävas av vad som än definieras i den första uppdelningen av uttaget.","multi_account_warning_deposit":"Tänk på att destinationskontot för efterföljande uppdelningar kommer att styras av vad som än definieras i den första uppdelningen av insättningen.","multi_account_warning_transfer":"Tänk på att käll + destinationskonto av efterföljande delningar kommer att styras av vad som definieras i den första uppdelningen av överföringen."},"form":{"interest_date":"Räntedatum","book_date":"Bokföringsdatum","process_date":"Behandlingsdatum","due_date":"Förfallodatum","foreign_amount":"Utländskt belopp","payment_date":"Betalningsdatum","invoice_date":"Fakturadatum","internal_reference":"Intern referens"},"config":{"html_language":"sv"}}')},9783:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Chào mừng trở lại?","flash_error":"Lỗi!","flash_success":"Thành công!","close":"Đóng","split_transaction_title":"Mô tả giao dịch tách","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Chia ra","single_split":"Split","transaction_stored_link":"Giao dịch #{ID} (\\"{title}\\") đã được lưu trữ.","transaction_updated_link":"Giao dịch#{ID} đã được cập nhật.","transaction_new_stored_link":" Giao dịch #{ID} đã được lưu trữ.","transaction_journal_information":"Thông tin giao dịch","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Nguồn tài khoản","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Tài khoản đích","add_another_split":"Thêm một phân chia khác","submission":"Gửi","create_another":"Sau khi lưu trữ, quay trở lại đây để tạo một cái khác.","reset_after":"Đặt lại mẫu sau khi gửi","submit":"Gửi","amount":"Số tiền","date":"Ngày","tags":"Nhãn","no_budget":"(không có ngân sách)","no_bill":"(no bill)","category":"Danh mục","attachments":"Tệp đính kèm","notes":"Ghi chú","external_uri":"External URL","update_transaction":"Cập nhật giao dịch","after_update_create_another":"Sau khi cập nhật, quay lại đây để tiếp tục chỉnh sửa.","store_as_new":"Lưu trữ như một giao dịch mới thay vì cập nhật.","split_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","none_in_select_list":"(Trống)","no_piggy_bank":"(chưa có heo đất)","description":"Sự miêu tả","split_transaction_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","destination_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản đích của giao dịch đối chiếu.","source_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản nguồn của giao dịch đối chiếu.","budget":"Ngân sách","bill":"Hóa đơn","you_create_withdrawal":"Bạn đang tạo một rút tiền.","you_create_transfer":"Bạn đang tạo một chuyển khoản.","you_create_deposit":"Bạn đang tạo một tiền gửi.","edit":"Sửa","delete":"Xóa","name":"Tên","profile_whoops":"Rất tiếc!","profile_something_wrong":"Có lỗi xảy ra!","profile_try_again":"Xảy ra lỗi. Vui lòng thử lại.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Bạn đã không tạo ra bất kỳ OAuth clients nào.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Tên","profile_oauth_client_secret":"Mã bí mật","profile_oauth_create_new_client":"Tạo mới Client","profile_oauth_create_client":"Tạo Client","profile_oauth_edit_client":"Sửa Client","profile_oauth_name_help":"Một cái gì đó người dùng của bạn sẽ nhận ra và tin tưởng.","profile_oauth_redirect_url":"URL chuyển tiếp","profile_oauth_redirect_url_help":"URL gọi lại ủy quyền của ứng dụng của bạn.","profile_authorized_apps":"Uỷ quyền ứng dụng","profile_authorized_clients":"Client ủy quyền","profile_scopes":"Phạm vi","profile_revoke":"Thu hồi","profile_personal_access_tokens":"Mã truy cập cá nhân","profile_personal_access_token":"Mã truy cập cá nhân","profile_personal_access_token_explanation":"Đây là mã thông báo truy cập cá nhân mới của bạn. Đây là lần duy nhất nó sẽ được hiển thị vì vậy đừng đánh mất nó! Bây giờ bạn có thể sử dụng mã thông báo này để thực hiện API.","profile_no_personal_access_token":"Bạn chưa tạo bất kỳ mã thông báo truy cập cá nhân nào.","profile_create_new_token":"Tạo mã mới","profile_create_token":"Tạo mã","profile_create":"Tạo","profile_save_changes":"Lưu thay đổi","default_group_title_name":"(chưa nhóm)","piggy_bank":"Heo đất","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ngày lãi","book_date":"Ngày đặt sách","process_date":"Ngày xử lý","due_date":"Ngày đáo hạn","foreign_amount":"Ngoại tệ","payment_date":"Ngày thanh toán","invoice_date":"Ngày hóa đơn","internal_reference":"Tài liệu tham khảo nội bộ"},"config":{"html_language":"vi"}}')},1922:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"今天理财了吗?","flash_error":"错误!","flash_success":"成功!","close":"关闭","split_transaction_title":"拆分交易的描述","errors_submission":"您提交的内容有误,请检查错误信息。","split":"拆分","single_split":"拆分","transaction_stored_link":"交易 #{ID} (“{title}”) 已保存。","transaction_updated_link":"交易 #{ID} 已更新。","transaction_new_stored_link":"交易 #{ID} 已保存。","transaction_journal_information":"交易信息","no_budget_pointer":"您还没有预算,您应该在预算页面进行创建。预算可以帮助您追踪支出。","no_bill_pointer":"您还没有账单,您应该在账单页面进行创建。账单可以帮助您追踪支出。","source_account":"来源账户","hidden_fields_preferences":"您可以在偏好设定中启用更多交易选项。","destination_account":"目标账户","add_another_split":"增加另一笔拆分","submission":"提交","create_another":"保存后,返回此页面以创建新记录","reset_after":"提交后重置表单","submit":"提交","amount":"金额","date":"日期","tags":"标签","no_budget":"(无预算)","no_bill":"(无账单)","category":"分类","attachments":"附件","notes":"备注","external_uri":"外部链接","update_transaction":"更新交易","after_update_create_another":"更新后,返回此页面继续编辑。","store_as_new":"保存为新交易而不是更新此交易。","split_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","none_in_select_list":"(空)","no_piggy_bank":"(无存钱罐)","description":"描述","split_transaction_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","destination_account_reconciliation":"您不能编辑对账交易的目标账户","source_account_reconciliation":"您不能编辑对账交易的来源账户。","budget":"预算","bill":"账单","you_create_withdrawal":"您正在创建一笔支出","you_create_transfer":"您正在创建一笔转账","you_create_deposit":"您正在创建一笔收入","edit":"编辑","delete":"删除","name":"名称","profile_whoops":"很抱歉!","profile_something_wrong":"发生错误!","profile_try_again":"发生错误,请稍后再试。","profile_oauth_clients":"OAuth 客户端","profile_oauth_no_clients":"您尚未创建任何 OAuth 客户端。","profile_oauth_clients_header":"客户端","profile_oauth_client_id":"客户端 ID","profile_oauth_client_name":"名称","profile_oauth_client_secret":"密钥","profile_oauth_create_new_client":"创建新客户端","profile_oauth_create_client":"创建客户端","profile_oauth_edit_client":"编辑客户端","profile_oauth_name_help":"您的用户可以识别并信任的信息","profile_oauth_redirect_url":"跳转网址","profile_oauth_redirect_url_help":"您的应用程序的授权回调网址","profile_authorized_apps":"已授权应用","profile_authorized_clients":"已授权客户端","profile_scopes":"范围","profile_revoke":"撤消","profile_personal_access_tokens":"个人访问令牌","profile_personal_access_token":"个人访问令牌","profile_personal_access_token_explanation":"请妥善保存您的新个人访问令牌,此令牌仅会在这里展示一次。您现在已可以使用此令牌进行 API 请求。","profile_no_personal_access_token":"您还没有创建个人访问令牌。","profile_create_new_token":"创建新令牌","profile_create_token":"创建令牌","profile_create":"创建","profile_save_changes":"保存更改","default_group_title_name":"(未分组)","piggy_bank":"存钱罐","profile_oauth_client_secret_title":"客户端密钥","profile_oauth_client_secret_expl":"请妥善保存您的新客户端的密钥,此密钥仅会在这里展示一次。您现在已可以使用此密钥进行 API 请求。","profile_oauth_confidential":"使用加密","profile_oauth_confidential_help":"要求客户端使用密钥进行认证。加密客户端可以安全储存凭据且不将其泄露给未授权方,而公共应用程序(例如本地计算机或 JavaScript SPA 应用程序)无法保证凭据的安全性。","multi_account_warning_unknown":"根据您创建的交易类型,后续拆分的来源和/或目标账户可能被交易的首笔拆分的配置所覆盖。","multi_account_warning_withdrawal":"请注意,后续拆分的来源账户将会被支出的首笔拆分的配置所覆盖。","multi_account_warning_deposit":"请注意,后续拆分的目标账户将会被收入的首笔拆分的配置所覆盖。","multi_account_warning_transfer":"请注意,后续拆分的来源和目标账户将会被转账的首笔拆分的配置所覆盖。"},"form":{"interest_date":"利息日期","book_date":"登记日期","process_date":"处理日期","due_date":"到期日","foreign_amount":"外币金额","payment_date":"付款日期","invoice_date":"发票日期","internal_reference":"内部引用"},"config":{"html_language":"zh-cn"}}')},4963:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"錯誤!","flash_success":"成功!","close":"關閉","split_transaction_title":"拆分交易的描述","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"分割","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"交易資訊","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"增加拆分","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"送出","amount":"金額","date":"日期","tags":"標籤","no_budget":"(無預算)","no_bill":"(no bill)","category":"分類","attachments":"附加檔案","notes":"備註","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"若您建立一筆拆分交易,須有一個有關交易所有拆分的整體描述。","none_in_select_list":"(空)","no_piggy_bank":"(no piggy bank)","description":"描述","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"預算","bill":"帳單","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"編輯","delete":"刪除","name":"名稱","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"小豬撲滿","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"利率日期","book_date":"登記日期","process_date":"處理日期","due_date":"到期日","foreign_amount":"外幣金額","payment_date":"付款日期","invoice_date":"發票日期","internal_reference":"內部參考"},"config":{"html_language":"zh-tw"}}')}},t={};function n(a){var i=t[a];if(void 0!==i)return i.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(e,t,n,a,i,o,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),a&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):i&&(l=s?function(){i.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:i),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var d=c.beforeCreate;c.beforeCreate=d?[].concat(d,l):[l]}return{exports:e,options:c}}const t=e({name:"CustomAttachments",props:{title:String,name:String,error:Array},mounted:function(){var e=this;window.addEventListener("paste",(function(t){e.$refs.input.files=t.clipboardData.files}))},methods:{clearAtt:function(){this.$refs.input.value=""},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",multiple:"multiple",type:"file"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearAtt}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const a=e({name:"EditTransaction",props:{groupId:Number},mounted:function(){this.getGroup()},ready:function(){},methods:{positiveAmount:function(e){return e<0?-1*e:e},roundNumber:function(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n},selectedSourceAccount:function(e,t){if("string"==typeof t)return this.transactions[e].source_account.id=null,void(this.transactions[e].source_account.name=t);this.transactions[e].source_account={id:t.id,name:t.name,type:t.type,currency_id:t.currency_id,currency_name:t.currency_name,currency_code:t.currency_code,currency_decimal_places:t.currency_decimal_places,allowed_types:this.transactions[e].source_account.allowed_types}},selectedDestinationAccount:function(e,t){if("string"==typeof t)return this.transactions[e].destination_account.id=null,void(this.transactions[e].destination_account.name=t);this.transactions[e].destination_account={id:t.id,name:t.name,type:t.type,currency_id:t.currency_id,currency_name:t.currency_name,currency_code:t.currency_code,currency_decimal_places:t.currency_decimal_places,allowed_types:this.transactions[e].destination_account.allowed_types}},clearSource:function(e){this.transactions[e].source_account={id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:this.transactions[e].source_account.allowed_types},this.transactions[e].destination_account&&this.selectedDestinationAccount(e,this.transactions[e].destination_account)},setTransactionType:function(e){null!==e&&(this.transactionType=e)},deleteTransaction:function(e,t){t.preventDefault(),this.transactions.splice(e,1)},clearDestination:function(e){this.transactions[e].destination_account={id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:this.transactions[e].destination_account.allowed_types},this.transactions[e].source_account&&this.selectedSourceAccount(e,this.transactions[e].source_account)},getGroup:function(){var e=this,t=window.location.href.split("/"),n="./api/v1/transactions/"+t[t.length-1];axios.get(n).then((function(t){e.processIncomingGroup(t.data.data)})).catch((function(e){console.error("Some error when getting axios"),console.error(e)}))},processIncomingGroup:function(e){this.group_title=e.attributes.group_title;var t=e.attributes.transactions.reverse();for(var n in t)if(t.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294){var a=t[n];this.processIncomingGroupRow(a)}},ucFirst:function(e){return"string"==typeof e?e.charAt(0).toUpperCase()+e.slice(1):null},processIncomingGroupRow:function(e){this.setTransactionType(e.type);var t=[];for(var n in e.tags)e.tags.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&t.push({text:e.tags[n],tiClasses:[]});void 0===window.expectedSourceTypes&&console.error("window.expectedSourceTypes is unexpectedly empty."),this.transactions.push({transaction_journal_id:e.transaction_journal_id,description:e.description,date:e.date.substr(0,10),amount:this.roundNumber(this.positiveAmount(e.amount),e.currency_decimal_places),category:e.category_name,errors:{source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}},budget:e.budget_id,bill:e.bill_id,tags:t,custom_fields:{interest_date:e.interest_date,book_date:e.book_date,process_date:e.process_date,due_date:e.due_date,payment_date:e.payment_date,invoice_date:e.invoice_date,internal_reference:e.internal_reference,notes:e.notes,external_uri:e.external_uri},foreign_amount:{amount:this.roundNumber(this.positiveAmount(e.foreign_amount),e.foreign_currency_decimal_places),currency_id:e.foreign_currency_id},source_account:{id:e.source_id,name:e.source_name,type:e.source_type,currency_id:e.currency_id,currency_name:e.currency_name,currency_code:e.currency_code,currency_decimal_places:e.currency_decimal_places,allowed_types:window.expectedSourceTypes.source[this.ucFirst(e.type)]},destination_account:{id:e.destination_id,name:e.destination_name,type:e.destination_type,currency_id:e.currency_id,currency_name:e.currency_name,currency_code:e.currency_code,currency_decimal_places:e.currency_decimal_places,allowed_types:window.expectedSourceTypes.destination[this.ucFirst(e.type)]}})},limitSourceType:function(e){},limitDestinationType:function(e){},convertData:function(){var e,t,n,a={transactions:[]};for(var i in this.transactions.length>1&&(a.group_title=this.group_title),e=this.transactionType?this.transactionType.toLowerCase():"invalid",t=this.transactions[0].source_account.type,n=this.transactions[0].destination_account.type,"invalid"===e&&["Asset account","Loan","Debt","Mortgage"].includes(t)&&(e="withdrawal"),"invalid"===e&&["Asset account","Loan","Debt","Mortgage"].includes(n)&&(e="deposit"),this.transactions)this.transactions.hasOwnProperty(i)&&/^0$|^[1-9]\d*$/.test(i)&&i<=4294967294&&a.transactions.push(this.convertDataRow(this.transactions[i],i,e));return a},convertDataRow:function(e,t,n){var a,i,o,r,s,l,c=[],u=null,d=null;for(var _ in i=e.source_account.id,o=e.source_account.name,r=e.destination_account.id,s=e.destination_account.name,"withdrawal"!==n&&"transfer"!==n||(e.currency_id=e.source_account.currency_id),"deposit"===n&&(e.currency_id=e.destination_account.currency_id),l=e.date,t>0&&(l=this.transactions[0].date),"withdrawal"===n&&""===s&&(r=window.cashAccountId),"deposit"===n&&""===o&&(i=window.cashAccountId),t>0&&("withdrawal"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(i=this.transactions[0].source_account.id,o=this.transactions[0].source_account.name),t>0&&("deposit"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(r=this.transactions[0].destination_account.id,s=this.transactions[0].destination_account.name),c=[],u="0",e.tags)e.tags.hasOwnProperty(_)&&/^0$|^[1-9]\d*$/.test(_)&&_<=4294967294&&c.push(e.tags[_].text);return""!==e.foreign_amount.amount&&0!==parseFloat(e.foreign_amount.amount)&&(u=e.foreign_amount.amount,d=e.foreign_amount.currency_id),d===e.currency_id&&(u=null,d=null),0===r&&(r=null),0===i&&(i=null),1===(String(e.amount).match(/\,/g)||[]).length&&(e.amount=String(e.amount).replace(",",".")),(a={transaction_journal_id:e.transaction_journal_id,type:n,date:l,amount:e.amount,description:e.description,source_id:i,source_name:o,destination_id:r,destination_name:s,category_name:e.category,interest_date:e.custom_fields.interest_date,book_date:e.custom_fields.book_date,process_date:e.custom_fields.process_date,due_date:e.custom_fields.due_date,payment_date:e.custom_fields.payment_date,invoice_date:e.custom_fields.invoice_date,internal_reference:e.custom_fields.internal_reference,external_uri:e.custom_fields.external_uri,notes:e.custom_fields.notes,tags:c}).foreign_amount=u,a.foreign_currency_id=d,0!==e.currency_id&&null!==e.currency_id&&(a.currency_id=e.currency_id),a.budget_id=parseInt(e.budget),parseInt(e.bill)>0&&(a.bill_id=parseInt(e.bill)),0===parseInt(e.bill)&&(a.bill_id=null),parseInt(e.piggy_bank)>0&&(a.piggy_bank_id=parseInt(e.piggy_bank)),a},submit:function(e){var t=this,n=$("#submitButton");n.prop("disabled",!0);var a=window.location.href.split("/"),i="./api/v1/transactions/"+a[a.length-1]+"?_token="+document.head.querySelector('meta[name="csrf-token"]').content,o="PUT";this.storeAsNew&&(i="./api/v1/transactions?_token="+document.head.querySelector('meta[name="csrf-token"]').content,o="POST");var r=this.convertData();axios({method:o,url:i,data:r}).then((function(e){0===t.collectAttachmentData(e)&&t.redirectUser(e.data.data.id)})).catch((function(e){t.parseErrors(e.response.data)})),e&&e.preventDefault(),n.removeAttr("disabled")},redirectUser:function(e){this.returnAfter?(this.setDefaultErrors(),this.storeAsNew?(this.success_message=this.$t("firefly.transaction_new_stored_link",{ID:e}),this.error_message=""):(this.success_message=this.$t("firefly.transaction_updated_link",{ID:e}),this.error_message="")):this.storeAsNew?window.location.href=window.previousUri+"?transaction_group_id="+e+"&message=created":window.location.href=window.previousUri+"?transaction_group_id="+e+"&message=updated"},collectAttachmentData:function(e){var t=this,n=e.data.data.id,a=[],i=[],o=$('input[name="attachments[]"]');for(var r in o)if(o.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294)for(var s in o[r].files)if(o[r].files.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294){var l=e.data.data.attributes.transactions.reverse();a.push({journal:l[r].transaction_journal_id,file:o[r].files[s]})}var c=a.length,u=function(e){var o,r,s;a.hasOwnProperty(e)&&/^0$|^[1-9]\d*$/.test(e)&&e<=4294967294&&(o=a[e],r=t,(s=new FileReader).onloadend=function(t){t.target.readyState===FileReader.DONE&&(i.push({name:a[e].file.name,journal:a[e].journal,content:new Blob([t.target.result])}),i.length===c&&r.uploadFiles(i,n))},s.readAsArrayBuffer(o.file))};for(var d in a)u(d);return c},uploadFiles:function(e,t){var n=this,a=e.length,i=0,o=function(o){if(e.hasOwnProperty(o)&&/^0$|^[1-9]\d*$/.test(o)&&o<=4294967294){var r={filename:e[o].name,attachable_type:"TransactionJournal",attachable_id:e[o].journal};axios.post("./api/v1/attachments",r).then((function(r){var s="./api/v1/attachments/"+r.data.data.id+"/upload";axios.post(s,e[o].content).then((function(e){return++i===a&&n.redirectUser(t,null),!0})).catch((function(e){return console.error("Could not upload file."),console.error(e),i++,n.error_message="Could not upload attachment: "+e,i===a&&n.redirectUser(t,null),!1}))})).catch((function(e){return console.error("Could not create upload."),console.error(e),++i===a&&n.redirectUser(t,null),!1}))}};for(var r in e)o(r)},addTransaction:function(e){this.transactions.push({transaction_journal_id:0,description:"",date:"",amount:"",category:"",piggy_bank:0,errors:{source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}},budget:0,bill:0,tags:[],custom_fields:{interest_date:"",book_date:"",process_date:"",due_date:"",payment_date:"",invoice_date:"",internal_reference:"",notes:"",attachments:[],external_uri:""},foreign_amount:{amount:"",currency_id:0},source_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:[]},destination_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:[]}});var t=this.transactions.length;this.transactions.length>1&&(this.transactions[t-1].source_account=this.transactions[t-2].source_account,this.transactions[t-1].destination_account=this.transactions[t-2].destination_account,this.transactions[t-1].date=this.transactions[t-2].date),e&&e.preventDefault()},parseErrors:function(e){var t,n;for(var a in this.setDefaultErrors(),this.error_message="",e.message.length>0?this.error_message=this.$t("firefly.errors_submission"):this.error_message="",e.errors)if(e.errors.hasOwnProperty(a)&&("group_title"===a&&(this.group_title_errors=e.errors[a]),"group_title"!==a)){switch(t=parseInt(a.split(".")[1]),n=a.split(".")[2]){case"amount":case"date":case"budget_id":case"bill_id":case"description":case"tags":this.transactions[t].errors[n]=e.errors[a];break;case"external_uri":this.transactions[t].errors.custom_errors[n]=e.errors[a];break;case"source_name":case"source_id":this.transactions[t].errors.source_account=this.transactions[t].errors.source_account.concat(e.errors[a]);break;case"destination_name":case"destination_id":this.transactions[t].errors.destination_account=this.transactions[t].errors.destination_account.concat(e.errors[a]);break;case"foreign_amount":case"foreign_currency_id":this.transactions[t].errors.foreign_amount=this.transactions[t].errors.foreign_amount.concat(e.errors[a])}this.transactions[t].errors.source_account=Array.from(new Set(this.transactions[t].errors.source_account)),this.transactions[t].errors.destination_account=Array.from(new Set(this.transactions[t].errors.destination_account))}},setDefaultErrors:function(){for(var e in this.transactions)this.transactions.hasOwnProperty(e)&&/^0$|^[1-9]\d*$/.test(e)&&e<=4294967294&&(this.transactions[e].errors={source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}})}},data:function(){return{group:this.groupId,error_message:"",success_message:"",transactions:[],group_title:"",returnAfter:!1,storeAsNew:!1,transactionType:null,group_title_errors:[],resetButtonDisabled:!0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("form",{staticClass:"form-horizontal",attrs:{id:"store","accept-charset":"UTF-8",action:"#",enctype:"multipart/form-data",method:"POST"}},[n("input",{attrs:{name:"_token",type:"hidden",value:"xxx"}}),e._v(" "),""!==e.error_message?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-12"},[n("div",{staticClass:"alert alert-danger alert-dismissible",attrs:{role:"alert"}},[n("button",{staticClass:"close",attrs:{"data-dismiss":"alert",type:"button","aria-label":e.$t("firefly.close")}},[n("span",{attrs:{"aria-hidden":"true"}},[e._v("×")])]),e._v(" "),n("strong",[e._v(e._s(e.$t("firefly.flash_error")))]),e._v(" "+e._s(e.error_message)+"\n ")])])]):e._e(),e._v(" "),""!==e.success_message?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-12"},[n("div",{staticClass:"alert alert-success alert-dismissible",attrs:{role:"alert"}},[n("button",{staticClass:"close",attrs:{"data-dismiss":"alert",type:"button","aria-label":e.$t("firefly.close")}},[n("span",{attrs:{"aria-hidden":"true"}},[e._v("×")])]),e._v(" "),n("strong",[e._v(e._s(e.$t("firefly.flash_success")))]),e._v(" "),n("span",{domProps:{innerHTML:e._s(e.success_message)}})])])]):e._e(),e._v(" "),n("div",e._l(e.transactions,(function(t,a){return n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title splitTitle"},[e.transactions.length>1?n("span",[e._v(e._s(e.$t("firefly.single_split"))+" "+e._s(a+1)+" / "+e._s(e.transactions.length))]):e._e(),e._v(" "),1===e.transactions.length?n("span",[e._v(e._s(e.$t("firefly.transaction_journal_information")))]):e._e()]),e._v(" "),e.transactions.length>1?n("div",{staticClass:"box-tools pull-right"},[n("button",{staticClass:"btn btn-xs btn-danger",attrs:{type:"button"},on:{click:function(t){return e.deleteTransaction(a,t)}}},[n("i",{staticClass:"fa fa-trash"})])]):e._e()]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-4"},["reconciliation"!==e.transactionType.toLowerCase()?n("transaction-description",{attrs:{error:t.errors.description,index:a},model:{value:t.description,callback:function(n){e.$set(t,"description",n)},expression:"transaction.description"}}):e._e(),e._v(" "),"reconciliation"!==e.transactionType.toLowerCase()?n("account-select",{attrs:{accountName:t.source_account.name,accountTypeFilters:t.source_account.allowed_types,error:t.errors.source_account,index:a,transactionType:e.transactionType,inputName:"source[]",inputDescription:e.$t("firefly.source_account")},on:{"clear:value":function(t){return e.clearSource(a)},"select:account":function(t){return e.selectedSourceAccount(a,t)}}}):e._e(),e._v(" "),"reconciliation"===e.transactionType.toLowerCase()?n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[n("p",{staticClass:"form-control-static",attrs:{id:"ffInput_source"}},[n("em",[e._v("\n "+e._s(e.$t("firefly.source_account_reconciliation"))+"\n ")])])])]):e._e(),e._v(" "),"reconciliation"!==e.transactionType.toLowerCase()?n("account-select",{attrs:{accountName:t.destination_account.name,accountTypeFilters:t.destination_account.allowed_types,error:t.errors.destination_account,index:a,transactionType:e.transactionType,inputName:"destination[]",inputDescription:e.$t("firefly.destination_account")},on:{"clear:value":function(t){return e.clearDestination(a)},"select:account":function(t){return e.selectedDestinationAccount(a,t)}}}):e._e(),e._v(" "),"reconciliation"===e.transactionType.toLowerCase()?n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[n("p",{staticClass:"form-control-static",attrs:{id:"ffInput_dest"}},[n("em",[e._v("\n "+e._s(e.$t("firefly.destination_account_reconciliation"))+"\n ")])])])]):e._e(),e._v(" "),n("standard-date",{attrs:{error:t.errors.date,index:a},model:{value:t.date,callback:function(n){e.$set(t,"date",n)},expression:"transaction.date"}}),e._v(" "),0===a?n("div",[n("transaction-type",{attrs:{destination:t.destination_account.type,source:t.source_account.type},on:{"set:transactionType":function(t){return e.setTransactionType(t)},"act:limitSourceType":function(t){return e.limitSourceType(t)},"act:limitDestinationType":function(t){return e.limitDestinationType(t)}}})],1):e._e()],1),e._v(" "),n("div",{staticClass:"col-lg-4"},[n("amount",{attrs:{destination:t.destination_account,error:t.errors.amount,source:t.source_account,transactionType:e.transactionType},model:{value:t.amount,callback:function(n){e.$set(t,"amount",n)},expression:"transaction.amount"}}),e._v(" "),"reconciliation"!==e.transactionType.toLowerCase()?n("foreign-amount",{attrs:{destination:t.destination_account,error:t.errors.foreign_amount,no_currency:e.$t("firefly.none_in_select_list"),source:t.source_account,transactionType:e.transactionType,title:e.$t("form.foreign_amount")},model:{value:t.foreign_amount,callback:function(n){e.$set(t,"foreign_amount",n)},expression:"transaction.foreign_amount"}}):e._e()],1),e._v(" "),n("div",{staticClass:"col-lg-4"},[n("budget",{attrs:{error:t.errors.budget_id,no_budget:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.budget,callback:function(n){e.$set(t,"budget",n)},expression:"transaction.budget"}}),e._v(" "),n("category",{attrs:{error:t.errors.category,transactionType:e.transactionType},model:{value:t.category,callback:function(n){e.$set(t,"category",n)},expression:"transaction.category"}}),e._v(" "),n("tags",{attrs:{error:t.errors.tags,tags:t.tags,transactionType:e.transactionType},model:{value:t.tags,callback:function(n){e.$set(t,"tags",n)},expression:"transaction.tags"}}),e._v(" "),n("bill",{attrs:{error:t.errors.bill_id,no_bill:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.bill,callback:function(n){e.$set(t,"bill",n)},expression:"transaction.bill"}}),e._v(" "),n("custom-transaction-fields",{attrs:{error:t.errors.custom_errors},model:{value:t.custom_fields,callback:function(n){e.$set(t,"custom_fields",n)},expression:"transaction.custom_fields"}})],1)])]),e._v(" "),e.transactions.length-1===a&&"reconciliation"!==e.transactionType.toLowerCase()?n("div",{staticClass:"box-footer"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.addTransaction}},[e._v(e._s(e.$t("firefly.add_another_split"))+"\n ")])]):e._e()])])])})),0),e._v(" "),e.transactions.length>1?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("group-description",{attrs:{error:e.group_title_errors},model:{value:e.group_title,callback:function(t){e.group_title=t},expression:"group_title"}})],1)])])]):e._e(),e._v(" "),n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.submission"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"checkbox"},[n("label",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.returnAfter,expression:"returnAfter"}],attrs:{name:"return_after",type:"checkbox"},domProps:{checked:Array.isArray(e.returnAfter)?e._i(e.returnAfter,null)>-1:e.returnAfter},on:{change:function(t){var n=e.returnAfter,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.returnAfter=n.concat([null])):o>-1&&(e.returnAfter=n.slice(0,o).concat(n.slice(o+1)))}else e.returnAfter=i}}}),e._v("\n "+e._s(e.$t("firefly.after_update_create_another"))+"\n ")])]),e._v(" "),null!==e.transactionType&&"reconciliation"!==e.transactionType.toLowerCase()?n("div",{staticClass:"checkbox"},[n("label",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.storeAsNew,expression:"storeAsNew"}],attrs:{name:"store_as_new",type:"checkbox"},domProps:{checked:Array.isArray(e.storeAsNew)?e._i(e.storeAsNew,null)>-1:e.storeAsNew},on:{change:function(t){var n=e.storeAsNew,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.storeAsNew=n.concat([null])):o>-1&&(e.storeAsNew=n.slice(0,o).concat(n.slice(o+1)))}else e.storeAsNew=i}}}),e._v("\n "+e._s(e.$t("firefly.store_as_new"))+"\n ")])]):e._e()]),e._v(" "),n("div",{staticClass:"box-footer"},[n("div",{staticClass:"btn-group"},[n("button",{staticClass:"btn btn-success",attrs:{id:"submitButton"},on:{click:e.submit}},[e._v(e._s(e.$t("firefly.update_transaction"))+"\n ")])])])])])])])}),[],!1,null,null,null).exports;const i=e({name:"CustomDate",props:{value:String,title:String,name:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.date.value)},hasError:function(){return this.error.length>0},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"date"},domProps:{value:e.value?e.value.substr(0,10):""},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const o=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},clearField:function(){this.name="",this.$refs.str.value="",this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"text"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const r=e({name:"CustomTextarea",props:{title:String,name:String,value:String,error:Array},data:function(){return{textValue:this.value}},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.textValue,expression:"textValue"}],ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",rows:"8"},domProps:{value:e.textValue},on:{input:[function(t){t.target.composing||(e.textValue=t.target.value)},e.handleInput]}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const s=e({props:["error","value","index"],name:"StandardDate",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.date.value)},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value),this.$emit("clear:date")}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.date"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{disabled:e.index>0,autocomplete:"off",name:"date[]",type:"date",placeholder:e.$t("firefly.date"),title:e.$t("firefly.date")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const l=e({props:["error","value","index"],name:"GroupDescription",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},clearField:function(){this.name="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{autocomplete:"off",name:"group_title",type:"text",placeholder:e.$t("firefly.split_transaction_title"),title:e.$t("firefly.split_transaction_title")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),0===e.error.length?n("p",{staticClass:"help-block"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title_help"))+"\n ")]):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const c=e({props:["error","value","index"],name:"TransactionDescription",mounted:function(){this.target=this.$refs.descr,this.descriptionAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/transactions?query=",this.$refs.descr.focus()},components:{},data:function(){return{descriptionAutoCompleteURI:null,name:null,description:null,target:null}},methods:{aSyncFunction:function(e,t){axios.get(this.descriptionAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.descr.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.description).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},search:function(e){return["ab","cd"]},hasError:function(){return this.error.length>0},clearDescription:function(){this.description="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value),this.$emit("clear:description")},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},handleEnter:function(e){e.keyCode},selectedItem:function(e){void 0!==this.name&&"string"!=typeof this.name&&(this.$refs.descr.value=this.name.description,this.$emit("input",this.$refs.descr.value))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.description"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{title:e.$t("firefly.description"),autocomplete:"off",name:"description[]",type:"text",placeholder:e.$t("firefly.description")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDescription}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"description"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const u=e({name:"CustomTransactionFields",props:["value","error"],mounted:function(){this.getPreference()},data:function(){return{customInterestDate:null,fields:[{interest_date:!1,book_date:!1,process_date:!1,due_date:!1,payment_date:!1,invoice_date:!1,internal_reference:!1,notes:!1,attachments:!1,external_uri:!1}]}},computed:{dateComponent:function(){return"custom-date"},stringComponent:function(){return"custom-string"},attachmentComponent:function(){return"custom-attachments"},textareaComponent:function(){return"custom-textarea"},uriComponent:function(){return"custom-uri"}},methods:{handleInput:function(e){this.$emit("input",this.value)},getPreference:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/preferences/transaction_journal_optional_fields";axios.get(t).then((function(t){e.fields=t.data.data.attributes.data})).catch((function(){return console.warn("Oh. Something went wrong loading custom transaction fields.")}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.hidden_fields_preferences"))}}),e._v(" "),this.fields.interest_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.interest_date,name:"interest_date[]",title:e.$t("form.interest_date")},model:{value:e.value.interest_date,callback:function(t){e.$set(e.value,"interest_date",t)},expression:"value.interest_date"}}):e._e(),e._v(" "),this.fields.book_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.book_date,name:"book_date[]",title:e.$t("form.book_date")},model:{value:e.value.book_date,callback:function(t){e.$set(e.value,"book_date",t)},expression:"value.book_date"}}):e._e(),e._v(" "),this.fields.process_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.process_date,name:"process_date[]",title:e.$t("form.process_date")},model:{value:e.value.process_date,callback:function(t){e.$set(e.value,"process_date",t)},expression:"value.process_date"}}):e._e(),e._v(" "),this.fields.due_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.due_date,name:"due_date[]",title:e.$t("form.due_date")},model:{value:e.value.due_date,callback:function(t){e.$set(e.value,"due_date",t)},expression:"value.due_date"}}):e._e(),e._v(" "),this.fields.payment_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.payment_date,name:"payment_date[]",title:e.$t("form.payment_date")},model:{value:e.value.payment_date,callback:function(t){e.$set(e.value,"payment_date",t)},expression:"value.payment_date"}}):e._e(),e._v(" "),this.fields.invoice_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.invoice_date,name:"invoice_date[]",title:e.$t("form.invoice_date")},model:{value:e.value.invoice_date,callback:function(t){e.$set(e.value,"invoice_date",t)},expression:"value.invoice_date"}}):e._e(),e._v(" "),this.fields.internal_reference?n(e.stringComponent,{tag:"component",attrs:{error:e.error.internal_reference,name:"internal_reference[]",title:e.$t("form.internal_reference")},model:{value:e.value.internal_reference,callback:function(t){e.$set(e.value,"internal_reference",t)},expression:"value.internal_reference"}}):e._e(),e._v(" "),this.fields.attachments?n(e.attachmentComponent,{tag:"component",attrs:{error:e.error.attachments,name:"attachments[]",title:e.$t("firefly.attachments")},model:{value:e.value.attachments,callback:function(t){e.$set(e.value,"attachments",t)},expression:"value.attachments"}}):e._e(),e._v(" "),this.fields.external_uri?n(e.uriComponent,{tag:"component",attrs:{error:e.error.external_uri,name:"external_uri[]",title:e.$t("firefly.external_uri")},model:{value:e.value.external_uri,callback:function(t){e.$set(e.value,"external_uri",t)},expression:"value.external_uri"}}):e._e(),e._v(" "),this.fields.notes?n(e.textareaComponent,{tag:"component",attrs:{error:e.error.notes,name:"notes[]",title:e.$t("firefly.notes")},model:{value:e.value.notes,callback:function(t){e.$set(e.value,"notes",t)},expression:"value.notes"}}):e._e()],1)}),[],!1,null,null,null).exports;const d=e({name:"PiggyBank",props:["value","transactionType","error","no_piggy_bank"],mounted:function(){this.loadPiggies()},data:function(){return{piggies:[]}},methods:{handleInput:function(e){this.$emit("input",this.$refs.piggy.value)},hasError:function(){return this.error.length>0},loadPiggies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/piggy-banks-with-balance?limit=1337";axios.get(t,{}).then((function(t){var n={0:{group:{title:e.$t("firefly.default_group_title_name")},piggies:[{name_with_balance:e.no_piggy_bank,id:0}]}};for(var a in t.data)if(t.data.hasOwnProperty(a)&&/^0$|^[1-9]\d*$/.test(a)&&a<=4294967294){var i=t.data[a];if(i.objectGroup){var o=i.objectGroup.order;n[o]||(n[o]={group:{title:i.objectGroup.title},piggies:[]}),n[o].piggies.push({name_with_balance:i.name_with_balance,id:i.id})}i.objectGroup||n[0].piggies.push({name_with_balance:i.name_with_balance,id:i.id}),e.piggies.push(t.data[a])}var r={};Object.keys(n).sort().forEach((function(e){var t=n[e].group.title;r[t]=n[e]})),e.piggies=r}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0!==this.transactionType&&"Transfer"===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.piggy_bank"))+"\n\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("select",{ref:"piggy",staticClass:"form-control",attrs:{name:"piggy_bank[]"},on:{input:e.handleInput}},e._l(this.piggies,(function(t,a){return n("optgroup",{attrs:{label:a}},e._l(t.piggies,(function(t){return n("option",{attrs:{label:t.name_with_balance},domProps:{value:t.id}},[e._v("\n "+e._s(t.name_with_balance)+"\n ")])})),0)})),0),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;var _=n(9669),p=n.n(_),f=n(7010);const h=e({name:"Tags",components:{VueTagsInput:n.n(f)()},props:["value","error"],data:function(){return{tag:"",autocompleteItems:[],debounce:null,tags:this.value}},watch:{tag:"initItems"},methods:{update:function(e){this.autocompleteItems=[],this.tags=e,this.$emit("input",this.tags)},clearTags:function(){this.tags=[]},hasError:function(){return this.error.length>0},initItems:function(){var e=this;if(!(this.tag.length<2)){var t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/tags?query=".concat(this.tag);clearTimeout(this.debounce),this.debounce=setTimeout((function(){p().get(t).then((function(t){e.autocompleteItems=t.data.map((function(e){return{text:e.tag}}))})).catch((function(){return console.warn("Oh. Something went wrong loading tags.")}))}),600)}}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.tags"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("vue-tags-input",{attrs:{"add-only-from-autocomplete":!1,"autocomplete-items":e.autocompleteItems,tags:e.tags,title:e.$t("firefly.tags"),classes:"form-input",placeholder:e.$t("firefly.tags")},on:{"tags-changed":e.update},model:{value:e.tag,callback:function(t){e.tag=t},expression:"tag"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearTags}},[n("i",{staticClass:"fa fa-trash-o"})])])],1)]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const A=e({name:"Category",props:{value:String,inputName:String,error:Array,accountName:{type:String,default:""}},data:function(){return{categoryAutoCompleteURI:null,name:null,target:null,acKey:null}},ready:function(){this.name=this.accountName,this.acKey="name"},mounted:function(){this.target=this.$refs.input,this.categoryAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/categories?query="},methods:{hasError:function(){return this.error.length>0},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name).replace(new RegExp(""+t,"i"),"$&")},aSyncFunction:function(e,t){axios.get(this.categoryAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},handleInput:function(e){"string"!=typeof this.$refs.input.value?this.$emit("input",this.$refs.input.value.name):this.$emit("input",this.$refs.input.value)},clearCategory:function(){this.name="",this.$refs.input.value="",this.$emit("input",this.$refs.input.value),this.$emit("clear:category")},selectedItem:function(e){void 0!==this.name&&(this.$emit("select:category",this.name),"string"!=typeof this.name?this.$emit("input",this.name.name):this.$emit("input",this.name))},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.category"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{autocomplete:"off","data-role":"input",name:"category[]",type:"text",placeholder:e.$t("firefly.category"),title:e.$t("firefly.category")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearCategory}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{ref:"typea",attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const g=e({name:"Amount",props:["source","destination","transactionType","value","error"],data:function(){return{sourceAccount:this.source,destinationAccount:this.destination,type:this.transactionType}},methods:{handleInput:function(e){this.$emit("input",this.$refs.amount.value)},clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},changeData:function(){var e=this.transactionType;e||this.source.name||this.destination.name?(null===e&&(e=""),""!==e||""===this.source.currency_name?""!==e||""===this.destination.currency_name?"withdrawal"!==e.toLowerCase()&&"reconciliation"!==e.toLowerCase()&&"transfer"!==e.toLowerCase()?("deposit"===e.toLowerCase()&&"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()&&$(this.$refs.cur).text(this.destination.currency_name),"deposit"!==e.toLowerCase()||"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()||$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text(this.source.currency_name):$(this.$refs.cur).text(this.destination.currency_name):$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text("")}},watch:{source:function(){this.changeData()},value:function(){},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},mounted:function(){this.changeData()}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("firefly.amount"))+"\n ")]),e._v(" "),n("label",{ref:"cur",staticClass:"col-sm-4 control-label"}),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[n("input",{ref:"amount",staticClass:"form-control",attrs:{title:e.$t("firefly.amount"),autocomplete:"off",name:"amount[]",step:"any",type:"number",placeholder:e.$t("firefly.amount")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const m=e({name:"ForeignAmountSelect",props:["source","destination","transactionType","value","error","no_currency","title"],mounted:function(){this.liability=!1,this.loadCurrencies()},data:function(){return{currencies:[],enabledCurrencies:[],exclude:null,liability:!1}},watch:{source:function(){this.changeData()},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},methods:{clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},handleInput:function(e){var t={amount:this.$refs.amount.value,currency_id:this.$refs.currency_select.value};this.$emit("input",t)},changeData:function(){this.enabledCurrencies=[];var e=this.destination.type?this.destination.type.toLowerCase():"invalid",t=this.source.type?this.source.type.toLowerCase():"invalid",n=this.transactionType?this.transactionType.toLowerCase():"invalid",a=["loan","debt","mortgage"],i=-1!==a.indexOf(t),o=-1!==a.indexOf(e);if("transfer"===n||o||i)for(var r in this.liability=!0,this.currencies)this.currencies.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294&&parseInt(this.currencies[r].id)===parseInt(this.destination.currency_id)&&this.enabledCurrencies.push(this.currencies[r]);else if("withdrawal"===n&&this.source&&!1===i)for(var s in this.currencies)this.currencies.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294&&this.source.currency_id!==this.currencies[s].id&&this.enabledCurrencies.push(this.currencies[s]);else if("deposit"===n&&this.destination)for(var l in this.currencies)this.currencies.hasOwnProperty(l)&&/^0$|^[1-9]\d*$/.test(l)&&l<=4294967294&&this.destination.currency_id!==this.currencies[l].id&&this.enabledCurrencies.push(this.currencies[l]);else for(var c in this.currencies)this.currencies.hasOwnProperty(c)&&/^0$|^[1-9]\d*$/.test(c)&&c<=4294967294&&this.enabledCurrencies.push(this.currencies[c])},loadCurrencies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/currencies";axios.get(t,{}).then((function(t){for(var n in e.currencies=[{id:0,attributes:{name:e.no_currency,enabled:!0}}],e.enabledCurrencies=[{attributes:{name:e.no_currency,enabled:!0},id:0}],t.data.data)t.data.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&t.data.data[n].attributes.enabled&&(e.currencies.push(t.data.data[n]),e.enabledCurrencies.push(t.data.data[n]))}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return this.enabledCurrencies.length>=1?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("form.foreign_amount"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-4"},[n("select",{ref:"currency_select",staticClass:"form-control",attrs:{name:"foreign_currency[]"},on:{input:e.handleInput}},e._l(this.enabledCurrencies,(function(t){return n("option",{attrs:{label:t.attributes.name},domProps:{selected:parseInt(e.value.currency_id)===parseInt(t.id),value:t.id}},[e._v("\n "+e._s(t.attributes.name)+"\n ")])})),0)]),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[this.enabledCurrencies.length>0?n("input",{ref:"amount",staticClass:"form-control",attrs:{placeholder:this.title,title:this.title,autocomplete:"off",name:"foreign_amount[]",step:"any",type:"number"},domProps:{value:e.value.amount},on:{input:e.handleInput}}):e._e(),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const v=e({props:{source:String,destination:String,type:String},methods:{changeValue:function(){if(this.source&&this.destination){var e="";window.accountToTypes[this.source]?window.accountToTypes[this.source][this.destination]?e=window.accountToTypes[this.source][this.destination]:console.warn("User selected an impossible destination."):console.warn("User selected an impossible source."),""!==e&&(this.transactionType=e,this.sentence=this.$t("firefly.you_create_"+e.toLowerCase()),this.$emit("act:limitSourceType",this.source),this.$emit("act:limitDestinationType",this.destination))}else this.sentence="",this.transactionType="";this.$emit("set:transactionType",this.transactionType)}},data:function(){return{transactionType:this.type,sentence:""}},watch:{source:function(){this.changeValue()},destination:function(){this.changeValue()}},name:"TransactionType"},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[""!==e.sentence?n("label",{staticClass:"control-label text-info"},[e._v("\n "+e._s(e.sentence)+"\n ")]):e._e()])])}),[],!1,null,null,null).exports;const b=e({props:{inputName:String,inputDescription:String,index:Number,transactionType:String,error:Array,accountName:{type:String,default:""},accountTypeFilters:{type:Array,default:function(){return[]}},defaultAccountTypeFilters:{type:Array,default:function(){return[]}}},data:function(){return{accountAutoCompleteURI:null,name:null,trType:this.transactionType,target:null,inputDisabled:!1,allowedTypes:this.accountTypeFilters,defaultAllowedTypes:this.defaultAccountTypeFilters}},ready:function(){this.name=this.accountName},mounted:function(){this.target=this.$refs.input,this.updateACURI(this.allowedTypes.join(",")),this.name=this.accountName,this.triggerTransactionType()},watch:{transactionType:function(){this.triggerTransactionType()},accountName:function(){this.name=this.accountName},accountTypeFilters:function(){var e=this.accountTypeFilters.join(",");0===this.accountTypeFilters.length&&(e=this.defaultAccountTypeFilters.join(",")),this.updateACURI(e)}},methods:{aSyncFunction:function(e,t){axios.get(this.accountAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name_with_balance).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},updateACURI:function(e){this.accountAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/accounts?types="+e+"&query="},hasError:function(){return this.error.length>0},triggerTransactionType:function(){if(this.name,null!==this.transactionType&&""!==this.transactionType&&(this.inputDisabled=!1,""!==this.transactionType.toString()&&this.index>0)){if("transfer"===this.transactionType.toString().toLowerCase())return void(this.inputDisabled=!0);if("withdrawal"===this.transactionType.toString().toLowerCase()&&"source"===this.inputName.substr(0,6).toLowerCase())return void(this.inputDisabled=!0);"deposit"===this.transactionType.toString().toLowerCase()&&"destination"===this.inputName.substr(0,11).toLowerCase()&&(this.inputDisabled=!0)}},selectedItem:function(e){void 0!==this.name&&("string"==typeof this.name&&this.$emit("clear:value"),this.$emit("select:account",this.name))},clearSource:function(e){this.name="",this.$emit("clear:value")},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.inputDescription)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{"data-index":e.index,disabled:e.inputDisabled,name:e.inputName,placeholder:e.inputDescription,title:e.inputDescription,autocomplete:"off","data-role":"input",type:"text"},on:{keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearSource}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name_with_balance"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const y=e({name:"Budget",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_budget:String},mounted:function(){this.loadBudgets()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,budgets:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.budget.value)},handleInput:function(e){this.$emit("input",this.$refs.budget.value)},hasError:function(){return this.error.length>0},loadBudgets:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/budgets?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.budgets=[{name:e.no_budget,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.budgets.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.budget"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.budgets.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"budget",staticClass:"form-control",attrs:{title:e.$t("firefly.budget"),name:"budget[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.budgets,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.budgets.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_budget_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const k=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.uri.value)},clearField:function(){this.name="",this.$refs.uri.value="",this.$emit("input",this.$refs.uri.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"uri",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"url"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const w=e({name:"Bill",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_bill:String},mounted:function(){this.loadBills()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,bills:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.bill.value)},handleInput:function(e){this.$emit("input",this.$refs.bill.value)},hasError:function(){return this.error.length>0},loadBills:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/bills?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.bills=[{name:e.no_bill,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.bills.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.bill"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.bills.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"bill",staticClass:"form-control",attrs:{title:e.$t("firefly.bill"),name:"bill[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.bills,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.bills.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_bill_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;n(9703),Vue.component("budget",y),Vue.component("bill",w),Vue.component("custom-date",i),Vue.component("custom-string",o),Vue.component("custom-attachments",t),Vue.component("custom-textarea",r),Vue.component("custom-uri",k),Vue.component("standard-date",s),Vue.component("group-description",l),Vue.component("transaction-description",c),Vue.component("custom-transaction-fields",u),Vue.component("piggy-bank",d),Vue.component("tags",h),Vue.component("category",A),Vue.component("amount",g),Vue.component("foreign-amount",m),Vue.component("transaction-type",v),Vue.component("account-select",b),Vue.component("edit-transaction",a);var C=n(5299),z={};new Vue({i18n:C,el:"#edit_transaction",render:function(e){return e(a,{props:z})}})})()})(); \ No newline at end of file +(()=>{var e={7010:e=>{window,e.exports=function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=6)}([function(e,t,n){var a=n(8);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("7ec05f6c",a,!1,{})},function(e,t,n){var a=n(10);"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals),(0,n(4).default)("3453d19d",a,!1,{})},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n,a=e[1]||"",i=e[3];if(!i)return a;if(t&&"function"==typeof btoa){var o=(n=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),r=i.sources.map((function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"}));return[a].concat(r).concat([o]).join("\n")}return[a].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},i=0;in.parts.length&&(a.parts.length=n.parts.length)}else{var r=[];for(i=0;i div[data-v-61d92e31] {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%;\n}\n.ti-selected-item[data-v-61d92e31] {\n background-color: #5C6BC0;\n color: #fff;\n}\n',"",{version:3,sources:["C:/Users/johan/dev/vue-tags-input/vue-tags-input/C:/Users/johan/dev/vue-tags-input/vue-tags-input/vue-tags-input.scss"],names:[],mappings:"AAAA;EACE,uBAAuB;EACvB,mCAA8C;EAC9C,+JAAuM;EACvM,oBAAoB;EACpB,mBAAmB;CAAE;AAEvB;EACE,kCAAkC;EAClC,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;EACf,oCAAoC;EACpC,mCAAmC;CAAE;AAEvC;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,iBAAiB;CAAE;AAErB;EACE,YAAY;EACZ,aAAa;EACb,sBAAsB;CAAE;AAE1B;EACE,uBAAuB;CAAE;AAE3B;EACE,cAAc;CAAE;AAElB;EACE,8BAA8B;CAAE;AAElC;EACE,iBAAiB;EACjB,mBAAmB;EACnB,uBAAuB;CAAE;AAE3B;EACE,aAAa;CAAE;AACf;IACE,gBAAgB;CAAE;AAEtB;EACE,uBAAuB;EACvB,cAAc;EACd,aAAa;EACb,gBAAgB;CAAE;AAEpB;EACE,cAAc;EACd,gBAAgB;EAChB,YAAY;EACZ,iBAAiB;CAAE;AAErB;EACE,0BAA0B;EAC1B,YAAY;EACZ,mBAAmB;EACnB,cAAc;EACd,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,cAAc;CAAE;AAClB;IACE,cAAc;IACd,oBAAoB;CAAE;AACxB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;CAAE;AACvB;IACE,mBAAmB;IACnB,mBAAmB;IACnB,YAAY;IACZ,iBAAiB;CAAE;AACrB;IACE,iBAAiB;IACjB,cAAc;IACd,oBAAoB;IACpB,kBAAkB;CAAE;AACpB;MACE,gBAAgB;CAAE;AACtB;IACE,kBAAkB;CAAE;AACtB;IACE,0BAA0B;CAAE;AAEhC;EACE,cAAc;EACd,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,iBAAiB;CAAE;AACnB;IACE,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,aAAa;IACb,YAAY;CAAE;AAElB;EACE,qBAAqB;CAAE;AAEzB;EACE,uBAAuB;EACvB,iBAAiB;EACjB,mBAAmB;EACnB,YAAY;EACZ,uBAAuB;EACvB,YAAY;CAAE;AAEhB;EACE,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CAAE;AAEhB;EACE,0BAA0B;EAC1B,YAAY;CAAE",file:"vue-tags-input.scss?vue&type=style&index=0&id=61d92e31&lang=scss&scoped=true&",sourcesContent:['@font-face {\n font-family: \'icomoon\';\n src: url("./assets/fonts/icomoon.eot?7grlse");\n src: url("./assets/fonts/icomoon.eot?7grlse#iefix") format("embedded-opentype"), url("./assets/fonts/icomoon.ttf?7grlse") format("truetype"), url("./assets/fonts/icomoon.woff?7grlse") format("woff");\n font-weight: normal;\n font-style: normal; }\n\n[class^="ti-icon-"], [class*=" ti-icon-"] {\n font-family: \'icomoon\' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.ti-icon-check:before {\n content: "\\e902"; }\n\n.ti-icon-close:before {\n content: "\\e901"; }\n\n.ti-icon-undo:before {\n content: "\\e900"; }\n\nul {\n margin: 0px;\n padding: 0px;\n list-style-type: none; }\n\n*, *:before, *:after {\n box-sizing: border-box; }\n\ninput:focus {\n outline: none; }\n\ninput[disabled] {\n background-color: transparent; }\n\n.vue-tags-input {\n max-width: 450px;\n position: relative;\n background-color: #fff; }\n\ndiv.vue-tags-input.disabled {\n opacity: 0.5; }\n div.vue-tags-input.disabled * {\n cursor: default; }\n\n.ti-input {\n border: 1px solid #ccc;\n display: flex;\n padding: 4px;\n flex-wrap: wrap; }\n\n.ti-tags {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n line-height: 1em; }\n\n.ti-tag {\n background-color: #5C6BC0;\n color: #fff;\n border-radius: 2px;\n display: flex;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-tag:focus {\n outline: none; }\n .ti-tag .ti-content {\n display: flex;\n align-items: center; }\n .ti-tag .ti-tag-center {\n position: relative; }\n .ti-tag span {\n line-height: .85em; }\n .ti-tag span.ti-hidden {\n padding-left: 14px;\n visibility: hidden;\n height: 0px;\n white-space: pre; }\n .ti-tag .ti-actions {\n margin-left: 2px;\n display: flex;\n align-items: center;\n font-size: 1.15em; }\n .ti-tag .ti-actions i {\n cursor: pointer; }\n .ti-tag:last-child {\n margin-right: 4px; }\n .ti-tag.ti-invalid, .ti-tag.ti-tag.ti-deletion-mark {\n background-color: #e54d42; }\n\n.ti-new-tag-input-wrapper {\n display: flex;\n flex: 1 0 auto;\n padding: 3px 5px;\n margin: 2px;\n font-size: .85em; }\n .ti-new-tag-input-wrapper input {\n flex: 1 0 auto;\n min-width: 100px;\n border: none;\n padding: 0px;\n margin: 0px; }\n\n.ti-new-tag-input {\n line-height: initial; }\n\n.ti-autocomplete {\n border: 1px solid #ccc;\n border-top: none;\n position: absolute;\n width: 100%;\n background-color: #fff;\n z-index: 20; }\n\n.ti-item > div {\n cursor: pointer;\n padding: 3px 6px;\n width: 100%; }\n\n.ti-selected-item {\n background-color: #5C6BC0;\n color: #fff; }\n'],sourceRoot:""}])},function(e,t,n){"use strict";e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t){e.exports="data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg8SBawAAAC8AAAAYGNtYXAXVtKJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZqWfozAAAAF4AAAA/GhlYWQPxZgIAAACdAAAADZoaGVhB4ADyAAAAqwAAAAkaG10eBIAAb4AAALQAAAAHGxvY2EAkgDiAAAC7AAAABBtYXhwAAkAHwAAAvwAAAAgbmFtZZlKCfsAAAMcAAABhnBvc3QAAwAAAAAEpAAAACAAAwOAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6QL//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAFYBAQO+AoEAHAAAATIXHgEXFhcHJicuAScmIyIGBxchERc2Nz4BNzYCFkpDQ28pKRdkECAfVTM0OT9wLZz+gJgdIiJLKSgCVRcYUjg5QiAzKys+ERIrJZoBgJoZFRQcCAgAAQDWAIEDKgLVAAsAAAEHFwcnByc3JzcXNwMq7u487u487u487u4Cme7uPO7uPO7uPO7uAAEAkgCBA4ACvQAFAAAlARcBJzcBgAHEPP4A7jz5AcQ8/gDuPAAAAAABAAAAAAAAH8nTUV8PPPUACwQAAAAAANZ1KhsAAAAA1nUqGwAAAAADvgLVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAO+AAEAAAAAAAAAAAAAAAAAAAAHBAAAAAAAAAAAAAAAAgAAAAQAAFYEAADWBAAAkgAAAAAACgAUAB4AUABqAH4AAQAAAAcAHQABAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},function(e,t){e.exports="data:font/woff;base64,d09GRgABAAAAAAUQAAsAAAAABMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIFrGNtYXAAAAFoAAAAVAAAAFQXVtKJZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAAAPwAAAD8pZ+jMGhlYWQAAALAAAAANgAAADYPxZgIaGhlYQAAAvgAAAAkAAAAJAeAA8hobXR4AAADHAAAABwAAAAcEgABvmxvY2EAAAM4AAAAEAAAABAAkgDibWF4cAAAA0gAAAAgAAAAIAAJAB9uYW1lAAADaAAAAYYAAAGGmUoJ+3Bvc3QAAATwAAAAIAAAACAAAwAAAAMDgAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6QIDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOkC//3//wAAAAAAIOkA//3//wAB/+MXBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQBWAQEDvgKBABwAAAEyFx4BFxYXByYnLgEnJiMiBgcXIREXNjc+ATc2AhZKQ0NvKSkXZBAgH1UzNDk/cC2c/oCYHSIiSykoAlUXGFI4OUIgMysrPhESKyWaAYCaGRUUHAgIAAEA1gCBAyoC1QALAAABBxcHJwcnNyc3FzcDKu7uPO7uPO7uPO7uApnu7jzu7jzu7jzu7gABAJIAgQOAAr0ABQAAJQEXASc3AYABxDz+AO48+QHEPP4A7jwAAAAAAQAAAAAAAB/J01FfDzz1AAsEAAAAAADWdSobAAAAANZ1KhsAAAAAA74C1QAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADvgABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABWBAAA1gQAAJIAAAAAAAoAFAAeAFAAagB+AAEAAAAHAB0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},function(e,t,n){"use strict";n.r(t);var a=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vue-tags-input",class:[{"ti-disabled":e.disabled},{"ti-focus":e.focused}]},[n("div",{staticClass:"ti-input"},[e.tagsCopy?n("ul",{staticClass:"ti-tags"},[e._l(e.tagsCopy,(function(t,a){return n("li",{key:a,staticClass:"ti-tag",class:[{"ti-editing":e.tagsEditStatus[a]},t.tiClasses,t.classes,{"ti-deletion-mark":e.isMarked(a)}],style:t.style,attrs:{tabindex:"0"},on:{click:function(n){return e.$emit("tag-clicked",{tag:t,index:a})}}},[n("div",{staticClass:"ti-content"},[e.$scopedSlots["tag-left"]?n("div",{staticClass:"ti-tag-left"},[e._t("tag-left",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e(),e._v(" "),n("div",{ref:"tagCenter",refInFor:!0,staticClass:"ti-tag-center"},[e.$scopedSlots["tag-center"]?e._e():n("span",{class:{"ti-hidden":e.tagsEditStatus[a]},on:{click:function(t){return e.performEditTag(a)}}},[e._v(e._s(t.text))]),e._v(" "),e.$scopedSlots["tag-center"]?e._e():n("tag-input",{attrs:{scope:{edit:e.tagsEditStatus[a],maxlength:e.maxlength,tag:t,index:a,validateTag:e.createChangedTag,performCancelEdit:e.cancelEdit,performSaveEdit:e.performSaveTag}}}),e._v(" "),e._t("tag-center",null,{tag:t,index:a,maxlength:e.maxlength,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,validateTag:e.createChangedTag,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2),e._v(" "),e.$scopedSlots["tag-right"]?n("div",{staticClass:"ti-tag-right"},[e._t("tag-right",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)})],2):e._e()]),e._v(" "),n("div",{staticClass:"ti-actions"},[e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:e.tagsEditStatus[a],expression:"tagsEditStatus[index]"}],staticClass:"ti-icon-undo",on:{click:function(t){return e.cancelEdit(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._e():n("i",{directives:[{name:"show",rawName:"v-show",value:!e.tagsEditStatus[a],expression:"!tagsEditStatus[index]"}],staticClass:"ti-icon-close",on:{click:function(t){return e.performDeleteTag(a)}}}),e._v(" "),e.$scopedSlots["tag-actions"]?e._t("tag-actions",null,{tag:t,index:a,edit:e.tagsEditStatus[a],performSaveEdit:e.performSaveTag,performDelete:e.performDeleteTag,performCancelEdit:e.cancelEdit,performOpenEdit:e.performEditTag,deletionMark:e.isMarked(a)}):e._e()],2)])})),e._v(" "),n("li",{staticClass:"ti-new-tag-input-wrapper"},[n("input",e._b({ref:"newTagInput",staticClass:"ti-new-tag-input",class:[e.createClasses(e.newTag,e.tags,e.validation,e.isDuplicate)],attrs:{placeholder:e.placeholder,maxlength:e.maxlength,disabled:e.disabled,type:"text",size:"1"},domProps:{value:e.newTag},on:{keydown:[function(t){return e.performAddTags(e.filteredAutocompleteItems[e.selectedItem]||e.newTag,t)},function(t){return t.type.indexOf("key")||8===t.keyCode?e.invokeDelete(t):null},function(t){return t.type.indexOf("key")||9===t.keyCode?e.performBlur(t):null},function(t){return t.type.indexOf("key")||38===t.keyCode?e.selectItem(t,"before"):null},function(t){return t.type.indexOf("key")||40===t.keyCode?e.selectItem(t,"after"):null}],paste:e.addTagsFromPaste,input:e.updateNewTag,blur:function(t){return e.$emit("blur",t)},focus:function(t){e.focused=!0,e.$emit("focus",t)},click:function(t){!e.addOnlyFromAutocomplete&&(e.selectedItem=null)}}},"input",e.$attrs,!1))])],2):e._e()]),e._v(" "),e._t("between-elements"),e._v(" "),e.autocompleteOpen?n("div",{staticClass:"ti-autocomplete",on:{mouseout:function(t){e.selectedItem=null}}},[e._t("autocomplete-header"),e._v(" "),n("ul",e._l(e.filteredAutocompleteItems,(function(t,a){return n("li",{key:a,staticClass:"ti-item",class:[t.tiClasses,t.classes,{"ti-selected-item":e.isSelected(a)}],style:t.style,on:{mouseover:function(t){!e.disabled&&(e.selectedItem=a)}}},[e.$scopedSlots["autocomplete-item"]?e._t("autocomplete-item",null,{item:t,index:a,performAdd:function(t){return e.performAddTags(t,void 0,"autocomplete")},selected:e.isSelected(a)}):n("div",{on:{click:function(n){return e.performAddTags(t,void 0,"autocomplete")}}},[e._v("\n "+e._s(t.text)+"\n ")])],2)})),0),e._v(" "),e._t("autocomplete-footer")],2):e._e()],2)};a._withStripped=!0;var i=n(5),o=n.n(i),r=function(e){return JSON.parse(JSON.stringify(e))},s=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3?arguments[3]:void 0;void 0===e.text&&(e={text:e});var i=function(e,t){return t.filter((function(t){var n=e.text;return"string"==typeof t.rule?!new RegExp(t.rule).test(n):t.rule instanceof RegExp?!t.rule.test(n):"[object Function]"==={}.toString.call(t.rule)?t.rule(e):void 0})).map((function(e){return e.classes}))}(e,n),o=function(e,t){for(var n=0;n1?n-1:0),i=1;i1?t-1:0),a=1;a=this.autocompleteMinLength&&this.filteredAutocompleteItems.length>0&&this.focused},filteredAutocompleteItems:function(){var e=this,t=this.autocompleteItems.map((function(t){return l(t,e.tags,e.validation,e.isDuplicate)}));return this.autocompleteFilterDuplicates?t.filter(this.duplicateFilter):t}},methods:{createClasses:s,getSelectedIndex:function(e){var t=this.filteredAutocompleteItems,n=this.selectedItem,a=t.length-1;if(0!==t.length)return null===n?0:"before"===e&&0===n?a:"after"===e&&n===a?0:"after"===e?n+1:n-1},selectDefaultItem:function(){this.addOnlyFromAutocomplete&&this.filteredAutocompleteItems.length>0?this.selectedItem=0:this.selectedItem=null},selectItem:function(e,t){e.preventDefault(),this.selectedItem=this.getSelectedIndex(t)},isSelected:function(e){return this.selectedItem===e},isMarked:function(e){return this.deletionMark===e},invokeDelete:function(){var e=this;if(this.deleteOnBackspace&&!(this.newTag.length>0)){var t=this.tagsCopy.length-1;null===this.deletionMark?(this.deletionMarkTime=setTimeout((function(){return e.deletionMark=null}),1e3),this.deletionMark=t):this.performDeleteTag(t)}},addTagsFromPaste:function(){var e=this;this.addFromPaste&&setTimeout((function(){return e.performAddTags(e.newTag)}),10)},performEditTag:function(e){var t=this;this.allowEditTags&&(this._events["before-editing-tag"]||this.editTag(e),this.$emit("before-editing-tag",{index:e,tag:this.tagsCopy[e],editTag:function(){return t.editTag(e)}}))},editTag:function(e){this.allowEditTags&&(this.toggleEditMode(e),this.focus(e))},toggleEditMode:function(e){this.allowEditTags&&!this.disabled&&this.$set(this.tagsEditStatus,e,!this.tagsEditStatus[e])},createChangedTag:function(e,t){var n=this.tagsCopy[e];n.text=t?t.target.value:this.tagsCopy[e].text,this.$set(this.tagsCopy,e,l(n,this.tagsCopy,this.validation,this.isDuplicate))},focus:function(e){var t=this;this.$nextTick((function(){var n=t.$refs.tagCenter[e].querySelector("input.ti-tag-input");n&&n.focus()}))},quote:function(e){return e.replace(/([()[{*+.$^\\|?])/g,"\\$1")},cancelEdit:function(e){this.tags[e]&&(this.tagsCopy[e]=r(l(this.tags[e],this.tags,this.validation,this.isDuplicate)),this.$set(this.tagsEditStatus,e,!1))},hasForbiddingAddRule:function(e){var t=this;return e.some((function(e){var n=t.validation.find((function(t){return e===t.classes}));return!!n&&n.disableAdd}))},createTagTexts:function(e){var t=this,n=new RegExp(this.separators.map((function(e){return t.quote(e)})).join("|"));return e.split(n).map((function(e){return{text:e}}))},performDeleteTag:function(e){var t=this;this._events["before-deleting-tag"]||this.deleteTag(e),this.$emit("before-deleting-tag",{index:e,tag:this.tagsCopy[e],deleteTag:function(){return t.deleteTag(e)}})},deleteTag:function(e){this.disabled||(this.deletionMark=null,clearTimeout(this.deletionMarkTime),this.tagsCopy.splice(e,1),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},noTriggerKey:function(e,t){var n=-1!==this[t].indexOf(e.keyCode)||-1!==this[t].indexOf(e.key);return n&&e.preventDefault(),!n},performAddTags:function(e,t,n){var a=this;if(!(this.disabled||t&&this.noTriggerKey(t,"addOnKey"))){var i=[];"object"===m(e)&&(i=[e]),"string"==typeof e&&(i=this.createTagTexts(e)),(i=i.filter((function(e){return e.text.trim().length>0}))).forEach((function(e){e=l(e,a.tags,a.validation,a.isDuplicate),a._events["before-adding-tag"]||a.addTag(e,n),a.$emit("before-adding-tag",{tag:e,addTag:function(){return a.addTag(e,n)}})}))}},duplicateFilter:function(e){return this.isDuplicate?!this.isDuplicate(this.tagsCopy,e):!this.tagsCopy.find((function(t){return t.text===e.text}))},addTag:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"new-tag-input",a=this.filteredAutocompleteItems.map((function(e){return e.text}));this.addOnlyFromAutocomplete&&-1===a.indexOf(e.text)||this.$nextTick((function(){return t.maxTags&&t.maxTags<=t.tagsCopy.length?t.$emit("max-tags-reached",e):t.avoidAddingDuplicates&&!t.duplicateFilter(e)?t.$emit("adding-duplicate",e):void(t.hasForbiddingAddRule(e.tiClasses)||(t.$emit("input",""),t.tagsCopy.push(e),t._events["update:tags"]&&t.$emit("update:tags",t.tagsCopy),"autocomplete"===n&&t.$refs.newTagInput.focus(),t.$emit("tags-changed",t.tagsCopy)))}))},performSaveTag:function(e,t){var n=this,a=this.tagsCopy[e];this.disabled||t&&this.noTriggerKey(t,"addOnKey")||0!==a.text.trim().length&&(this._events["before-saving-tag"]||this.saveTag(e,a),this.$emit("before-saving-tag",{index:e,tag:a,saveTag:function(){return n.saveTag(e,a)}}))},saveTag:function(e,t){if(this.avoidAddingDuplicates){var n=r(this.tagsCopy),a=n.splice(e,1)[0];if(this.isDuplicate?this.isDuplicate(n,a):-1!==n.map((function(e){return e.text})).indexOf(a.text))return this.$emit("saving-duplicate",t)}this.hasForbiddingAddRule(t.tiClasses)||(this.$set(this.tagsCopy,e,t),this.toggleEditMode(e),this._events["update:tags"]&&this.$emit("update:tags",this.tagsCopy),this.$emit("tags-changed",this.tagsCopy))},tagsEqual:function(){var e=this;return!this.tagsCopy.some((function(t,n){return!o()(t,e.tags[n])}))},updateNewTag:function(e){var t=e.target.value;this.newTag=t,this.$emit("input",t)},initTags:function(){this.tagsCopy=c(this.tags,this.validation,this.isDuplicate),this.tagsEditStatus=r(this.tags).map((function(){return!1})),this._events["update:tags"]&&!this.tagsEqual()&&this.$emit("update:tags",this.tagsCopy)},blurredOnClick:function(e){this.$el.contains(e.target)||this.$el.contains(document.activeElement)||this.performBlur(e)},performBlur:function(){this.addOnBlur&&this.focused&&this.performAddTags(this.newTag),this.focused=!1}},watch:{value:function(e){this.addOnlyFromAutocomplete||(this.selectedItem=null),this.newTag=e},tags:{handler:function(){this.initTags()},deep:!0},autocompleteOpen:"selectDefaultItem"},created:function(){this.newTag=this.value,this.initTags()},mounted:function(){this.selectDefaultItem(),document.addEventListener("click",this.blurredOnClick)},destroyed:function(){document.removeEventListener("click",this.blurredOnClick)}},b=(n(9),_(v,a,[],!1,null,"61d92e31",null));b.options.__file="vue-tags-input/vue-tags-input.vue";var y=b.exports;n.d(t,"VueTagsInput",(function(){return y})),n.d(t,"createClasses",(function(){return s})),n.d(t,"createTag",(function(){return l})),n.d(t,"createTags",(function(){return c})),n.d(t,"TagInput",(function(){return f})),y.install=function(e){return e.component(y.name,y)},"undefined"!=typeof window&&window.Vue&&window.Vue.use(y),t.default=y}])},9669:(e,t,n)=>{e.exports=n(1609)},5448:(e,t,n)=>{"use strict";var a=n(4867),i=n(6026),o=n(4372),r=n(5327),s=n(4097),l=n(4109),c=n(7985),u=n(5061);e.exports=function(e){return new Promise((function(t,n){var d=e.data,_=e.headers;a.isFormData(d)&&delete _["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var f=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";_.Authorization="Basic "+btoa(f+":"+h)}var A=s(e.baseURL,e.url);if(p.open(e.method.toUpperCase(),r(A,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var a="getAllResponseHeaders"in p?l(p.getAllResponseHeaders()):null,o={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:a,config:e,request:p};i(t,n,o),p=null}},p.onabort=function(){p&&(n(u("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){n(u("Network Error",e,null,p)),p=null},p.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(u(t,e,"ECONNABORTED",p)),p=null},a.isStandardBrowserEnv()){var g=(e.withCredentials||c(A))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;g&&(_[e.xsrfHeaderName]=g)}if("setRequestHeader"in p&&a.forEach(_,(function(e,t){void 0===d&&"content-type"===t.toLowerCase()?delete _[t]:p.setRequestHeader(t,e)})),a.isUndefined(e.withCredentials)||(p.withCredentials=!!e.withCredentials),e.responseType)try{p.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),n(e),p=null)})),d||(d=null),p.send(d)}))}},1609:(e,t,n)=>{"use strict";var a=n(4867),i=n(1849),o=n(321),r=n(7185);function s(e){var t=new o(e),n=i(o.prototype.request,t);return a.extend(n,o.prototype,t),a.extend(n,t),n}var l=s(n(5655));l.Axios=o,l.create=function(e){return s(r(l.defaults,e))},l.Cancel=n(5263),l.CancelToken=n(4972),l.isCancel=n(6502),l.all=function(e){return Promise.all(e)},l.spread=n(8713),l.isAxiosError=n(6268),e.exports=l,e.exports.default=l},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,n)=>{"use strict";var a=n(5263);function i(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new a(e),t(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var e;return{token:new i((function(t){e=t})),cancel:e}},e.exports=i},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,n)=>{"use strict";var a=n(4867),i=n(5327),o=n(782),r=n(3572),s=n(7185);function l(e){this.defaults=e,this.interceptors={request:new o,response:new o}}l.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[r,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)n=n.then(t.shift(),t.shift());return n},l.prototype.getUri=function(e){return e=s(this.defaults,e),i(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},a.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),a.forEach(["post","put","patch"],(function(e){l.prototype[e]=function(t,n,a){return this.request(s(a||{},{method:e,url:t,data:n}))}})),e.exports=l},782:(e,t,n)=>{"use strict";var a=n(4867);function i(){this.handlers=[]}i.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},i.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},i.prototype.forEach=function(e){a.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=i},4097:(e,t,n)=>{"use strict";var a=n(1793),i=n(7303);e.exports=function(e,t){return e&&!a(t)?i(e,t):t}},5061:(e,t,n)=>{"use strict";var a=n(481);e.exports=function(e,t,n,i,o){var r=new Error(e);return a(r,t,n,i,o)}},3572:(e,t,n)=>{"use strict";var a=n(4867),i=n(8527),o=n(6502),r=n(5655);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=i(e.data,e.headers,e.transformRequest),e.headers=a.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),a.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||r.adapter)(e).then((function(t){return s(e),t.data=i(t.data,t.headers,e.transformResponse),t}),(function(t){return o(t)||(s(e),t&&t.response&&(t.response.data=i(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,n,a,i){return e.config=t,n&&(e.code=n),e.request=a,e.response=i,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){t=t||{};var n={},i=["url","method","data"],o=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function l(e,t){return a.isPlainObject(e)&&a.isPlainObject(t)?a.merge(e,t):a.isPlainObject(t)?a.merge({},t):a.isArray(t)?t.slice():t}function c(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(e[i],t[i])}a.forEach(i,(function(e){a.isUndefined(t[e])||(n[e]=l(void 0,t[e]))})),a.forEach(o,c),a.forEach(r,(function(i){a.isUndefined(t[i])?a.isUndefined(e[i])||(n[i]=l(void 0,e[i])):n[i]=l(void 0,t[i])})),a.forEach(s,(function(a){a in t?n[a]=l(e[a],t[a]):a in e&&(n[a]=l(void 0,e[a]))}));var u=i.concat(o).concat(r).concat(s),d=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===u.indexOf(e)}));return a.forEach(d,c),n}},6026:(e,t,n)=>{"use strict";var a=n(5061);e.exports=function(e,t,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?t(a("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},8527:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t,n){return a.forEach(n,(function(n){e=n(e,t)})),e}},5655:(e,t,n)=>{"use strict";var a=n(4155),i=n(4867),o=n(6016),r={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==a&&"[object process]"===Object.prototype.toString.call(a))&&(l=n(5448)),l),transformRequest:[function(e,t){return o(t,"Accept"),o(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(s(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),i.forEach(["post","put","patch"],(function(e){c.headers[e]=i.merge(r)})),e.exports=c},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),a=0;a{"use strict";var a=n(4867);function i(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var o;if(n)o=n(t);else if(a.isURLSearchParams(t))o=t.toString();else{var r=[];a.forEach(t,(function(e,t){null!=e&&(a.isArray(e)?t+="[]":e=[e],a.forEach(e,(function(e){a.isDate(e)?e=e.toISOString():a.isObject(e)&&(e=JSON.stringify(e)),r.push(i(t)+"="+i(e))})))})),o=r.join("&")}if(o){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?{write:function(e,t,n,i,o,r){var s=[];s.push(e+"="+encodeURIComponent(t)),a.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),a.isString(i)&&s.push("path="+i),a.isString(o)&&s.push("domain="+o),!0===r&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(e){var a=e;return t&&(n.setAttribute("href",a),a=n.href),n.setAttribute("href",a),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=i(window.location.href),function(t){var n=a.isString(t)?i(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},6016:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,t){a.forEach(e,(function(n,a){a!==t&&a.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[a])}))}},4109:(e,t,n)=>{"use strict";var a=n(4867),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,o,r={};return e?(a.forEach(e.split("\n"),(function(e){if(o=e.indexOf(":"),t=a.trim(e.substr(0,o)).toLowerCase(),n=a.trim(e.substr(o+1)),t){if(r[t]&&i.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([n]):r[t]?r[t]+", "+n:n}})),r):r}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4867:(e,t,n)=>{"use strict";var a=n(1849),i=Object.prototype.toString;function o(e){return"[object Array]"===i.call(e)}function r(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==i.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===i.call(e)}function u(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),o(e))for(var n=0,a=e.length;n{window.axios=n(9669),window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var a=document.head.querySelector('meta[name="csrf-token"]');a?window.axios.defaults.headers.common["X-CSRF-TOKEN"]=a.content:console.error("CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token")},5299:(e,t,n)=>{e.exports=new vuei18n({locale:document.documentElement.lang,fallbackLocale:"en",messages:{bg:n(987),cs:n(6054),de:n(7062),en:n(6886),"en-us":n(6886),"en-gb":n(5642),es:n(2360),el:n(1410),fr:n(6833),hu:n(6477),it:n(3092),nl:n(78),nb:n(2502),pl:n(8691),fi:n(3684),"pt-br":n(122),"pt-pt":n(4895),ro:n(403),ru:n(7448),"zh-tw":n(4963),"zh-cn":n(1922),sk:n(6949),sv:n(2285),vi:n(9783)}})},4155:e=>{var t,n,a=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var s,l=[],c=!1,u=-1;function d(){c&&s&&(c=!1,s.length?l=s.concat(l):u=-1,l.length&&_())}function _(){if(!c){var e=r(d);c=!0;for(var t=l.length;t;){for(s=l,l=[];++u1)for(var n=1;n{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Какво се случва?","flash_error":"Грешка!","flash_success":"Успех!","close":"Затвори","split_transaction_title":"Описание на разделена транзакция","errors_submission":"Имаше нещо нередно с вашите данни. Моля, проверете грешките.","split":"Раздели","single_split":"Раздел","transaction_stored_link":"Транзакция #{ID}(\\"{title}\\") беше записана.","transaction_updated_link":"Транзакция #{ID} беше обновена.","transaction_new_stored_link":"Транзакция #{ID} беше записана.","transaction_journal_information":"Информация за транзакция","no_budget_pointer":"Изглежда все още нямате бюджети. Трябва да създадете някои на страницата Бюджети . Бюджетите могат да ви помогнат да следите разходите си.","no_bill_pointer":"Изглежда все още нямате сметки. Трябва да създадете някои на страницата Сметки . Сметките могат да ви помогнат да следите разходите си.","source_account":"Разходна сметка","hidden_fields_preferences":"Можете да активирате повече опции за транзакции във вашите настройки.","destination_account":"Приходна сметка","add_another_split":"Добавяне на друг раздел","submission":"Изпращане","create_another":"След съхраняването се върнете тук, за да създадете нова.","reset_after":"Изчистване на формуляра след изпращане","submit":"Потвърди","amount":"Сума","date":"Дата","tags":"Етикети","no_budget":"(без бюджет)","no_bill":"(няма сметка)","category":"Категория","attachments":"Прикачени файлове","notes":"Бележки","external_uri":"External URL","update_transaction":"Обнови транзакцията","after_update_create_another":"След обновяването се върнете тук, за да продължите с редакцията.","store_as_new":"Съхранете като нова транзакция, вместо да я актуализирате.","split_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","none_in_select_list":"(нищо)","no_piggy_bank":"(без касичка)","description":"Описание","split_transaction_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","destination_account_reconciliation":"Не може да редактирате приходната сметка на транзакция за съгласуване.","source_account_reconciliation":"Не може да редактирате разходната сметка на транзакция за съгласуване.","budget":"Бюджет","bill":"Сметка","you_create_withdrawal":"Създавате теглене.","you_create_transfer":"Създавате прехвърляне.","you_create_deposit":"Създавате депозит.","edit":"Промени","delete":"Изтрий","name":"Име","profile_whoops":"Опаааа!","profile_something_wrong":"Нещо се обърка!","profile_try_again":"Нещо се обърка. Моля, опитайте отново.","profile_oauth_clients":"OAuth клиенти","profile_oauth_no_clients":"Не сте създали клиенти на OAuth.","profile_oauth_clients_header":"Клиенти","profile_oauth_client_id":"ИД (ID) на клиент","profile_oauth_client_name":"Име","profile_oauth_client_secret":"Тайна","profile_oauth_create_new_client":"Създай нов клиент","profile_oauth_create_client":"Създай клиент","profile_oauth_edit_client":"Редактирай клиент","profile_oauth_name_help":"Нещо, което вашите потребители ще разпознаят и ще се доверят.","profile_oauth_redirect_url":"Линк на препратката","profile_oauth_redirect_url_help":"URL адрес за обратно извикване на оторизацията на вашето приложение.","profile_authorized_apps":"Удостоверени приложения","profile_authorized_clients":"Удостоверени клиенти","profile_scopes":"Сфери","profile_revoke":"Анулирай","profile_personal_access_tokens":"Персонални маркери за достъп","profile_personal_access_token":"Персонален маркер за достъп","profile_personal_access_token_explanation":"Това е новия ви персонален маркер за достъп. Това е единственият път, когато ще бъде показан, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_no_personal_access_token":"Не сте създали никакви лични маркери за достъп.","profile_create_new_token":"Създай нов маркер","profile_create_token":"Създай маркер","profile_create":"Създай","profile_save_changes":"Запазване на промените","default_group_title_name":"(без група)","piggy_bank":"Касичка","profile_oauth_client_secret_title":"Тайна на клиента","profile_oauth_client_secret_expl":"Това е новата ви \\"тайна на клиента\\". Това е единственият път, когато ще бъде показана, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_oauth_confidential":"Поверително","profile_oauth_confidential_help":"Изисквайте клиента да се удостоверява с тайна. Поверителните клиенти могат да притежават идентификационни данни по защитен начин, без да ги излагат на неоторизирани страни. Публичните приложения, като например десктопа или JavaScript SPA приложения, не могат да пазят тайни по сигурен начин.","multi_account_warning_unknown":"В зависимост от вида на транзакцията която създавате, източникът и / или целевата сметка на следващите разделяния може да бъде променена от това което е дефинирано в първото разделение на транзакцията.","multi_account_warning_withdrawal":"Имайте предвид, че разходна сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на тегленето.","multi_account_warning_deposit":"Имайте предвид, че приходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на депозита.","multi_account_warning_transfer":"Имайте предвид, че приходната + разходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на прехвърлянето."},"form":{"interest_date":"Падеж на лихва","book_date":"Дата на осчетоводяване","process_date":"Дата на обработка","due_date":"Дата на падеж","foreign_amount":"Сума във валута","payment_date":"Дата на плащане","invoice_date":"Дата на фактура","internal_reference":"Вътрешна референция"},"config":{"html_language":"bg"}}')},6054:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Jak to jde?","flash_error":"Chyba!","flash_success":"Úspěšně dokončeno!","close":"Zavřít","split_transaction_title":"Popis rozúčtování","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Rozdělit","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Informace o transakci","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Zdrojový účet","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Cílový účet","add_another_split":"Přidat další rozúčtování","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Odeslat","amount":"Částka","date":"Datum","tags":"Štítky","no_budget":"(žádný rozpočet)","no_bill":"(no bill)","category":"Kategorie","attachments":"Přílohy","notes":"Poznámky","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.","none_in_select_list":"(žádné)","no_piggy_bank":"(žádná pokladnička)","description":"Popis","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Upravit","delete":"Odstranit","name":"Název","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Úrokové datum","book_date":"Datum rezervace","process_date":"Datum zpracování","due_date":"Datum splatnosti","foreign_amount":"Částka v cizí měně","payment_date":"Datum zaplacení","invoice_date":"Datum vystavení","internal_reference":"Interní reference"},"config":{"html_language":"cs"}}')},7062:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Überblick","flash_error":"Fehler!","flash_success":"Geschafft!","close":"Schließen","split_transaction_title":"Beschreibung der Splittbuchung","errors_submission":"Ihre Übermittlung ist fehlgeschlagen. Bitte überprüfen Sie die Fehler.","split":"Teilen","single_split":"Teil","transaction_stored_link":"Buchung #{ID} (\\"{title}\\") wurde gespeichert.","transaction_updated_link":"Buchung#{ID} wurde aktualisiert.","transaction_new_stored_link":"Buchung #{ID} wurde gespeichert.","transaction_journal_information":"Transaktionsinformationen","no_budget_pointer":"Sie scheinen noch keine Kostenrahmen festgelegt zu haben. Sie sollten einige davon auf der Seite Kostenrahmen- anlegen. Kostenrahmen können Ihnen dabei helfen, den Überblick über die Ausgaben zu behalten.","no_bill_pointer":"Sie scheinen noch keine Rechnungen zu haben. Sie sollten einige auf der Seite Rechnungen erstellen. Anhand der Rechnungen können Sie den Überblick über Ihre Ausgaben behalten.","source_account":"Quellkonto","hidden_fields_preferences":"Sie können weitere Buchungsoptionen in Ihren Einstellungen aktivieren.","destination_account":"Zielkonto","add_another_split":"Eine weitere Aufteilung hinzufügen","submission":"Übermittlung","create_another":"Nach dem Speichern hierher zurückkehren, um ein weiteres zu erstellen.","reset_after":"Formular nach der Übermittlung zurücksetzen","submit":"Absenden","amount":"Betrag","date":"Datum","tags":"Schlagwörter","no_budget":"(kein Budget)","no_bill":"(keine Belege)","category":"Kategorie","attachments":"Anhänge","notes":"Notizen","external_uri":"Externe URL","update_transaction":"Buchung aktualisieren","after_update_create_another":"Nach dem Aktualisieren hierher zurückkehren, um weiter zu bearbeiten.","store_as_new":"Als neue Buchung speichern statt zu aktualisieren.","split_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.","none_in_select_list":"(Keine)","no_piggy_bank":"(kein Sparschwein)","description":"Beschreibung","split_transaction_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchung geben.","destination_account_reconciliation":"Sie können das Zielkonto einer Kontenausgleichsbuchung nicht bearbeiten.","source_account_reconciliation":"Sie können das Quellkonto einer Kontenausgleichsbuchung nicht bearbeiten.","budget":"Budget","bill":"Rechnung","you_create_withdrawal":"Sie haben eine Auszahlung erstellt.","you_create_transfer":"Sie haben eine Buchung erstellt.","you_create_deposit":"Sie haben eine Einzahlung erstellt.","edit":"Bearbeiten","delete":"Löschen","name":"Name","profile_whoops":"Huch!","profile_something_wrong":"Ein Problem ist aufgetreten!","profile_try_again":"Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.","profile_oauth_clients":"OAuth-Clients","profile_oauth_no_clients":"Sie haben noch keine OAuth-Clients erstellt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client-ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Geheimnis","profile_oauth_create_new_client":"Neuen Client erstellen","profile_oauth_create_client":"Client erstellen","profile_oauth_edit_client":"Client bearbeiten","profile_oauth_name_help":"Etwas das Ihre Nutzer erkennen und dem sie vertrauen.","profile_oauth_redirect_url":"Weiterleitungs-URL","profile_oauth_redirect_url_help":"Die Authorisierungs-Callback-URL Ihrer Anwendung.","profile_authorized_apps":"Autorisierte Anwendungen","profile_authorized_clients":"Autorisierte Clients","profile_scopes":"Bereiche","profile_revoke":"Widerrufen","profile_personal_access_tokens":"Persönliche Zugangs-Tokens","profile_personal_access_token":"Persönlicher Zugangs-Token","profile_personal_access_token_explanation":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_no_personal_access_token":"Sie haben keine persönlichen Zugangsschlüssel erstellt.","profile_create_new_token":"Neuen Schlüssel erstellen","profile_create_token":"Schlüssel erstellen","profile_create":"Erstellen","profile_save_changes":"Änderungen speichern","default_group_title_name":"(ohne Gruppierung)","piggy_bank":"Sparschwein","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_oauth_confidential":"Vertraulich","profile_oauth_confidential_help":"Der Client muss sich mit einem Secret authentifizieren. Vertrauliche Clients können die Anmeldedaten speichern, ohne diese unautorisierten Akteuren mitzuteilen. Öffentliche Anwendungen wie native Desktop- oder JavaScript-SPA-Anwendungen können Geheimnisse nicht sicher speichern.","multi_account_warning_unknown":"Abhängig von der Art der Buchung, die Sie anlegen, kann das Quell- und/oder Zielkonto nachfolgender Aufteilungen durch das überschrieben werden, was in der ersten Aufteilung der Buchung definiert wurde.","multi_account_warning_withdrawal":"Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_deposit":"Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einzahlung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_transfer":"Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der Übertragung definiert ist, außer Kraft gesetzt wird."},"form":{"interest_date":"Zinstermin","book_date":"Buchungsdatum","process_date":"Bearbeitungsdatum","due_date":"Fälligkeitstermin","foreign_amount":"Ausländischer Betrag","payment_date":"Zahlungsdatum","invoice_date":"Rechnungsdatum","internal_reference":"Interner Verweis"},"config":{"html_language":"de"}}')},1410:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Τι παίζει;","flash_error":"Σφάλμα!","flash_success":"Επιτυχία!","close":"Κλείσιμο","split_transaction_title":"Περιγραφή της συναλλαγής με διαχωρισμό","errors_submission":"Υπήρξε κάποιο λάθος με την υποβολή σας. Παρακαλώ ελέγξτε τα σφάλματα.","split":"Διαχωρισμός","single_split":"Διαχωρισμός","transaction_stored_link":"Η συναλλαγή #{ID} (\\"{title}\\") έχει αποθηκευτεί.","transaction_updated_link":"Η συναλλαγή #{ID} έχει ενημερωθεί.","transaction_new_stored_link":"Η συναλλαγή #{ID} έχει αποθηκευτεί.","transaction_journal_information":"Πληροφορίες συναλλαγής","no_budget_pointer":"Φαίνεται πως δεν έχετε ορίσει προϋπολογισμούς ακόμη. Πρέπει να δημιουργήσετε κάποιον στη σελίδα προϋπολογισμών. Οι προϋπολογισμοί σας βοηθούν να επιβλέπετε τις δαπάνες σας.","no_bill_pointer":"Φαίνεται πως δεν έχετε ορίσει πάγια έξοδα ακόμη. Πρέπει να δημιουργήσετε κάποιο στη σελίδα πάγιων εξόδων. Τα πάγια έξοδα σας βοηθούν να επιβλέπετε τις δαπάνες σας.","source_account":"Λογαριασμός προέλευσης","hidden_fields_preferences":"Μπορείτε να ενεργοποιήσετε περισσότερες επιλογές συναλλαγών στις προτιμήσεις.","destination_account":"Λογαριασμός προορισμού","add_another_split":"Προσθήκη ενός ακόμα διαχωρισμού","submission":"Υποβολή","create_another":"Μετά την αποθήκευση, επιστρέψτε εδώ για να δημιουργήσετε ακόμη ένα.","reset_after":"Επαναφορά φόρμας μετά την υποβολή","submit":"Υποβολή","amount":"Ποσό","date":"Ημερομηνία","tags":"Ετικέτες","no_budget":"(χωρίς προϋπολογισμό)","no_bill":"(χωρίς πάγιο έξοδο)","category":"Κατηγορία","attachments":"Συνημμένα","notes":"Σημειώσεις","external_uri":"External URL","update_transaction":"Ενημέρωση συναλλαγής","after_update_create_another":"Μετά την ενημέρωση, επιστρέψτε εδώ για να συνεχίσετε την επεξεργασία.","store_as_new":"Αποθήκευση ως νέα συναλλαγή αντί για ενημέρωση.","split_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","none_in_select_list":"(τίποτα)","no_piggy_bank":"(χωρίς κουμπαρά)","description":"Περιγραφή","split_transaction_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","destination_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προορισμού σε μια συναλλαγή τακτοποίησης.","source_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προέλευσης σε μια συναλλαγή τακτοποίησης.","budget":"Προϋπολογισμός","bill":"Πάγιο έξοδο","you_create_withdrawal":"Δημιουργείτε μια ανάληψη.","you_create_transfer":"Δημιουργείτε μια μεταφορά.","you_create_deposit":"Δημιουργείτε μια κατάθεση.","edit":"Επεξεργασία","delete":"Διαγραφή","name":"Όνομα","profile_whoops":"Ούπς!","profile_something_wrong":"Κάτι πήγε στραβά!","profile_try_again":"Κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά.","profile_oauth_clients":"Πελάτες OAuth","profile_oauth_no_clients":"Δεν έχετε δημιουργήσει πελάτες OAuth.","profile_oauth_clients_header":"Πελάτες","profile_oauth_client_id":"Αναγνωριστικό πελάτη","profile_oauth_client_name":"Όνομα","profile_oauth_client_secret":"Μυστικό","profile_oauth_create_new_client":"Δημιουργία νέου πελάτη","profile_oauth_create_client":"Δημιουργία πελάτη","profile_oauth_edit_client":"Επεξεργασία πελάτη","profile_oauth_name_help":"Κάτι που οι χρήστες σας θα αναγνωρίζουν και θα εμπιστεύονται.","profile_oauth_redirect_url":"URL ανακατεύθυνσης","profile_oauth_redirect_url_help":"To authorization callback URL της εφαρμογής σας.","profile_authorized_apps":"Εξουσιοδοτημένες εφαρμογές","profile_authorized_clients":"Εξουσιοδοτημένοι πελάτες","profile_scopes":"Πεδία εφαρμογής","profile_revoke":"Ανάκληση","profile_personal_access_tokens":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token_explanation":"Εδώ είναι το νέο διακριτικό προσωπικής πρόσβασης. Αυτή είναι η μόνη φορά που θα εμφανιστεί, οπότε μη το χάσετε! Μπορείτε να χρησιμοποιείτε αυτό το διακριτικό για να κάνετε κλήσεις API.","profile_no_personal_access_token":"Δεν έχετε δημιουργήσει προσωπικά διακριτικά πρόσβασης.","profile_create_new_token":"Δημιουργία νέου διακριτικού","profile_create_token":"Δημιουργία διακριτικού","profile_create":"Δημιουργία","profile_save_changes":"Αποθήκευση αλλαγών","default_group_title_name":"(χωρίς ομάδα)","piggy_bank":"Κουμπαράς","profile_oauth_client_secret_title":"Μυστικό Πελάτη","profile_oauth_client_secret_expl":"Εδώ είναι το νέο σας μυστικό πελάτη. Αυτή είναι η μόνη φορά που θα σας εμφανιστεί, οπότε μην το χάσετε! Μπορείτε να το χρησιμοποιείτε για να κάνετε αιτήματα API.","profile_oauth_confidential":"Εμπιστευτικό","profile_oauth_confidential_help":"Απαιτήστε από το πρόγραμμα πελάτη να πραγματοποιήσει έλεγχο ταυτότητας με ένα μυστικό. Οι έμπιστοι πελάτες μπορούν να διατηρούν διαπιστευτήρια με ασφαλή τρόπο χωρίς να τα εκθέτουν σε μη εξουσιοδοτημένα μέρη. Οι δημόσιες εφαρμογές, όπως οι εγγενείς εφαρμογές για επιτραπέζιους υπολογιστές ή JavaScript SPA, δεν μπορούν να κρατήσουν μυστικά με ασφάλεια.","multi_account_warning_unknown":"Ανάλογα με τον τύπο της συναλλαγής που δημιουργείτε, ο λογαριασμός προέλευσης ή/και προορισμού των επόμενων διαχωρισμών ενδέχεται να παρακαμφθεί από αυτό που ορίζεται στο πρώτο διαχωρισμό της συναλλαγής.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ημερομηνία τοκισμού","book_date":"Ημερομηνία εγγραφής","process_date":"Ημερομηνία επεξεργασίας","due_date":"Ημερομηνία προθεσμίας","foreign_amount":"Ποσό σε ξένο νόμισμα","payment_date":"Ημερομηνία πληρωμής","invoice_date":"Ημερομηνία τιμολόγησης","internal_reference":"Εσωτερική αναφορά"},"config":{"html_language":"el"}}')},5642:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en-gb"}}')},6886:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en"}}')},2360:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"¿Qué está pasando?","flash_error":"¡Error!","flash_success":"¡Operación correcta!","close":"Cerrar","split_transaction_title":"Descripción de la transacción dividida","errors_submission":"Hubo un problema con su envío. Por favor, compruebe los errores.","split":"Separar","single_split":"División","transaction_stored_link":"La transacción #{ID} (\\"{title}\\") ha sido almacenada.","transaction_updated_link":"La transacción #{ID} ha sido actualizada.","transaction_new_stored_link":"La transacción #{ID} ha sido guardada.","transaction_journal_information":"Información de transacción","no_budget_pointer":"Parece que aún no tienes presupuestos. Debes crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.","no_bill_pointer":"Parece que aún no tienes facturas. Deberías crear algunas en la página de facturas. Las facturas pueden ayudarte a llevar un seguimiento de los gastos.","source_account":"Cuenta origen","hidden_fields_preferences":"Puede habilitar más opciones de transacción en sus ajustes .","destination_account":"Cuenta destino","add_another_split":"Añadir otra división","submission":"Envío","create_another":"Después de guardar, vuelve aquí para crear otro.","reset_after":"Restablecer formulario después del envío","submit":"Enviar","amount":"Cantidad","date":"Fecha","tags":"Etiquetas","no_budget":"(sin presupuesto)","no_bill":"(sin factura)","category":"Categoria","attachments":"Archivos adjuntos","notes":"Notas","external_uri":"External URL","update_transaction":"Actualizar transacción","after_update_create_another":"Después de actualizar, vuelve aquí para continuar editando.","store_as_new":"Almacenar como una nueva transacción en lugar de actualizar.","split_title_help":"Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.","none_in_select_list":"(ninguno)","no_piggy_bank":"(sin hucha)","description":"Descripción","split_transaction_title_help":"Si crea una transacción dividida, debe existir una descripción global para todas las divisiones de la transacción.","destination_account_reconciliation":"No puedes editar la cuenta de destino de una transacción de reconciliación.","source_account_reconciliation":"No puedes editar la cuenta de origen de una transacción de reconciliación.","budget":"Presupuesto","bill":"Factura","you_create_withdrawal":"Está creando un retiro.","you_create_transfer":"Está creando una transferencia.","you_create_deposit":"Está creando un depósito.","edit":"Editar","delete":"Eliminar","name":"Nombre","profile_whoops":"¡Ups!","profile_something_wrong":"¡Algo salió mal!","profile_try_again":"Algo salió mal. Por favor, vuelva a intentarlo.","profile_oauth_clients":"Clientes de OAuth","profile_oauth_no_clients":"No ha creado ningún cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID del cliente","profile_oauth_client_name":"Nombre","profile_oauth_client_secret":"Secreto","profile_oauth_create_new_client":"Crear un Nuevo Cliente","profile_oauth_create_client":"Crear Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que sus usuarios reconocerán y confiarán.","profile_oauth_redirect_url":"Redirigir URL","profile_oauth_redirect_url_help":"La URL de devolución de autorización de su aplicación.","profile_authorized_apps":"Aplicaciones autorizadas","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Ámbitos","profile_revoke":"Revocar","profile_personal_access_tokens":"Tokens de acceso personal","profile_personal_access_token":"Token de acceso personal","profile_personal_access_token_explanation":"Aquí está su nuevo token de acceso personal. Esta es la única vez que se mostrará así que ¡no lo pierda! Ahora puede usar este token para hacer solicitudes de la API.","profile_no_personal_access_token":"No ha creado ningún token de acceso personal.","profile_create_new_token":"Crear nuevo token","profile_create_token":"Crear token","profile_create":"Crear","profile_save_changes":"Guardar cambios","default_group_title_name":"(sin agrupación)","piggy_bank":"Hucha","profile_oauth_client_secret_title":"Secreto del Cliente","profile_oauth_client_secret_expl":"Aquí está su nuevo secreto de cliente. Esta es la única vez que se mostrará así que no lo pierda! Ahora puede usar este secreto para hacer solicitudes de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Requerir que el cliente se autentifique con un secreto. Los clientes confidenciales pueden mantener las credenciales de forma segura sin exponerlas a partes no autorizadas. Las aplicaciones públicas, como aplicaciones de escritorio nativo o SPA de JavaScript, no pueden guardar secretos de forma segura.","multi_account_warning_unknown":"Dependiendo del tipo de transacción que cree, la cuenta de origen y/o destino de divisiones posteriores puede ser anulada por lo que se define en la primera división de la transacción.","multi_account_warning_withdrawal":"Tenga en cuenta que la cuenta de origen de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_deposit":"Tenga en cuenta que la cuenta de destino de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_transfer":"Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores será anulada por lo que se defina en la primera división de la transferencia."},"form":{"interest_date":"Fecha de interés","book_date":"Fecha de registro","process_date":"Fecha de procesamiento","due_date":"Fecha de vencimiento","foreign_amount":"Cantidad extranjera","payment_date":"Fecha de pago","invoice_date":"Fecha de la factura","internal_reference":"Referencia interna"},"config":{"html_language":"es"}}')},3684:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mitä kuuluu?","flash_error":"Virhe!","flash_success":"Valmista tuli!","close":"Sulje","split_transaction_title":"Jaetun tapahtuman kuvaus","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Jaa","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Tapahtumatiedot","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Lähdetili","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Kohdetili","add_another_split":"Lisää tapahtumaan uusi osa","submission":"Vahvistus","create_another":"Tallennuksen jälkeen, palaa takaisin luomaan uusi tapahtuma.","reset_after":"Tyhjennä lomake lähetyksen jälkeen","submit":"Vahvista","amount":"Summa","date":"Päivämäärä","tags":"Tägit","no_budget":"(ei budjettia)","no_bill":"(no bill)","category":"Kategoria","attachments":"Liitteet","notes":"Muistiinpanot","external_uri":"External URL","update_transaction":"Päivitä tapahtuma","after_update_create_another":"Päivityksen jälkeen, palaa takaisin jatkamaan muokkausta.","store_as_new":"Tallenna uutena tapahtumana päivityksen sijaan.","split_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","none_in_select_list":"(ei mitään)","no_piggy_bank":"(ei säästöpossu)","description":"Kuvaus","split_transaction_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","destination_account_reconciliation":"Et voi muokata täsmäytystapahtuman kohdetiliä.","source_account_reconciliation":"Et voi muokata täsmäytystapahtuman lähdetiliä.","budget":"Budjetti","bill":"Lasku","you_create_withdrawal":"Olet luomassa nostoa.","you_create_transfer":"Olet luomassa siirtoa.","you_create_deposit":"Olet luomassa talletusta.","edit":"Muokkaa","delete":"Poista","name":"Nimi","profile_whoops":"Hupsis!","profile_something_wrong":"Jokin meni vikaan!","profile_try_again":"Jokin meni vikaan. Yritä uudelleen.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Asiakasohjelmat","profile_oauth_client_id":"Asiakastunnus","profile_oauth_client_name":"Nimi","profile_oauth_client_secret":"Salaisuus","profile_oauth_create_new_client":"Luo Uusi Asiakas","profile_oauth_create_client":"Luo Asiakas","profile_oauth_edit_client":"Muokkaa asiakasta","profile_oauth_name_help":"Jotain käyttäjillesi tuttua ja luotettavaa.","profile_oauth_redirect_url":"URL:n uudelleenohjaus","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Peruuta","profile_personal_access_tokens":"Henkilökohtaiset Käyttöoikeuskoodit","profile_personal_access_token":"Henkilökohtainen Käyttöoikeuskoodi","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Luo uusi tunnus","profile_create_token":"Luo tunnus","profile_create":"Luo","profile_save_changes":"Tallenna muutokset","default_group_title_name":"(ryhmittelemättömät)","piggy_bank":"Säästöpossu","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Korkopäivä","book_date":"Kirjauspäivä","process_date":"Käsittelypäivä","due_date":"Eräpäivä","foreign_amount":"Ulkomaan summa","payment_date":"Maksupäivä","invoice_date":"Laskun päivämäärä","internal_reference":"Sisäinen viite"},"config":{"html_language":"fi"}}')},6833:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Quoi de neuf ?","flash_error":"Erreur !","flash_success":"Super !","close":"Fermer","split_transaction_title":"Description de l\'opération ventilée","errors_submission":"Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs.","split":"Ventiler","single_split":"Ventilation","transaction_stored_link":"L\'opération n°{ID} (\\"{title}\\") a été enregistrée.","transaction_updated_link":"L\'opération n°{ID} a été mise à jour.","transaction_new_stored_link":"L\'opération n°{ID} a été enregistrée.","transaction_journal_information":"Informations sur l\'opération","no_budget_pointer":"Vous semblez n’avoir encore aucun budget. Vous devriez en créer un sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.","no_bill_pointer":"Vous semblez n\'avoir encore aucune facture. Vous devriez en créer une sur la page factures-. Les factures peuvent vous aider à garder une trace des dépenses.","source_account":"Compte source","hidden_fields_preferences":"Vous pouvez activer plus d\'options d\'opérations dans vos paramètres.","destination_account":"Compte de destination","add_another_split":"Ajouter une autre fraction","submission":"Soumission","create_another":"Après enregistrement, revenir ici pour en créer un nouveau.","reset_after":"Réinitialiser le formulaire après soumission","submit":"Soumettre","amount":"Montant","date":"Date","tags":"Tags","no_budget":"(pas de budget)","no_bill":"(aucune facture)","category":"Catégorie","attachments":"Pièces jointes","notes":"Notes","external_uri":"URL externe","update_transaction":"Mettre à jour l\'opération","after_update_create_another":"Après la mise à jour, revenir ici pour continuer l\'édition.","store_as_new":"Enregistrer comme une nouvelle opération au lieu de mettre à jour.","split_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.","none_in_select_list":"(aucun)","no_piggy_bank":"(aucune tirelire)","description":"Description","split_transaction_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fraction de l\'opération.","destination_account_reconciliation":"Vous ne pouvez pas modifier le compte de destination d\'une opération de rapprochement.","source_account_reconciliation":"Vous ne pouvez pas modifier le compte source d\'une opération de rapprochement.","budget":"Budget","bill":"Facture","you_create_withdrawal":"Vous saisissez une dépense.","you_create_transfer":"Vous saisissez un transfert.","you_create_deposit":"Vous saisissez un dépôt.","edit":"Modifier","delete":"Supprimer","name":"Nom","profile_whoops":"Oups !","profile_something_wrong":"Une erreur s\'est produite !","profile_try_again":"Une erreur s’est produite. Merci d’essayer à nouveau.","profile_oauth_clients":"Clients OAuth","profile_oauth_no_clients":"Vous n’avez pas encore créé de client OAuth.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Identifiant","profile_oauth_client_name":"Nom","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Créer un nouveau client","profile_oauth_create_client":"Créer un client","profile_oauth_edit_client":"Modifier le client","profile_oauth_name_help":"Quelque chose que vos utilisateurs reconnaîtront et qui inspirera confiance.","profile_oauth_redirect_url":"URL de redirection","profile_oauth_redirect_url_help":"URL de callback de votre application.","profile_authorized_apps":"Applications autorisées","profile_authorized_clients":"Clients autorisés","profile_scopes":"Permissions","profile_revoke":"Révoquer","profile_personal_access_tokens":"Jetons d\'accès personnels","profile_personal_access_token":"Jeton d\'accès personnel","profile_personal_access_token_explanation":"Voici votre nouveau jeton d’accès personnel. Ceci est la seule fois où vous pourrez le voir, ne le perdez pas ! Vous pouvez dès à présent utiliser ce jeton pour lancer des requêtes avec l’API.","profile_no_personal_access_token":"Vous n’avez pas encore créé de jeton d’accès personnel.","profile_create_new_token":"Créer un nouveau jeton","profile_create_token":"Créer un jeton","profile_create":"Créer","profile_save_changes":"Enregistrer les modifications","default_group_title_name":"(Sans groupement)","piggy_bank":"Tirelire","profile_oauth_client_secret_title":"Secret du client","profile_oauth_client_secret_expl":"Voici votre nouveau secret de client. C\'est la seule fois qu\'il sera affiché, donc ne le perdez pas ! Vous pouvez maintenant utiliser ce secret pour faire des requêtes d\'API.","profile_oauth_confidential":"Confidentiel","profile_oauth_confidential_help":"Exiger que le client s\'authentifie avec un secret. Les clients confidentiels peuvent détenir des informations d\'identification de manière sécurisée sans les exposer à des tiers non autorisés. Les applications publiques, telles que les applications de bureau natif ou les SPA JavaScript, ne peuvent pas tenir des secrets en toute sécurité.","multi_account_warning_unknown":"Selon le type d\'opération que vous créez, le(s) compte(s) source et/ou de destination des ventilations suivantes peuvent être remplacés par celui de la première ventilation de l\'opération.","multi_account_warning_withdrawal":"Gardez en tête que le compte source des ventilations suivantes peut être remplacé par celui de la première ventilation de la dépense.","multi_account_warning_deposit":"Gardez en tête que le compte de destination des ventilations suivantes peut être remplacé par celui de la première ventilation du dépôt.","multi_account_warning_transfer":"Gardez en tête que les comptes source et de destination des ventilations suivantes peuvent être remplacés par ceux de la première ventilation du transfert."},"form":{"interest_date":"Date de valeur (intérêts)","book_date":"Date de réservation","process_date":"Date de traitement","due_date":"Échéance","foreign_amount":"Montant en devise étrangère","payment_date":"Date de paiement","invoice_date":"Date de facturation","internal_reference":"Référence interne"},"config":{"html_language":"fr"}}')},6477:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mi a helyzet?","flash_error":"Hiba!","flash_success":"Siker!","close":"Bezárás","split_transaction_title":"Felosztott tranzakció leírása","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Felosztás","single_split":"Felosztás","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") mentve.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} mentve.","transaction_journal_information":"Tranzakciós információk","no_budget_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","no_bill_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","source_account":"Forrás számla","hidden_fields_preferences":"A beállításokban több mező is engedélyezhető.","destination_account":"Célszámla","add_another_split":"Másik felosztás hozzáadása","submission":"Feliratkozás","create_another":"A tárolás után térjen vissza ide új létrehozásához.","reset_after":"Űrlap törlése a beküldés után","submit":"Beküldés","amount":"Összeg","date":"Dátum","tags":"Címkék","no_budget":"(nincs költségkeret)","no_bill":"(no bill)","category":"Kategória","attachments":"Mellékletek","notes":"Megjegyzések","external_uri":"External URL","update_transaction":"Tranzakció frissítése","after_update_create_another":"A frissítés után térjen vissza ide a szerkesztés folytatásához.","store_as_new":"Tárolás új tranzakcióként frissítés helyett.","split_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","none_in_select_list":"(nincs)","no_piggy_bank":"(nincs malacpersely)","description":"Leírás","split_transaction_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","destination_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció célszámláját.","source_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció forrásszámláját.","budget":"Költségkeret","bill":"Számla","you_create_withdrawal":"Egy költség létrehozása.","you_create_transfer":"Egy átutalás létrehozása.","you_create_deposit":"Egy bevétel létrehozása.","edit":"Szerkesztés","delete":"Törlés","name":"Név","profile_whoops":"Hoppá!","profile_something_wrong":"Hiba történt!","profile_try_again":"Hiba történt. Kérjük, próbálja meg újra.","profile_oauth_clients":"OAuth kliensek","profile_oauth_no_clients":"Nincs létrehozva egyetlen OAuth kliens sem.","profile_oauth_clients_header":"Kliensek","profile_oauth_client_id":"Kliens ID","profile_oauth_client_name":"Megnevezés","profile_oauth_client_secret":"Titkos kód","profile_oauth_create_new_client":"Új kliens létrehozása","profile_oauth_create_client":"Kliens létrehozása","profile_oauth_edit_client":"Kliens szerkesztése","profile_oauth_name_help":"Segítség, hogy a felhasználók tudják mihez kapcsolódik.","profile_oauth_redirect_url":"Átirányítási URL","profile_oauth_redirect_url_help":"Az alkalmazásban használt autentikációs URL.","profile_authorized_apps":"Engedélyezett alkalmazások","profile_authorized_clients":"Engedélyezett kliensek","profile_scopes":"Hatáskörök","profile_revoke":"Visszavonás","profile_personal_access_tokens":"Személyes hozzáférési tokenek","profile_personal_access_token":"Személyes hozzáférési token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"Nincs létrehozva egyetlen személyes hozzáférési token sem.","profile_create_new_token":"Új token létrehozása","profile_create_token":"Token létrehozása","profile_create":"Létrehozás","profile_save_changes":"Módosítások mentése","default_group_title_name":"(nem csoportosított)","piggy_bank":"Malacpersely","profile_oauth_client_secret_title":"Kliens titkos kódja","profile_oauth_client_secret_expl":"Ez a kliens titkos kódja. Ez az egyetlen alkalom, amikor meg van jelenítve, ne hagyd el! Ezzel a kóddal végezhetsz API hívásokat.","profile_oauth_confidential":"Bizalmas","profile_oauth_confidential_help":"Titkos kód használata a kliens bejelentkezéséhez. Bizonyos kliensek biztonságosan tudnak hitelesítő adatokat tárolni, anélkül hogy jogosulatlan fél hozzáférhetne. Nyilvános kliensek, például mint asztali vagy JavaScript SPA alkalmazások nem tudnak biztonságosan titkos kódot tárolni.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Kamatfizetési időpont","book_date":"Könyvelés dátuma","process_date":"Feldolgozás dátuma","due_date":"Lejárati időpont","foreign_amount":"Külföldi összeg","payment_date":"Fizetés dátuma","invoice_date":"Számla dátuma","internal_reference":"Belső hivatkozás"},"config":{"html_language":"hu"}}')},3092:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"La tua situazione finanziaria","flash_error":"Errore!","flash_success":"Successo!","close":"Chiudi","split_transaction_title":"Descrizione della transazione suddivisa","errors_submission":"Errore durante l\'invio. Controlla gli errori segnalati qui sotto.","split":"Dividi","single_split":"Divisione","transaction_stored_link":"La transazione #{ID} (\\"{title}\\") è stata salvata.","transaction_updated_link":"La transazione #{ID} è stata aggiornata.","transaction_new_stored_link":"La transazione #{ID} è stata salvata.","transaction_journal_information":"Informazioni transazione","no_budget_pointer":"Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget. I budget possono aiutarti a tenere traccia delle spese.","no_bill_pointer":"Sembra che tu non abbia ancora delle bollette. Dovresti crearne alcune nella pagina delle bollette. Le bollette possono aiutarti a tenere traccia delle spese.","source_account":"Conto di origine","hidden_fields_preferences":"Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni.","destination_account":"Conto destinazione","add_another_split":"Aggiungi un\'altra divisione","submission":"Invio","create_another":"Dopo il salvataggio, torna qui per crearne un\'altra.","reset_after":"Resetta il modulo dopo l\'invio","submit":"Invia","amount":"Importo","date":"Data","tags":"Etichette","no_budget":"(nessun budget)","no_bill":"(nessuna bolletta)","category":"Categoria","attachments":"Allegati","notes":"Note","external_uri":"URL esterno","update_transaction":"Aggiorna transazione","after_update_create_another":"Dopo l\'aggiornamento, torna qui per continuare la modifica.","store_as_new":"Salva come nuova transazione invece di aggiornarla.","split_title_help":"Se crei una transazione suddivisa è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","none_in_select_list":"(nessuna)","no_piggy_bank":"(nessun salvadanaio)","description":"Descrizione","split_transaction_title_help":"Se crei una transazione suddivisa, è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","destination_account_reconciliation":"Non è possibile modificare il conto di destinazione di una transazione di riconciliazione.","source_account_reconciliation":"Non puoi modificare il conto di origine di una transazione di riconciliazione.","budget":"Budget","bill":"Bolletta","you_create_withdrawal":"Stai creando un prelievo.","you_create_transfer":"Stai creando un trasferimento.","you_create_deposit":"Stai creando un deposito.","edit":"Modifica","delete":"Elimina","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Qualcosa non ha funzionato!","profile_try_again":"Qualcosa non ha funzionato. Riprova.","profile_oauth_clients":"Client OAuth","profile_oauth_no_clients":"Non hai creato nessun client OAuth.","profile_oauth_clients_header":"Client","profile_oauth_client_id":"ID client","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segreto","profile_oauth_create_new_client":"Crea nuovo client","profile_oauth_create_client":"Crea client","profile_oauth_edit_client":"Modifica client","profile_oauth_name_help":"Qualcosa di cui i tuoi utenti potranno riconoscere e fidarsi.","profile_oauth_redirect_url":"URL di reindirizzamento","profile_oauth_redirect_url_help":"L\'URL di callback dell\'autorizzazione della tua applicazione.","profile_authorized_apps":"Applicazioni autorizzate","profile_authorized_clients":"Client autorizzati","profile_scopes":"Ambiti","profile_revoke":"Revoca","profile_personal_access_tokens":"Token di acceso personale","profile_personal_access_token":"Token di acceso personale","profile_personal_access_token_explanation":"Ecco il tuo nuovo token di accesso personale. Questa è l\'unica volta che ti viene mostrato per cui non perderlo! Da adesso puoi utilizzare questo token per effettuare delle richieste API.","profile_no_personal_access_token":"Non hai creato alcun token di accesso personale.","profile_create_new_token":"Crea nuovo token","profile_create_token":"Crea token","profile_create":"Crea","profile_save_changes":"Salva modifiche","default_group_title_name":"(non in un gruppo)","piggy_bank":"Salvadanaio","profile_oauth_client_secret_title":"Segreto del client","profile_oauth_client_secret_expl":"Ecco il segreto del nuovo client. Questa è l\'unica occasione in cui viene mostrato pertanto non perderlo! Ora puoi usare questo segreto per effettuare delle richieste alle API.","profile_oauth_confidential":"Riservato","profile_oauth_confidential_help":"Richiede al client di autenticarsi con un segreto. I client riservati possono conservare le credenziali in modo sicuro senza esporle a soggetti non autorizzati. Le applicazioni pubbliche, come le applicazioni desktop native o JavaScript SPA, non sono in grado di conservare i segreti in modo sicuro.","multi_account_warning_unknown":"A seconda del tipo di transazione che hai creato, il conto di origine e/o destinazione delle successive suddivisioni può essere sovrascritto da qualsiasi cosa sia definita nella prima suddivisione della transazione.","multi_account_warning_withdrawal":"Ricorda che il conto di origine delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del prelievo.","multi_account_warning_deposit":"Ricorda che il conto di destinazione delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del deposito.","multi_account_warning_transfer":"Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento."},"form":{"interest_date":"Data di valuta","book_date":"Data contabile","process_date":"Data elaborazione","due_date":"Data scadenza","foreign_amount":"Importo estero","payment_date":"Data pagamento","invoice_date":"Data fatturazione","internal_reference":"Riferimento interno"},"config":{"html_language":"it"}}')},2502:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Feil!","flash_success":"Suksess!","close":"Lukk","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Del opp","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaksjonsinformasjon","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Legg til en oppdeling til","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Send inn","amount":"Beløp","date":"Dato","tags":"Tagger","no_budget":"(ingen budsjett)","no_bill":"(no bill)","category":"Kategori","attachments":"Vedlegg","notes":"Notater","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(ingen)","no_piggy_bank":"(no piggy bank)","description":"Beskrivelse","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Busjett","bill":"Regning","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Rediger","delete":"Slett","name":"Navn","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Sparegris","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Rentedato","book_date":"Bokføringsdato","process_date":"Prosesseringsdato","due_date":"Forfallsdato","foreign_amount":"Utenlandske beløp","payment_date":"Betalingsdato","invoice_date":"Fakturadato","internal_reference":"Intern referanse"},"config":{"html_language":"nb"}}')},78:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Hoe staat het er voor?","flash_error":"Fout!","flash_success":"Gelukt!","close":"Sluiten","split_transaction_title":"Beschrijving van de gesplitste transactie","errors_submission":"Er ging iets mis. Check de errors.","split":"Splitsen","single_split":"Split","transaction_stored_link":"Transactie #{ID} (\\"{title}\\") is opgeslagen.","transaction_updated_link":"Transactie #{ID} is geüpdatet.","transaction_new_stored_link":"Transactie #{ID} is opgeslagen.","transaction_journal_information":"Transactieinformatie","no_budget_pointer":"Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.","no_bill_pointer":"Je hebt nog geen contracten. Maak er een aantal op de contracten-pagina. Met contracten kan je je uitgaven beter bijhouden.","source_account":"Bronrekening","hidden_fields_preferences":"Je kan meer transactieopties inschakelen in je instellingen.","destination_account":"Doelrekening","add_another_split":"Voeg een split toe","submission":"Indienen","create_another":"Terug naar deze pagina voor een nieuwe transactie.","reset_after":"Reset formulier na opslaan","submit":"Invoeren","amount":"Bedrag","date":"Datum","tags":"Tags","no_budget":"(geen budget)","no_bill":"(geen contract)","category":"Categorie","attachments":"Bijlagen","notes":"Notities","external_uri":"Externe URL","update_transaction":"Update transactie","after_update_create_another":"Na het opslaan terug om door te gaan met wijzigen.","store_as_new":"Opslaan als nieuwe transactie ipv de huidige bij te werken.","split_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","none_in_select_list":"(geen)","no_piggy_bank":"(geen spaarpotje)","description":"Omschrijving","split_transaction_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","destination_account_reconciliation":"Je kan de doelrekening van een afstemming niet wijzigen.","source_account_reconciliation":"Je kan de bronrekening van een afstemming niet wijzigen.","budget":"Budget","bill":"Contract","you_create_withdrawal":"Je maakt een uitgave.","you_create_transfer":"Je maakt een overschrijving.","you_create_deposit":"Je maakt inkomsten.","edit":"Wijzig","delete":"Verwijder","name":"Naam","profile_whoops":"Oeps!","profile_something_wrong":"Er is iets mis gegaan!","profile_try_again":"Er is iets misgegaan. Probeer het nogmaals.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Je hebt nog geen OAuth-clients aangemaakt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Naam","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Nieuwe client aanmaken","profile_oauth_create_client":"Client aanmaken","profile_oauth_edit_client":"Client bewerken","profile_oauth_name_help":"Iets dat je gebruikers herkennen en vertrouwen.","profile_oauth_redirect_url":"Redirect-URL","profile_oauth_redirect_url_help":"De authorisatie-callback-url van jouw applicatie.","profile_authorized_apps":"Geautoriseerde toepassingen","profile_authorized_clients":"Geautoriseerde clients","profile_scopes":"Scopes","profile_revoke":"Intrekken","profile_personal_access_tokens":"Persoonlijke toegangstokens","profile_personal_access_token":"Persoonlijk toegangstoken","profile_personal_access_token_explanation":"Hier is je nieuwe persoonlijke toegangstoken. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan deze toegangstoken gebruiken om API-aanvragen te maken.","profile_no_personal_access_token":"Je hebt nog geen persoonlijke toegangstokens aangemaakt.","profile_create_new_token":"Nieuwe token aanmaken","profile_create_token":"Token aanmaken","profile_create":"Creër","profile_save_changes":"Aanpassingen opslaan","default_group_title_name":"(ongegroepeerd)","piggy_bank":"Spaarpotje","profile_oauth_client_secret_title":"Client secret","profile_oauth_client_secret_expl":"Hier is je nieuwe client secret. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan dit secret gebruiken om API-aanvragen te maken.","profile_oauth_confidential":"Vertrouwelijk","profile_oauth_confidential_help":"Dit vinkje is bedoeld voor applicaties die geheimen kunnen bewaren. Applicaties zoals sommige desktop-apps en Javascript apps kunnen dit niet. In zo\'n geval haal je het vinkje weg.","multi_account_warning_unknown":"Afhankelijk van het type transactie wordt de bron- en/of doelrekening overschreven door wat er in de eerste split staat.","multi_account_warning_withdrawal":"De bronrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_deposit":"De doelrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_transfer":"De bron + doelrekening wordt overschreven door wat er in de eerste split staat."},"form":{"interest_date":"Rentedatum","book_date":"Boekdatum","process_date":"Verwerkingsdatum","due_date":"Vervaldatum","foreign_amount":"Bedrag in vreemde valuta","payment_date":"Betalingsdatum","invoice_date":"Factuurdatum","internal_reference":"Interne verwijzing"},"config":{"html_language":"nl"}}')},8691:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Co jest grane?","flash_error":"Błąd!","flash_success":"Sukces!","close":"Zamknij","split_transaction_title":"Opis podzielonej transakcji","errors_submission":"Coś poszło nie tak w czasie zapisu. Proszę sprawdź błędy.","split":"Podziel","single_split":"Podział","transaction_stored_link":"Transakcja #{ID} (\\"{title}\\") została zapisana.","transaction_updated_link":"Transakcja #{ID} została zaktualizowana.","transaction_new_stored_link":"Transakcja #{ID} została zapisana.","transaction_journal_information":"Informacje o transakcji","no_budget_pointer":"Wygląda na to, że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżetów. Budżety mogą Ci pomóc śledzić wydatki.","no_bill_pointer":"Wygląda na to, że nie masz jeszcze rachunków. Powinieneś utworzyć kilka na stronie rachunków. Rachunki mogą Ci pomóc śledzić wydatki.","source_account":"Konto źródłowe","hidden_fields_preferences":"Możesz włączyć więcej opcji transakcji w swoich ustawieniach.","destination_account":"Konto docelowe","add_another_split":"Dodaj kolejny podział","submission":"Zapisz","create_another":"Po zapisaniu wróć tutaj, aby utworzyć kolejny.","reset_after":"Wyczyść formularz po zapisaniu","submit":"Prześlij","amount":"Kwota","date":"Data","tags":"Tagi","no_budget":"(brak budżetu)","no_bill":"(brak rachunku)","category":"Kategoria","attachments":"Załączniki","notes":"Notatki","external_uri":"Zewnętrzny adres URL","update_transaction":"Zaktualizuj transakcję","after_update_create_another":"Po aktualizacji wróć tutaj, aby kontynuować edycję.","store_as_new":"Zapisz jako nową zamiast aktualizować.","split_title_help":"Podzielone transakcje muszą posiadać globalny opis.","none_in_select_list":"(żadne)","no_piggy_bank":"(brak skarbonki)","description":"Opis","split_transaction_title_help":"Jeśli tworzysz podzieloną transakcję, musi ona posiadać globalny opis dla wszystkich podziałów w transakcji.","destination_account_reconciliation":"Nie możesz edytować konta docelowego transakcji uzgadniania.","source_account_reconciliation":"Nie możesz edytować konta źródłowego transakcji uzgadniania.","budget":"Budżet","bill":"Rachunek","you_create_withdrawal":"Tworzysz wydatek.","you_create_transfer":"Tworzysz przelew.","you_create_deposit":"Tworzysz wpłatę.","edit":"Modyfikuj","delete":"Usuń","name":"Nazwa","profile_whoops":"Uuuups!","profile_something_wrong":"Coś poszło nie tak!","profile_try_again":"Coś poszło nie tak. Spróbuj ponownie.","profile_oauth_clients":"Klienci OAuth","profile_oauth_no_clients":"Nie utworzyłeś żadnych klientów OAuth.","profile_oauth_clients_header":"Klienci","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Nazwa","profile_oauth_client_secret":"Sekretny klucz","profile_oauth_create_new_client":"Utwórz nowego klienta","profile_oauth_create_client":"Utwórz klienta","profile_oauth_edit_client":"Edytuj klienta","profile_oauth_name_help":"Coś, co Twoi użytkownicy będą rozpoznawać i ufać.","profile_oauth_redirect_url":"Przekierowanie URL","profile_oauth_redirect_url_help":"Adres URL wywołania zwrotnego autoryzacji aplikacji.","profile_authorized_apps":"Autoryzowane aplikacje","profile_authorized_clients":"Autoryzowani klienci","profile_scopes":"Zakresy","profile_revoke":"Unieważnij","profile_personal_access_tokens":"Osobiste tokeny dostępu","profile_personal_access_token":"Osobisty token dostępu","profile_personal_access_token_explanation":"Oto twój nowy osobisty token dostępu. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego tokenu, aby wykonać zapytania API.","profile_no_personal_access_token":"Nie utworzyłeś żadnych osobistych tokenów.","profile_create_new_token":"Utwórz nowy token","profile_create_token":"Utwórz token","profile_create":"Utwórz","profile_save_changes":"Zapisz zmiany","default_group_title_name":"(bez grupy)","piggy_bank":"Skarbonka","profile_oauth_client_secret_title":"Sekret klienta","profile_oauth_client_secret_expl":"Oto twój nowy sekret klienta. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego sekretu, aby wykonać zapytania API.","profile_oauth_confidential":"Poufne","profile_oauth_confidential_help":"Wymagaj od klienta uwierzytelnienia za pomocą sekretu. Poufni klienci mogą przechowywać poświadczenia w bezpieczny sposób bez narażania ich na dostęp przez nieuprawnione strony. Publiczne aplikacje, takie jak natywne aplikacje desktopowe lub JavaScript SPA, nie są w stanie bezpiecznie trzymać sekretów.","multi_account_warning_unknown":"W zależności od rodzaju transakcji, którą tworzysz, konto źródłowe i/lub docelowe kolejnych podziałów może zostać ustawione na konto zdefiniowane w pierwszym podziale transakcji.","multi_account_warning_withdrawal":"Pamiętaj, że konto źródłowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wypłaty.","multi_account_warning_deposit":"Pamiętaj, że konto docelowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wpłaty.","multi_account_warning_transfer":"Pamiętaj, że konta źródłowe i docelowe kolejnych podziałów zostaną ustawione na konto zdefiniowane w pierwszym podziale transferu."},"form":{"interest_date":"Data odsetek","book_date":"Data księgowania","process_date":"Data przetworzenia","due_date":"Termin realizacji","foreign_amount":"Kwota zagraniczna","payment_date":"Data płatności","invoice_date":"Data faktury","internal_reference":"Wewnętrzny numer"},"config":{"html_language":"pl"}}')},122:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"O que está acontecendo?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transação dividida","errors_submission":"Há algo de errado com o seu envio. Por favor, verifique os erros abaixo.","split":"Dividir","single_split":"Divisão","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi salva.","transaction_updated_link":"Transação #{ID} foi atualizada.","transaction_new_stored_link":"Transação #{ID} foi salva.","transaction_journal_information":"Informação da transação","no_budget_pointer":"Parece que você ainda não tem orçamentos. Você deve criar alguns na página de orçamentos. Orçamentos podem ajudá-lo a manter o controle das despesas.","no_bill_pointer":"Parece que você ainda não tem contas. Você deve criar algumas em contas. Contas podem ajudar você a manter o controle de despesas.","source_account":"Conta origem","hidden_fields_preferences":"Você pode habilitar mais opções de transação em suas preferências.","destination_account":"Conta destino","add_another_split":"Adicionar outra divisão","submission":"Envio","create_another":"Depois de armazenar, retorne aqui para criar outro.","reset_after":"Resetar o formulário após o envio","submit":"Enviar","amount":"Valor","date":"Data","tags":"Tags","no_budget":"(sem orçamento)","no_bill":"(sem conta)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL externa","update_transaction":"Atualizar transação","after_update_create_another":"Depois de atualizar, retorne aqui para continuar editando.","store_as_new":"Armazene como uma nova transação em vez de atualizar.","split_title_help":"Se você criar uma transação dividida, é necessário haver uma descrição global para todas as partes da transação.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum cofrinho)","description":"Descrição","split_transaction_title_help":"Se você criar uma transação dividida, deve haver uma descrição global para todas as partes da transação.","destination_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","source_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","budget":"Orçamento","bill":"Fatura","you_create_withdrawal":"Você está criando uma saída.","you_create_transfer":"Você está criando uma transferência.","you_create_deposit":"Você está criando uma entrada.","edit":"Editar","delete":"Apagar","name":"Nome","profile_whoops":"Ops!","profile_something_wrong":"Alguma coisa deu errado!","profile_try_again":"Algo deu errado. Por favor tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Você não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segredo","profile_oauth_create_new_client":"Criar um novo cliente","profile_oauth_create_client":"Criar um cliente","profile_oauth_edit_client":"Editar cliente","profile_oauth_name_help":"Alguma coisa que seus usuários vão reconhecer e identificar.","profile_oauth_redirect_url":"URL de redirecionamento","profile_oauth_redirect_url_help":"A URL de retorno da sua solicitação de autorização.","profile_authorized_apps":"Aplicativos autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Escopos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está seu novo token de acesso pessoal. Esta é a única vez que ela será mostrada então não perca! Agora você pode usar esse token para fazer solicitações de API.","profile_no_personal_access_token":"Você não criou nenhum token de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Salvar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Cofrinho","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu novo segredo de cliente. Esta é a única vez que ela será mostrada, então não o perca! Agora você pode usar este segredo para fazer requisições de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exige que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expô-las à partes não autorizadas. Aplicações públicas, como aplicações de área de trabalho nativas ou JavaScript SPA, são incapazes de manter segredos com segurança.","multi_account_warning_unknown":"Dependendo do tipo de transação que você criar, a conta de origem e/ou de destino das divisões subsequentes pode ser sobrescrita pelo que estiver definido na primeira divisão da transação.","multi_account_warning_withdrawal":"Tenha em mente que a conta de origem das subsequentes divisões será sobrescrita pelo que estiver definido na primeira divisão da saída.","multi_account_warning_deposit":"Tenha em mente que a conta de destino das divisões subsequentes será sobrescrita pelo que estiver definido na primeira divisão da entrada.","multi_account_warning_transfer":"Tenha em mente que a conta de origem + de destino das divisões subsequentes será sobrescrita pelo que for definido na primeira divisão da transferência."},"form":{"interest_date":"Data de interesse","book_date":"Data reserva","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante em moeda estrangeira","payment_date":"Data de pagamento","invoice_date":"Data da Fatura","internal_reference":"Referência interna"},"config":{"html_language":"pt-br"}}')},4895:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Tudo bem?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transacção dividida","errors_submission":"Aconteceu algo errado com a sua submissão. Por favor, verifique os erros.","split":"Dividir","single_split":"Dividir","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi guardada.","transaction_updated_link":"Transação#{ID} foi atualizada.","transaction_new_stored_link":"Transação#{ID} foi guardada.","transaction_journal_information":"Informacao da transaccao","no_budget_pointer":"Parece que ainda não tem orçamentos. Pode criar-los na página de orçamentos. Orçamentos podem ajudá-lo a controlar as despesas.","no_bill_pointer":"Parece que ainda não tem contas. Pode criar-las na página de contas. Contas podem ajudá-lo a controlar as despesas.","source_account":"Conta de origem","hidden_fields_preferences":"Pode ativar mais opções de transações nas suas preferências.","destination_account":"Conta de destino","add_another_split":"Adicionar outra divisão","submission":"Submissão","create_another":"Depois de guardar, voltar aqui para criar outra.","reset_after":"Repor o formulário após o envio","submit":"Enviar","amount":"Montante","date":"Data","tags":"Tags","no_budget":"(sem orcamento)","no_bill":"(sem contas)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL Externo","update_transaction":"Actualizar transacção","after_update_create_another":"Após a atualização, regresse aqui para continuar a editar.","store_as_new":"Guarde como uma nova transação em vez de atualizar.","split_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum mealheiro)","description":"Descricao","split_transaction_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","destination_account_reconciliation":"Não pode editar a conta de destino de uma transacção de reconciliação.","source_account_reconciliation":"Não pode editar a conta de origem de uma transacção de reconciliação.","budget":"Orcamento","bill":"Conta","you_create_withdrawal":"Está a criar um levantamento.","you_create_transfer":"Está a criar uma transferência.","you_create_deposit":"Está a criar um deposito.","edit":"Alterar","delete":"Apagar","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Algo correu mal!","profile_try_again":"Algo correu mal. Por favor, tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Código secreto","profile_oauth_create_new_client":"Criar Novo Cliente","profile_oauth_create_client":"Criar Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que os utilizadores reconheçam e confiem.","profile_oauth_redirect_url":"URL de redireccionamento","profile_oauth_redirect_url_help":"URL de callback de autorização da aplicação.","profile_authorized_apps":"Aplicações autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Contextos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está o seu novo token de acesso pessoal. Esta é a única vês que o mesmo será mostrado portanto não o perca! Pode utiliza-lo para fazer pedidos de API.","profile_no_personal_access_token":"Você ainda não criou tokens de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Guardar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Mealheiro","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu segredo de cliente. Apenas estará visível uma vez portanto não o perca! Pode agora utilizar este segredo para fazer pedidos à API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exigir que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expor as mesmas a terceiros não autorizadas. Aplicações públicas, como por exemplo aplicações nativas de sistema operativo ou SPA JavaScript, são incapazes de garantir a segurança dos segredos.","multi_account_warning_unknown":"Dependendo do tipo de transição que quer criar, a conta de origem e/ou a destino de subsequentes divisões pode ser sub-escrita por quaisquer regra definida na primeira divisão da transação.","multi_account_warning_withdrawal":"Mantenha em mente que a conta de origem de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do levantamento.","multi_account_warning_deposit":"Mantenha em mente que a conta de destino de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do depósito.","multi_account_warning_transfer":"Mantenha em mente que a conta de origem + destino de divisões subsequentes serão sobre-escritas por quaisquer regras definidas na divisão da transferência."},"form":{"interest_date":"Data de juros","book_date":"Data de registo","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante estrangeiro","payment_date":"Data de pagamento","invoice_date":"Data da factura","internal_reference":"Referencia interna"},"config":{"html_language":"pt"}}')},403:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ce se redă?","flash_error":"Eroare!","flash_success":"Succes!","close":"Închide","split_transaction_title":"Descrierea tranzacției divizate","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Împarte","single_split":"Împarte","transaction_stored_link":"Tranzacția #{ID} (\\"{title}\\") a fost stocată.","transaction_updated_link":"Tranzacția #{ID} a fost actualizată.","transaction_new_stored_link":"Tranzacția #{ID} a fost stocată.","transaction_journal_information":"Informații despre tranzacții","no_budget_pointer":"Se pare că nu aveți încă bugete. Ar trebui să creați câteva pe pagina bugete. Bugetele vă pot ajuta să țineți evidența cheltuielilor.","no_bill_pointer":"Se pare că nu aveți încă facturi. Ar trebui să creați unele pe pagina facturi. Facturile vă pot ajuta să țineți evidența cheltuielilor.","source_account":"Contul sursă","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Contul de destinație","add_another_split":"Adăugați o divizare","submission":"Transmitere","create_another":"După stocare, reveniți aici pentru a crea alta.","reset_after":"Resetați formularul după trimitere","submit":"Trimite","amount":"Sumă","date":"Dată","tags":"Etichete","no_budget":"(nici un buget)","no_bill":"(no bill)","category":"Categorie","attachments":"Atașamente","notes":"Notițe","external_uri":"External URL","update_transaction":"Actualizați tranzacția","after_update_create_another":"După actualizare, reveniți aici pentru a continua editarea.","store_as_new":"Stocați ca o tranzacție nouă în loc să actualizați.","split_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","none_in_select_list":"(nici unul)","no_piggy_bank":"(nicio pușculiță)","description":"Descriere","split_transaction_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","destination_account_reconciliation":"Nu puteți edita contul de destinație al unei tranzacții de reconciliere.","source_account_reconciliation":"Nu puteți edita contul sursă al unei tranzacții de reconciliere.","budget":"Buget","bill":"Factură","you_create_withdrawal":"Creezi o retragere.","you_create_transfer":"Creezi un transfer.","you_create_deposit":"Creezi un depozit.","edit":"Editează","delete":"Șterge","name":"Nume","profile_whoops":"Hopaa!","profile_something_wrong":"A apărut o eroare!","profile_try_again":"A apărut o problemă. Încercați din nou.","profile_oauth_clients":"Clienți OAuth","profile_oauth_no_clients":"Nu ați creat niciun client OAuth.","profile_oauth_clients_header":"Clienți","profile_oauth_client_id":"ID Client","profile_oauth_client_name":"Nume","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Creare client nou","profile_oauth_create_client":"Creare client","profile_oauth_edit_client":"Editare client","profile_oauth_name_help":"Ceva ce utilizatorii vor recunoaște și vor avea încredere.","profile_oauth_redirect_url":"Redirectioneaza URL","profile_oauth_redirect_url_help":"URL-ul de retroapelare al aplicației dvs.","profile_authorized_apps":"Aplicațiile dvs autorizate","profile_authorized_clients":"Clienți autorizați","profile_scopes":"Domenii","profile_revoke":"Revocați","profile_personal_access_tokens":"Token de acces personal","profile_personal_access_token":"Token de acces personal","profile_personal_access_token_explanation":"Aici este noul dvs. token de acces personal. Este singura dată când va fi afișat așa că nu îl pierde! Acum poți folosi acest token pentru a face cereri API.","profile_no_personal_access_token":"Nu aţi creat nici un token personal de acces.","profile_create_new_token":"Crează un nou token","profile_create_token":"Crează token","profile_create":"Crează","profile_save_changes":"Salvează modificările","default_group_title_name":"(ungrouped)","piggy_bank":"Pușculiță","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Data de interes","book_date":"Rezervă dată","process_date":"Data procesării","due_date":"Data scadentă","foreign_amount":"Sumă străină","payment_date":"Data de plată","invoice_date":"Data facturii","internal_reference":"Referință internă"},"config":{"html_language":"ro"}}')},7448:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Что происходит с моими финансами?","flash_error":"Ошибка!","flash_success":"Успешно!","close":"Закрыть","split_transaction_title":"Описание разделённой транзакции","errors_submission":"При отправке что-то пошло не так. Пожалуйста, проверьте ошибки ниже.","split":"Разделить","single_split":"Разделённая транзакция","transaction_stored_link":"Транзакция #{ID} (\\"{title}\\") сохранена.","transaction_updated_link":"Транзакция #{ID} обновлена.","transaction_new_stored_link":"Транзакция #{ID} сохранена.","transaction_journal_information":"Информация о транзакции","no_budget_pointer":"Похоже, у вас пока нет бюджетов. Вы должны создать их на странице Бюджеты. Бюджеты могут помочь вам отслеживать расходы.","no_bill_pointer":"Похоже, у вас пока нет счетов на оплату. Вы должны создать их на странице Счета на оплату. Счета на оплату могут помочь вам отслеживать расходы.","source_account":"Счёт-источник","hidden_fields_preferences":"Вы можете включить больше параметров транзакции в настройках.","destination_account":"Счёт назначения","add_another_split":"Добавить еще одну часть","submission":"Отправить","create_another":"После сохранения вернуться сюда и создать ещё одну аналогичную запись.","reset_after":"Сбросить форму после отправки","submit":"Подтвердить","amount":"Сумма","date":"Дата","tags":"Метки","no_budget":"(вне бюджета)","no_bill":"(нет счёта на оплату)","category":"Категория","attachments":"Вложения","notes":"Заметки","external_uri":"Внешний URL","update_transaction":"Обновить транзакцию","after_update_create_another":"После обновления вернитесь сюда, чтобы продолжить редактирование.","store_as_new":"Сохранить как новую транзакцию вместо обновления.","split_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание дле всех её составляющих.","none_in_select_list":"(нет)","no_piggy_bank":"(нет копилки)","description":"Описание","split_transaction_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание для всех её составляющих.","destination_account_reconciliation":"Вы не можете редактировать счёт назначения для сверяемой транзакции.","source_account_reconciliation":"Вы не можете редактировать счёт-источник для сверяемой транзакции.","budget":"Бюджет","bill":"Счёт к оплате","you_create_withdrawal":"Вы создаёте расход.","you_create_transfer":"Вы создаёте перевод.","you_create_deposit":"Вы создаёте доход.","edit":"Изменить","delete":"Удалить","name":"Название","profile_whoops":"Ууупс!","profile_something_wrong":"Что-то пошло не так!","profile_try_again":"Произошла ошибка. Пожалуйста, попробуйте снова.","profile_oauth_clients":"Клиенты OAuth","profile_oauth_no_clients":"У вас пока нет клиентов OAuth.","profile_oauth_clients_header":"Клиенты","profile_oauth_client_id":"ID клиента","profile_oauth_client_name":"Название","profile_oauth_client_secret":"Секретный ключ","profile_oauth_create_new_client":"Создать нового клиента","profile_oauth_create_client":"Создать клиента","profile_oauth_edit_client":"Изменить клиента","profile_oauth_name_help":"Что-то, что ваши пользователи знают, и чему доверяют.","profile_oauth_redirect_url":"URL редиректа","profile_oauth_redirect_url_help":"URL обратного вызова для вашего приложения.","profile_authorized_apps":"Авторизованные приложения","profile_authorized_clients":"Авторизованные клиенты","profile_scopes":"Разрешения","profile_revoke":"Отключить","profile_personal_access_tokens":"Персональные Access Tokens","profile_personal_access_token":"Персональный Access Token","profile_personal_access_token_explanation":"Вот ваш новый персональный токен доступа. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот токен, чтобы делать запросы по API.","profile_no_personal_access_token":"Вы не создали ни одного персонального токена доступа.","profile_create_new_token":"Создать новый токен","profile_create_token":"Создать токен","profile_create":"Создать","profile_save_changes":"Сохранить изменения","default_group_title_name":"(без группировки)","piggy_bank":"Копилка","profile_oauth_client_secret_title":"Ключ клиента","profile_oauth_client_secret_expl":"Вот ваш новый ключ клиента. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот ключ, чтобы делать запросы по API.","profile_oauth_confidential":"Конфиденциальный","profile_oauth_confidential_help":"Требовать, чтобы клиент аутентифицировался с секретным ключом. Конфиденциальные клиенты могут хранить учётные данные в надёжном виде, защищая их от несанкционированного доступа. Публичные приложения, такие как обычный рабочий стол или приложения JavaScript SPA, не могут надёжно хранить ваши ключи.","multi_account_warning_unknown":"В зависимости от типа транзакции, которую вы создаёте, счёт-источник и/или счёт назначения следующих частей разделённой транзакции могут быть заменены теми, которые указаны для первой части транзакции.","multi_account_warning_withdrawal":"Имейте в виду, что счёт-источник в других частях разделённой транзакции будет таким же, как в первой части расхода.","multi_account_warning_deposit":"Имейте в виду, что счёт назначения в других частях разделённой транзакции будет таким же, как в первой части дохода.","multi_account_warning_transfer":"Имейте в виду, что счёт-источник и счёт назначения в других частях разделённой транзакции будут такими же, как в первой части перевода."},"form":{"interest_date":"Дата начисления процентов","book_date":"Дата бронирования","process_date":"Дата обработки","due_date":"Срок оплаты","foreign_amount":"Сумма в иностранной валюте","payment_date":"Дата платежа","invoice_date":"Дата выставления счёта","internal_reference":"Внутренняя ссылка"},"config":{"html_language":"ru"}}')},6949:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ako to ide?","flash_error":"Chyba!","flash_success":"Hotovo!","close":"Zavrieť","split_transaction_title":"Popis rozúčtovania","errors_submission":"Pri odosielaní sa niečo nepodarilo. Skontrolujte prosím chyby.","split":"Rozúčtovať","single_split":"Rozúčtovať","transaction_stored_link":"Transakcia #{ID} (\\"{title}\\") bola uložená.","transaction_updated_link":"Transakcia #{ID} bola aktualizovaná.","transaction_new_stored_link":"Transakcia #{ID} bola uložená.","transaction_journal_information":"Informácie o transakcii","no_budget_pointer":"Zdá sa, že zatiaľ nemáte žiadne rozpočty. Na stránke rozpočty by ste si nejaké mali vytvoriť. Rozpočty môžu pomôcť udržať prehľad vo výdavkoch.","no_bill_pointer":"Zdá sa, že zatiaľ nemáte žiadne účty. Na stránke účty by ste mali nejaké vytvoriť. Účty môžu pomôcť udržať si prehľad vo výdavkoch.","source_account":"Zdrojový účet","hidden_fields_preferences":"Viac možností transakcií môžete povoliť vo svojich nastaveniach.","destination_account":"Cieľový účet","add_another_split":"Pridať ďalšie rozúčtovanie","submission":"Odoslanie","create_another":"Po uložení sa vrátiť späť sem a vytvoriť ďalší.","reset_after":"Po odoslaní vynulovať formulár","submit":"Odoslať","amount":"Suma","date":"Dátum","tags":"Štítky","no_budget":"(žiadny rozpočet)","no_bill":"(žiadny účet)","category":"Kategória","attachments":"Prílohy","notes":"Poznámky","external_uri":"Externá URL","update_transaction":"Upraviť transakciu","after_update_create_another":"Po aktualizácii sa vrátiť späť a pokračovať v úpravách.","store_as_new":"Namiesto aktualizácie uložiť ako novú transakciu.","split_title_help":"Ak vytvoríte rozúčtovanie transakcie, je potrebné, aby ste určili všeobecný popis pre všetky rozúčtovania danej transakcie.","none_in_select_list":"(žiadne)","no_piggy_bank":"(žiadna pokladnička)","description":"Popis","split_transaction_title_help":"Ak vytvoríte rozúčtovanú transakciu, musí existovať globálny popis všetkých rozúčtovaní transakcie.","destination_account_reconciliation":"Nemôžete upraviť cieľový účet zúčtovacej transakcie.","source_account_reconciliation":"Nemôžete upraviť zdrojový účet zúčtovacej transakcie.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"Vytvárate výber.","you_create_transfer":"Vytvárate prevod.","you_create_deposit":"Vytvárate vklad.","edit":"Upraviť","delete":"Odstrániť","name":"Názov","profile_whoops":"Ajaj!","profile_something_wrong":"Niečo sa pokazilo!","profile_try_again":"Niečo sa pokazilo. Prosím, skúste znova.","profile_oauth_clients":"OAuth klienti","profile_oauth_no_clients":"Zatiaľ ste nevytvorili žiadneho OAuth klienta.","profile_oauth_clients_header":"Klienti","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Meno/Názov","profile_oauth_client_secret":"Tajný kľúč","profile_oauth_create_new_client":"Vytvoriť nového klienta","profile_oauth_create_client":"Vytvoriť klienta","profile_oauth_edit_client":"Upraviť klienta","profile_oauth_name_help":"Niečo, čo vaši použivatelia poznajú a budú tomu dôverovať.","profile_oauth_redirect_url":"URL presmerovania","profile_oauth_redirect_url_help":"Spätná URL pre overenie autorizácie vašej aplikácie.","profile_authorized_apps":"Povolené aplikácie","profile_authorized_clients":"Autorizovaní klienti","profile_scopes":"Rozsahy","profile_revoke":"Odvolať","profile_personal_access_tokens":"Osobné prístupové tokeny","profile_personal_access_token":"Osobný prístupový token","profile_personal_access_token_explanation":"Toto je váš nový osobný prístupový token. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz ho môžete používať pre prístup k API.","profile_no_personal_access_token":"Ešte ste nevytvorili žiadne osobné prístupové tokeny.","profile_create_new_token":"Vytvoriť nový token","profile_create_token":"Vytvoriť token","profile_create":"Vytvoriť","profile_save_changes":"Uložiť zmeny","default_group_title_name":"(nezoskupené)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Tajný kľúč klienta","profile_oauth_client_secret_expl":"Toto je váš tajný kľúč klienta. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz môžete tento tajný kľúč používať pre prístup k API.","profile_oauth_confidential":"Dôverné","profile_oauth_confidential_help":"Vyžadujte od klienta autentifikáciu pomocou tajného kľúča. Dôverní klienti môžu uchovávať poverenia bezpečným spôsobom bez toho, aby boli vystavení neoprávneným stranám. Verejné aplikácie, ako napríklad natívna pracovná plocha alebo aplikácie Java SPA, nedokážu tajné kľúče bezpečne uchovať.","multi_account_warning_unknown":"V závislosti od typu vytvorenej transakcie, môže byť zdrojový a/alebo cieľový účet následných rozúčtovaní prepísaný údajmi v prvom rozdelení transakcie.","multi_account_warning_withdrawal":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozdelení výberu.","multi_account_warning_deposit":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní vkladu.","multi_account_warning_transfer":"Majte na pamäti, že zdrojový a cieľový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní prevodu."},"form":{"interest_date":"Úrokový dátum","book_date":"Dátum rezervácie","process_date":"Dátum spracovania","due_date":"Dátum splatnosti","foreign_amount":"Suma v cudzej mene","payment_date":"Dátum úhrady","invoice_date":"Dátum vystavenia","internal_reference":"Interná referencia"},"config":{"html_language":"sk"}}')},2285:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Vad spelas?","flash_error":"Fel!","flash_success":"Slutförd!","close":"Stäng","split_transaction_title":"Beskrivning av delad transaktion","errors_submission":"Något fel uppstod med inskickningen. Vänligen kontrollera felen nedan.","split":"Dela","single_split":"Dela","transaction_stored_link":"Transaktion #{ID} (\\"{title}\\") sparades.","transaction_updated_link":"Transaktion #{ID} uppdaterades.","transaction_new_stored_link":"Transaktion #{ID} sparades.","transaction_journal_information":"Transaktionsinformation","no_budget_pointer":"Du verkar inte ha några budgetar än. Du bör skapa några på budgetar-sidan. Budgetar kan hjälpa dig att hålla reda på utgifter.","no_bill_pointer":"Du verkar inte ha några räkningar ännu. Du bör skapa några på räkningar-sidan. Räkningar kan hjälpa dig att hålla reda på utgifter.","source_account":"Källkonto","hidden_fields_preferences":"Du kan aktivera fler transaktionsalternativ i dina inställningar.","destination_account":"Till konto","add_another_split":"Lägga till en annan delning","submission":"Inskickning","create_another":"Efter sparat, återkom hit för att skapa ytterligare en.","reset_after":"Återställ formulär efter inskickat","submit":"Skicka","amount":"Belopp","date":"Datum","tags":"Etiketter","no_budget":"(ingen budget)","no_bill":"(ingen räkning)","category":"Kategori","attachments":"Bilagor","notes":"Noteringar","external_uri":"External URL","update_transaction":"Uppdatera transaktion","after_update_create_another":"Efter uppdaterat, återkom hit för att fortsätta redigera.","store_as_new":"Spara en ny transaktion istället för att uppdatera.","split_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","none_in_select_list":"(Ingen)","no_piggy_bank":"(ingen spargris)","description":"Beskrivning","split_transaction_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","destination_account_reconciliation":"Du kan inte redigera destinationskontot för en avstämningstransaktion.","source_account_reconciliation":"Du kan inte redigera källkontot för en avstämningstransaktion.","budget":"Budget","bill":"Nota","you_create_withdrawal":"Du skapar ett uttag.","you_create_transfer":"Du skapar en överföring.","you_create_deposit":"Du skapar en insättning.","edit":"Redigera","delete":"Ta bort","name":"Namn","profile_whoops":"Hoppsan!","profile_something_wrong":"Något gick fel!","profile_try_again":"Något gick fel. Försök igen.","profile_oauth_clients":"OAuth klienter","profile_oauth_no_clients":"Du har inte skapat några OAuth klienter.","profile_oauth_clients_header":"Klienter","profile_oauth_client_id":"Klient ID","profile_oauth_client_name":"Namn","profile_oauth_client_secret":"Hemlighet","profile_oauth_create_new_client":"Skapa ny klient","profile_oauth_create_client":"Skapa klient","profile_oauth_edit_client":"Redigera klient","profile_oauth_name_help":"Något som dina användare kommer att känna igen och lita på.","profile_oauth_redirect_url":"Omdirigera URL","profile_oauth_redirect_url_help":"Din applikations auktorisering callback URL.","profile_authorized_apps":"Auktoriserade applikationer","profile_authorized_clients":"Auktoriserade klienter","profile_scopes":"Omfattningar","profile_revoke":"Återkalla","profile_personal_access_tokens":"Personliga åtkomst-Tokens","profile_personal_access_token":"Personlig åtkomsttoken","profile_personal_access_token_explanation":"Här är din nya personliga tillgångs token. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna token för att göra API-förfrågningar.","profile_no_personal_access_token":"Du har inte skapat några personliga åtkomsttokens.","profile_create_new_token":"Skapa ny token","profile_create_token":"Skapa token","profile_create":"Skapa","profile_save_changes":"Spara ändringar","default_group_title_name":"(ogrupperad)","piggy_bank":"Spargris","profile_oauth_client_secret_title":"Klienthemlighet","profile_oauth_client_secret_expl":"Här är din nya klient hemlighet. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna hemlighet för att göra API-förfrågningar.","profile_oauth_confidential":"Konfidentiell","profile_oauth_confidential_help":"Kräv att klienten autentiserar med en hemlighet. Konfidentiella klienter kan hålla autentiseringsuppgifter på ett säkert sätt utan att utsätta dem för obehöriga parter. Publika applikationer, som skrivbord eller JavaScript-SPA-applikationer, kan inte hålla hemligheter på ett säkert sätt.","multi_account_warning_unknown":"Beroende på vilken typ av transaktion du skapar, källan och/eller destinationskontot för efterföljande delningar kan åsidosättas av vad som än definieras i den första delningen av transaktionen.","multi_account_warning_withdrawal":"Tänk på att källkontot för efterföljande uppdelningar kommer att upphävas av vad som än definieras i den första uppdelningen av uttaget.","multi_account_warning_deposit":"Tänk på att destinationskontot för efterföljande uppdelningar kommer att styras av vad som än definieras i den första uppdelningen av insättningen.","multi_account_warning_transfer":"Tänk på att käll + destinationskonto av efterföljande delningar kommer att styras av vad som definieras i den första uppdelningen av överföringen."},"form":{"interest_date":"Räntedatum","book_date":"Bokföringsdatum","process_date":"Behandlingsdatum","due_date":"Förfallodatum","foreign_amount":"Utländskt belopp","payment_date":"Betalningsdatum","invoice_date":"Fakturadatum","internal_reference":"Intern referens"},"config":{"html_language":"sv"}}')},9783:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Chào mừng trở lại?","flash_error":"Lỗi!","flash_success":"Thành công!","close":"Đóng","split_transaction_title":"Mô tả giao dịch tách","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Chia ra","single_split":"Split","transaction_stored_link":"Giao dịch #{ID} (\\"{title}\\") đã được lưu trữ.","transaction_updated_link":"Giao dịch#{ID} đã được cập nhật.","transaction_new_stored_link":" Giao dịch #{ID} đã được lưu trữ.","transaction_journal_information":"Thông tin giao dịch","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Nguồn tài khoản","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Tài khoản đích","add_another_split":"Thêm một phân chia khác","submission":"Gửi","create_another":"Sau khi lưu trữ, quay trở lại đây để tạo một cái khác.","reset_after":"Đặt lại mẫu sau khi gửi","submit":"Gửi","amount":"Số tiền","date":"Ngày","tags":"Nhãn","no_budget":"(không có ngân sách)","no_bill":"(no bill)","category":"Danh mục","attachments":"Tệp đính kèm","notes":"Ghi chú","external_uri":"External URL","update_transaction":"Cập nhật giao dịch","after_update_create_another":"Sau khi cập nhật, quay lại đây để tiếp tục chỉnh sửa.","store_as_new":"Lưu trữ như một giao dịch mới thay vì cập nhật.","split_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","none_in_select_list":"(Trống)","no_piggy_bank":"(chưa có heo đất)","description":"Sự miêu tả","split_transaction_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","destination_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản đích của giao dịch đối chiếu.","source_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản nguồn của giao dịch đối chiếu.","budget":"Ngân sách","bill":"Hóa đơn","you_create_withdrawal":"Bạn đang tạo một rút tiền.","you_create_transfer":"Bạn đang tạo một chuyển khoản.","you_create_deposit":"Bạn đang tạo một tiền gửi.","edit":"Sửa","delete":"Xóa","name":"Tên","profile_whoops":"Rất tiếc!","profile_something_wrong":"Có lỗi xảy ra!","profile_try_again":"Xảy ra lỗi. Vui lòng thử lại.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Bạn đã không tạo ra bất kỳ OAuth clients nào.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Tên","profile_oauth_client_secret":"Mã bí mật","profile_oauth_create_new_client":"Tạo mới Client","profile_oauth_create_client":"Tạo Client","profile_oauth_edit_client":"Sửa Client","profile_oauth_name_help":"Một cái gì đó người dùng của bạn sẽ nhận ra và tin tưởng.","profile_oauth_redirect_url":"URL chuyển tiếp","profile_oauth_redirect_url_help":"URL gọi lại ủy quyền của ứng dụng của bạn.","profile_authorized_apps":"Uỷ quyền ứng dụng","profile_authorized_clients":"Client ủy quyền","profile_scopes":"Phạm vi","profile_revoke":"Thu hồi","profile_personal_access_tokens":"Mã truy cập cá nhân","profile_personal_access_token":"Mã truy cập cá nhân","profile_personal_access_token_explanation":"Đây là mã thông báo truy cập cá nhân mới của bạn. Đây là lần duy nhất nó sẽ được hiển thị vì vậy đừng đánh mất nó! Bây giờ bạn có thể sử dụng mã thông báo này để thực hiện API.","profile_no_personal_access_token":"Bạn chưa tạo bất kỳ mã thông báo truy cập cá nhân nào.","profile_create_new_token":"Tạo mã mới","profile_create_token":"Tạo mã","profile_create":"Tạo","profile_save_changes":"Lưu thay đổi","default_group_title_name":"(chưa nhóm)","piggy_bank":"Heo đất","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ngày lãi","book_date":"Ngày đặt sách","process_date":"Ngày xử lý","due_date":"Ngày đáo hạn","foreign_amount":"Ngoại tệ","payment_date":"Ngày thanh toán","invoice_date":"Ngày hóa đơn","internal_reference":"Tài liệu tham khảo nội bộ"},"config":{"html_language":"vi"}}')},1922:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"今天理财了吗?","flash_error":"错误!","flash_success":"成功!","close":"关闭","split_transaction_title":"拆分交易的描述","errors_submission":"您提交的内容有误,请检查错误信息。","split":"拆分","single_split":"拆分","transaction_stored_link":"交易 #{ID} (“{title}”) 已保存。","transaction_updated_link":"交易 #{ID} 已更新。","transaction_new_stored_link":"交易 #{ID} 已保存。","transaction_journal_information":"交易信息","no_budget_pointer":"您还没有预算,您应该在预算页面进行创建。预算可以帮助您追踪支出。","no_bill_pointer":"您还没有账单,您应该在账单页面进行创建。账单可以帮助您追踪支出。","source_account":"来源账户","hidden_fields_preferences":"您可以在偏好设定中启用更多交易选项。","destination_account":"目标账户","add_another_split":"增加另一笔拆分","submission":"提交","create_another":"保存后,返回此页面以创建新记录","reset_after":"提交后重置表单","submit":"提交","amount":"金额","date":"日期","tags":"标签","no_budget":"(无预算)","no_bill":"(无账单)","category":"分类","attachments":"附件","notes":"备注","external_uri":"外部链接","update_transaction":"更新交易","after_update_create_another":"更新后,返回此页面继续编辑。","store_as_new":"保存为新交易而不是更新此交易。","split_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","none_in_select_list":"(空)","no_piggy_bank":"(无存钱罐)","description":"描述","split_transaction_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","destination_account_reconciliation":"您不能编辑对账交易的目标账户","source_account_reconciliation":"您不能编辑对账交易的来源账户。","budget":"预算","bill":"账单","you_create_withdrawal":"您正在创建一笔支出","you_create_transfer":"您正在创建一笔转账","you_create_deposit":"您正在创建一笔收入","edit":"编辑","delete":"删除","name":"名称","profile_whoops":"很抱歉!","profile_something_wrong":"发生错误!","profile_try_again":"发生错误,请稍后再试。","profile_oauth_clients":"OAuth 客户端","profile_oauth_no_clients":"您尚未创建任何 OAuth 客户端。","profile_oauth_clients_header":"客户端","profile_oauth_client_id":"客户端 ID","profile_oauth_client_name":"名称","profile_oauth_client_secret":"密钥","profile_oauth_create_new_client":"创建新客户端","profile_oauth_create_client":"创建客户端","profile_oauth_edit_client":"编辑客户端","profile_oauth_name_help":"您的用户可以识别并信任的信息","profile_oauth_redirect_url":"跳转网址","profile_oauth_redirect_url_help":"您的应用程序的授权回调网址","profile_authorized_apps":"已授权应用","profile_authorized_clients":"已授权客户端","profile_scopes":"范围","profile_revoke":"撤消","profile_personal_access_tokens":"个人访问令牌","profile_personal_access_token":"个人访问令牌","profile_personal_access_token_explanation":"请妥善保存您的新个人访问令牌,此令牌仅会在这里展示一次。您现在已可以使用此令牌进行 API 请求。","profile_no_personal_access_token":"您还没有创建个人访问令牌。","profile_create_new_token":"创建新令牌","profile_create_token":"创建令牌","profile_create":"创建","profile_save_changes":"保存更改","default_group_title_name":"(未分组)","piggy_bank":"存钱罐","profile_oauth_client_secret_title":"客户端密钥","profile_oauth_client_secret_expl":"请妥善保存您的新客户端的密钥,此密钥仅会在这里展示一次。您现在已可以使用此密钥进行 API 请求。","profile_oauth_confidential":"使用加密","profile_oauth_confidential_help":"要求客户端使用密钥进行认证。加密客户端可以安全储存凭据且不将其泄露给未授权方,而公共应用程序(例如本地计算机或 JavaScript SPA 应用程序)无法保证凭据的安全性。","multi_account_warning_unknown":"根据您创建的交易类型,后续拆分的来源和/或目标账户可能被交易的首笔拆分的配置所覆盖。","multi_account_warning_withdrawal":"请注意,后续拆分的来源账户将会被支出的首笔拆分的配置所覆盖。","multi_account_warning_deposit":"请注意,后续拆分的目标账户将会被收入的首笔拆分的配置所覆盖。","multi_account_warning_transfer":"请注意,后续拆分的来源和目标账户将会被转账的首笔拆分的配置所覆盖。"},"form":{"interest_date":"利息日期","book_date":"登记日期","process_date":"处理日期","due_date":"到期日","foreign_amount":"外币金额","payment_date":"付款日期","invoice_date":"发票日期","internal_reference":"内部引用"},"config":{"html_language":"zh-cn"}}')},4963:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"錯誤!","flash_success":"成功!","close":"關閉","split_transaction_title":"拆分交易的描述","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"分割","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"交易資訊","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"增加拆分","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"送出","amount":"金額","date":"日期","tags":"標籤","no_budget":"(無預算)","no_bill":"(no bill)","category":"分類","attachments":"附加檔案","notes":"備註","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"若您建立一筆拆分交易,須有一個有關交易所有拆分的整體描述。","none_in_select_list":"(空)","no_piggy_bank":"(no piggy bank)","description":"描述","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"預算","bill":"帳單","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"編輯","delete":"刪除","name":"名稱","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"小豬撲滿","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"利率日期","book_date":"登記日期","process_date":"處理日期","due_date":"到期日","foreign_amount":"外幣金額","payment_date":"付款日期","invoice_date":"發票日期","internal_reference":"內部參考"},"config":{"html_language":"zh-tw"}}')}},t={};function n(a){var i=t[a];if(void 0!==i)return i.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(e,t,n,a,i,o,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),a&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):i&&(l=s?function(){i.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:i),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var d=c.beforeCreate;c.beforeCreate=d?[].concat(d,l):[l]}return{exports:e,options:c}}const t=e({name:"CustomAttachments",props:{title:String,name:String,error:Array},mounted:function(){var e=this;window.addEventListener("paste",(function(t){e.$refs.input.files=t.clipboardData.files}))},methods:{clearAtt:function(){this.$refs.input.value=""},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",multiple:"multiple",type:"file"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearAtt}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const a=e({name:"EditTransaction",props:{groupId:Number},mounted:function(){this.getGroup()},ready:function(){},methods:{positiveAmount:function(e){return e<0?-1*e:e},roundNumber:function(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n},selectedSourceAccount:function(e,t){if("string"==typeof t)return this.transactions[e].source_account.id=null,void(this.transactions[e].source_account.name=t);this.transactions[e].source_account={id:t.id,name:t.name,type:t.type,currency_id:t.currency_id,currency_name:t.currency_name,currency_code:t.currency_code,currency_decimal_places:t.currency_decimal_places,allowed_types:this.transactions[e].source_account.allowed_types}},selectedDestinationAccount:function(e,t){if("string"==typeof t)return this.transactions[e].destination_account.id=null,void(this.transactions[e].destination_account.name=t);this.transactions[e].destination_account={id:t.id,name:t.name,type:t.type,currency_id:t.currency_id,currency_name:t.currency_name,currency_code:t.currency_code,currency_decimal_places:t.currency_decimal_places,allowed_types:this.transactions[e].destination_account.allowed_types}},clearSource:function(e){this.transactions[e].source_account={id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:this.transactions[e].source_account.allowed_types},this.transactions[e].destination_account&&this.selectedDestinationAccount(e,this.transactions[e].destination_account)},setTransactionType:function(e){null!==e&&(this.transactionType=e)},deleteTransaction:function(e,t){t.preventDefault(),this.transactions.splice(e,1)},clearDestination:function(e){this.transactions[e].destination_account={id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:this.transactions[e].destination_account.allowed_types},this.transactions[e].source_account&&this.selectedSourceAccount(e,this.transactions[e].source_account)},getGroup:function(){var e=this,t=window.location.href.split("/"),n="./api/v1/transactions/"+t[t.length-1];axios.get(n).then((function(t){e.processIncomingGroup(t.data.data)})).catch((function(e){console.error("Some error when getting axios"),console.error(e)}))},processIncomingGroup:function(e){this.group_title=e.attributes.group_title;var t=e.attributes.transactions.reverse();for(var n in t)if(t.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294){var a=t[n];this.processIncomingGroupRow(a)}},ucFirst:function(e){return"string"==typeof e?e.charAt(0).toUpperCase()+e.slice(1):null},processIncomingGroupRow:function(e){this.setTransactionType(e.type);var t=[];for(var n in e.tags)e.tags.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&t.push({text:e.tags[n],tiClasses:[]});void 0===window.expectedSourceTypes&&console.error("window.expectedSourceTypes is unexpectedly empty."),this.transactions.push({transaction_journal_id:e.transaction_journal_id,description:e.description,date:e.date.substr(0,10),amount:this.roundNumber(this.positiveAmount(e.amount),e.currency_decimal_places),category:e.category_name,errors:{source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}},budget:e.budget_id,bill:e.bill_id,tags:t,custom_fields:{interest_date:e.interest_date,book_date:e.book_date,process_date:e.process_date,due_date:e.due_date,payment_date:e.payment_date,invoice_date:e.invoice_date,internal_reference:e.internal_reference,notes:e.notes,external_uri:e.external_uri},foreign_amount:{amount:this.roundNumber(this.positiveAmount(e.foreign_amount),e.foreign_currency_decimal_places),currency_id:e.foreign_currency_id},source_account:{id:e.source_id,name:e.source_name,type:e.source_type,currency_id:e.currency_id,currency_name:e.currency_name,currency_code:e.currency_code,currency_decimal_places:e.currency_decimal_places,allowed_types:window.expectedSourceTypes.source[this.ucFirst(e.type)]},destination_account:{id:e.destination_id,name:e.destination_name,type:e.destination_type,currency_id:e.currency_id,currency_name:e.currency_name,currency_code:e.currency_code,currency_decimal_places:e.currency_decimal_places,allowed_types:window.expectedSourceTypes.destination[this.ucFirst(e.type)]}})},limitSourceType:function(e){},limitDestinationType:function(e){},convertData:function(){var e,t,n,a={transactions:[]};for(var i in this.transactions.length>1&&(a.group_title=this.group_title),e=this.transactionType?this.transactionType.toLowerCase():"invalid",t=this.transactions[0].source_account.type,n=this.transactions[0].destination_account.type,"invalid"===e&&["Asset account","Loan","Debt","Mortgage"].includes(t)&&(e="withdrawal"),"invalid"===e&&["Asset account","Loan","Debt","Mortgage"].includes(n)&&(e="deposit"),this.transactions)this.transactions.hasOwnProperty(i)&&/^0$|^[1-9]\d*$/.test(i)&&i<=4294967294&&a.transactions.push(this.convertDataRow(this.transactions[i],i,e));return a},convertDataRow:function(e,t,n){var a,i,o,r,s,l,c=[],u=null,d=null;for(var _ in i=e.source_account.id,o=e.source_account.name,r=e.destination_account.id,s=e.destination_account.name,"withdrawal"!==n&&"transfer"!==n||(e.currency_id=e.source_account.currency_id),"deposit"===n&&(e.currency_id=e.destination_account.currency_id),l=e.date,t>0&&(l=this.transactions[0].date),"withdrawal"===n&&""===s&&(r=window.cashAccountId),"deposit"===n&&""===o&&(i=window.cashAccountId),t>0&&("withdrawal"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(i=this.transactions[0].source_account.id,o=this.transactions[0].source_account.name),t>0&&("deposit"===n.toLowerCase()||"transfer"===n.toLowerCase())&&(r=this.transactions[0].destination_account.id,s=this.transactions[0].destination_account.name),c=[],u="0",e.tags)e.tags.hasOwnProperty(_)&&/^0$|^[1-9]\d*$/.test(_)&&_<=4294967294&&c.push(e.tags[_].text);return""!==e.foreign_amount.amount&&0!==parseFloat(e.foreign_amount.amount)&&(u=e.foreign_amount.amount,d=e.foreign_amount.currency_id),d===e.currency_id&&(u=null,d=null),0===r&&(r=null),0===i&&(i=null),1===(String(e.amount).match(/\,/g)||[]).length&&(e.amount=String(e.amount).replace(",",".")),(a={transaction_journal_id:e.transaction_journal_id,type:n,date:l,amount:e.amount,description:e.description,source_id:i,source_name:o,destination_id:r,destination_name:s,category_name:e.category,interest_date:e.custom_fields.interest_date,book_date:e.custom_fields.book_date,process_date:e.custom_fields.process_date,due_date:e.custom_fields.due_date,payment_date:e.custom_fields.payment_date,invoice_date:e.custom_fields.invoice_date,internal_reference:e.custom_fields.internal_reference,external_uri:e.custom_fields.external_uri,notes:e.custom_fields.notes,tags:c}).foreign_amount=u,a.foreign_currency_id=d,0!==e.currency_id&&null!==e.currency_id&&(a.currency_id=e.currency_id),a.budget_id=parseInt(e.budget),parseInt(e.bill)>0&&(a.bill_id=parseInt(e.bill)),0===parseInt(e.bill)&&(a.bill_id=null),parseInt(e.piggy_bank)>0&&(a.piggy_bank_id=parseInt(e.piggy_bank)),a},submit:function(e){var t=this,n=$("#submitButton");n.prop("disabled",!0);var a=window.location.href.split("/"),i="./api/v1/transactions/"+a[a.length-1]+"?_token="+document.head.querySelector('meta[name="csrf-token"]').content,o="PUT";this.storeAsNew&&(i="./api/v1/transactions?_token="+document.head.querySelector('meta[name="csrf-token"]').content,o="POST");var r=this.convertData();axios({method:o,url:i,data:r}).then((function(e){0===t.collectAttachmentData(e)&&t.redirectUser(e.data.data.id)})).catch((function(e){t.parseErrors(e.response.data)})),e&&e.preventDefault(),n.removeAttr("disabled")},redirectUser:function(e){this.returnAfter?(this.setDefaultErrors(),this.storeAsNew?(this.success_message=this.$t("firefly.transaction_new_stored_link",{ID:e}),this.error_message=""):(this.success_message=this.$t("firefly.transaction_updated_link",{ID:e}),this.error_message="")):this.storeAsNew?window.location.href=window.previousUri+"?transaction_group_id="+e+"&message=created":window.location.href=window.previousUri+"?transaction_group_id="+e+"&message=updated"},collectAttachmentData:function(e){var t=this,n=e.data.data.id,a=[],i=[],o=$('input[name="attachments[]"]');for(var r in o)if(o.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294)for(var s in o[r].files)if(o[r].files.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294){var l=e.data.data.attributes.transactions.reverse();a.push({journal:l[r].transaction_journal_id,file:o[r].files[s]})}var c=a.length,u=function(e){var o,r,s;a.hasOwnProperty(e)&&/^0$|^[1-9]\d*$/.test(e)&&e<=4294967294&&(o=a[e],r=t,(s=new FileReader).onloadend=function(t){t.target.readyState===FileReader.DONE&&(i.push({name:a[e].file.name,journal:a[e].journal,content:new Blob([t.target.result])}),i.length===c&&r.uploadFiles(i,n))},s.readAsArrayBuffer(o.file))};for(var d in a)u(d);return c},uploadFiles:function(e,t){var n=this,a=e.length,i=0,o=function(o){if(e.hasOwnProperty(o)&&/^0$|^[1-9]\d*$/.test(o)&&o<=4294967294){var r={filename:e[o].name,attachable_type:"TransactionJournal",attachable_id:e[o].journal};axios.post("./api/v1/attachments",r).then((function(r){var s="./api/v1/attachments/"+r.data.data.id+"/upload";axios.post(s,e[o].content).then((function(e){return++i===a&&n.redirectUser(t,null),!0})).catch((function(e){return console.error("Could not upload file."),console.error(e),i++,n.error_message="Could not upload attachment: "+e,i===a&&n.redirectUser(t,null),!1}))})).catch((function(e){return console.error("Could not create upload."),console.error(e),++i===a&&n.redirectUser(t,null),!1}))}};for(var r in e)o(r)},addTransaction:function(e){this.transactions.push({transaction_journal_id:0,description:"",date:"",amount:"",category:"",piggy_bank:0,errors:{source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}},budget:0,bill:0,tags:[],custom_fields:{interest_date:"",book_date:"",process_date:"",due_date:"",payment_date:"",invoice_date:"",internal_reference:"",notes:"",attachments:[],external_uri:""},foreign_amount:{amount:"",currency_id:0},source_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:[]},destination_account:{id:0,name:"",type:"",currency_id:0,currency_name:"",currency_code:"",currency_decimal_places:2,allowed_types:[]}});var t=this.transactions.length;this.transactions.length>1&&(this.transactions[t-1].source_account=this.transactions[t-2].source_account,this.transactions[t-1].destination_account=this.transactions[t-2].destination_account,this.transactions[t-1].date=this.transactions[t-2].date),e&&e.preventDefault()},parseErrors:function(e){var t,n;for(var a in this.setDefaultErrors(),this.error_message="",e.message.length>0?this.error_message=this.$t("firefly.errors_submission"):this.error_message="",e.errors)if(e.errors.hasOwnProperty(a)&&("group_title"===a&&(this.group_title_errors=e.errors[a]),"group_title"!==a)){switch(t=parseInt(a.split(".")[1]),n=a.split(".")[2]){case"amount":case"date":case"budget_id":case"bill_id":case"description":case"tags":this.transactions[t].errors[n]=e.errors[a];break;case"external_uri":this.transactions[t].errors.custom_errors[n]=e.errors[a];break;case"source_name":case"source_id":this.transactions[t].errors.source_account=this.transactions[t].errors.source_account.concat(e.errors[a]);break;case"destination_name":case"destination_id":this.transactions[t].errors.destination_account=this.transactions[t].errors.destination_account.concat(e.errors[a]);break;case"foreign_amount":case"foreign_currency_id":this.transactions[t].errors.foreign_amount=this.transactions[t].errors.foreign_amount.concat(e.errors[a])}this.transactions[t].errors.source_account=Array.from(new Set(this.transactions[t].errors.source_account)),this.transactions[t].errors.destination_account=Array.from(new Set(this.transactions[t].errors.destination_account))}},setDefaultErrors:function(){for(var e in this.transactions)this.transactions.hasOwnProperty(e)&&/^0$|^[1-9]\d*$/.test(e)&&e<=4294967294&&(this.transactions[e].errors={source_account:[],destination_account:[],description:[],amount:[],date:[],budget_id:[],bill_id:[],foreign_amount:[],category:[],piggy_bank:[],tags:[],custom_errors:{interest_date:[],book_date:[],process_date:[],due_date:[],payment_date:[],invoice_date:[],internal_reference:[],notes:[],attachments:[],external_uri:[]}})}},data:function(){return{group:this.groupId,error_message:"",success_message:"",transactions:[],group_title:"",returnAfter:!1,storeAsNew:!1,transactionType:null,group_title_errors:[],resetButtonDisabled:!0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("form",{staticClass:"form-horizontal",attrs:{id:"store","accept-charset":"UTF-8",action:"#",enctype:"multipart/form-data",method:"POST"}},[n("input",{attrs:{name:"_token",type:"hidden",value:"xxx"}}),e._v(" "),""!==e.error_message?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-12"},[n("div",{staticClass:"alert alert-danger alert-dismissible",attrs:{role:"alert"}},[n("button",{staticClass:"close",attrs:{"data-dismiss":"alert",type:"button","aria-label":e.$t("firefly.close")}},[n("span",{attrs:{"aria-hidden":"true"}},[e._v("×")])]),e._v(" "),n("strong",[e._v(e._s(e.$t("firefly.flash_error")))]),e._v(" "+e._s(e.error_message)+"\n ")])])]):e._e(),e._v(" "),""!==e.success_message?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-12"},[n("div",{staticClass:"alert alert-success alert-dismissible",attrs:{role:"alert"}},[n("button",{staticClass:"close",attrs:{"data-dismiss":"alert",type:"button","aria-label":e.$t("firefly.close")}},[n("span",{attrs:{"aria-hidden":"true"}},[e._v("×")])]),e._v(" "),n("strong",[e._v(e._s(e.$t("firefly.flash_success")))]),e._v(" "),n("span",{domProps:{innerHTML:e._s(e.success_message)}})])])]):e._e(),e._v(" "),n("div",e._l(e.transactions,(function(t,a){return n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title splitTitle"},[e.transactions.length>1?n("span",[e._v(e._s(e.$t("firefly.single_split"))+" "+e._s(a+1)+" / "+e._s(e.transactions.length))]):e._e(),e._v(" "),1===e.transactions.length?n("span",[e._v(e._s(e.$t("firefly.transaction_journal_information")))]):e._e()]),e._v(" "),e.transactions.length>1?n("div",{staticClass:"box-tools pull-right"},[n("button",{staticClass:"btn btn-xs btn-danger",attrs:{type:"button"},on:{click:function(t){return e.deleteTransaction(a,t)}}},[n("i",{staticClass:"fa fa-trash"})])]):e._e()]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-4"},["reconciliation"!==e.transactionType.toLowerCase()?n("transaction-description",{attrs:{error:t.errors.description,index:a},model:{value:t.description,callback:function(n){e.$set(t,"description",n)},expression:"transaction.description"}}):e._e(),e._v(" "),"reconciliation"!==e.transactionType.toLowerCase()?n("account-select",{attrs:{accountName:t.source_account.name,accountTypeFilters:t.source_account.allowed_types,error:t.errors.source_account,index:a,transactionType:e.transactionType,inputName:"source[]",inputDescription:e.$t("firefly.source_account")},on:{"clear:value":function(t){return e.clearSource(a)},"select:account":function(t){return e.selectedSourceAccount(a,t)}}}):e._e(),e._v(" "),"reconciliation"===e.transactionType.toLowerCase()?n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[n("p",{staticClass:"form-control-static",attrs:{id:"ffInput_source"}},[n("em",[e._v("\n "+e._s(e.$t("firefly.source_account_reconciliation"))+"\n ")])])])]):e._e(),e._v(" "),"reconciliation"!==e.transactionType.toLowerCase()?n("account-select",{attrs:{accountName:t.destination_account.name,accountTypeFilters:t.destination_account.allowed_types,error:t.errors.destination_account,index:a,transactionType:e.transactionType,inputName:"destination[]",inputDescription:e.$t("firefly.destination_account")},on:{"clear:value":function(t){return e.clearDestination(a)},"select:account":function(t){return e.selectedDestinationAccount(a,t)}}}):e._e(),e._v(" "),"reconciliation"===e.transactionType.toLowerCase()?n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[n("p",{staticClass:"form-control-static",attrs:{id:"ffInput_dest"}},[n("em",[e._v("\n "+e._s(e.$t("firefly.destination_account_reconciliation"))+"\n ")])])])]):e._e(),e._v(" "),n("standard-date",{attrs:{error:t.errors.date,index:a},model:{value:t.date,callback:function(n){e.$set(t,"date",n)},expression:"transaction.date"}}),e._v(" "),0===a?n("div",[n("transaction-type",{attrs:{destination:t.destination_account.type,source:t.source_account.type},on:{"set:transactionType":function(t){return e.setTransactionType(t)},"act:limitSourceType":function(t){return e.limitSourceType(t)},"act:limitDestinationType":function(t){return e.limitDestinationType(t)}}})],1):e._e()],1),e._v(" "),n("div",{staticClass:"col-lg-4"},[n("amount",{attrs:{destination:t.destination_account,error:t.errors.amount,source:t.source_account,transactionType:e.transactionType},model:{value:t.amount,callback:function(n){e.$set(t,"amount",n)},expression:"transaction.amount"}}),e._v(" "),"reconciliation"!==e.transactionType.toLowerCase()?n("foreign-amount",{attrs:{destination:t.destination_account,error:t.errors.foreign_amount,no_currency:e.$t("firefly.none_in_select_list"),source:t.source_account,transactionType:e.transactionType,title:e.$t("form.foreign_amount")},model:{value:t.foreign_amount,callback:function(n){e.$set(t,"foreign_amount",n)},expression:"transaction.foreign_amount"}}):e._e()],1),e._v(" "),n("div",{staticClass:"col-lg-4"},[n("budget",{attrs:{error:t.errors.budget_id,no_budget:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.budget,callback:function(n){e.$set(t,"budget",n)},expression:"transaction.budget"}}),e._v(" "),n("category",{attrs:{error:t.errors.category,transactionType:e.transactionType},model:{value:t.category,callback:function(n){e.$set(t,"category",n)},expression:"transaction.category"}}),e._v(" "),n("tags",{attrs:{error:t.errors.tags,tags:t.tags,transactionType:e.transactionType},model:{value:t.tags,callback:function(n){e.$set(t,"tags",n)},expression:"transaction.tags"}}),e._v(" "),n("bill",{attrs:{error:t.errors.bill_id,no_bill:e.$t("firefly.none_in_select_list"),transactionType:e.transactionType},model:{value:t.bill,callback:function(n){e.$set(t,"bill",n)},expression:"transaction.bill"}}),e._v(" "),n("custom-transaction-fields",{attrs:{error:t.errors.custom_errors},model:{value:t.custom_fields,callback:function(n){e.$set(t,"custom_fields",n)},expression:"transaction.custom_fields"}})],1)])]),e._v(" "),e.transactions.length-1===a&&"reconciliation"!==e.transactionType.toLowerCase()?n("div",{staticClass:"box-footer"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.addTransaction}},[e._v(e._s(e.$t("firefly.add_another_split"))+"\n ")])]):e._e()])])])})),0),e._v(" "),e.transactions.length>1?n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("group-description",{attrs:{error:e.group_title_errors},model:{value:e.group_title,callback:function(t){e.group_title=t},expression:"group_title"}})],1)])])]):e._e(),e._v(" "),n("div",{staticClass:"row"},[n("div",{staticClass:"col-lg-6 col-md-6 col-sm-12 col-xs-12"},[n("div",{staticClass:"box"},[n("div",{staticClass:"box-header with-border"},[n("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.submission"))+"\n ")])]),e._v(" "),n("div",{staticClass:"box-body"},[n("div",{staticClass:"checkbox"},[n("label",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.returnAfter,expression:"returnAfter"}],attrs:{name:"return_after",type:"checkbox"},domProps:{checked:Array.isArray(e.returnAfter)?e._i(e.returnAfter,null)>-1:e.returnAfter},on:{change:function(t){var n=e.returnAfter,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.returnAfter=n.concat([null])):o>-1&&(e.returnAfter=n.slice(0,o).concat(n.slice(o+1)))}else e.returnAfter=i}}}),e._v("\n "+e._s(e.$t("firefly.after_update_create_another"))+"\n ")])]),e._v(" "),null!==e.transactionType&&"reconciliation"!==e.transactionType.toLowerCase()?n("div",{staticClass:"checkbox"},[n("label",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.storeAsNew,expression:"storeAsNew"}],attrs:{name:"store_as_new",type:"checkbox"},domProps:{checked:Array.isArray(e.storeAsNew)?e._i(e.storeAsNew,null)>-1:e.storeAsNew},on:{change:function(t){var n=e.storeAsNew,a=t.target,i=!!a.checked;if(Array.isArray(n)){var o=e._i(n,null);a.checked?o<0&&(e.storeAsNew=n.concat([null])):o>-1&&(e.storeAsNew=n.slice(0,o).concat(n.slice(o+1)))}else e.storeAsNew=i}}}),e._v("\n "+e._s(e.$t("firefly.store_as_new"))+"\n ")])]):e._e()]),e._v(" "),n("div",{staticClass:"box-footer"},[n("div",{staticClass:"btn-group"},[n("button",{staticClass:"btn btn-success",attrs:{id:"submitButton"},on:{click:e.submit}},[e._v(e._s(e.$t("firefly.update_transaction"))+"\n ")])])])])])])])}),[],!1,null,null,null).exports;const i=e({name:"CustomDate",props:{value:String,title:String,name:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.date.value)},hasError:function(){return this.error.length>0},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"date"},domProps:{value:e.value?e.value.substr(0,10):""},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const o=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},clearField:function(){this.name="",this.$refs.str.value="",this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"text"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const r=e({name:"CustomTextarea",props:{title:String,name:String,value:String,error:Array},data:function(){return{textValue:this.value}},methods:{handleInput:function(e){this.$emit("input",this.$refs.str.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.textValue,expression:"textValue"}],ref:"str",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",rows:"8"},domProps:{value:e.textValue},on:{input:[function(t){t.target.composing||(e.textValue=t.target.value)},e.handleInput]}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const s=e({props:["error","value","index"],name:"StandardDate",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.date.value)},clearDate:function(){this.name="",this.$refs.date.value="",this.$emit("input",this.$refs.date.value),this.$emit("clear:date")}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.date"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"date",staticClass:"form-control",attrs:{disabled:e.index>0,autocomplete:"off",name:"date[]",type:"date",placeholder:e.$t("firefly.date"),title:e.$t("firefly.date")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDate}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const l=e({props:["error","value","index"],name:"GroupDescription",methods:{hasError:function(){return this.error.length>0},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},clearField:function(){this.name="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value)}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{autocomplete:"off",name:"group_title",type:"text",placeholder:e.$t("firefly.split_transaction_title"),title:e.$t("firefly.split_transaction_title")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),0===e.error.length?n("p",{staticClass:"help-block"},[e._v("\n "+e._s(e.$t("firefly.split_transaction_title_help"))+"\n ")]):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const c=e({props:["error","value","index"],name:"TransactionDescription",mounted:function(){this.target=this.$refs.descr,this.descriptionAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/transactions?query=",this.$refs.descr.focus()},components:{},data:function(){return{descriptionAutoCompleteURI:null,name:null,description:null,target:null}},methods:{aSyncFunction:function(e,t){axios.get(this.descriptionAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.descr.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.description).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},search:function(e){return["ab","cd"]},hasError:function(){return this.error.length>0},clearDescription:function(){this.description="",this.$refs.descr.value="",this.$emit("input",this.$refs.descr.value),this.$emit("clear:description")},handleInput:function(e){this.$emit("input",this.$refs.descr.value)},handleEnter:function(e){e.keyCode},selectedItem:function(e){void 0!==this.name&&"string"!=typeof this.name&&(this.$refs.descr.value=this.name.description,this.$emit("input",this.$refs.descr.value))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.description"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"descr",staticClass:"form-control",attrs:{title:e.$t("firefly.description"),autocomplete:"off",name:"description[]",type:"text",placeholder:e.$t("firefly.description")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearDescription}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"description"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const u=e({name:"CustomTransactionFields",props:["value","error"],mounted:function(){this.getPreference()},data:function(){return{customInterestDate:null,fields:[{interest_date:!1,book_date:!1,process_date:!1,due_date:!1,payment_date:!1,invoice_date:!1,internal_reference:!1,notes:!1,attachments:!1,external_uri:!1}]}},computed:{dateComponent:function(){return"custom-date"},stringComponent:function(){return"custom-string"},attachmentComponent:function(){return"custom-attachments"},textareaComponent:function(){return"custom-textarea"},uriComponent:function(){return"custom-uri"}},methods:{handleInput:function(e){this.$emit("input",this.value)},getPreference:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/preferences/transaction_journal_optional_fields";axios.get(t).then((function(t){e.fields=t.data.data.attributes.data})).catch((function(){return console.warn("Oh. Something went wrong loading custom transaction fields.")}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.hidden_fields_preferences"))}}),e._v(" "),this.fields.interest_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.interest_date,name:"interest_date[]",title:e.$t("form.interest_date")},model:{value:e.value.interest_date,callback:function(t){e.$set(e.value,"interest_date",t)},expression:"value.interest_date"}}):e._e(),e._v(" "),this.fields.book_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.book_date,name:"book_date[]",title:e.$t("form.book_date")},model:{value:e.value.book_date,callback:function(t){e.$set(e.value,"book_date",t)},expression:"value.book_date"}}):e._e(),e._v(" "),this.fields.process_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.process_date,name:"process_date[]",title:e.$t("form.process_date")},model:{value:e.value.process_date,callback:function(t){e.$set(e.value,"process_date",t)},expression:"value.process_date"}}):e._e(),e._v(" "),this.fields.due_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.due_date,name:"due_date[]",title:e.$t("form.due_date")},model:{value:e.value.due_date,callback:function(t){e.$set(e.value,"due_date",t)},expression:"value.due_date"}}):e._e(),e._v(" "),this.fields.payment_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.payment_date,name:"payment_date[]",title:e.$t("form.payment_date")},model:{value:e.value.payment_date,callback:function(t){e.$set(e.value,"payment_date",t)},expression:"value.payment_date"}}):e._e(),e._v(" "),this.fields.invoice_date?n(e.dateComponent,{tag:"component",attrs:{error:e.error.invoice_date,name:"invoice_date[]",title:e.$t("form.invoice_date")},model:{value:e.value.invoice_date,callback:function(t){e.$set(e.value,"invoice_date",t)},expression:"value.invoice_date"}}):e._e(),e._v(" "),this.fields.internal_reference?n(e.stringComponent,{tag:"component",attrs:{error:e.error.internal_reference,name:"internal_reference[]",title:e.$t("form.internal_reference")},model:{value:e.value.internal_reference,callback:function(t){e.$set(e.value,"internal_reference",t)},expression:"value.internal_reference"}}):e._e(),e._v(" "),this.fields.attachments?n(e.attachmentComponent,{tag:"component",attrs:{error:e.error.attachments,name:"attachments[]",title:e.$t("firefly.attachments")},model:{value:e.value.attachments,callback:function(t){e.$set(e.value,"attachments",t)},expression:"value.attachments"}}):e._e(),e._v(" "),this.fields.external_uri?n(e.uriComponent,{tag:"component",attrs:{error:e.error.external_uri,name:"external_uri[]",title:e.$t("firefly.external_uri")},model:{value:e.value.external_uri,callback:function(t){e.$set(e.value,"external_uri",t)},expression:"value.external_uri"}}):e._e(),e._v(" "),this.fields.notes?n(e.textareaComponent,{tag:"component",attrs:{error:e.error.notes,name:"notes[]",title:e.$t("firefly.notes")},model:{value:e.value.notes,callback:function(t){e.$set(e.value,"notes",t)},expression:"value.notes"}}):e._e()],1)}),[],!1,null,null,null).exports;const d=e({name:"PiggyBank",props:["value","transactionType","error","no_piggy_bank"],mounted:function(){this.loadPiggies()},data:function(){return{piggies:[]}},methods:{handleInput:function(e){this.$emit("input",this.$refs.piggy.value)},hasError:function(){return this.error.length>0},loadPiggies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/piggy-banks-with-balance?limit=1337";axios.get(t,{}).then((function(t){var n={0:{group:{title:e.$t("firefly.default_group_title_name")},piggies:[{name_with_balance:e.no_piggy_bank,id:0}]}};for(var a in t.data)if(t.data.hasOwnProperty(a)&&/^0$|^[1-9]\d*$/.test(a)&&a<=4294967294){var i=t.data[a];if(i.objectGroup){var o=i.objectGroup.order;n[o]||(n[o]={group:{title:i.objectGroup.title},piggies:[]}),n[o].piggies.push({name_with_balance:i.name_with_balance,id:i.id})}i.objectGroup||n[0].piggies.push({name_with_balance:i.name_with_balance,id:i.id}),e.piggies.push(t.data[a])}var r={};Object.keys(n).sort().forEach((function(e){var t=n[e].group.title;r[t]=n[e]})),e.piggies=r}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0!==this.transactionType&&"Transfer"===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.piggy_bank"))+"\n\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("select",{ref:"piggy",staticClass:"form-control",attrs:{name:"piggy_bank[]"},on:{input:e.handleInput}},e._l(this.piggies,(function(t,a){return n("optgroup",{attrs:{label:a}},e._l(t.piggies,(function(t){return n("option",{attrs:{label:t.name_with_balance},domProps:{value:t.id}},[e._v("\n "+e._s(t.name_with_balance)+"\n ")])})),0)})),0),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;var _=n(9669),p=n.n(_),f=n(7010);const h=e({name:"Tags",components:{VueTagsInput:n.n(f)()},props:["value","error"],data:function(){return{tag:"",autocompleteItems:[],debounce:null,tags:this.value}},watch:{tag:"initItems"},methods:{update:function(e){this.autocompleteItems=[],this.tags=e,this.$emit("input",this.tags)},clearTags:function(){this.tags=[]},hasError:function(){return this.error.length>0},initItems:function(){var e=this;if(!(this.tag.length<2)){var t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/tags?query=".concat(this.tag);clearTimeout(this.debounce),this.debounce=setTimeout((function(){p().get(t).then((function(t){e.autocompleteItems=t.data.map((function(e){return{text:e.tag}}))})).catch((function(){return console.warn("Oh. Something went wrong loading tags.")}))}),600)}}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.tags"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("vue-tags-input",{attrs:{"add-only-from-autocomplete":!1,"autocomplete-items":e.autocompleteItems,tags:e.tags,title:e.$t("firefly.tags"),classes:"form-input",placeholder:e.$t("firefly.tags")},on:{"tags-changed":e.update},model:{value:e.tag,callback:function(t){e.tag=t},expression:"tag"}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearTags}},[n("i",{staticClass:"fa fa-trash-o"})])])],1)]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const A=e({name:"Category",props:{value:String,inputName:String,error:Array,accountName:{type:String,default:""}},data:function(){return{categoryAutoCompleteURI:null,name:null,target:null,acKey:null}},ready:function(){this.name=this.accountName,this.acKey="name"},mounted:function(){this.target=this.$refs.input,this.categoryAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/categories?query="},methods:{hasError:function(){return this.error.length>0},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name).replace(new RegExp(""+t,"i"),"$&")},aSyncFunction:function(e,t){axios.get(this.categoryAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},handleInput:function(e){"string"!=typeof this.$refs.input.value?this.$emit("input",this.$refs.input.value.name):this.$emit("input",this.$refs.input.value)},clearCategory:function(){this.name="",this.$refs.input.value="",this.$emit("input",this.$refs.input.value),this.$emit("clear:category")},selectedItem:function(e){void 0!==this.name&&(this.$emit("select:category",this.name),"string"!=typeof this.name?this.$emit("input",this.name.name):this.$emit("input",this.name))},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.category"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{autocomplete:"off","data-role":"input",name:"category[]",type:"text",placeholder:e.$t("firefly.category"),title:e.$t("firefly.category")},domProps:{value:e.value},on:{input:e.handleInput,keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{type:"button"},on:{click:e.clearCategory}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{ref:"typea",attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const g=e({name:"Amount",props:["source","destination","transactionType","value","error"],data:function(){return{sourceAccount:this.source,destinationAccount:this.destination,type:this.transactionType}},methods:{handleInput:function(e){this.$emit("input",this.$refs.amount.value)},clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},changeData:function(){var e=this.transactionType;e||this.source.name||this.destination.name?(null===e&&(e=""),""!==e||""===this.source.currency_name?""!==e||""===this.destination.currency_name?"withdrawal"!==e.toLowerCase()&&"reconciliation"!==e.toLowerCase()&&"transfer"!==e.toLowerCase()?("deposit"===e.toLowerCase()&&"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()&&$(this.$refs.cur).text(this.destination.currency_name),"deposit"!==e.toLowerCase()||"debt"!==this.source.type.toLowerCase()&&"loan"!==this.source.type.toLowerCase()&&"mortgage"!==this.source.type.toLowerCase()||$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text(this.source.currency_name):$(this.$refs.cur).text(this.destination.currency_name):$(this.$refs.cur).text(this.source.currency_name)):$(this.$refs.cur).text("")}},watch:{source:function(){this.changeData()},value:function(){},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},mounted:function(){this.changeData()}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("firefly.amount"))+"\n ")]),e._v(" "),n("label",{ref:"cur",staticClass:"col-sm-4 control-label"}),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[n("input",{ref:"amount",staticClass:"form-control",attrs:{title:e.$t("firefly.amount"),autocomplete:"off",name:"amount[]",step:"any",type:"number",placeholder:e.$t("firefly.amount")},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)}),[],!1,null,null,null).exports;const m=e({name:"ForeignAmountSelect",props:["source","destination","transactionType","value","error","no_currency","title"],mounted:function(){this.liability=!1,this.loadCurrencies()},data:function(){return{currencies:[],enabledCurrencies:[],exclude:null,liability:!1}},watch:{source:function(){this.changeData()},destination:function(){this.changeData()},transactionType:function(){this.changeData()}},methods:{clearAmount:function(){this.$refs.amount.value="",this.$emit("input",this.$refs.amount.value),this.$emit("clear:amount")},hasError:function(){return this.error.length>0},handleInput:function(e){var t={amount:this.$refs.amount.value,currency_id:this.$refs.currency_select.value};this.$emit("input",t)},changeData:function(){this.enabledCurrencies=[];var e=this.destination.type?this.destination.type.toLowerCase():"invalid",t=this.source.type?this.source.type.toLowerCase():"invalid",n=this.transactionType?this.transactionType.toLowerCase():"invalid",a=["loan","debt","mortgage"],i=-1!==a.indexOf(t),o=-1!==a.indexOf(e);if("transfer"===n||o||i)for(var r in this.liability=!0,this.currencies)this.currencies.hasOwnProperty(r)&&/^0$|^[1-9]\d*$/.test(r)&&r<=4294967294&&parseInt(this.currencies[r].id)===parseInt(this.destination.currency_id)&&this.enabledCurrencies.push(this.currencies[r]);else if("withdrawal"===n&&this.source&&!1===i)for(var s in this.currencies)this.currencies.hasOwnProperty(s)&&/^0$|^[1-9]\d*$/.test(s)&&s<=4294967294&&this.source.currency_id!==this.currencies[s].id&&this.enabledCurrencies.push(this.currencies[s]);else if("deposit"===n&&this.destination)for(var l in this.currencies)this.currencies.hasOwnProperty(l)&&/^0$|^[1-9]\d*$/.test(l)&&l<=4294967294&&this.destination.currency_id!==this.currencies[l].id&&this.enabledCurrencies.push(this.currencies[l]);else for(var c in this.currencies)this.currencies.hasOwnProperty(c)&&/^0$|^[1-9]\d*$/.test(c)&&c<=4294967294&&this.enabledCurrencies.push(this.currencies[c])},loadCurrencies:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/currencies";axios.get(t,{}).then((function(t){for(var n in e.currencies=[{id:0,attributes:{name:e.no_currency,enabled:!0}}],e.enabledCurrencies=[{attributes:{name:e.no_currency,enabled:!0},id:0}],t.data.data)t.data.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&t.data.data[n].attributes.enabled&&(e.currencies.push(t.data.data[n]),e.enabledCurrencies.push(t.data.data[n]))}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return this.enabledCurrencies.length>=1?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-8 col-sm-offset-4 text-sm"},[e._v("\n "+e._s(e.$t("form.foreign_amount"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-4"},[n("select",{ref:"currency_select",staticClass:"form-control",attrs:{name:"foreign_currency[]"},on:{input:e.handleInput}},e._l(this.enabledCurrencies,(function(t){return n("option",{attrs:{label:t.attributes.name},domProps:{selected:parseInt(e.value.currency_id)===parseInt(t.id),value:t.id}},[e._v("\n "+e._s(t.attributes.name)+"\n ")])})),0)]),e._v(" "),n("div",{staticClass:"col-sm-8"},[n("div",{staticClass:"input-group"},[this.enabledCurrencies.length>0?n("input",{ref:"amount",staticClass:"form-control",attrs:{placeholder:this.title,title:this.title,autocomplete:"off",name:"foreign_amount[]",step:"any",type:"number"},domProps:{value:e.value.amount},on:{input:e.handleInput}}):e._e(),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearAmount}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const v=e({props:{source:String,destination:String,type:String},methods:{changeValue:function(){if(this.source&&this.destination){var e="";window.accountToTypes[this.source]?window.accountToTypes[this.source][this.destination]?e=window.accountToTypes[this.source][this.destination]:console.warn("User selected an impossible destination."):console.warn("User selected an impossible source."),""!==e&&(this.transactionType=e,this.sentence=this.$t("firefly.you_create_"+e.toLowerCase()),this.$emit("act:limitSourceType",this.source),this.$emit("act:limitDestinationType",this.destination))}else this.sentence="",this.transactionType="";this.$emit("set:transactionType",this.transactionType)}},data:function(){return{transactionType:this.type,sentence:""}},watch:{source:function(){this.changeValue()},destination:function(){this.changeValue()}},name:"TransactionType"},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group"},[n("div",{staticClass:"col-sm-12"},[""!==e.sentence?n("label",{staticClass:"control-label text-info"},[e._v("\n "+e._s(e.sentence)+"\n ")]):e._e()])])}),[],!1,null,null,null).exports;const b=e({props:{inputName:String,inputDescription:String,index:Number,transactionType:String,error:Array,accountName:{type:String,default:""},accountTypeFilters:{type:Array,default:function(){return[]}},defaultAccountTypeFilters:{type:Array,default:function(){return[]}}},data:function(){return{accountAutoCompleteURI:null,name:null,trType:this.transactionType,target:null,inputDisabled:!1,allowedTypes:this.accountTypeFilters,defaultAllowedTypes:this.defaultAccountTypeFilters}},ready:function(){this.name=this.accountName},mounted:function(){this.target=this.$refs.input,this.updateACURI(this.allowedTypes.join(",")),this.name=this.accountName,this.triggerTransactionType()},watch:{transactionType:function(){this.triggerTransactionType()},accountName:function(){this.name=this.accountName},accountTypeFilters:function(){var e=this.accountTypeFilters.join(",");0===this.accountTypeFilters.length&&(e=this.defaultAccountTypeFilters.join(",")),this.updateACURI(e)}},methods:{aSyncFunction:function(e,t){axios.get(this.accountAutoCompleteURI+e).then((function(e){t(e.data)})).catch((function(e){}))},betterHighlight:function(e){var t=this.$refs.input.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");return this.escapeHtml(e.name_with_balance).replace(new RegExp(""+t,"i"),"$&")},escapeHtml:function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(e).replace(/[&<>"'`=\/]/g,(function(e){return t[e]}))},updateACURI:function(e){this.accountAutoCompleteURI=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/accounts?types="+e+"&query="},hasError:function(){return this.error.length>0},triggerTransactionType:function(){if(this.name,null!==this.transactionType&&""!==this.transactionType&&(this.inputDisabled=!1,""!==this.transactionType.toString()&&this.index>0)){if("transfer"===this.transactionType.toString().toLowerCase())return void(this.inputDisabled=!0);if("withdrawal"===this.transactionType.toString().toLowerCase()&&"source"===this.inputName.substr(0,6).toLowerCase())return void(this.inputDisabled=!0);"deposit"===this.transactionType.toString().toLowerCase()&&"destination"===this.inputName.substr(0,11).toLowerCase()&&(this.inputDisabled=!0)}},selectedItem:function(e){void 0!==this.name&&("string"==typeof this.name&&this.$emit("clear:value"),this.$emit("select:account",this.name))},clearSource:function(e){this.name="",this.$emit("clear:value")},handleEnter:function(e){e.keyCode}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.inputDescription)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"input",staticClass:"form-control",attrs:{"data-index":e.index,disabled:e.inputDisabled,name:e.inputName,placeholder:e.inputDescription,title:e.inputDescription,autocomplete:"off","data-role":"input",type:"text"},on:{keypress:e.handleEnter,submit:function(e){e.preventDefault()}}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearSource}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),n("typeahead",{attrs:{"async-function":e.aSyncFunction,"open-on-empty":!0,"open-on-focus":!0,target:e.target,"item-key":"name_with_balance"},on:{input:e.selectedItem},scopedSlots:e._u([{key:"item",fn:function(t){return e._l(t.items,(function(a,i){return n("li",{class:{active:t.activeIndex===i}},[n("a",{attrs:{role:"button"},on:{click:function(e){return t.select(a)}}},[n("span",{domProps:{innerHTML:e._s(e.betterHighlight(a))}})])])}))}}]),model:{value:e.name,callback:function(t){e.name=t},expression:"name"}}),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const y=e({name:"Budget",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_budget:String},mounted:function(){this.loadBudgets()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,budgets:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.budget.value)},handleInput:function(e){this.$emit("input",this.$refs.budget.value)},hasError:function(){return this.error.length>0},loadBudgets:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/budgets?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.budgets=[{name:e.no_budget,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.budgets.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.budget"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.budgets.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"budget",staticClass:"form-control",attrs:{title:e.$t("firefly.budget"),name:"budget[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.budgets,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.budgets.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_budget_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;const k=e({name:"CustomString",props:{title:String,name:String,value:String,error:Array},methods:{handleInput:function(e){this.$emit("input",this.$refs.uri.value)},clearField:function(){this.name="",this.$refs.uri.value="",this.$emit("input",this.$refs.uri.value)},hasError:function(){return this.error.length>0}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.title)+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[n("div",{staticClass:"input-group"},[n("input",{ref:"uri",staticClass:"form-control",attrs:{name:e.name,placeholder:e.title,title:e.title,autocomplete:"off",type:"url"},domProps:{value:e.value},on:{input:e.handleInput}}),e._v(" "),n("span",{staticClass:"input-group-btn"},[n("button",{staticClass:"btn btn-default",attrs:{tabIndex:"-1",type:"button"},on:{click:e.clearField}},[n("i",{staticClass:"fa fa-trash-o"})])])]),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)])}),[],!1,null,null,null).exports;const w=e({name:"Bill",props:{transactionType:String,value:{type:[String,Number],default:0},error:Array,no_bill:String},mounted:function(){this.loadBills()},data:function(){var e;return{selected:null!==(e=this.value)&&void 0!==e?e:0,bills:[]}},watch:{value:function(){this.selected=this.value}},methods:{signalChange:function(e){this.$emit("input",this.$refs.bill.value)},handleInput:function(e){this.$emit("input",this.$refs.bill.value)},hasError:function(){return this.error.length>0},loadBills:function(){var e=this,t=document.getElementsByTagName("base")[0].href+"api/v1/autocomplete/bills?limit=1337";axios.get(t,{}).then((function(t){for(var n in e.bills=[{name:e.no_bill,id:0}],t.data)t.data.hasOwnProperty(n)&&/^0$|^[1-9]\d*$/.test(n)&&n<=4294967294&&e.bills.push(t.data[n])}))}}},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return void 0===this.transactionType||"withdrawal"===this.transactionType||"Withdrawal"===this.transactionType||""===this.transactionType||null===this.transactionType?n("div",{staticClass:"form-group",class:{"has-error":e.hasError()}},[n("div",{staticClass:"col-sm-12 text-sm"},[e._v("\n "+e._s(e.$t("firefly.bill"))+"\n ")]),e._v(" "),n("div",{staticClass:"col-sm-12"},[this.bills.length>0?n("select",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],ref:"bill",staticClass:"form-control",attrs:{title:e.$t("firefly.bill"),name:"bill[]"},on:{input:e.handleInput,change:[function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.selected=t.target.multiple?n:n[0]},e.signalChange]}},e._l(this.bills,(function(t){return n("option",{attrs:{label:t.name},domProps:{value:t.id}},[e._v(e._s(t.name)+"\n ")])})),0):e._e(),e._v(" "),1===this.bills.length?n("p",{staticClass:"help-block",domProps:{innerHTML:e._s(e.$t("firefly.no_bill_pointer"))}}):e._e(),e._v(" "),e._l(this.error,(function(t){return n("ul",{staticClass:"list-unstyled"},[n("li",{staticClass:"text-danger"},[e._v(e._s(t))])])}))],2)]):e._e()}),[],!1,null,null,null).exports;n(9703),Vue.component("budget",y),Vue.component("bill",w),Vue.component("custom-date",i),Vue.component("custom-string",o),Vue.component("custom-attachments",t),Vue.component("custom-textarea",r),Vue.component("custom-uri",k),Vue.component("standard-date",s),Vue.component("group-description",l),Vue.component("transaction-description",c),Vue.component("custom-transaction-fields",u),Vue.component("piggy-bank",d),Vue.component("tags",h),Vue.component("category",A),Vue.component("amount",g),Vue.component("foreign-amount",m),Vue.component("transaction-type",v),Vue.component("account-select",b),Vue.component("edit-transaction",a);var C=n(5299),z={};new Vue({i18n:C,el:"#edit_transaction",render:function(e){return e(a,{props:z})}})})()})(); \ No newline at end of file diff --git a/public/v1/js/profile.js b/public/v1/js/profile.js index 8f05d0e941..d5affce64a 100644 --- a/public/v1/js/profile.js +++ b/public/v1/js/profile.js @@ -1 +1 @@ -(()=>{var e={9669:(e,t,a)=>{e.exports=a(1609)},5448:(e,t,a)=>{"use strict";var n=a(4867),o=a(6026),i=a(4372),r=a(5327),s=a(4097),l=a(4109),c=a(7985),_=a(5061);e.exports=function(e){return new Promise((function(t,a){var u=e.data,d=e.headers;n.isFormData(u)&&delete d["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var f=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(f+":"+h)}var m=s(e.baseURL,e.url);if(p.open(e.method.toUpperCase(),r(m,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in p?l(p.getAllResponseHeaders()):null,i={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:n,config:e,request:p};o(t,a,i),p=null}},p.onabort=function(){p&&(a(_("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){a(_("Network Error",e,null,p)),p=null},p.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),a(_(t,e,"ECONNABORTED",p)),p=null},n.isStandardBrowserEnv()){var g=(e.withCredentials||c(m))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in p&&n.forEach(d,(function(e,t){void 0===u&&"content-type"===t.toLowerCase()?delete d[t]:p.setRequestHeader(t,e)})),n.isUndefined(e.withCredentials)||(p.withCredentials=!!e.withCredentials),e.responseType)try{p.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),a(e),p=null)})),u||(u=null),p.send(u)}))}},1609:(e,t,a)=>{"use strict";var n=a(4867),o=a(1849),i=a(321),r=a(7185);function s(e){var t=new i(e),a=o(i.prototype.request,t);return n.extend(a,i.prototype,t),n.extend(a,t),a}var l=s(a(5655));l.Axios=i,l.create=function(e){return s(r(l.defaults,e))},l.Cancel=a(5263),l.CancelToken=a(4972),l.isCancel=a(6502),l.all=function(e){return Promise.all(e)},l.spread=a(8713),l.isAxiosError=a(6268),e.exports=l,e.exports.default=l},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,a)=>{"use strict";var n=a(5263);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var a=this;e((function(e){a.reason||(a.reason=new n(e),t(a.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,a)=>{"use strict";var n=a(4867),o=a(5327),i=a(782),r=a(3572),s=a(7185);function l(e){this.defaults=e,this.interceptors={request:new i,response:new i}}l.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[r,void 0],a=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)a=a.then(t.shift(),t.shift());return a},l.prototype.getUri=function(e){return e=s(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},n.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,a){return this.request(s(a||{},{method:e,url:t,data:(a||{}).data}))}})),n.forEach(["post","put","patch"],(function(e){l.prototype[e]=function(t,a,n){return this.request(s(n||{},{method:e,url:t,data:a}))}})),e.exports=l},782:(e,t,a)=>{"use strict";var n=a(4867);function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){n.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},4097:(e,t,a)=>{"use strict";var n=a(1793),o=a(7303);e.exports=function(e,t){return e&&!n(t)?o(e,t):t}},5061:(e,t,a)=>{"use strict";var n=a(481);e.exports=function(e,t,a,o,i){var r=new Error(e);return n(r,t,a,o,i)}},3572:(e,t,a)=>{"use strict";var n=a(4867),o=a(8527),i=a(6502),r=a(5655);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=n.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),n.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||r.adapter)(e).then((function(t){return s(e),t.data=o(t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(s(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,a,n,o){return e.config=t,a&&(e.code=a),e.request=n,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,a)=>{"use strict";var n=a(4867);e.exports=function(e,t){t=t||{};var a={},o=["url","method","data"],i=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function l(e,t){return n.isPlainObject(e)&&n.isPlainObject(t)?n.merge(e,t):n.isPlainObject(t)?n.merge({},t):n.isArray(t)?t.slice():t}function c(o){n.isUndefined(t[o])?n.isUndefined(e[o])||(a[o]=l(void 0,e[o])):a[o]=l(e[o],t[o])}n.forEach(o,(function(e){n.isUndefined(t[e])||(a[e]=l(void 0,t[e]))})),n.forEach(i,c),n.forEach(r,(function(o){n.isUndefined(t[o])?n.isUndefined(e[o])||(a[o]=l(void 0,e[o])):a[o]=l(void 0,t[o])})),n.forEach(s,(function(n){n in t?a[n]=l(e[n],t[n]):n in e&&(a[n]=l(void 0,e[n]))}));var _=o.concat(i).concat(r).concat(s),u=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===_.indexOf(e)}));return n.forEach(u,c),a}},6026:(e,t,a)=>{"use strict";var n=a(5061);e.exports=function(e,t,a){var o=a.config.validateStatus;a.status&&o&&!o(a.status)?t(n("Request failed with status code "+a.status,a.config,null,a.request,a)):e(a)}},8527:(e,t,a)=>{"use strict";var n=a(4867);e.exports=function(e,t,a){return n.forEach(a,(function(a){e=a(e,t)})),e}},5655:(e,t,a)=>{"use strict";var n=a(4155),o=a(4867),i=a(6016),r={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!o.isUndefined(e)&&o.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==n&&"[object process]"===Object.prototype.toString.call(n))&&(l=a(5448)),l),transformRequest:[function(e,t){return i(t,"Accept"),i(t,"Content-Type"),o.isFormData(e)||o.isArrayBuffer(e)||o.isBuffer(e)||o.isStream(e)||o.isFile(e)||o.isBlob(e)?e:o.isArrayBufferView(e)?e.buffer:o.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):o.isObject(e)?(s(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},o.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),o.forEach(["post","put","patch"],(function(e){c.headers[e]=o.merge(r)})),e.exports=c},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var a=new Array(arguments.length),n=0;n{"use strict";var n=a(4867);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,a){if(!t)return e;var i;if(a)i=a(t);else if(n.isURLSearchParams(t))i=t.toString();else{var r=[];n.forEach(t,(function(e,t){null!=e&&(n.isArray(e)?t+="[]":e=[e],n.forEach(e,(function(e){n.isDate(e)?e=e.toISOString():n.isObject(e)&&(e=JSON.stringify(e)),r.push(o(t)+"="+o(e))})))})),i=r.join("&")}if(i){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,a)=>{"use strict";var n=a(4867);e.exports=n.isStandardBrowserEnv()?{write:function(e,t,a,o,i,r){var s=[];s.push(e+"="+encodeURIComponent(t)),n.isNumber(a)&&s.push("expires="+new Date(a).toGMTString()),n.isString(o)&&s.push("path="+o),n.isString(i)&&s.push("domain="+i),!0===r&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,a)=>{"use strict";var n=a(4867);e.exports=n.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),a=document.createElement("a");function o(e){var n=e;return t&&(a.setAttribute("href",n),n=a.href),a.setAttribute("href",n),{href:a.href,protocol:a.protocol?a.protocol.replace(/:$/,""):"",host:a.host,search:a.search?a.search.replace(/^\?/,""):"",hash:a.hash?a.hash.replace(/^#/,""):"",hostname:a.hostname,port:a.port,pathname:"/"===a.pathname.charAt(0)?a.pathname:"/"+a.pathname}}return e=o(window.location.href),function(t){var a=n.isString(t)?o(t):t;return a.protocol===e.protocol&&a.host===e.host}}():function(){return!0}},6016:(e,t,a)=>{"use strict";var n=a(4867);e.exports=function(e,t){n.forEach(e,(function(a,n){n!==t&&n.toUpperCase()===t.toUpperCase()&&(e[t]=a,delete e[n])}))}},4109:(e,t,a)=>{"use strict";var n=a(4867),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,a,i,r={};return e?(n.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=n.trim(e.substr(0,i)).toLowerCase(),a=n.trim(e.substr(i+1)),t){if(r[t]&&o.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([a]):r[t]?r[t]+", "+a:a}})),r):r}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4867:(e,t,a)=>{"use strict";var n=a(1849),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function r(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==o.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===o.call(e)}function _(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),i(e))for(var a=0,n=e.length;a{window.axios=a(9669),window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var n=document.head.querySelector('meta[name="csrf-token"]');n?window.axios.defaults.headers.common["X-CSRF-TOKEN"]=n.content:console.error("CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token")},5299:(e,t,a)=>{e.exports=new vuei18n({locale:document.documentElement.lang,fallbackLocale:"en",messages:{bg:a(987),cs:a(6054),de:a(7062),en:a(6886),"en-us":a(6886),"en-gb":a(5642),es:a(2360),el:a(1410),fr:a(6833),hu:a(6477),it:a(3092),nl:a(78),nb:a(2502),pl:a(8691),fi:a(3684),"pt-br":a(122),"pt-pt":a(4895),ro:a(403),ru:a(7448),"zh-tw":a(4963),"zh-cn":a(1922),sk:a(6949),sv:a(2285),vi:a(9783)}})},1954:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(3645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,".action-link[data-v-da1c7f80]{cursor:pointer}",""]);const i=o},4130:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(3645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,".action-link[data-v-5006d7a4]{cursor:pointer}",""]);const i=o},1672:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(3645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,".action-link[data-v-5b4ee38c]{cursor:pointer}",""]);const i=o},3645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var a=e(t);return t[2]?"@media ".concat(t[2]," {").concat(a,"}"):a})).join("")},t.i=function(e,a,n){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(n)for(var i=0;i{var t,a,n=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function r(e){if(t===setTimeout)return setTimeout(e,0);if((t===o||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(a){try{return t.call(null,e,0)}catch(a){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:o}catch(e){t=o}try{a="function"==typeof clearTimeout?clearTimeout:i}catch(e){a=i}}();var s,l=[],c=!1,_=-1;function u(){c&&s&&(c=!1,s.length?l=s.concat(l):_=-1,l.length&&d())}function d(){if(!c){var e=r(u);c=!0;for(var t=l.length;t;){for(s=l,l=[];++_1)for(var a=1;a{"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},i=function(){var e={};return function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(e){a=null}e[t]=a}return e[t]}}(),r=[];function s(e){for(var t=-1,a=0;a{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Какво се случва?","flash_error":"Грешка!","flash_success":"Успех!","close":"Затвори","split_transaction_title":"Описание на разделена транзакция","errors_submission":"Имаше нещо нередно с вашите данни. Моля, проверете грешките.","split":"Раздели","single_split":"Раздел","transaction_stored_link":"Транзакция #{ID}(\\"{title}\\") беше записана.","transaction_updated_link":"Транзакция #{ID} беше обновена.","transaction_new_stored_link":"Транзакция #{ID} беше записана.","transaction_journal_information":"Информация за транзакция","no_budget_pointer":"Изглежда все още нямате бюджети. Трябва да създадете някои на страницата Бюджети . Бюджетите могат да ви помогнат да следите разходите си.","no_bill_pointer":"Изглежда все още нямате сметки. Трябва да създадете някои на страницата Сметки . Сметките могат да ви помогнат да следите разходите си.","source_account":"Разходна сметка","hidden_fields_preferences":"Можете да активирате повече опции за транзакции във вашите настройки.","destination_account":"Приходна сметка","add_another_split":"Добавяне на друг раздел","submission":"Изпращане","create_another":"След съхраняването се върнете тук, за да създадете нова.","reset_after":"Изчистване на формуляра след изпращане","submit":"Потвърди","amount":"Сума","date":"Дата","tags":"Етикети","no_budget":"(без бюджет)","no_bill":"(няма сметка)","category":"Категория","attachments":"Прикачени файлове","notes":"Бележки","external_uri":"External URL","update_transaction":"Обнови транзакцията","after_update_create_another":"След обновяването се върнете тук, за да продължите с редакцията.","store_as_new":"Съхранете като нова транзакция, вместо да я актуализирате.","split_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","none_in_select_list":"(нищо)","no_piggy_bank":"(без касичка)","description":"Описание","split_transaction_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","destination_account_reconciliation":"Не може да редактирате приходната сметка на транзакция за съгласуване.","source_account_reconciliation":"Не може да редактирате разходната сметка на транзакция за съгласуване.","budget":"Бюджет","bill":"Сметка","you_create_withdrawal":"Създавате теглене.","you_create_transfer":"Създавате прехвърляне.","you_create_deposit":"Създавате депозит.","edit":"Промени","delete":"Изтрий","name":"Име","profile_whoops":"Опаааа!","profile_something_wrong":"Нещо се обърка!","profile_try_again":"Нещо се обърка. Моля, опитайте отново.","profile_oauth_clients":"OAuth клиенти","profile_oauth_no_clients":"Не сте създали клиенти на OAuth.","profile_oauth_clients_header":"Клиенти","profile_oauth_client_id":"ИД (ID) на клиент","profile_oauth_client_name":"Име","profile_oauth_client_secret":"Тайна","profile_oauth_create_new_client":"Създай нов клиент","profile_oauth_create_client":"Създай клиент","profile_oauth_edit_client":"Редактирай клиент","profile_oauth_name_help":"Нещо, което вашите потребители ще разпознаят и ще се доверят.","profile_oauth_redirect_url":"Линк на препратката","profile_oauth_redirect_url_help":"URL адрес за обратно извикване на оторизацията на вашето приложение.","profile_authorized_apps":"Удостоверени приложения","profile_authorized_clients":"Удостоверени клиенти","profile_scopes":"Сфери","profile_revoke":"Анулирай","profile_personal_access_tokens":"Персонални маркери за достъп","profile_personal_access_token":"Персонален маркер за достъп","profile_personal_access_token_explanation":"Това е новия ви персонален маркер за достъп. Това е единственият път, когато ще бъде показан, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_no_personal_access_token":"Не сте създали никакви лични маркери за достъп.","profile_create_new_token":"Създай нов маркер","profile_create_token":"Създай маркер","profile_create":"Създай","profile_save_changes":"Запазване на промените","default_group_title_name":"(без група)","piggy_bank":"Касичка","profile_oauth_client_secret_title":"Тайна на клиента","profile_oauth_client_secret_expl":"Това е новата ви \\"тайна на клиента\\". Това е единственият път, когато ще бъде показана, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_oauth_confidential":"Поверително","profile_oauth_confidential_help":"Изисквайте клиента да се удостоверява с тайна. Поверителните клиенти могат да притежават идентификационни данни по защитен начин, без да ги излагат на неоторизирани страни. Публичните приложения, като например десктопа или JavaScript SPA приложения, не могат да пазят тайни по сигурен начин.","multi_account_warning_unknown":"В зависимост от вида на транзакцията която създавате, източникът и / или целевата сметка на следващите разделяния може да бъде променена от това което е дефинирано в първото разделение на транзакцията.","multi_account_warning_withdrawal":"Имайте предвид, че разходна сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на тегленето.","multi_account_warning_deposit":"Имайте предвид, че приходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на депозита.","multi_account_warning_transfer":"Имайте предвид, че приходната + разходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на прехвърлянето."},"form":{"interest_date":"Падеж на лихва","book_date":"Дата на осчетоводяване","process_date":"Дата на обработка","due_date":"Дата на падеж","foreign_amount":"Сума във валута","payment_date":"Дата на плащане","invoice_date":"Дата на фактура","internal_reference":"Вътрешна референция"},"config":{"html_language":"bg"}}')},6054:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Jak to jde?","flash_error":"Chyba!","flash_success":"Úspěšně dokončeno!","close":"Zavřít","split_transaction_title":"Popis rozúčtování","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Rozdělit","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Informace o transakci","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Zdrojový účet","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Cílový účet","add_another_split":"Přidat další rozúčtování","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Odeslat","amount":"Částka","date":"Datum","tags":"Štítky","no_budget":"(žádný rozpočet)","no_bill":"(no bill)","category":"Kategorie","attachments":"Přílohy","notes":"Poznámky","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.","none_in_select_list":"(žádné)","no_piggy_bank":"(žádná pokladnička)","description":"Popis","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Upravit","delete":"Odstranit","name":"Název","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Úrokové datum","book_date":"Datum rezervace","process_date":"Datum zpracování","due_date":"Datum splatnosti","foreign_amount":"Částka v cizí měně","payment_date":"Datum zaplacení","invoice_date":"Datum vystavení","internal_reference":"Interní reference"},"config":{"html_language":"cs"}}')},7062:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Überblick","flash_error":"Fehler!","flash_success":"Geschafft!","close":"Schließen","split_transaction_title":"Beschreibung der Splittbuchung","errors_submission":"Ihre Übermittlung ist fehlgeschlagen. Bitte überprüfen Sie die Fehler.","split":"Teilen","single_split":"Teil","transaction_stored_link":"Buchung #{ID} (\\"{title}\\") wurde gespeichert.","transaction_updated_link":"Buchung#{ID} wurde aktualisiert.","transaction_new_stored_link":"Buchung #{ID} wurde gespeichert.","transaction_journal_information":"Transaktionsinformationen","no_budget_pointer":"Sie scheinen noch keine Kostenrahmen festgelegt zu haben. Sie sollten einige davon auf der Seite Kostenrahmen- anlegen. Kostenrahmen können Ihnen dabei helfen, den Überblick über die Ausgaben zu behalten.","no_bill_pointer":"Sie scheinen noch keine Rechnungen zu haben. Sie sollten einige auf der Seite Rechnungen erstellen. Anhand der Rechnungen können Sie den Überblick über Ihre Ausgaben behalten.","source_account":"Quellkonto","hidden_fields_preferences":"Sie können weitere Buchungsoptionen in Ihren Einstellungen aktivieren.","destination_account":"Zielkonto","add_another_split":"Eine weitere Aufteilung hinzufügen","submission":"Übermittlung","create_another":"Nach dem Speichern hierher zurückkehren, um ein weiteres zu erstellen.","reset_after":"Formular nach der Übermittlung zurücksetzen","submit":"Absenden","amount":"Betrag","date":"Datum","tags":"Schlagwörter","no_budget":"(kein Budget)","no_bill":"(keine Belege)","category":"Kategorie","attachments":"Anhänge","notes":"Notizen","external_uri":"Externe URL","update_transaction":"Buchung aktualisieren","after_update_create_another":"Nach dem Aktualisieren hierher zurückkehren, um weiter zu bearbeiten.","store_as_new":"Als neue Buchung speichern statt zu aktualisieren.","split_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.","none_in_select_list":"(Keine)","no_piggy_bank":"(kein Sparschwein)","description":"Beschreibung","split_transaction_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchung geben.","destination_account_reconciliation":"Sie können das Zielkonto einer Kontenausgleichsbuchung nicht bearbeiten.","source_account_reconciliation":"Sie können das Quellkonto einer Kontenausgleichsbuchung nicht bearbeiten.","budget":"Budget","bill":"Rechnung","you_create_withdrawal":"Sie haben eine Auszahlung erstellt.","you_create_transfer":"Sie haben eine Buchung erstellt.","you_create_deposit":"Sie haben eine Einzahlung erstellt.","edit":"Bearbeiten","delete":"Löschen","name":"Name","profile_whoops":"Huch!","profile_something_wrong":"Ein Problem ist aufgetreten!","profile_try_again":"Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.","profile_oauth_clients":"OAuth-Clients","profile_oauth_no_clients":"Sie haben noch keine OAuth-Clients erstellt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client-ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Geheimnis","profile_oauth_create_new_client":"Neuen Client erstellen","profile_oauth_create_client":"Client erstellen","profile_oauth_edit_client":"Client bearbeiten","profile_oauth_name_help":"Etwas das Ihre Nutzer erkennen und dem sie vertrauen.","profile_oauth_redirect_url":"Weiterleitungs-URL","profile_oauth_redirect_url_help":"Die Authorisierungs-Callback-URL Ihrer Anwendung.","profile_authorized_apps":"Autorisierte Anwendungen","profile_authorized_clients":"Autorisierte Clients","profile_scopes":"Bereiche","profile_revoke":"Widerrufen","profile_personal_access_tokens":"Persönliche Zugangs-Tokens","profile_personal_access_token":"Persönlicher Zugangs-Token","profile_personal_access_token_explanation":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_no_personal_access_token":"Sie haben keine persönlichen Zugangsschlüssel erstellt.","profile_create_new_token":"Neuen Schlüssel erstellen","profile_create_token":"Schlüssel erstellen","profile_create":"Erstellen","profile_save_changes":"Änderungen speichern","default_group_title_name":"(ohne Gruppierung)","piggy_bank":"Sparschwein","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_oauth_confidential":"Vertraulich","profile_oauth_confidential_help":"Der Client muss sich mit einem Secret authentifizieren. Vertrauliche Clients können die Anmeldedaten speichern, ohne diese unautorisierten Akteuren mitzuteilen. Öffentliche Anwendungen wie native Desktop- oder JavaScript-SPA-Anwendungen können Geheimnisse nicht sicher speichern.","multi_account_warning_unknown":"Abhängig von der Art der Buchung, die Sie anlegen, kann das Quell- und/oder Zielkonto nachfolgender Aufteilungen durch das überschrieben werden, was in der ersten Aufteilung der Buchung definiert wurde.","multi_account_warning_withdrawal":"Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_deposit":"Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einzahlung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_transfer":"Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der Übertragung definiert ist, außer Kraft gesetzt wird."},"form":{"interest_date":"Zinstermin","book_date":"Buchungsdatum","process_date":"Bearbeitungsdatum","due_date":"Fälligkeitstermin","foreign_amount":"Ausländischer Betrag","payment_date":"Zahlungsdatum","invoice_date":"Rechnungsdatum","internal_reference":"Interner Verweis"},"config":{"html_language":"de"}}')},1410:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Τι παίζει;","flash_error":"Σφάλμα!","flash_success":"Επιτυχία!","close":"Κλείσιμο","split_transaction_title":"Περιγραφή της συναλλαγής με διαχωρισμό","errors_submission":"Υπήρξε κάποιο λάθος με την υποβολή σας. Παρακαλώ ελέγξτε τα σφάλματα.","split":"Διαχωρισμός","single_split":"Διαχωρισμός","transaction_stored_link":"Η συναλλαγή #{ID} (\\"{title}\\") έχει αποθηκευτεί.","transaction_updated_link":"Η συναλλαγή #{ID} έχει ενημερωθεί.","transaction_new_stored_link":"Η συναλλαγή #{ID} έχει αποθηκευτεί.","transaction_journal_information":"Πληροφορίες συναλλαγής","no_budget_pointer":"Φαίνεται πως δεν έχετε ορίσει προϋπολογισμούς ακόμη. Πρέπει να δημιουργήσετε κάποιον στη σελίδα προϋπολογισμών. Οι προϋπολογισμοί σας βοηθούν να επιβλέπετε τις δαπάνες σας.","no_bill_pointer":"Φαίνεται πως δεν έχετε ορίσει πάγια έξοδα ακόμη. Πρέπει να δημιουργήσετε κάποιο στη σελίδα πάγιων εξόδων. Τα πάγια έξοδα σας βοηθούν να επιβλέπετε τις δαπάνες σας.","source_account":"Λογαριασμός προέλευσης","hidden_fields_preferences":"Μπορείτε να ενεργοποιήσετε περισσότερες επιλογές συναλλαγών στις προτιμήσεις.","destination_account":"Λογαριασμός προορισμού","add_another_split":"Προσθήκη ενός ακόμα διαχωρισμού","submission":"Υποβολή","create_another":"Μετά την αποθήκευση, επιστρέψτε εδώ για να δημιουργήσετε ακόμη ένα.","reset_after":"Επαναφορά φόρμας μετά την υποβολή","submit":"Υποβολή","amount":"Ποσό","date":"Ημερομηνία","tags":"Ετικέτες","no_budget":"(χωρίς προϋπολογισμό)","no_bill":"(χωρίς πάγιο έξοδο)","category":"Κατηγορία","attachments":"Συνημμένα","notes":"Σημειώσεις","external_uri":"External URL","update_transaction":"Ενημέρωση συναλλαγής","after_update_create_another":"Μετά την ενημέρωση, επιστρέψτε εδώ για να συνεχίσετε την επεξεργασία.","store_as_new":"Αποθήκευση ως νέα συναλλαγή αντί για ενημέρωση.","split_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","none_in_select_list":"(τίποτα)","no_piggy_bank":"(χωρίς κουμπαρά)","description":"Περιγραφή","split_transaction_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","destination_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προορισμού σε μια συναλλαγή τακτοποίησης.","source_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προέλευσης σε μια συναλλαγή τακτοποίησης.","budget":"Προϋπολογισμός","bill":"Πάγιο έξοδο","you_create_withdrawal":"Δημιουργείτε μια ανάληψη.","you_create_transfer":"Δημιουργείτε μια μεταφορά.","you_create_deposit":"Δημιουργείτε μια κατάθεση.","edit":"Επεξεργασία","delete":"Διαγραφή","name":"Όνομα","profile_whoops":"Ούπς!","profile_something_wrong":"Κάτι πήγε στραβά!","profile_try_again":"Κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά.","profile_oauth_clients":"Πελάτες OAuth","profile_oauth_no_clients":"Δεν έχετε δημιουργήσει πελάτες OAuth.","profile_oauth_clients_header":"Πελάτες","profile_oauth_client_id":"Αναγνωριστικό πελάτη","profile_oauth_client_name":"Όνομα","profile_oauth_client_secret":"Μυστικό","profile_oauth_create_new_client":"Δημιουργία νέου πελάτη","profile_oauth_create_client":"Δημιουργία πελάτη","profile_oauth_edit_client":"Επεξεργασία πελάτη","profile_oauth_name_help":"Κάτι που οι χρήστες σας θα αναγνωρίζουν και θα εμπιστεύονται.","profile_oauth_redirect_url":"URL ανακατεύθυνσης","profile_oauth_redirect_url_help":"To authorization callback URL της εφαρμογής σας.","profile_authorized_apps":"Εξουσιοδοτημένες εφαρμογές","profile_authorized_clients":"Εξουσιοδοτημένοι πελάτες","profile_scopes":"Πεδία εφαρμογής","profile_revoke":"Ανάκληση","profile_personal_access_tokens":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token_explanation":"Εδώ είναι το νέο διακριτικό προσωπικής πρόσβασης. Αυτή είναι η μόνη φορά που θα εμφανιστεί, οπότε μη το χάσετε! Μπορείτε να χρησιμοποιείτε αυτό το διακριτικό για να κάνετε κλήσεις API.","profile_no_personal_access_token":"Δεν έχετε δημιουργήσει προσωπικά διακριτικά πρόσβασης.","profile_create_new_token":"Δημιουργία νέου διακριτικού","profile_create_token":"Δημιουργία διακριτικού","profile_create":"Δημιουργία","profile_save_changes":"Αποθήκευση αλλαγών","default_group_title_name":"(χωρίς ομάδα)","piggy_bank":"Κουμπαράς","profile_oauth_client_secret_title":"Μυστικό Πελάτη","profile_oauth_client_secret_expl":"Εδώ είναι το νέο σας μυστικό πελάτη. Αυτή είναι η μόνη φορά που θα σας εμφανιστεί, οπότε μην το χάσετε! Μπορείτε να το χρησιμοποιείτε για να κάνετε αιτήματα API.","profile_oauth_confidential":"Εμπιστευτικό","profile_oauth_confidential_help":"Απαιτήστε από το πρόγραμμα πελάτη να πραγματοποιήσει έλεγχο ταυτότητας με ένα μυστικό. Οι έμπιστοι πελάτες μπορούν να διατηρούν διαπιστευτήρια με ασφαλή τρόπο χωρίς να τα εκθέτουν σε μη εξουσιοδοτημένα μέρη. Οι δημόσιες εφαρμογές, όπως οι εγγενείς εφαρμογές για επιτραπέζιους υπολογιστές ή JavaScript SPA, δεν μπορούν να κρατήσουν μυστικά με ασφάλεια.","multi_account_warning_unknown":"Ανάλογα με τον τύπο της συναλλαγής που δημιουργείτε, ο λογαριασμός προέλευσης ή/και προορισμού των επόμενων διαχωρισμών ενδέχεται να παρακαμφθεί από αυτό που ορίζεται στο πρώτο διαχωρισμό της συναλλαγής.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ημερομηνία τοκισμού","book_date":"Ημερομηνία εγγραφής","process_date":"Ημερομηνία επεξεργασίας","due_date":"Ημερομηνία προθεσμίας","foreign_amount":"Ποσό σε ξένο νόμισμα","payment_date":"Ημερομηνία πληρωμής","invoice_date":"Ημερομηνία τιμολόγησης","internal_reference":"Εσωτερική αναφορά"},"config":{"html_language":"el"}}')},5642:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en-gb"}}')},6886:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en"}}')},2360:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"¿Qué está pasando?","flash_error":"¡Error!","flash_success":"¡Operación correcta!","close":"Cerrar","split_transaction_title":"Descripción de la transacción dividida","errors_submission":"Hubo un problema con su envío. Por favor, compruebe los errores.","split":"Separar","single_split":"División","transaction_stored_link":"La transacción #{ID} (\\"{title}\\") ha sido almacenada.","transaction_updated_link":"La transacción #{ID} ha sido actualizada.","transaction_new_stored_link":"La transacción #{ID} ha sido guardada.","transaction_journal_information":"Información de transacción","no_budget_pointer":"Parece que aún no tienes presupuestos. Debes crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.","no_bill_pointer":"Parece que aún no tienes facturas. Deberías crear algunas en la página de facturas. Las facturas pueden ayudarte a llevar un seguimiento de los gastos.","source_account":"Cuenta origen","hidden_fields_preferences":"Puede habilitar más opciones de transacción en sus ajustes .","destination_account":"Cuenta destino","add_another_split":"Añadir otra división","submission":"Envío","create_another":"Después de guardar, vuelve aquí para crear otro.","reset_after":"Restablecer formulario después del envío","submit":"Enviar","amount":"Cantidad","date":"Fecha","tags":"Etiquetas","no_budget":"(sin presupuesto)","no_bill":"(sin factura)","category":"Categoria","attachments":"Archivos adjuntos","notes":"Notas","external_uri":"External URL","update_transaction":"Actualizar transacción","after_update_create_another":"Después de actualizar, vuelve aquí para continuar editando.","store_as_new":"Almacenar como una nueva transacción en lugar de actualizar.","split_title_help":"Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.","none_in_select_list":"(ninguno)","no_piggy_bank":"(sin hucha)","description":"Descripción","split_transaction_title_help":"Si crea una transacción dividida, debe existir una descripción global para todas las divisiones de la transacción.","destination_account_reconciliation":"No puedes editar la cuenta de destino de una transacción de reconciliación.","source_account_reconciliation":"No puedes editar la cuenta de origen de una transacción de reconciliación.","budget":"Presupuesto","bill":"Factura","you_create_withdrawal":"Está creando un retiro.","you_create_transfer":"Está creando una transferencia.","you_create_deposit":"Está creando un depósito.","edit":"Editar","delete":"Eliminar","name":"Nombre","profile_whoops":"¡Ups!","profile_something_wrong":"¡Algo salió mal!","profile_try_again":"Algo salió mal. Por favor, vuelva a intentarlo.","profile_oauth_clients":"Clientes de OAuth","profile_oauth_no_clients":"No ha creado ningún cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID del cliente","profile_oauth_client_name":"Nombre","profile_oauth_client_secret":"Secreto","profile_oauth_create_new_client":"Crear un Nuevo Cliente","profile_oauth_create_client":"Crear Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que sus usuarios reconocerán y confiarán.","profile_oauth_redirect_url":"Redirigir URL","profile_oauth_redirect_url_help":"La URL de devolución de autorización de su aplicación.","profile_authorized_apps":"Aplicaciones autorizadas","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Ámbitos","profile_revoke":"Revocar","profile_personal_access_tokens":"Tokens de acceso personal","profile_personal_access_token":"Token de acceso personal","profile_personal_access_token_explanation":"Aquí está su nuevo token de acceso personal. Esta es la única vez que se mostrará así que ¡no lo pierda! Ahora puede usar este token para hacer solicitudes de la API.","profile_no_personal_access_token":"No ha creado ningún token de acceso personal.","profile_create_new_token":"Crear nuevo token","profile_create_token":"Crear token","profile_create":"Crear","profile_save_changes":"Guardar cambios","default_group_title_name":"(sin agrupación)","piggy_bank":"Hucha","profile_oauth_client_secret_title":"Secreto del Cliente","profile_oauth_client_secret_expl":"Aquí está su nuevo secreto de cliente. Esta es la única vez que se mostrará así que no lo pierda! Ahora puede usar este secreto para hacer solicitudes de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Requerir que el cliente se autentifique con un secreto. Los clientes confidenciales pueden mantener las credenciales de forma segura sin exponerlas a partes no autorizadas. Las aplicaciones públicas, como aplicaciones de escritorio nativo o SPA de JavaScript, no pueden guardar secretos de forma segura.","multi_account_warning_unknown":"Dependiendo del tipo de transacción que cree, la cuenta de origen y/o destino de divisiones posteriores puede ser anulada por lo que se define en la primera división de la transacción.","multi_account_warning_withdrawal":"Tenga en cuenta que la cuenta de origen de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_deposit":"Tenga en cuenta que la cuenta de destino de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_transfer":"Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores será anulada por lo que se defina en la primera división de la transferencia."},"form":{"interest_date":"Fecha de interés","book_date":"Fecha de registro","process_date":"Fecha de procesamiento","due_date":"Fecha de vencimiento","foreign_amount":"Cantidad extranjera","payment_date":"Fecha de pago","invoice_date":"Fecha de la factura","internal_reference":"Referencia interna"},"config":{"html_language":"es"}}')},3684:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mitä kuuluu?","flash_error":"Virhe!","flash_success":"Valmista tuli!","close":"Sulje","split_transaction_title":"Jaetun tapahtuman kuvaus","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Jaa","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Tapahtumatiedot","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Lähdetili","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Kohdetili","add_another_split":"Lisää tapahtumaan uusi osa","submission":"Vahvistus","create_another":"Tallennuksen jälkeen, palaa takaisin luomaan uusi tapahtuma.","reset_after":"Tyhjennä lomake lähetyksen jälkeen","submit":"Vahvista","amount":"Summa","date":"Päivämäärä","tags":"Tägit","no_budget":"(ei budjettia)","no_bill":"(no bill)","category":"Kategoria","attachments":"Liitteet","notes":"Muistiinpanot","external_uri":"External URL","update_transaction":"Päivitä tapahtuma","after_update_create_another":"Päivityksen jälkeen, palaa takaisin jatkamaan muokkausta.","store_as_new":"Tallenna uutena tapahtumana päivityksen sijaan.","split_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","none_in_select_list":"(ei mitään)","no_piggy_bank":"(ei säästöpossu)","description":"Kuvaus","split_transaction_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","destination_account_reconciliation":"Et voi muokata täsmäytystapahtuman kohdetiliä.","source_account_reconciliation":"Et voi muokata täsmäytystapahtuman lähdetiliä.","budget":"Budjetti","bill":"Lasku","you_create_withdrawal":"Olet luomassa nostoa.","you_create_transfer":"Olet luomassa siirtoa.","you_create_deposit":"Olet luomassa talletusta.","edit":"Muokkaa","delete":"Poista","name":"Nimi","profile_whoops":"Hupsis!","profile_something_wrong":"Jokin meni vikaan!","profile_try_again":"Jokin meni vikaan. Yritä uudelleen.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Asiakasohjelmat","profile_oauth_client_id":"Asiakastunnus","profile_oauth_client_name":"Nimi","profile_oauth_client_secret":"Salaisuus","profile_oauth_create_new_client":"Luo Uusi Asiakas","profile_oauth_create_client":"Luo Asiakas","profile_oauth_edit_client":"Muokkaa asiakasta","profile_oauth_name_help":"Jotain käyttäjillesi tuttua ja luotettavaa.","profile_oauth_redirect_url":"URL:n uudelleenohjaus","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Peruuta","profile_personal_access_tokens":"Henkilökohtaiset Käyttöoikeuskoodit","profile_personal_access_token":"Henkilökohtainen Käyttöoikeuskoodi","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Luo uusi tunnus","profile_create_token":"Luo tunnus","profile_create":"Luo","profile_save_changes":"Tallenna muutokset","default_group_title_name":"(ryhmittelemättömät)","piggy_bank":"Säästöpossu","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Korkopäivä","book_date":"Kirjauspäivä","process_date":"Käsittelypäivä","due_date":"Eräpäivä","foreign_amount":"Ulkomaan summa","payment_date":"Maksupäivä","invoice_date":"Laskun päivämäärä","internal_reference":"Sisäinen viite"},"config":{"html_language":"fi"}}')},6833:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Quoi de neuf ?","flash_error":"Erreur !","flash_success":"Super !","close":"Fermer","split_transaction_title":"Description de l\'opération ventilée","errors_submission":"Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs.","split":"Ventiler","single_split":"Ventilation","transaction_stored_link":"L\'opération n°{ID} (\\"{title}\\") a été enregistrée.","transaction_updated_link":"L\'opération n°{ID} a été mise à jour.","transaction_new_stored_link":"L\'opération n°{ID} a été enregistrée.","transaction_journal_information":"Informations sur l\'opération","no_budget_pointer":"Vous semblez n’avoir encore aucun budget. Vous devriez en créer un sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.","no_bill_pointer":"Vous semblez n\'avoir encore aucune facture. Vous devriez en créer une sur la page factures-. Les factures peuvent vous aider à garder une trace des dépenses.","source_account":"Compte source","hidden_fields_preferences":"Vous pouvez activer plus d\'options d\'opérations dans vos paramètres.","destination_account":"Compte de destination","add_another_split":"Ajouter une autre fraction","submission":"Soumission","create_another":"Après enregistrement, revenir ici pour en créer un nouveau.","reset_after":"Réinitialiser le formulaire après soumission","submit":"Soumettre","amount":"Montant","date":"Date","tags":"Tags","no_budget":"(pas de budget)","no_bill":"(aucune facture)","category":"Catégorie","attachments":"Pièces jointes","notes":"Notes","external_uri":"URL externe","update_transaction":"Mettre à jour l\'opération","after_update_create_another":"Après la mise à jour, revenir ici pour continuer l\'édition.","store_as_new":"Enregistrer comme une nouvelle opération au lieu de mettre à jour.","split_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.","none_in_select_list":"(aucun)","no_piggy_bank":"(aucune tirelire)","description":"Description","split_transaction_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fraction de l\'opération.","destination_account_reconciliation":"Vous ne pouvez pas modifier le compte de destination d\'une opération de rapprochement.","source_account_reconciliation":"Vous ne pouvez pas modifier le compte source d\'une opération de rapprochement.","budget":"Budget","bill":"Facture","you_create_withdrawal":"Vous saisissez une dépense.","you_create_transfer":"Vous saisissez un transfert.","you_create_deposit":"Vous saisissez un dépôt.","edit":"Modifier","delete":"Supprimer","name":"Nom","profile_whoops":"Oups !","profile_something_wrong":"Une erreur s\'est produite !","profile_try_again":"Une erreur s’est produite. Merci d’essayer à nouveau.","profile_oauth_clients":"Clients OAuth","profile_oauth_no_clients":"Vous n’avez pas encore créé de client OAuth.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Identifiant","profile_oauth_client_name":"Nom","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Créer un nouveau client","profile_oauth_create_client":"Créer un client","profile_oauth_edit_client":"Modifier le client","profile_oauth_name_help":"Quelque chose que vos utilisateurs reconnaîtront et qui inspirera confiance.","profile_oauth_redirect_url":"URL de redirection","profile_oauth_redirect_url_help":"URL de callback de votre application.","profile_authorized_apps":"Applications autorisées","profile_authorized_clients":"Clients autorisés","profile_scopes":"Permissions","profile_revoke":"Révoquer","profile_personal_access_tokens":"Jetons d\'accès personnels","profile_personal_access_token":"Jeton d\'accès personnel","profile_personal_access_token_explanation":"Voici votre nouveau jeton d’accès personnel. Ceci est la seule fois où vous pourrez le voir, ne le perdez pas ! Vous pouvez dès à présent utiliser ce jeton pour lancer des requêtes avec l’API.","profile_no_personal_access_token":"Vous n’avez pas encore créé de jeton d’accès personnel.","profile_create_new_token":"Créer un nouveau jeton","profile_create_token":"Créer un jeton","profile_create":"Créer","profile_save_changes":"Enregistrer les modifications","default_group_title_name":"(Sans groupement)","piggy_bank":"Tirelire","profile_oauth_client_secret_title":"Secret du client","profile_oauth_client_secret_expl":"Voici votre nouveau secret de client. C\'est la seule fois qu\'il sera affiché, donc ne le perdez pas ! Vous pouvez maintenant utiliser ce secret pour faire des requêtes d\'API.","profile_oauth_confidential":"Confidentiel","profile_oauth_confidential_help":"Exiger que le client s\'authentifie avec un secret. Les clients confidentiels peuvent détenir des informations d\'identification de manière sécurisée sans les exposer à des tiers non autorisés. Les applications publiques, telles que les applications de bureau natif ou les SPA JavaScript, ne peuvent pas tenir des secrets en toute sécurité.","multi_account_warning_unknown":"Selon le type d\'opération que vous créez, le(s) compte(s) source et/ou de destination des ventilations suivantes peuvent être remplacés par celui de la première ventilation de l\'opération.","multi_account_warning_withdrawal":"Gardez en tête que le compte source des ventilations suivantes peut être remplacé par celui de la première ventilation de la dépense.","multi_account_warning_deposit":"Gardez en tête que le compte de destination des ventilations suivantes peut être remplacé par celui de la première ventilation du dépôt.","multi_account_warning_transfer":"Gardez en tête que les comptes source et de destination des ventilations suivantes peuvent être remplacés par ceux de la première ventilation du transfert."},"form":{"interest_date":"Date de valeur (intérêts)","book_date":"Date de réservation","process_date":"Date de traitement","due_date":"Échéance","foreign_amount":"Montant en devise étrangère","payment_date":"Date de paiement","invoice_date":"Date de facturation","internal_reference":"Référence interne"},"config":{"html_language":"fr"}}')},6477:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mi a helyzet?","flash_error":"Hiba!","flash_success":"Siker!","close":"Bezárás","split_transaction_title":"Felosztott tranzakció leírása","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Felosztás","single_split":"Felosztás","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") mentve.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} mentve.","transaction_journal_information":"Tranzakciós információk","no_budget_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","no_bill_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","source_account":"Forrás számla","hidden_fields_preferences":"A beállításokban több mező is engedélyezhető.","destination_account":"Célszámla","add_another_split":"Másik felosztás hozzáadása","submission":"Feliratkozás","create_another":"A tárolás után térjen vissza ide új létrehozásához.","reset_after":"Űrlap törlése a beküldés után","submit":"Beküldés","amount":"Összeg","date":"Dátum","tags":"Címkék","no_budget":"(nincs költségkeret)","no_bill":"(no bill)","category":"Kategória","attachments":"Mellékletek","notes":"Megjegyzések","external_uri":"External URL","update_transaction":"Tranzakció frissítése","after_update_create_another":"A frissítés után térjen vissza ide a szerkesztés folytatásához.","store_as_new":"Tárolás új tranzakcióként frissítés helyett.","split_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","none_in_select_list":"(nincs)","no_piggy_bank":"(nincs malacpersely)","description":"Leírás","split_transaction_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","destination_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció célszámláját.","source_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció forrásszámláját.","budget":"Költségkeret","bill":"Számla","you_create_withdrawal":"Egy költség létrehozása.","you_create_transfer":"Egy átutalás létrehozása.","you_create_deposit":"Egy bevétel létrehozása.","edit":"Szerkesztés","delete":"Törlés","name":"Név","profile_whoops":"Hoppá!","profile_something_wrong":"Hiba történt!","profile_try_again":"Hiba történt. Kérjük, próbálja meg újra.","profile_oauth_clients":"OAuth kliensek","profile_oauth_no_clients":"Nincs létrehozva egyetlen OAuth kliens sem.","profile_oauth_clients_header":"Kliensek","profile_oauth_client_id":"Kliens ID","profile_oauth_client_name":"Megnevezés","profile_oauth_client_secret":"Titkos kód","profile_oauth_create_new_client":"Új kliens létrehozása","profile_oauth_create_client":"Kliens létrehozása","profile_oauth_edit_client":"Kliens szerkesztése","profile_oauth_name_help":"Segítség, hogy a felhasználók tudják mihez kapcsolódik.","profile_oauth_redirect_url":"Átirányítási URL","profile_oauth_redirect_url_help":"Az alkalmazásban használt autentikációs URL.","profile_authorized_apps":"Engedélyezett alkalmazások","profile_authorized_clients":"Engedélyezett kliensek","profile_scopes":"Hatáskörök","profile_revoke":"Visszavonás","profile_personal_access_tokens":"Személyes hozzáférési tokenek","profile_personal_access_token":"Személyes hozzáférési token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"Nincs létrehozva egyetlen személyes hozzáférési token sem.","profile_create_new_token":"Új token létrehozása","profile_create_token":"Token létrehozása","profile_create":"Létrehozás","profile_save_changes":"Módosítások mentése","default_group_title_name":"(nem csoportosított)","piggy_bank":"Malacpersely","profile_oauth_client_secret_title":"Kliens titkos kódja","profile_oauth_client_secret_expl":"Ez a kliens titkos kódja. Ez az egyetlen alkalom, amikor meg van jelenítve, ne hagyd el! Ezzel a kóddal végezhetsz API hívásokat.","profile_oauth_confidential":"Bizalmas","profile_oauth_confidential_help":"Titkos kód használata a kliens bejelentkezéséhez. Bizonyos kliensek biztonságosan tudnak hitelesítő adatokat tárolni, anélkül hogy jogosulatlan fél hozzáférhetne. Nyilvános kliensek, például mint asztali vagy JavaScript SPA alkalmazások nem tudnak biztonságosan titkos kódot tárolni.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Kamatfizetési időpont","book_date":"Könyvelés dátuma","process_date":"Feldolgozás dátuma","due_date":"Lejárati időpont","foreign_amount":"Külföldi összeg","payment_date":"Fizetés dátuma","invoice_date":"Számla dátuma","internal_reference":"Belső hivatkozás"},"config":{"html_language":"hu"}}')},3092:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"La tua situazione finanziaria","flash_error":"Errore!","flash_success":"Successo!","close":"Chiudi","split_transaction_title":"Descrizione della transazione suddivisa","errors_submission":"Errore durante l\'invio. Controlla gli errori segnalati qui sotto.","split":"Dividi","single_split":"Divisione","transaction_stored_link":"La transazione #{ID} (\\"{title}\\") è stata salvata.","transaction_updated_link":"La transazione #{ID} è stata aggiornata.","transaction_new_stored_link":"La transazione #{ID} è stata salvata.","transaction_journal_information":"Informazioni transazione","no_budget_pointer":"Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget. I budget possono aiutarti a tenere traccia delle spese.","no_bill_pointer":"Sembra che tu non abbia ancora delle bollette. Dovresti crearne alcune nella pagina delle bollette. Le bollette possono aiutarti a tenere traccia delle spese.","source_account":"Conto di origine","hidden_fields_preferences":"Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni.","destination_account":"Conto destinazione","add_another_split":"Aggiungi un\'altra divisione","submission":"Invio","create_another":"Dopo il salvataggio, torna qui per crearne un\'altra.","reset_after":"Resetta il modulo dopo l\'invio","submit":"Invia","amount":"Importo","date":"Data","tags":"Etichette","no_budget":"(nessun budget)","no_bill":"(nessuna bolletta)","category":"Categoria","attachments":"Allegati","notes":"Note","external_uri":"URL esterno","update_transaction":"Aggiorna transazione","after_update_create_another":"Dopo l\'aggiornamento, torna qui per continuare la modifica.","store_as_new":"Salva come nuova transazione invece di aggiornarla.","split_title_help":"Se crei una transazione suddivisa è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","none_in_select_list":"(nessuna)","no_piggy_bank":"(nessun salvadanaio)","description":"Descrizione","split_transaction_title_help":"Se crei una transazione suddivisa, è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","destination_account_reconciliation":"Non è possibile modificare il conto di destinazione di una transazione di riconciliazione.","source_account_reconciliation":"Non puoi modificare il conto di origine di una transazione di riconciliazione.","budget":"Budget","bill":"Bolletta","you_create_withdrawal":"Stai creando un prelievo.","you_create_transfer":"Stai creando un trasferimento.","you_create_deposit":"Stai creando un deposito.","edit":"Modifica","delete":"Elimina","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Qualcosa non ha funzionato!","profile_try_again":"Qualcosa non ha funzionato. Riprova.","profile_oauth_clients":"Client OAuth","profile_oauth_no_clients":"Non hai creato nessun client OAuth.","profile_oauth_clients_header":"Client","profile_oauth_client_id":"ID client","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segreto","profile_oauth_create_new_client":"Crea nuovo client","profile_oauth_create_client":"Crea client","profile_oauth_edit_client":"Modifica client","profile_oauth_name_help":"Qualcosa di cui i tuoi utenti potranno riconoscere e fidarsi.","profile_oauth_redirect_url":"URL di reindirizzamento","profile_oauth_redirect_url_help":"L\'URL di callback dell\'autorizzazione della tua applicazione.","profile_authorized_apps":"Applicazioni autorizzate","profile_authorized_clients":"Client autorizzati","profile_scopes":"Ambiti","profile_revoke":"Revoca","profile_personal_access_tokens":"Token di acceso personale","profile_personal_access_token":"Token di acceso personale","profile_personal_access_token_explanation":"Ecco il tuo nuovo token di accesso personale. Questa è l\'unica volta che ti viene mostrato per cui non perderlo! Da adesso puoi utilizzare questo token per effettuare delle richieste API.","profile_no_personal_access_token":"Non hai creato alcun token di accesso personale.","profile_create_new_token":"Crea nuovo token","profile_create_token":"Crea token","profile_create":"Crea","profile_save_changes":"Salva modifiche","default_group_title_name":"(non in un gruppo)","piggy_bank":"Salvadanaio","profile_oauth_client_secret_title":"Segreto del client","profile_oauth_client_secret_expl":"Ecco il segreto del nuovo client. Questa è l\'unica occasione in cui viene mostrato pertanto non perderlo! Ora puoi usare questo segreto per effettuare delle richieste alle API.","profile_oauth_confidential":"Riservato","profile_oauth_confidential_help":"Richiede al client di autenticarsi con un segreto. I client riservati possono conservare le credenziali in modo sicuro senza esporle a soggetti non autorizzati. Le applicazioni pubbliche, come le applicazioni desktop native o JavaScript SPA, non sono in grado di conservare i segreti in modo sicuro.","multi_account_warning_unknown":"A seconda del tipo di transazione che hai creato, il conto di origine e/o destinazione delle successive suddivisioni può essere sovrascritto da qualsiasi cosa sia definita nella prima suddivisione della transazione.","multi_account_warning_withdrawal":"Ricorda che il conto di origine delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del prelievo.","multi_account_warning_deposit":"Ricorda che il conto di destinazione delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del deposito.","multi_account_warning_transfer":"Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento."},"form":{"interest_date":"Data di valuta","book_date":"Data contabile","process_date":"Data elaborazione","due_date":"Data scadenza","foreign_amount":"Importo estero","payment_date":"Data pagamento","invoice_date":"Data fatturazione","internal_reference":"Riferimento interno"},"config":{"html_language":"it"}}')},2502:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Feil!","flash_success":"Suksess!","close":"Lukk","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Del opp","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaksjonsinformasjon","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Legg til en oppdeling til","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Send inn","amount":"Beløp","date":"Dato","tags":"Tagger","no_budget":"(ingen budsjett)","no_bill":"(no bill)","category":"Kategori","attachments":"Vedlegg","notes":"Notater","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(ingen)","no_piggy_bank":"(no piggy bank)","description":"Beskrivelse","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Busjett","bill":"Regning","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Rediger","delete":"Slett","name":"Navn","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Sparegris","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Rentedato","book_date":"Bokføringsdato","process_date":"Prosesseringsdato","due_date":"Forfallsdato","foreign_amount":"Utenlandske beløp","payment_date":"Betalingsdato","invoice_date":"Fakturadato","internal_reference":"Intern referanse"},"config":{"html_language":"nb"}}')},78:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Hoe staat het er voor?","flash_error":"Fout!","flash_success":"Gelukt!","close":"Sluiten","split_transaction_title":"Beschrijving van de gesplitste transactie","errors_submission":"Er ging iets mis. Check de errors.","split":"Splitsen","single_split":"Split","transaction_stored_link":"Transactie #{ID} (\\"{title}\\") is opgeslagen.","transaction_updated_link":"Transactie #{ID} is geüpdatet.","transaction_new_stored_link":"Transactie #{ID} is opgeslagen.","transaction_journal_information":"Transactieinformatie","no_budget_pointer":"Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.","no_bill_pointer":"Je hebt nog geen contracten. Maak er een aantal op de contracten-pagina. Met contracten kan je je uitgaven beter bijhouden.","source_account":"Bronrekening","hidden_fields_preferences":"Je kan meer transactieopties inschakelen in je instellingen.","destination_account":"Doelrekening","add_another_split":"Voeg een split toe","submission":"Indienen","create_another":"Terug naar deze pagina voor een nieuwe transactie.","reset_after":"Reset formulier na opslaan","submit":"Invoeren","amount":"Bedrag","date":"Datum","tags":"Tags","no_budget":"(geen budget)","no_bill":"(geen contract)","category":"Categorie","attachments":"Bijlagen","notes":"Notities","external_uri":"Externe URL","update_transaction":"Update transactie","after_update_create_another":"Na het opslaan terug om door te gaan met wijzigen.","store_as_new":"Opslaan als nieuwe transactie ipv de huidige bij te werken.","split_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","none_in_select_list":"(geen)","no_piggy_bank":"(geen spaarpotje)","description":"Omschrijving","split_transaction_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","destination_account_reconciliation":"Je kan de doelrekening van een afstemming niet wijzigen.","source_account_reconciliation":"Je kan de bronrekening van een afstemming niet wijzigen.","budget":"Budget","bill":"Contract","you_create_withdrawal":"Je maakt een uitgave.","you_create_transfer":"Je maakt een overschrijving.","you_create_deposit":"Je maakt inkomsten.","edit":"Wijzig","delete":"Verwijder","name":"Naam","profile_whoops":"Oeps!","profile_something_wrong":"Er is iets mis gegaan!","profile_try_again":"Er is iets misgegaan. Probeer het nogmaals.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Je hebt nog geen OAuth-clients aangemaakt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Naam","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Nieuwe client aanmaken","profile_oauth_create_client":"Client aanmaken","profile_oauth_edit_client":"Client bewerken","profile_oauth_name_help":"Iets dat je gebruikers herkennen en vertrouwen.","profile_oauth_redirect_url":"Redirect-URL","profile_oauth_redirect_url_help":"De authorisatie-callback-url van jouw applicatie.","profile_authorized_apps":"Geautoriseerde toepassingen","profile_authorized_clients":"Geautoriseerde clients","profile_scopes":"Scopes","profile_revoke":"Intrekken","profile_personal_access_tokens":"Persoonlijke toegangstokens","profile_personal_access_token":"Persoonlijk toegangstoken","profile_personal_access_token_explanation":"Hier is je nieuwe persoonlijke toegangstoken. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan deze toegangstoken gebruiken om API-aanvragen te maken.","profile_no_personal_access_token":"Je hebt nog geen persoonlijke toegangstokens aangemaakt.","profile_create_new_token":"Nieuwe token aanmaken","profile_create_token":"Token aanmaken","profile_create":"Creër","profile_save_changes":"Aanpassingen opslaan","default_group_title_name":"(ongegroepeerd)","piggy_bank":"Spaarpotje","profile_oauth_client_secret_title":"Client secret","profile_oauth_client_secret_expl":"Hier is je nieuwe client secret. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan dit secret gebruiken om API-aanvragen te maken.","profile_oauth_confidential":"Vertrouwelijk","profile_oauth_confidential_help":"Dit vinkje is bedoeld voor applicaties die geheimen kunnen bewaren. Applicaties zoals sommige desktop-apps en Javascript apps kunnen dit niet. In zo\'n geval haal je het vinkje weg.","multi_account_warning_unknown":"Afhankelijk van het type transactie wordt de bron- en/of doelrekening overschreven door wat er in de eerste split staat.","multi_account_warning_withdrawal":"De bronrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_deposit":"De doelrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_transfer":"De bron + doelrekening wordt overschreven door wat er in de eerste split staat."},"form":{"interest_date":"Rentedatum","book_date":"Boekdatum","process_date":"Verwerkingsdatum","due_date":"Vervaldatum","foreign_amount":"Bedrag in vreemde valuta","payment_date":"Betalingsdatum","invoice_date":"Factuurdatum","internal_reference":"Interne verwijzing"},"config":{"html_language":"nl"}}')},8691:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Co jest grane?","flash_error":"Błąd!","flash_success":"Sukces!","close":"Zamknij","split_transaction_title":"Opis podzielonej transakcji","errors_submission":"Coś poszło nie tak w czasie zapisu. Proszę sprawdź błędy.","split":"Podziel","single_split":"Podział","transaction_stored_link":"Transakcja #{ID} (\\"{title}\\") została zapisana.","transaction_updated_link":"Transakcja #{ID} została zaktualizowana.","transaction_new_stored_link":"Transakcja #{ID} została zapisana.","transaction_journal_information":"Informacje o transakcji","no_budget_pointer":"Wygląda na to, że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżetów. Budżety mogą Ci pomóc śledzić wydatki.","no_bill_pointer":"Wygląda na to, że nie masz jeszcze rachunków. Powinieneś utworzyć kilka na stronie rachunków. Rachunki mogą Ci pomóc śledzić wydatki.","source_account":"Konto źródłowe","hidden_fields_preferences":"Możesz włączyć więcej opcji transakcji w swoich ustawieniach.","destination_account":"Konto docelowe","add_another_split":"Dodaj kolejny podział","submission":"Zapisz","create_another":"Po zapisaniu wróć tutaj, aby utworzyć kolejny.","reset_after":"Wyczyść formularz po zapisaniu","submit":"Prześlij","amount":"Kwota","date":"Data","tags":"Tagi","no_budget":"(brak budżetu)","no_bill":"(brak rachunku)","category":"Kategoria","attachments":"Załączniki","notes":"Notatki","external_uri":"Zewnętrzny adres URL","update_transaction":"Zaktualizuj transakcję","after_update_create_another":"Po aktualizacji wróć tutaj, aby kontynuować edycję.","store_as_new":"Zapisz jako nową zamiast aktualizować.","split_title_help":"Podzielone transakcje muszą posiadać globalny opis.","none_in_select_list":"(żadne)","no_piggy_bank":"(brak skarbonki)","description":"Opis","split_transaction_title_help":"Jeśli tworzysz podzieloną transakcję, musi ona posiadać globalny opis dla wszystkich podziałów w transakcji.","destination_account_reconciliation":"Nie możesz edytować konta docelowego transakcji uzgadniania.","source_account_reconciliation":"Nie możesz edytować konta źródłowego transakcji uzgadniania.","budget":"Budżet","bill":"Rachunek","you_create_withdrawal":"Tworzysz wydatek.","you_create_transfer":"Tworzysz przelew.","you_create_deposit":"Tworzysz wpłatę.","edit":"Modyfikuj","delete":"Usuń","name":"Nazwa","profile_whoops":"Uuuups!","profile_something_wrong":"Coś poszło nie tak!","profile_try_again":"Coś poszło nie tak. Spróbuj ponownie.","profile_oauth_clients":"Klienci OAuth","profile_oauth_no_clients":"Nie utworzyłeś żadnych klientów OAuth.","profile_oauth_clients_header":"Klienci","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Nazwa","profile_oauth_client_secret":"Sekretny klucz","profile_oauth_create_new_client":"Utwórz nowego klienta","profile_oauth_create_client":"Utwórz klienta","profile_oauth_edit_client":"Edytuj klienta","profile_oauth_name_help":"Coś, co Twoi użytkownicy będą rozpoznawać i ufać.","profile_oauth_redirect_url":"Przekierowanie URL","profile_oauth_redirect_url_help":"Adres URL wywołania zwrotnego autoryzacji aplikacji.","profile_authorized_apps":"Autoryzowane aplikacje","profile_authorized_clients":"Autoryzowani klienci","profile_scopes":"Zakresy","profile_revoke":"Unieważnij","profile_personal_access_tokens":"Osobiste tokeny dostępu","profile_personal_access_token":"Osobisty token dostępu","profile_personal_access_token_explanation":"Oto twój nowy osobisty token dostępu. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego tokenu, aby wykonać zapytania API.","profile_no_personal_access_token":"Nie utworzyłeś żadnych osobistych tokenów.","profile_create_new_token":"Utwórz nowy token","profile_create_token":"Utwórz token","profile_create":"Utwórz","profile_save_changes":"Zapisz zmiany","default_group_title_name":"(bez grupy)","piggy_bank":"Skarbonka","profile_oauth_client_secret_title":"Sekret klienta","profile_oauth_client_secret_expl":"Oto twój nowy sekret klienta. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego sekretu, aby wykonać zapytania API.","profile_oauth_confidential":"Poufne","profile_oauth_confidential_help":"Wymagaj od klienta uwierzytelnienia za pomocą sekretu. Poufni klienci mogą przechowywać poświadczenia w bezpieczny sposób bez narażania ich na dostęp przez nieuprawnione strony. Publiczne aplikacje, takie jak natywne aplikacje desktopowe lub JavaScript SPA, nie są w stanie bezpiecznie trzymać sekretów.","multi_account_warning_unknown":"W zależności od rodzaju transakcji, którą tworzysz, konto źródłowe i/lub docelowe kolejnych podziałów może zostać ustawione na konto zdefiniowane w pierwszym podziale transakcji.","multi_account_warning_withdrawal":"Pamiętaj, że konto źródłowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wypłaty.","multi_account_warning_deposit":"Pamiętaj, że konto docelowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wpłaty.","multi_account_warning_transfer":"Pamiętaj, że konta źródłowe i docelowe kolejnych podziałów zostaną ustawione na konto zdefiniowane w pierwszym podziale transferu."},"form":{"interest_date":"Data odsetek","book_date":"Data księgowania","process_date":"Data przetworzenia","due_date":"Termin realizacji","foreign_amount":"Kwota zagraniczna","payment_date":"Data płatności","invoice_date":"Data faktury","internal_reference":"Wewnętrzny numer"},"config":{"html_language":"pl"}}')},122:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"O que está acontecendo?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transação dividida","errors_submission":"Há algo de errado com o seu envio. Por favor, verifique os erros abaixo.","split":"Dividir","single_split":"Divisão","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi salva.","transaction_updated_link":"Transação #{ID} foi atualizada.","transaction_new_stored_link":"Transação #{ID} foi salva.","transaction_journal_information":"Informação da transação","no_budget_pointer":"Parece que você ainda não tem orçamentos. Você deve criar alguns na página de orçamentos. Orçamentos podem ajudá-lo a manter o controle das despesas.","no_bill_pointer":"Parece que você ainda não tem contas. Você deve criar algumas em contas. Contas podem ajudar você a manter o controle de despesas.","source_account":"Conta origem","hidden_fields_preferences":"Você pode habilitar mais opções de transação em suas preferências.","destination_account":"Conta destino","add_another_split":"Adicionar outra divisão","submission":"Envio","create_another":"Depois de armazenar, retorne aqui para criar outro.","reset_after":"Resetar o formulário após o envio","submit":"Enviar","amount":"Valor","date":"Data","tags":"Tags","no_budget":"(sem orçamento)","no_bill":"(sem conta)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL externa","update_transaction":"Atualizar transação","after_update_create_another":"Depois de atualizar, retorne aqui para continuar editando.","store_as_new":"Armazene como uma nova transação em vez de atualizar.","split_title_help":"Se você criar uma transação dividida, é necessário haver uma descrição global para todas as partes da transação.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum cofrinho)","description":"Descrição","split_transaction_title_help":"Se você criar uma transação dividida, deve haver uma descrição global para todas as partes da transação.","destination_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","source_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","budget":"Orçamento","bill":"Fatura","you_create_withdrawal":"Você está criando uma saída.","you_create_transfer":"Você está criando uma transferência.","you_create_deposit":"Você está criando uma entrada.","edit":"Editar","delete":"Apagar","name":"Nome","profile_whoops":"Ops!","profile_something_wrong":"Alguma coisa deu errado!","profile_try_again":"Algo deu errado. Por favor tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Você não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segredo","profile_oauth_create_new_client":"Criar um novo cliente","profile_oauth_create_client":"Criar um cliente","profile_oauth_edit_client":"Editar cliente","profile_oauth_name_help":"Alguma coisa que seus usuários vão reconhecer e identificar.","profile_oauth_redirect_url":"URL de redirecionamento","profile_oauth_redirect_url_help":"A URL de retorno da sua solicitação de autorização.","profile_authorized_apps":"Aplicativos autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Escopos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está seu novo token de acesso pessoal. Esta é a única vez que ela será mostrada então não perca! Agora você pode usar esse token para fazer solicitações de API.","profile_no_personal_access_token":"Você não criou nenhum token de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Salvar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Cofrinho","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu novo segredo de cliente. Esta é a única vez que ela será mostrada, então não o perca! Agora você pode usar este segredo para fazer requisições de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exige que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expô-las à partes não autorizadas. Aplicações públicas, como aplicações de área de trabalho nativas ou JavaScript SPA, são incapazes de manter segredos com segurança.","multi_account_warning_unknown":"Dependendo do tipo de transação que você criar, a conta de origem e/ou de destino das divisões subsequentes pode ser sobrescrita pelo que estiver definido na primeira divisão da transação.","multi_account_warning_withdrawal":"Tenha em mente que a conta de origem das subsequentes divisões será sobrescrita pelo que estiver definido na primeira divisão da saída.","multi_account_warning_deposit":"Tenha em mente que a conta de destino das divisões subsequentes será sobrescrita pelo que estiver definido na primeira divisão da entrada.","multi_account_warning_transfer":"Tenha em mente que a conta de origem + de destino das divisões subsequentes será sobrescrita pelo que for definido na primeira divisão da transferência."},"form":{"interest_date":"Data de interesse","book_date":"Data reserva","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante em moeda estrangeira","payment_date":"Data de pagamento","invoice_date":"Data da Fatura","internal_reference":"Referência interna"},"config":{"html_language":"pt-br"}}')},4895:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Tudo bem?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transacção dividida","errors_submission":"Aconteceu algo errado com a sua submissão. Por favor, verifique os erros.","split":"Dividir","single_split":"Dividir","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi guardada.","transaction_updated_link":"Transação#{ID} foi atualizada.","transaction_new_stored_link":"Transação#{ID} foi guardada.","transaction_journal_information":"Informacao da transaccao","no_budget_pointer":"Parece que ainda não tem orçamentos. Pode criar-los na página de orçamentos. Orçamentos podem ajudá-lo a controlar as despesas.","no_bill_pointer":"Parece que ainda não tem contas. Pode criar-las na página de contas. Contas podem ajudá-lo a controlar as despesas.","source_account":"Conta de origem","hidden_fields_preferences":"Pode ativar mais opções de transações nas suas preferências.","destination_account":"Conta de destino","add_another_split":"Adicionar outra divisão","submission":"Submissão","create_another":"Depois de guardar, voltar aqui para criar outra.","reset_after":"Repor o formulário após o envio","submit":"Enviar","amount":"Montante","date":"Data","tags":"Tags","no_budget":"(sem orcamento)","no_bill":"(sem contas)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL Externo","update_transaction":"Actualizar transacção","after_update_create_another":"Após a atualização, regresse aqui para continuar a editar.","store_as_new":"Guarde como uma nova transação em vez de atualizar.","split_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum mealheiro)","description":"Descricao","split_transaction_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","destination_account_reconciliation":"Não pode editar a conta de destino de uma transacção de reconciliação.","source_account_reconciliation":"Não pode editar a conta de origem de uma transacção de reconciliação.","budget":"Orcamento","bill":"Conta","you_create_withdrawal":"Está a criar um levantamento.","you_create_transfer":"Está a criar uma transferência.","you_create_deposit":"Está a criar um deposito.","edit":"Alterar","delete":"Apagar","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Algo correu mal!","profile_try_again":"Algo correu mal. Por favor, tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Código secreto","profile_oauth_create_new_client":"Criar Novo Cliente","profile_oauth_create_client":"Criar Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que os utilizadores reconheçam e confiem.","profile_oauth_redirect_url":"URL de redireccionamento","profile_oauth_redirect_url_help":"URL de callback de autorização da aplicação.","profile_authorized_apps":"Aplicações autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Contextos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está o seu novo token de acesso pessoal. Esta é a única vês que o mesmo será mostrado portanto não o perca! Pode utiliza-lo para fazer pedidos de API.","profile_no_personal_access_token":"Você ainda não criou tokens de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Guardar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Mealheiro","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu segredo de cliente. Apenas estará visível uma vez portanto não o perca! Pode agora utilizar este segredo para fazer pedidos à API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exigir que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expor as mesmas a terceiros não autorizadas. Aplicações públicas, como por exemplo aplicações nativas de sistema operativo ou SPA JavaScript, são incapazes de garantir a segurança dos segredos.","multi_account_warning_unknown":"Dependendo do tipo de transição que quer criar, a conta de origem e/ou a destino de subsequentes divisões pode ser sub-escrita por quaisquer regra definida na primeira divisão da transação.","multi_account_warning_withdrawal":"Mantenha em mente que a conta de origem de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do levantamento.","multi_account_warning_deposit":"Mantenha em mente que a conta de destino de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do depósito.","multi_account_warning_transfer":"Mantenha em mente que a conta de origem + destino de divisões subsequentes serão sobre-escritas por quaisquer regras definidas na divisão da transferência."},"form":{"interest_date":"Data de juros","book_date":"Data de registo","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante estrangeiro","payment_date":"Data de pagamento","invoice_date":"Data da factura","internal_reference":"Referencia interna"},"config":{"html_language":"pt"}}')},403:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ce se redă?","flash_error":"Eroare!","flash_success":"Succes!","close":"Închide","split_transaction_title":"Descrierea tranzacției divizate","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Împarte","single_split":"Împarte","transaction_stored_link":"Tranzacția #{ID} (\\"{title}\\") a fost stocată.","transaction_updated_link":"Tranzacția #{ID} a fost actualizată.","transaction_new_stored_link":"Tranzacția #{ID} a fost stocată.","transaction_journal_information":"Informații despre tranzacții","no_budget_pointer":"Se pare că nu aveți încă bugete. Ar trebui să creați câteva pe pagina bugete. Bugetele vă pot ajuta să țineți evidența cheltuielilor.","no_bill_pointer":"Se pare că nu aveți încă facturi. Ar trebui să creați unele pe pagina facturi. Facturile vă pot ajuta să țineți evidența cheltuielilor.","source_account":"Contul sursă","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Contul de destinație","add_another_split":"Adăugați o divizare","submission":"Transmitere","create_another":"După stocare, reveniți aici pentru a crea alta.","reset_after":"Resetați formularul după trimitere","submit":"Trimite","amount":"Sumă","date":"Dată","tags":"Etichete","no_budget":"(nici un buget)","no_bill":"(no bill)","category":"Categorie","attachments":"Atașamente","notes":"Notițe","external_uri":"External URL","update_transaction":"Actualizați tranzacția","after_update_create_another":"După actualizare, reveniți aici pentru a continua editarea.","store_as_new":"Stocați ca o tranzacție nouă în loc să actualizați.","split_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","none_in_select_list":"(nici unul)","no_piggy_bank":"(nicio pușculiță)","description":"Descriere","split_transaction_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","destination_account_reconciliation":"Nu puteți edita contul de destinație al unei tranzacții de reconciliere.","source_account_reconciliation":"Nu puteți edita contul sursă al unei tranzacții de reconciliere.","budget":"Buget","bill":"Factură","you_create_withdrawal":"Creezi o retragere.","you_create_transfer":"Creezi un transfer.","you_create_deposit":"Creezi un depozit.","edit":"Editează","delete":"Șterge","name":"Nume","profile_whoops":"Hopaa!","profile_something_wrong":"A apărut o eroare!","profile_try_again":"A apărut o problemă. Încercați din nou.","profile_oauth_clients":"Clienți OAuth","profile_oauth_no_clients":"Nu ați creat niciun client OAuth.","profile_oauth_clients_header":"Clienți","profile_oauth_client_id":"ID Client","profile_oauth_client_name":"Nume","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Creare client nou","profile_oauth_create_client":"Creare client","profile_oauth_edit_client":"Editare client","profile_oauth_name_help":"Ceva ce utilizatorii vor recunoaște și vor avea încredere.","profile_oauth_redirect_url":"Redirectioneaza URL","profile_oauth_redirect_url_help":"URL-ul de retroapelare al aplicației dvs.","profile_authorized_apps":"Aplicațiile dvs autorizate","profile_authorized_clients":"Clienți autorizați","profile_scopes":"Domenii","profile_revoke":"Revocați","profile_personal_access_tokens":"Token de acces personal","profile_personal_access_token":"Token de acces personal","profile_personal_access_token_explanation":"Aici este noul dvs. token de acces personal. Este singura dată când va fi afișat așa că nu îl pierde! Acum poți folosi acest token pentru a face cereri API.","profile_no_personal_access_token":"Nu aţi creat nici un token personal de acces.","profile_create_new_token":"Crează un nou token","profile_create_token":"Crează token","profile_create":"Crează","profile_save_changes":"Salvează modificările","default_group_title_name":"(ungrouped)","piggy_bank":"Pușculiță","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Data de interes","book_date":"Rezervă dată","process_date":"Data procesării","due_date":"Data scadentă","foreign_amount":"Sumă străină","payment_date":"Data de plată","invoice_date":"Data facturii","internal_reference":"Referință internă"},"config":{"html_language":"ro"}}')},7448:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Что происходит с моими финансами?","flash_error":"Ошибка!","flash_success":"Успешно!","close":"Закрыть","split_transaction_title":"Описание разделённой транзакции","errors_submission":"При отправке что-то пошло не так. Пожалуйста, проверьте ошибки ниже.","split":"Разделить","single_split":"Разделённая транзакция","transaction_stored_link":"Транзакция #{ID} (\\"{title}\\") сохранена.","transaction_updated_link":"Транзакция #{ID} обновлена.","transaction_new_stored_link":"Транзакция #{ID} сохранена.","transaction_journal_information":"Информация о транзакции","no_budget_pointer":"Похоже, у вас пока нет бюджетов. Вы должны создать их на странице Бюджеты. Бюджеты могут помочь вам отслеживать расходы.","no_bill_pointer":"Похоже, у вас пока нет счетов на оплату. Вы должны создать их на странице Счета на оплату. Счета на оплату могут помочь вам отслеживать расходы.","source_account":"Счёт-источник","hidden_fields_preferences":"Вы можете включить больше параметров транзакции в настройках.","destination_account":"Счёт назначения","add_another_split":"Добавить еще одну часть","submission":"Отправить","create_another":"После сохранения вернуться сюда и создать ещё одну аналогичную запись.","reset_after":"Сбросить форму после отправки","submit":"Подтвердить","amount":"Сумма","date":"Дата","tags":"Метки","no_budget":"(вне бюджета)","no_bill":"(нет счёта на оплату)","category":"Категория","attachments":"Вложения","notes":"Заметки","external_uri":"External URL","update_transaction":"Обновить транзакцию","after_update_create_another":"После обновления вернитесь сюда, чтобы продолжить редактирование.","store_as_new":"Сохранить как новую транзакцию вместо обновления.","split_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание дле всех её составляющих.","none_in_select_list":"(нет)","no_piggy_bank":"(нет копилки)","description":"Описание","split_transaction_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание для всех её составляющих.","destination_account_reconciliation":"Вы не можете редактировать счёт назначения для сверяемой транзакции.","source_account_reconciliation":"Вы не можете редактировать счёт-источник для сверяемой транзакции.","budget":"Бюджет","bill":"Счёт к оплате","you_create_withdrawal":"Вы создаёте расход.","you_create_transfer":"Вы создаёте перевод.","you_create_deposit":"Вы создаёте доход.","edit":"Изменить","delete":"Удалить","name":"Название","profile_whoops":"Ууупс!","profile_something_wrong":"Что-то пошло не так!","profile_try_again":"Произошла ошибка. Пожалуйста, попробуйте снова.","profile_oauth_clients":"Клиенты OAuth","profile_oauth_no_clients":"У вас пока нет клиентов OAuth.","profile_oauth_clients_header":"Клиенты","profile_oauth_client_id":"ID клиента","profile_oauth_client_name":"Название","profile_oauth_client_secret":"Секретный ключ","profile_oauth_create_new_client":"Создать нового клиента","profile_oauth_create_client":"Создать клиента","profile_oauth_edit_client":"Изменить клиента","profile_oauth_name_help":"Что-то, что ваши пользователи знают, и чему доверяют.","profile_oauth_redirect_url":"URL редиректа","profile_oauth_redirect_url_help":"URL обратного вызова для вашего приложения.","profile_authorized_apps":"Авторизованные приложения","profile_authorized_clients":"Авторизованные клиенты","profile_scopes":"Разрешения","profile_revoke":"Отключить","profile_personal_access_tokens":"Персональные Access Tokens","profile_personal_access_token":"Персональный Access Token","profile_personal_access_token_explanation":"Вот ваш новый персональный токен доступа. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот токен, чтобы делать запросы по API.","profile_no_personal_access_token":"Вы не создали ни одного персонального токена доступа.","profile_create_new_token":"Создать новый токен","profile_create_token":"Создать токен","profile_create":"Создать","profile_save_changes":"Сохранить изменения","default_group_title_name":"(без группировки)","piggy_bank":"Копилка","profile_oauth_client_secret_title":"Ключ клиента","profile_oauth_client_secret_expl":"Вот ваш новый ключ клиента. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот ключ, чтобы делать запросы по API.","profile_oauth_confidential":"Конфиденциальный","profile_oauth_confidential_help":"Требовать, чтобы клиент аутентифицировался с секретным ключом. Конфиденциальные клиенты могут хранить учётные данные в надёжном виде, защищая их от несанкционированного доступа. Публичные приложения, такие как обычный рабочий стол или приложения JavaScript SPA, не могут надёжно хранить ваши ключи.","multi_account_warning_unknown":"В зависимости от типа транзакции, которую вы создаёте, счёт-источник и/или счёт назначения следующих частей разделённой транзакции могут быть заменены теми, которые указаны для первой части транзакции.","multi_account_warning_withdrawal":"Имейте в виду, что счёт-источник в других частях разделённой транзакции будет таким же, как в первой части расхода.","multi_account_warning_deposit":"Имейте в виду, что счёт назначения в других частях разделённой транзакции будет таким же, как в первой части дохода.","multi_account_warning_transfer":"Имейте в виду, что счёт-источник и счёт назначения в других частях разделённой транзакции будут такими же, как в первой части перевода."},"form":{"interest_date":"Дата начисления процентов","book_date":"Дата бронирования","process_date":"Дата обработки","due_date":"Срок оплаты","foreign_amount":"Сумма в иностранной валюте","payment_date":"Дата платежа","invoice_date":"Дата выставления счёта","internal_reference":"Внутренняя ссылка"},"config":{"html_language":"ru"}}')},6949:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ako to ide?","flash_error":"Chyba!","flash_success":"Hotovo!","close":"Zavrieť","split_transaction_title":"Popis rozúčtovania","errors_submission":"Pri odosielaní sa niečo nepodarilo. Skontrolujte prosím chyby.","split":"Rozúčtovať","single_split":"Rozúčtovať","transaction_stored_link":"Transakcia #{ID} (\\"{title}\\") bola uložená.","transaction_updated_link":"Transakcia #{ID} bola aktualizovaná.","transaction_new_stored_link":"Transakcia #{ID} bola uložená.","transaction_journal_information":"Informácie o transakcii","no_budget_pointer":"Zdá sa, že zatiaľ nemáte žiadne rozpočty. Na stránke rozpočty by ste si nejaké mali vytvoriť. Rozpočty môžu pomôcť udržať prehľad vo výdavkoch.","no_bill_pointer":"Zdá sa, že zatiaľ nemáte žiadne účty. Na stránke účty by ste mali nejaké vytvoriť. Účty môžu pomôcť udržať si prehľad vo výdavkoch.","source_account":"Zdrojový účet","hidden_fields_preferences":"Viac možností transakcií môžete povoliť vo svojich nastaveniach.","destination_account":"Cieľový účet","add_another_split":"Pridať ďalšie rozúčtovanie","submission":"Odoslanie","create_another":"Po uložení sa vrátiť späť sem a vytvoriť ďalší.","reset_after":"Po odoslaní vynulovať formulár","submit":"Odoslať","amount":"Suma","date":"Dátum","tags":"Štítky","no_budget":"(žiadny rozpočet)","no_bill":"(žiadny účet)","category":"Kategória","attachments":"Prílohy","notes":"Poznámky","external_uri":"Externá URL","update_transaction":"Upraviť transakciu","after_update_create_another":"Po aktualizácii sa vrátiť späť a pokračovať v úpravách.","store_as_new":"Namiesto aktualizácie uložiť ako novú transakciu.","split_title_help":"Ak vytvoríte rozúčtovanie transakcie, je potrebné, aby ste určili všeobecný popis pre všetky rozúčtovania danej transakcie.","none_in_select_list":"(žiadne)","no_piggy_bank":"(žiadna pokladnička)","description":"Popis","split_transaction_title_help":"Ak vytvoríte rozúčtovanú transakciu, musí existovať globálny popis všetkých rozúčtovaní transakcie.","destination_account_reconciliation":"Nemôžete upraviť cieľový účet zúčtovacej transakcie.","source_account_reconciliation":"Nemôžete upraviť zdrojový účet zúčtovacej transakcie.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"Vytvárate výber.","you_create_transfer":"Vytvárate prevod.","you_create_deposit":"Vytvárate vklad.","edit":"Upraviť","delete":"Odstrániť","name":"Názov","profile_whoops":"Ajaj!","profile_something_wrong":"Niečo sa pokazilo!","profile_try_again":"Niečo sa pokazilo. Prosím, skúste znova.","profile_oauth_clients":"OAuth klienti","profile_oauth_no_clients":"Zatiaľ ste nevytvorili žiadneho OAuth klienta.","profile_oauth_clients_header":"Klienti","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Meno/Názov","profile_oauth_client_secret":"Tajný kľúč","profile_oauth_create_new_client":"Vytvoriť nového klienta","profile_oauth_create_client":"Vytvoriť klienta","profile_oauth_edit_client":"Upraviť klienta","profile_oauth_name_help":"Niečo, čo vaši použivatelia poznajú a budú tomu dôverovať.","profile_oauth_redirect_url":"URL presmerovania","profile_oauth_redirect_url_help":"Spätná URL pre overenie autorizácie vašej aplikácie.","profile_authorized_apps":"Povolené aplikácie","profile_authorized_clients":"Autorizovaní klienti","profile_scopes":"Rozsahy","profile_revoke":"Odvolať","profile_personal_access_tokens":"Osobné prístupové tokeny","profile_personal_access_token":"Osobný prístupový token","profile_personal_access_token_explanation":"Toto je váš nový osobný prístupový token. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz ho môžete používať pre prístup k API.","profile_no_personal_access_token":"Ešte ste nevytvorili žiadne osobné prístupové tokeny.","profile_create_new_token":"Vytvoriť nový token","profile_create_token":"Vytvoriť token","profile_create":"Vytvoriť","profile_save_changes":"Uložiť zmeny","default_group_title_name":"(nezoskupené)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Tajný kľúč klienta","profile_oauth_client_secret_expl":"Toto je váš tajný kľúč klienta. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz môžete tento tajný kľúč používať pre prístup k API.","profile_oauth_confidential":"Dôverné","profile_oauth_confidential_help":"Vyžadujte od klienta autentifikáciu pomocou tajného kľúča. Dôverní klienti môžu uchovávať poverenia bezpečným spôsobom bez toho, aby boli vystavení neoprávneným stranám. Verejné aplikácie, ako napríklad natívna pracovná plocha alebo aplikácie Java SPA, nedokážu tajné kľúče bezpečne uchovať.","multi_account_warning_unknown":"V závislosti od typu vytvorenej transakcie, môže byť zdrojový a/alebo cieľový účet následných rozúčtovaní prepísaný údajmi v prvom rozdelení transakcie.","multi_account_warning_withdrawal":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozdelení výberu.","multi_account_warning_deposit":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní vkladu.","multi_account_warning_transfer":"Majte na pamäti, že zdrojový a cieľový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní prevodu."},"form":{"interest_date":"Úrokový dátum","book_date":"Dátum rezervácie","process_date":"Dátum spracovania","due_date":"Dátum splatnosti","foreign_amount":"Suma v cudzej mene","payment_date":"Dátum úhrady","invoice_date":"Dátum vystavenia","internal_reference":"Interná referencia"},"config":{"html_language":"sk"}}')},2285:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Vad spelas?","flash_error":"Fel!","flash_success":"Slutförd!","close":"Stäng","split_transaction_title":"Beskrivning av delad transaktion","errors_submission":"Något fel uppstod med inskickningen. Vänligen kontrollera felen nedan.","split":"Dela","single_split":"Dela","transaction_stored_link":"Transaktion #{ID} (\\"{title}\\") sparades.","transaction_updated_link":"Transaktion #{ID} uppdaterades.","transaction_new_stored_link":"Transaktion #{ID} sparades.","transaction_journal_information":"Transaktionsinformation","no_budget_pointer":"Du verkar inte ha några budgetar än. Du bör skapa några på budgetar-sidan. Budgetar kan hjälpa dig att hålla reda på utgifter.","no_bill_pointer":"Du verkar inte ha några räkningar ännu. Du bör skapa några på räkningar-sidan. Räkningar kan hjälpa dig att hålla reda på utgifter.","source_account":"Källkonto","hidden_fields_preferences":"Du kan aktivera fler transaktionsalternativ i dina inställningar.","destination_account":"Till konto","add_another_split":"Lägga till en annan delning","submission":"Inskickning","create_another":"Efter sparat, återkom hit för att skapa ytterligare en.","reset_after":"Återställ formulär efter inskickat","submit":"Skicka","amount":"Belopp","date":"Datum","tags":"Etiketter","no_budget":"(ingen budget)","no_bill":"(ingen räkning)","category":"Kategori","attachments":"Bilagor","notes":"Noteringar","external_uri":"External URL","update_transaction":"Uppdatera transaktion","after_update_create_another":"Efter uppdaterat, återkom hit för att fortsätta redigera.","store_as_new":"Spara en ny transaktion istället för att uppdatera.","split_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","none_in_select_list":"(Ingen)","no_piggy_bank":"(ingen spargris)","description":"Beskrivning","split_transaction_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","destination_account_reconciliation":"Du kan inte redigera destinationskontot för en avstämningstransaktion.","source_account_reconciliation":"Du kan inte redigera källkontot för en avstämningstransaktion.","budget":"Budget","bill":"Nota","you_create_withdrawal":"Du skapar ett uttag.","you_create_transfer":"Du skapar en överföring.","you_create_deposit":"Du skapar en insättning.","edit":"Redigera","delete":"Ta bort","name":"Namn","profile_whoops":"Hoppsan!","profile_something_wrong":"Något gick fel!","profile_try_again":"Något gick fel. Försök igen.","profile_oauth_clients":"OAuth klienter","profile_oauth_no_clients":"Du har inte skapat några OAuth klienter.","profile_oauth_clients_header":"Klienter","profile_oauth_client_id":"Klient ID","profile_oauth_client_name":"Namn","profile_oauth_client_secret":"Hemlighet","profile_oauth_create_new_client":"Skapa ny klient","profile_oauth_create_client":"Skapa klient","profile_oauth_edit_client":"Redigera klient","profile_oauth_name_help":"Något som dina användare kommer att känna igen och lita på.","profile_oauth_redirect_url":"Omdirigera URL","profile_oauth_redirect_url_help":"Din applikations auktorisering callback URL.","profile_authorized_apps":"Auktoriserade applikationer","profile_authorized_clients":"Auktoriserade klienter","profile_scopes":"Omfattningar","profile_revoke":"Återkalla","profile_personal_access_tokens":"Personliga åtkomst-Tokens","profile_personal_access_token":"Personlig åtkomsttoken","profile_personal_access_token_explanation":"Här är din nya personliga tillgångs token. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna token för att göra API-förfrågningar.","profile_no_personal_access_token":"Du har inte skapat några personliga åtkomsttokens.","profile_create_new_token":"Skapa ny token","profile_create_token":"Skapa token","profile_create":"Skapa","profile_save_changes":"Spara ändringar","default_group_title_name":"(ogrupperad)","piggy_bank":"Spargris","profile_oauth_client_secret_title":"Klienthemlighet","profile_oauth_client_secret_expl":"Här är din nya klient hemlighet. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna hemlighet för att göra API-förfrågningar.","profile_oauth_confidential":"Konfidentiell","profile_oauth_confidential_help":"Kräv att klienten autentiserar med en hemlighet. Konfidentiella klienter kan hålla autentiseringsuppgifter på ett säkert sätt utan att utsätta dem för obehöriga parter. Publika applikationer, som skrivbord eller JavaScript-SPA-applikationer, kan inte hålla hemligheter på ett säkert sätt.","multi_account_warning_unknown":"Beroende på vilken typ av transaktion du skapar, källan och/eller destinationskontot för efterföljande delningar kan åsidosättas av vad som än definieras i den första delningen av transaktionen.","multi_account_warning_withdrawal":"Tänk på att källkontot för efterföljande uppdelningar kommer att upphävas av vad som än definieras i den första uppdelningen av uttaget.","multi_account_warning_deposit":"Tänk på att destinationskontot för efterföljande uppdelningar kommer att styras av vad som än definieras i den första uppdelningen av insättningen.","multi_account_warning_transfer":"Tänk på att käll + destinationskonto av efterföljande delningar kommer att styras av vad som definieras i den första uppdelningen av överföringen."},"form":{"interest_date":"Räntedatum","book_date":"Bokföringsdatum","process_date":"Behandlingsdatum","due_date":"Förfallodatum","foreign_amount":"Utländskt belopp","payment_date":"Betalningsdatum","invoice_date":"Fakturadatum","internal_reference":"Intern referens"},"config":{"html_language":"sv"}}')},9783:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Chào mừng trở lại?","flash_error":"Lỗi!","flash_success":"Thành công!","close":"Đóng","split_transaction_title":"Mô tả giao dịch tách","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Chia ra","single_split":"Split","transaction_stored_link":"Giao dịch #{ID} (\\"{title}\\") đã được lưu trữ.","transaction_updated_link":"Giao dịch#{ID} đã được cập nhật.","transaction_new_stored_link":" Giao dịch #{ID} đã được lưu trữ.","transaction_journal_information":"Thông tin giao dịch","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Nguồn tài khoản","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Tài khoản đích","add_another_split":"Thêm một phân chia khác","submission":"Gửi","create_another":"Sau khi lưu trữ, quay trở lại đây để tạo một cái khác.","reset_after":"Đặt lại mẫu sau khi gửi","submit":"Gửi","amount":"Số tiền","date":"Ngày","tags":"Nhãn","no_budget":"(không có ngân sách)","no_bill":"(no bill)","category":"Danh mục","attachments":"Tệp đính kèm","notes":"Ghi chú","external_uri":"External URL","update_transaction":"Cập nhật giao dịch","after_update_create_another":"Sau khi cập nhật, quay lại đây để tiếp tục chỉnh sửa.","store_as_new":"Lưu trữ như một giao dịch mới thay vì cập nhật.","split_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","none_in_select_list":"(Trống)","no_piggy_bank":"(chưa có heo đất)","description":"Sự miêu tả","split_transaction_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","destination_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản đích của giao dịch đối chiếu.","source_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản nguồn của giao dịch đối chiếu.","budget":"Ngân sách","bill":"Hóa đơn","you_create_withdrawal":"Bạn đang tạo một rút tiền.","you_create_transfer":"Bạn đang tạo một chuyển khoản.","you_create_deposit":"Bạn đang tạo một tiền gửi.","edit":"Sửa","delete":"Xóa","name":"Tên","profile_whoops":"Rất tiếc!","profile_something_wrong":"Có lỗi xảy ra!","profile_try_again":"Xảy ra lỗi. Vui lòng thử lại.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Bạn đã không tạo ra bất kỳ OAuth clients nào.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Tên","profile_oauth_client_secret":"Mã bí mật","profile_oauth_create_new_client":"Tạo mới Client","profile_oauth_create_client":"Tạo Client","profile_oauth_edit_client":"Sửa Client","profile_oauth_name_help":"Một cái gì đó người dùng của bạn sẽ nhận ra và tin tưởng.","profile_oauth_redirect_url":"URL chuyển tiếp","profile_oauth_redirect_url_help":"URL gọi lại ủy quyền của ứng dụng của bạn.","profile_authorized_apps":"Uỷ quyền ứng dụng","profile_authorized_clients":"Client ủy quyền","profile_scopes":"Phạm vi","profile_revoke":"Thu hồi","profile_personal_access_tokens":"Mã truy cập cá nhân","profile_personal_access_token":"Mã truy cập cá nhân","profile_personal_access_token_explanation":"Đây là mã thông báo truy cập cá nhân mới của bạn. Đây là lần duy nhất nó sẽ được hiển thị vì vậy đừng đánh mất nó! Bây giờ bạn có thể sử dụng mã thông báo này để thực hiện API.","profile_no_personal_access_token":"Bạn chưa tạo bất kỳ mã thông báo truy cập cá nhân nào.","profile_create_new_token":"Tạo mã mới","profile_create_token":"Tạo mã","profile_create":"Tạo","profile_save_changes":"Lưu thay đổi","default_group_title_name":"(chưa nhóm)","piggy_bank":"Heo đất","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ngày lãi","book_date":"Ngày đặt sách","process_date":"Ngày xử lý","due_date":"Ngày đáo hạn","foreign_amount":"Ngoại tệ","payment_date":"Ngày thanh toán","invoice_date":"Ngày hóa đơn","internal_reference":"Tài liệu tham khảo nội bộ"},"config":{"html_language":"vi"}}')},1922:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"今天理财了吗?","flash_error":"错误!","flash_success":"成功!","close":"关闭","split_transaction_title":"拆分交易的描述","errors_submission":"您提交的内容有误,请检查错误信息。","split":"拆分","single_split":"拆分","transaction_stored_link":"交易 #{ID} (“{title}”) 已保存。","transaction_updated_link":"交易 #{ID} 已更新。","transaction_new_stored_link":"交易 #{ID} 已保存。","transaction_journal_information":"交易信息","no_budget_pointer":"您还没有预算,您应该在预算页面进行创建。预算可以帮助您追踪支出。","no_bill_pointer":"您还没有账单,您应该在账单页面进行创建。账单可以帮助您追踪支出。","source_account":"来源账户","hidden_fields_preferences":"您可以在偏好设定中启用更多交易选项。","destination_account":"目标账户","add_another_split":"增加另一笔拆分","submission":"提交","create_another":"保存后,返回此页面以创建新记录","reset_after":"提交后重置表单","submit":"提交","amount":"金额","date":"日期","tags":"标签","no_budget":"(无预算)","no_bill":"(无账单)","category":"分类","attachments":"附件","notes":"备注","external_uri":"外部链接","update_transaction":"更新交易","after_update_create_another":"更新后,返回此页面继续编辑。","store_as_new":"保存为新交易而不是更新此交易。","split_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","none_in_select_list":"(空)","no_piggy_bank":"(无存钱罐)","description":"描述","split_transaction_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","destination_account_reconciliation":"您不能编辑对账交易的目标账户","source_account_reconciliation":"您不能编辑对账交易的来源账户。","budget":"预算","bill":"账单","you_create_withdrawal":"您正在创建一笔支出","you_create_transfer":"您正在创建一笔转账","you_create_deposit":"您正在创建一笔收入","edit":"编辑","delete":"删除","name":"名称","profile_whoops":"很抱歉!","profile_something_wrong":"发生错误!","profile_try_again":"发生错误,请稍后再试。","profile_oauth_clients":"OAuth 客户端","profile_oauth_no_clients":"您尚未创建任何 OAuth 客户端。","profile_oauth_clients_header":"客户端","profile_oauth_client_id":"客户端 ID","profile_oauth_client_name":"名称","profile_oauth_client_secret":"密钥","profile_oauth_create_new_client":"创建新客户端","profile_oauth_create_client":"创建客户端","profile_oauth_edit_client":"编辑客户端","profile_oauth_name_help":"您的用户可以识别并信任的信息","profile_oauth_redirect_url":"跳转网址","profile_oauth_redirect_url_help":"您的应用程序的授权回调网址","profile_authorized_apps":"已授权应用","profile_authorized_clients":"已授权客户端","profile_scopes":"范围","profile_revoke":"撤消","profile_personal_access_tokens":"个人访问令牌","profile_personal_access_token":"个人访问令牌","profile_personal_access_token_explanation":"请妥善保存您的新个人访问令牌,此令牌仅会在这里展示一次。您现在已可以使用此令牌进行 API 请求。","profile_no_personal_access_token":"您还没有创建个人访问令牌。","profile_create_new_token":"创建新令牌","profile_create_token":"创建令牌","profile_create":"创建","profile_save_changes":"保存更改","default_group_title_name":"(未分组)","piggy_bank":"存钱罐","profile_oauth_client_secret_title":"客户端密钥","profile_oauth_client_secret_expl":"请妥善保存您的新客户端的密钥,此密钥仅会在这里展示一次。您现在已可以使用此密钥进行 API 请求。","profile_oauth_confidential":"使用加密","profile_oauth_confidential_help":"要求客户端使用密钥进行认证。加密客户端可以安全储存凭据且不将其泄露给未授权方,而公共应用程序(例如本地计算机或 JavaScript SPA 应用程序)无法保证凭据的安全性。","multi_account_warning_unknown":"根据您创建的交易类型,后续拆分的来源和/或目标账户可能被交易的首笔拆分的配置所覆盖。","multi_account_warning_withdrawal":"请注意,后续拆分的来源账户将会被支出的首笔拆分的配置所覆盖。","multi_account_warning_deposit":"请注意,后续拆分的目标账户将会被收入的首笔拆分的配置所覆盖。","multi_account_warning_transfer":"请注意,后续拆分的来源和目标账户将会被转账的首笔拆分的配置所覆盖。"},"form":{"interest_date":"利息日期","book_date":"登记日期","process_date":"处理日期","due_date":"到期日","foreign_amount":"外币金额","payment_date":"付款日期","invoice_date":"发票日期","internal_reference":"内部引用"},"config":{"html_language":"zh-cn"}}')},4963:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"錯誤!","flash_success":"成功!","close":"關閉","split_transaction_title":"拆分交易的描述","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"分割","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"交易資訊","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"增加拆分","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"送出","amount":"金額","date":"日期","tags":"標籤","no_budget":"(無預算)","no_bill":"(no bill)","category":"分類","attachments":"附加檔案","notes":"備註","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"若您建立一筆拆分交易,須有一個有關交易所有拆分的整體描述。","none_in_select_list":"(空)","no_piggy_bank":"(no piggy bank)","description":"描述","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"預算","bill":"帳單","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"編輯","delete":"刪除","name":"名稱","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"小豬撲滿","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"利率日期","book_date":"登記日期","process_date":"處理日期","due_date":"到期日","foreign_amount":"外幣金額","payment_date":"付款日期","invoice_date":"發票日期","internal_reference":"內部參考"},"config":{"html_language":"zh-tw"}}')}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={id:n,exports:{}};return e[n](i,i.exports,a),i.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}const t={data:function(){return{clients:[],clientSecret:null,createForm:{errors:[],name:"",redirect:"",confidential:!0},editForm:{errors:[],name:"",redirect:""}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getClients(),$("#modal-create-client").on("shown.bs.modal",(function(){$("#create-client-name").focus()})),$("#modal-edit-client").on("shown.bs.modal",(function(){$("#edit-client-name").focus()}))},getClients:function(){var e=this;axios.get("./oauth/clients").then((function(t){e.clients=t.data}))},showCreateClientForm:function(){$("#modal-create-client").modal("show")},store:function(){this.persistClient("post","./oauth/clients",this.createForm,"#modal-create-client")},edit:function(e){this.editForm.id=e.id,this.editForm.name=e.name,this.editForm.redirect=e.redirect,$("#modal-edit-client").modal("show")},update:function(){this.persistClient("put","./oauth/clients/"+this.editForm.id,this.editForm,"#modal-edit-client")},persistClient:function(t,a,n,o){var i=this;n.errors=[],axios[t](a,n).then((function(e){i.getClients(),n.name="",n.redirect="",n.errors=[],$(o).modal("hide"),e.data.plainSecret&&i.showClientSecret(e.data.plainSecret)})).catch((function(t){"object"===e(t.response.data)?n.errors=_.flatten(_.toArray(t.response.data.errors)):n.errors=["Something went wrong. Please try again."]}))},showClientSecret:function(e){this.clientSecret=e,$("#modal-client-secret").modal("show")},destroy:function(e){var t=this;axios.delete("./oauth/clients/"+e.id).then((function(e){t.getClients()}))}}};var n=a(3379),o=a.n(n),i=a(4130),r={insert:"head",singleton:!1};o()(i.Z,r);i.Z.locals;function s(e,t,a,n,o,i,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=a,c._compiled=!0),n&&(c.functional=!0),i&&(c._scopeId="data-v-"+i),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):o&&(l=s?function(){o.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:o),l)if(c.functional){c._injectStyles=l;var _=c.render;c.render=function(e,t){return l.call(t),_(e,t)}}else{var u=c.beforeCreate;c.beforeCreate=u?[].concat(u,l):[l]}return{exports:e,options:c}}const l=s(t,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("div",{staticClass:"box box-default"},[a("div",{staticClass:"box-header with-border"},[a("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_clients"))+"\n ")]),e._v(" "),a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateClientForm}},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_create_new_client"))+"\n ")])]),e._v(" "),a("div",{staticClass:"box-body"},[0===e.clients.length?a("p",{staticClass:"mb-0"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_no_clients"))+"\n ")]):e._e(),e._v(" "),e.clients.length>0?a("table",{staticClass:"table table-responsive table-borderless mb-0"},[a("caption",[e._v(e._s(e.$t("firefly.profile_oauth_clients_header")))]),e._v(" "),a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.profile_oauth_client_id")))]),e._v(" "),a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.profile_oauth_client_secret")))]),e._v(" "),a("th",{attrs:{scope:"col"}}),e._v(" "),a("th",{attrs:{scope:"col"}})])]),e._v(" "),a("tbody",e._l(e.clients,(function(t){return a("tr",[a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.id)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.name)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("code",[e._v(e._s(t.secret?t.secret:"-"))])]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link",attrs:{tabindex:"-1"},on:{click:function(a){return e.edit(t)}}},[e._v("\n "+e._s(e.$t("firefly.edit"))+"\n ")])]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link text-danger",on:{click:function(a){return e.destroy(t)}}},[e._v("\n "+e._s(e.$t("firefly.delete"))+"\n ")])])])})),0)]):e._e()]),e._v(" "),a("div",{staticClass:"box-footer"},[a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateClientForm}},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_create_new_client"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-create-client",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_create_client"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[e.createForm.errors.length>0?a("div",{staticClass:"alert alert-danger"},[a("p",{staticClass:"mb-0"},[a("strong",[e._v(e._s(e.$t("firefly.profile_whoops")))]),e._v(" "+e._s(e.$t("firefly.profile_something_wrong")))]),e._v(" "),a("br"),e._v(" "),a("ul",e._l(e.createForm.errors,(function(t){return a("li",[e._v("\n "+e._s(t)+"\n ")])})),0)]):e._e(),e._v(" "),a("form",{attrs:{role:"form","aria-label":"form"}},[a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.name,expression:"createForm.name"}],staticClass:"form-control",attrs:{id:"create-client-name",type:"text"},domProps:{value:e.createForm.name},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.store(t)},input:function(t){t.target.composing||e.$set(e.createForm,"name",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_name_help"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.profile_oauth_redirect_url")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.redirect,expression:"createForm.redirect"}],staticClass:"form-control",attrs:{name:"redirect",type:"text"},domProps:{value:e.createForm.redirect},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.store(t)},input:function(t){t.target.composing||e.$set(e.createForm,"redirect",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_redirect_url_help"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.profile_oauth_confidential")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("div",{staticClass:"checkbox"},[a("label",[a("input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.confidential,expression:"createForm.confidential"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.createForm.confidential)?e._i(e.createForm.confidential,null)>-1:e.createForm.confidential},on:{change:function(t){var a=e.createForm.confidential,n=t.target,o=!!n.checked;if(Array.isArray(a)){var i=e._i(a,null);n.checked?i<0&&e.$set(e.createForm,"confidential",a.concat([null])):i>-1&&e.$set(e.createForm,"confidential",a.slice(0,i).concat(a.slice(i+1)))}else e.$set(e.createForm,"confidential",o)}}})])]),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_confidential_help"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))]),e._v(" "),a("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:e.store}},[e._v("\n "+e._s(e.$t("firefly.profile_create"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-edit-client",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_edit_client"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[e.editForm.errors.length>0?a("div",{staticClass:"alert alert-danger"},[a("p",{staticClass:"mb-0"},[a("strong",[e._v(e._s(e.$t("firefly.profile_whoops")))]),e._v(" "+e._s(e.$t("firefly.profile_something_wrong")))]),e._v(" "),a("br"),e._v(" "),a("ul",e._l(e.editForm.errors,(function(t){return a("li",[e._v("\n "+e._s(t)+"\n ")])})),0)]):e._e(),e._v(" "),a("form",{attrs:{role:"form","aria-label":"form"}},[a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.editForm.name,expression:"editForm.name"}],staticClass:"form-control",attrs:{id:"edit-client-name",type:"text"},domProps:{value:e.editForm.name},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.update(t)},input:function(t){t.target.composing||e.$set(e.editForm,"name",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_name_help"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.profile_oauth_redirect_url")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.editForm.redirect,expression:"editForm.redirect"}],staticClass:"form-control",attrs:{name:"redirect",type:"text"},domProps:{value:e.editForm.redirect},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.update(t)},input:function(t){t.target.composing||e.$set(e.editForm,"redirect",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_redirect_url_help"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))]),e._v(" "),a("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:e.update}},[e._v("\n "+e._s(e.$t("firefly.profile_save_changes"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-client-secret",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_client_secret_title"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[a("p",[e._v("\n "+e._s(e.$t("firefly.profile_oauth_client_secret_expl"))+"\n ")]),e._v(" "),a("input",{directives:[{name:"model",rawName:"v-model",value:e.clientSecret,expression:"clientSecret"}],staticClass:"form-control",attrs:{type:"text"},domProps:{value:e.clientSecret},on:{input:function(t){t.target.composing||(e.clientSecret=t.target.value)}}})]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))])])])])])])}),[],!1,null,"5006d7a4",null).exports;const c={data:function(){return{tokens:[]}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens()},getTokens:function(){var e=this;axios.get("./oauth/tokens").then((function(t){e.tokens=t.data}))},revoke:function(e){var t=this;axios.delete("./oauth/tokens/"+e.id).then((function(e){t.getTokens()}))}}};var u=a(1954),d={insert:"head",singleton:!1};o()(u.Z,d);u.Z.locals;const p=s(c,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[e.tokens.length>0?a("div",[a("div",{staticClass:"box box-default"},[a("div",{staticClass:"box-header"},[a("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.profile_authorized_apps"))+"\n ")])]),e._v(" "),a("div",{staticClass:"box-body"},[a("table",{staticClass:"table table-responsive table-borderless mb-0"},[a("caption",{staticStyle:{display:"none"}},[e._v(e._s(e.$t("firefly.profile_authorized_apps")))]),e._v(" "),a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.profile_scopes")))]),e._v(" "),a("th",{attrs:{scope:"col"}})])]),e._v(" "),a("tbody",e._l(e.tokens,(function(t){return a("tr",[a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.client.name)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[t.scopes.length>0?a("span",[e._v("\n "+e._s(t.scopes.join(", "))+"\n ")]):e._e()]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link text-danger",on:{click:function(a){return e.revoke(t)}}},[e._v("\n "+e._s(e.$t("firefly.profile_revoke"))+"\n ")])])])})),0)])])])]):e._e()])}),[],!1,null,"da1c7f80",null).exports;function f(e){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}const h={data:function(){return{accessToken:null,tokens:[],scopes:[],form:{name:"",scopes:[],errors:[]}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens(),this.getScopes(),$("#modal-create-token").on("shown.bs.modal",(function(){$("#create-token-name").focus()}))},getTokens:function(){var e=this;axios.get("./oauth/personal-access-tokens").then((function(t){e.tokens=t.data}))},getScopes:function(){var e=this;axios.get("./oauth/scopes").then((function(t){e.scopes=t.data}))},showCreateTokenForm:function(){$("#modal-create-token").modal("show")},store:function(){var e=this;this.accessToken=null,this.form.errors=[],axios.post("./oauth/personal-access-tokens",this.form).then((function(t){e.form.name="",e.form.scopes=[],e.form.errors=[],e.tokens.push(t.data.token),e.showAccessToken(t.data.accessToken)})).catch((function(t){"object"===f(t.response.data)?e.form.errors=_.flatten(_.toArray(t.response.data.errors)):e.form.errors=["Something went wrong. Please try again."]}))},toggleScope:function(e){this.scopeIsAssigned(e)?this.form.scopes=_.reject(this.form.scopes,(function(t){return t==e})):this.form.scopes.push(e)},scopeIsAssigned:function(e){return _.indexOf(this.form.scopes,e)>=0},showAccessToken:function(e){$("#modal-create-token").modal("hide"),this.accessToken=e,$("#modal-access-token").modal("show")},revoke:function(e){var t=this;axios.delete("./oauth/personal-access-tokens/"+e.id).then((function(e){t.getTokens()}))}}};var m=a(1672),g={insert:"head",singleton:!1};o()(m.Z,g);m.Z.locals;const k=s(h,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("div",[a("div",{staticClass:"box box-default"},[a("div",{staticClass:"box-header"},[a("h3",{staticClass:"box-title"},[e._v(e._s(e.$t("firefly.profile_personal_access_tokens")))]),e._v(" "),a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateTokenForm}},[e._v("\n "+e._s(e.$t("firefly.profile_create_new_token"))+"\n ")])]),e._v(" "),a("div",{staticClass:"box-body"},[0===e.tokens.length?a("p",{staticClass:"mb-0"},[e._v("\n "+e._s(e.$t("firefly.profile_no_personal_access_token"))+"\n ")]):e._e(),e._v(" "),e.tokens.length>0?a("table",{staticClass:"table table-responsive table-borderless mb-0"},[a("caption",{staticStyle:{display:"none"}},[e._v(e._s(e.$t("firefly.profile_personal_access_tokens")))]),e._v(" "),a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("th",{attrs:{scope:"col"}})])]),e._v(" "),a("tbody",e._l(e.tokens,(function(t){return a("tr",[a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.name)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link text-danger",on:{click:function(a){return e.revoke(t)}}},[e._v("\n "+e._s(e.$t("firefly.delete"))+"\n ")])])])})),0)]):e._e()]),e._v(" "),a("div",{staticClass:"box-footer"},[a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateTokenForm}},[e._v("\n "+e._s(e.$t("firefly.profile_create_new_token"))+"\n ")])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-create-token",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_create_token"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[e.form.errors.length>0?a("div",{staticClass:"alert alert-danger"},[a("p",{staticClass:"mb-0"},[a("strong",[e._v(e._s(e.$t("firefly.profile_whoops")))]),e._v("\n "+e._s(e.$t("firefly.profile_something_wrong")))]),e._v(" "),a("br"),e._v(" "),a("ul",e._l(e.form.errors,(function(t){return a("li",[e._v("\n "+e._s(t)+"\n ")])})),0)]):e._e(),e._v(" "),a("form",{attrs:{role:"form"},on:{submit:function(t){return t.preventDefault(),e.store(t)}}},[a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-4 col-form-label"},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("div",{staticClass:"col-md-6"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.form.name,expression:"form.name"}],staticClass:"form-control",attrs:{id:"create-token-name",name:"name",type:"text"},domProps:{value:e.form.name},on:{input:function(t){t.target.composing||e.$set(e.form,"name",t.target.value)}}})])]),e._v(" "),e.scopes.length>0?a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-4 col-form-label"},[e._v(e._s(e.$t("firefly.profile_scopes")))]),e._v(" "),a("div",{staticClass:"col-md-6"},e._l(e.scopes,(function(t){return a("div",[a("div",{staticClass:"checkbox"},[a("label",[a("input",{attrs:{type:"checkbox"},domProps:{checked:e.scopeIsAssigned(t.id)},on:{click:function(a){return e.toggleScope(t.id)}}}),e._v("\n\n "+e._s(t.id)+"\n ")])])])})),0)]):e._e()])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))]),e._v(" "),a("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:e.store}},[e._v("\n Create\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-access-token",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_personal_access_token"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[a("p",[e._v("\n "+e._s(e.$t("firefly.profile_personal_access_token_explanation"))+"\n ")]),e._v(" "),a("textarea",{staticClass:"form-control",staticStyle:{width:"100%"},attrs:{readonly:"",rows:"20"}},[e._v(e._s(e.accessToken))])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))])])])])])])}),[],!1,null,"5b4ee38c",null).exports;const v=s({name:"ProfileOptions"},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("div",{staticClass:"row"},[a("div",{staticClass:"col-lg-12"},[a("passport-clients")],1)]),e._v(" "),a("div",{staticClass:"row"},[a("div",{staticClass:"col-lg-12"},[a("passport-authorized-clients")],1)]),e._v(" "),a("div",{staticClass:"row"},[a("div",{staticClass:"col-lg-12"},[a("passport-personal-access-tokens")],1)])])}),[],!1,null,null,null).exports;a(9703),Vue.component("passport-clients",l),Vue.component("passport-authorized-clients",p),Vue.component("passport-personal-access-tokens",k),Vue.component("profile-options",v);var b=a(5299),w={};new Vue({i18n:b,el:"#passport_clients",render:function(e){return e(v,{props:w})}})})()})(); \ No newline at end of file +(()=>{var e={9669:(e,t,a)=>{e.exports=a(1609)},5448:(e,t,a)=>{"use strict";var n=a(4867),o=a(6026),i=a(4372),r=a(5327),s=a(4097),l=a(4109),c=a(7985),_=a(5061);e.exports=function(e){return new Promise((function(t,a){var u=e.data,d=e.headers;n.isFormData(u)&&delete d["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var f=e.auth.username||"",h=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(f+":"+h)}var m=s(e.baseURL,e.url);if(p.open(e.method.toUpperCase(),r(m,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in p?l(p.getAllResponseHeaders()):null,i={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:n,config:e,request:p};o(t,a,i),p=null}},p.onabort=function(){p&&(a(_("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){a(_("Network Error",e,null,p)),p=null},p.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),a(_(t,e,"ECONNABORTED",p)),p=null},n.isStandardBrowserEnv()){var g=(e.withCredentials||c(m))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in p&&n.forEach(d,(function(e,t){void 0===u&&"content-type"===t.toLowerCase()?delete d[t]:p.setRequestHeader(t,e)})),n.isUndefined(e.withCredentials)||(p.withCredentials=!!e.withCredentials),e.responseType)try{p.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),a(e),p=null)})),u||(u=null),p.send(u)}))}},1609:(e,t,a)=>{"use strict";var n=a(4867),o=a(1849),i=a(321),r=a(7185);function s(e){var t=new i(e),a=o(i.prototype.request,t);return n.extend(a,i.prototype,t),n.extend(a,t),a}var l=s(a(5655));l.Axios=i,l.create=function(e){return s(r(l.defaults,e))},l.Cancel=a(5263),l.CancelToken=a(4972),l.isCancel=a(6502),l.all=function(e){return Promise.all(e)},l.spread=a(8713),l.isAxiosError=a(6268),e.exports=l,e.exports.default=l},5263:e=>{"use strict";function t(e){this.message=e}t.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},t.prototype.__CANCEL__=!0,e.exports=t},4972:(e,t,a)=>{"use strict";var n=a(5263);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var a=this;e((function(e){a.reason||(a.reason=new n(e),t(a.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,a)=>{"use strict";var n=a(4867),o=a(5327),i=a(782),r=a(3572),s=a(7185);function l(e){this.defaults=e,this.interceptors={request:new i,response:new i}}l.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[r,void 0],a=Promise.resolve(e);for(this.interceptors.request.forEach((function(e){t.unshift(e.fulfilled,e.rejected)})),this.interceptors.response.forEach((function(e){t.push(e.fulfilled,e.rejected)}));t.length;)a=a.then(t.shift(),t.shift());return a},l.prototype.getUri=function(e){return e=s(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},n.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,a){return this.request(s(a||{},{method:e,url:t,data:(a||{}).data}))}})),n.forEach(["post","put","patch"],(function(e){l.prototype[e]=function(t,a,n){return this.request(s(n||{},{method:e,url:t,data:a}))}})),e.exports=l},782:(e,t,a)=>{"use strict";var n=a(4867);function o(){this.handlers=[]}o.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){n.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},4097:(e,t,a)=>{"use strict";var n=a(1793),o=a(7303);e.exports=function(e,t){return e&&!n(t)?o(e,t):t}},5061:(e,t,a)=>{"use strict";var n=a(481);e.exports=function(e,t,a,o,i){var r=new Error(e);return n(r,t,a,o,i)}},3572:(e,t,a)=>{"use strict";var n=a(4867),o=a(8527),i=a(6502),r=a(5655);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=o(e.data,e.headers,e.transformRequest),e.headers=n.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),n.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||r.adapter)(e).then((function(t){return s(e),t.data=o(t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(s(e),t&&t.response&&(t.response.data=o(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},481:e=>{"use strict";e.exports=function(e,t,a,n,o){return e.config=t,a&&(e.code=a),e.request=n,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},7185:(e,t,a)=>{"use strict";var n=a(4867);e.exports=function(e,t){t=t||{};var a={},o=["url","method","data"],i=["headers","auth","proxy","params"],r=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],s=["validateStatus"];function l(e,t){return n.isPlainObject(e)&&n.isPlainObject(t)?n.merge(e,t):n.isPlainObject(t)?n.merge({},t):n.isArray(t)?t.slice():t}function c(o){n.isUndefined(t[o])?n.isUndefined(e[o])||(a[o]=l(void 0,e[o])):a[o]=l(e[o],t[o])}n.forEach(o,(function(e){n.isUndefined(t[e])||(a[e]=l(void 0,t[e]))})),n.forEach(i,c),n.forEach(r,(function(o){n.isUndefined(t[o])?n.isUndefined(e[o])||(a[o]=l(void 0,e[o])):a[o]=l(void 0,t[o])})),n.forEach(s,(function(n){n in t?a[n]=l(e[n],t[n]):n in e&&(a[n]=l(void 0,e[n]))}));var _=o.concat(i).concat(r).concat(s),u=Object.keys(e).concat(Object.keys(t)).filter((function(e){return-1===_.indexOf(e)}));return n.forEach(u,c),a}},6026:(e,t,a)=>{"use strict";var n=a(5061);e.exports=function(e,t,a){var o=a.config.validateStatus;a.status&&o&&!o(a.status)?t(n("Request failed with status code "+a.status,a.config,null,a.request,a)):e(a)}},8527:(e,t,a)=>{"use strict";var n=a(4867);e.exports=function(e,t,a){return n.forEach(a,(function(a){e=a(e,t)})),e}},5655:(e,t,a)=>{"use strict";var n=a(4155),o=a(4867),i=a(6016),r={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!o.isUndefined(e)&&o.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==n&&"[object process]"===Object.prototype.toString.call(n))&&(l=a(5448)),l),transformRequest:[function(e,t){return i(t,"Accept"),i(t,"Content-Type"),o.isFormData(e)||o.isArrayBuffer(e)||o.isBuffer(e)||o.isStream(e)||o.isFile(e)||o.isBlob(e)?e:o.isArrayBufferView(e)?e.buffer:o.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):o.isObject(e)?(s(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},o.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),o.forEach(["post","put","patch"],(function(e){c.headers[e]=o.merge(r)})),e.exports=c},1849:e=>{"use strict";e.exports=function(e,t){return function(){for(var a=new Array(arguments.length),n=0;n{"use strict";var n=a(4867);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,a){if(!t)return e;var i;if(a)i=a(t);else if(n.isURLSearchParams(t))i=t.toString();else{var r=[];n.forEach(t,(function(e,t){null!=e&&(n.isArray(e)?t+="[]":e=[e],n.forEach(e,(function(e){n.isDate(e)?e=e.toISOString():n.isObject(e)&&(e=JSON.stringify(e)),r.push(o(t)+"="+o(e))})))})),i=r.join("&")}if(i){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,a)=>{"use strict";var n=a(4867);e.exports=n.isStandardBrowserEnv()?{write:function(e,t,a,o,i,r){var s=[];s.push(e+"="+encodeURIComponent(t)),n.isNumber(a)&&s.push("expires="+new Date(a).toGMTString()),n.isString(o)&&s.push("path="+o),n.isString(i)&&s.push("domain="+i),!0===r&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},6268:e=>{"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},7985:(e,t,a)=>{"use strict";var n=a(4867);e.exports=n.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),a=document.createElement("a");function o(e){var n=e;return t&&(a.setAttribute("href",n),n=a.href),a.setAttribute("href",n),{href:a.href,protocol:a.protocol?a.protocol.replace(/:$/,""):"",host:a.host,search:a.search?a.search.replace(/^\?/,""):"",hash:a.hash?a.hash.replace(/^#/,""):"",hostname:a.hostname,port:a.port,pathname:"/"===a.pathname.charAt(0)?a.pathname:"/"+a.pathname}}return e=o(window.location.href),function(t){var a=n.isString(t)?o(t):t;return a.protocol===e.protocol&&a.host===e.host}}():function(){return!0}},6016:(e,t,a)=>{"use strict";var n=a(4867);e.exports=function(e,t){n.forEach(e,(function(a,n){n!==t&&n.toUpperCase()===t.toUpperCase()&&(e[t]=a,delete e[n])}))}},4109:(e,t,a)=>{"use strict";var n=a(4867),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,a,i,r={};return e?(n.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=n.trim(e.substr(0,i)).toLowerCase(),a=n.trim(e.substr(i+1)),t){if(r[t]&&o.indexOf(t)>=0)return;r[t]="set-cookie"===t?(r[t]?r[t]:[]).concat([a]):r[t]?r[t]+", "+a:a}})),r):r}},8713:e=>{"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},4867:(e,t,a)=>{"use strict";var n=a(1849),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function r(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function l(e){if("[object Object]"!==o.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function c(e){return"[object Function]"===o.call(e)}function _(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),i(e))for(var a=0,n=e.length;a{window.axios=a(9669),window.axios.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var n=document.head.querySelector('meta[name="csrf-token"]');n?window.axios.defaults.headers.common["X-CSRF-TOKEN"]=n.content:console.error("CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token")},5299:(e,t,a)=>{e.exports=new vuei18n({locale:document.documentElement.lang,fallbackLocale:"en",messages:{bg:a(987),cs:a(6054),de:a(7062),en:a(6886),"en-us":a(6886),"en-gb":a(5642),es:a(2360),el:a(1410),fr:a(6833),hu:a(6477),it:a(3092),nl:a(78),nb:a(2502),pl:a(8691),fi:a(3684),"pt-br":a(122),"pt-pt":a(4895),ro:a(403),ru:a(7448),"zh-tw":a(4963),"zh-cn":a(1922),sk:a(6949),sv:a(2285),vi:a(9783)}})},1954:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(3645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,".action-link[data-v-da1c7f80]{cursor:pointer}",""]);const i=o},4130:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(3645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,".action-link[data-v-5006d7a4]{cursor:pointer}",""]);const i=o},1672:(e,t,a)=>{"use strict";a.d(t,{Z:()=>i});var n=a(3645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,".action-link[data-v-5b4ee38c]{cursor:pointer}",""]);const i=o},3645:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var a=e(t);return t[2]?"@media ".concat(t[2]," {").concat(a,"}"):a})).join("")},t.i=function(e,a,n){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(n)for(var i=0;i{var t,a,n=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function r(e){if(t===setTimeout)return setTimeout(e,0);if((t===o||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(a){try{return t.call(null,e,0)}catch(a){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:o}catch(e){t=o}try{a="function"==typeof clearTimeout?clearTimeout:i}catch(e){a=i}}();var s,l=[],c=!1,_=-1;function u(){c&&s&&(c=!1,s.length?l=s.concat(l):_=-1,l.length&&d())}function d(){if(!c){var e=r(u);c=!0;for(var t=l.length;t;){for(s=l,l=[];++_1)for(var a=1;a{"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},i=function(){var e={};return function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(e){a=null}e[t]=a}return e[t]}}(),r=[];function s(e){for(var t=-1,a=0;a{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Какво се случва?","flash_error":"Грешка!","flash_success":"Успех!","close":"Затвори","split_transaction_title":"Описание на разделена транзакция","errors_submission":"Имаше нещо нередно с вашите данни. Моля, проверете грешките.","split":"Раздели","single_split":"Раздел","transaction_stored_link":"Транзакция #{ID}(\\"{title}\\") беше записана.","transaction_updated_link":"Транзакция #{ID} беше обновена.","transaction_new_stored_link":"Транзакция #{ID} беше записана.","transaction_journal_information":"Информация за транзакция","no_budget_pointer":"Изглежда все още нямате бюджети. Трябва да създадете някои на страницата Бюджети . Бюджетите могат да ви помогнат да следите разходите си.","no_bill_pointer":"Изглежда все още нямате сметки. Трябва да създадете някои на страницата Сметки . Сметките могат да ви помогнат да следите разходите си.","source_account":"Разходна сметка","hidden_fields_preferences":"Можете да активирате повече опции за транзакции във вашите настройки.","destination_account":"Приходна сметка","add_another_split":"Добавяне на друг раздел","submission":"Изпращане","create_another":"След съхраняването се върнете тук, за да създадете нова.","reset_after":"Изчистване на формуляра след изпращане","submit":"Потвърди","amount":"Сума","date":"Дата","tags":"Етикети","no_budget":"(без бюджет)","no_bill":"(няма сметка)","category":"Категория","attachments":"Прикачени файлове","notes":"Бележки","external_uri":"External URL","update_transaction":"Обнови транзакцията","after_update_create_another":"След обновяването се върнете тук, за да продължите с редакцията.","store_as_new":"Съхранете като нова транзакция, вместо да я актуализирате.","split_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","none_in_select_list":"(нищо)","no_piggy_bank":"(без касичка)","description":"Описание","split_transaction_title_help":"Ако създадете разделена транзакция, трябва да има глобално описание за всички раздели на транзакцията.","destination_account_reconciliation":"Не може да редактирате приходната сметка на транзакция за съгласуване.","source_account_reconciliation":"Не може да редактирате разходната сметка на транзакция за съгласуване.","budget":"Бюджет","bill":"Сметка","you_create_withdrawal":"Създавате теглене.","you_create_transfer":"Създавате прехвърляне.","you_create_deposit":"Създавате депозит.","edit":"Промени","delete":"Изтрий","name":"Име","profile_whoops":"Опаааа!","profile_something_wrong":"Нещо се обърка!","profile_try_again":"Нещо се обърка. Моля, опитайте отново.","profile_oauth_clients":"OAuth клиенти","profile_oauth_no_clients":"Не сте създали клиенти на OAuth.","profile_oauth_clients_header":"Клиенти","profile_oauth_client_id":"ИД (ID) на клиент","profile_oauth_client_name":"Име","profile_oauth_client_secret":"Тайна","profile_oauth_create_new_client":"Създай нов клиент","profile_oauth_create_client":"Създай клиент","profile_oauth_edit_client":"Редактирай клиент","profile_oauth_name_help":"Нещо, което вашите потребители ще разпознаят и ще се доверят.","profile_oauth_redirect_url":"Линк на препратката","profile_oauth_redirect_url_help":"URL адрес за обратно извикване на оторизацията на вашето приложение.","profile_authorized_apps":"Удостоверени приложения","profile_authorized_clients":"Удостоверени клиенти","profile_scopes":"Сфери","profile_revoke":"Анулирай","profile_personal_access_tokens":"Персонални маркери за достъп","profile_personal_access_token":"Персонален маркер за достъп","profile_personal_access_token_explanation":"Това е новия ви персонален маркер за достъп. Това е единственият път, когато ще бъде показан, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_no_personal_access_token":"Не сте създали никакви лични маркери за достъп.","profile_create_new_token":"Създай нов маркер","profile_create_token":"Създай маркер","profile_create":"Създай","profile_save_changes":"Запазване на промените","default_group_title_name":"(без група)","piggy_bank":"Касичка","profile_oauth_client_secret_title":"Тайна на клиента","profile_oauth_client_secret_expl":"Това е новата ви \\"тайна на клиента\\". Това е единственият път, когато ще бъде показана, така че не го губете! Вече можете да използвате този маркер, за да отправяте заявки към API.","profile_oauth_confidential":"Поверително","profile_oauth_confidential_help":"Изисквайте клиента да се удостоверява с тайна. Поверителните клиенти могат да притежават идентификационни данни по защитен начин, без да ги излагат на неоторизирани страни. Публичните приложения, като например десктопа или JavaScript SPA приложения, не могат да пазят тайни по сигурен начин.","multi_account_warning_unknown":"В зависимост от вида на транзакцията която създавате, източникът и / или целевата сметка на следващите разделяния може да бъде променена от това което е дефинирано в първото разделение на транзакцията.","multi_account_warning_withdrawal":"Имайте предвид, че разходна сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на тегленето.","multi_account_warning_deposit":"Имайте предвид, че приходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на депозита.","multi_account_warning_transfer":"Имайте предвид, че приходната + разходната сметка на следващите разделяния ще бъде тази която е дефинирана в първия раздел на прехвърлянето."},"form":{"interest_date":"Падеж на лихва","book_date":"Дата на осчетоводяване","process_date":"Дата на обработка","due_date":"Дата на падеж","foreign_amount":"Сума във валута","payment_date":"Дата на плащане","invoice_date":"Дата на фактура","internal_reference":"Вътрешна референция"},"config":{"html_language":"bg"}}')},6054:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Jak to jde?","flash_error":"Chyba!","flash_success":"Úspěšně dokončeno!","close":"Zavřít","split_transaction_title":"Popis rozúčtování","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Rozdělit","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Informace o transakci","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Zdrojový účet","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Cílový účet","add_another_split":"Přidat další rozúčtování","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Odeslat","amount":"Částka","date":"Datum","tags":"Štítky","no_budget":"(žádný rozpočet)","no_bill":"(no bill)","category":"Kategorie","attachments":"Přílohy","notes":"Poznámky","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.","none_in_select_list":"(žádné)","no_piggy_bank":"(žádná pokladnička)","description":"Popis","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Upravit","delete":"Odstranit","name":"Název","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Úrokové datum","book_date":"Datum rezervace","process_date":"Datum zpracování","due_date":"Datum splatnosti","foreign_amount":"Částka v cizí měně","payment_date":"Datum zaplacení","invoice_date":"Datum vystavení","internal_reference":"Interní reference"},"config":{"html_language":"cs"}}')},7062:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Überblick","flash_error":"Fehler!","flash_success":"Geschafft!","close":"Schließen","split_transaction_title":"Beschreibung der Splittbuchung","errors_submission":"Ihre Übermittlung ist fehlgeschlagen. Bitte überprüfen Sie die Fehler.","split":"Teilen","single_split":"Teil","transaction_stored_link":"Buchung #{ID} (\\"{title}\\") wurde gespeichert.","transaction_updated_link":"Buchung#{ID} wurde aktualisiert.","transaction_new_stored_link":"Buchung #{ID} wurde gespeichert.","transaction_journal_information":"Transaktionsinformationen","no_budget_pointer":"Sie scheinen noch keine Kostenrahmen festgelegt zu haben. Sie sollten einige davon auf der Seite Kostenrahmen- anlegen. Kostenrahmen können Ihnen dabei helfen, den Überblick über die Ausgaben zu behalten.","no_bill_pointer":"Sie scheinen noch keine Rechnungen zu haben. Sie sollten einige auf der Seite Rechnungen erstellen. Anhand der Rechnungen können Sie den Überblick über Ihre Ausgaben behalten.","source_account":"Quellkonto","hidden_fields_preferences":"Sie können weitere Buchungsoptionen in Ihren Einstellungen aktivieren.","destination_account":"Zielkonto","add_another_split":"Eine weitere Aufteilung hinzufügen","submission":"Übermittlung","create_another":"Nach dem Speichern hierher zurückkehren, um ein weiteres zu erstellen.","reset_after":"Formular nach der Übermittlung zurücksetzen","submit":"Absenden","amount":"Betrag","date":"Datum","tags":"Schlagwörter","no_budget":"(kein Budget)","no_bill":"(keine Belege)","category":"Kategorie","attachments":"Anhänge","notes":"Notizen","external_uri":"Externe URL","update_transaction":"Buchung aktualisieren","after_update_create_another":"Nach dem Aktualisieren hierher zurückkehren, um weiter zu bearbeiten.","store_as_new":"Als neue Buchung speichern statt zu aktualisieren.","split_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.","none_in_select_list":"(Keine)","no_piggy_bank":"(kein Sparschwein)","description":"Beschreibung","split_transaction_title_help":"Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchung geben.","destination_account_reconciliation":"Sie können das Zielkonto einer Kontenausgleichsbuchung nicht bearbeiten.","source_account_reconciliation":"Sie können das Quellkonto einer Kontenausgleichsbuchung nicht bearbeiten.","budget":"Budget","bill":"Rechnung","you_create_withdrawal":"Sie haben eine Auszahlung erstellt.","you_create_transfer":"Sie haben eine Buchung erstellt.","you_create_deposit":"Sie haben eine Einzahlung erstellt.","edit":"Bearbeiten","delete":"Löschen","name":"Name","profile_whoops":"Huch!","profile_something_wrong":"Ein Problem ist aufgetreten!","profile_try_again":"Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.","profile_oauth_clients":"OAuth-Clients","profile_oauth_no_clients":"Sie haben noch keine OAuth-Clients erstellt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client-ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Geheimnis","profile_oauth_create_new_client":"Neuen Client erstellen","profile_oauth_create_client":"Client erstellen","profile_oauth_edit_client":"Client bearbeiten","profile_oauth_name_help":"Etwas das Ihre Nutzer erkennen und dem sie vertrauen.","profile_oauth_redirect_url":"Weiterleitungs-URL","profile_oauth_redirect_url_help":"Die Authorisierungs-Callback-URL Ihrer Anwendung.","profile_authorized_apps":"Autorisierte Anwendungen","profile_authorized_clients":"Autorisierte Clients","profile_scopes":"Bereiche","profile_revoke":"Widerrufen","profile_personal_access_tokens":"Persönliche Zugangs-Tokens","profile_personal_access_token":"Persönlicher Zugangs-Token","profile_personal_access_token_explanation":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_no_personal_access_token":"Sie haben keine persönlichen Zugangsschlüssel erstellt.","profile_create_new_token":"Neuen Schlüssel erstellen","profile_create_token":"Schlüssel erstellen","profile_create":"Erstellen","profile_save_changes":"Änderungen speichern","default_group_title_name":"(ohne Gruppierung)","piggy_bank":"Sparschwein","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Hier ist Ihr neuer persönlicher Zugangsschlüssel. Dies ist das einzige Mal, dass er angezeigt wird, also verlieren Sie ihn nicht! Sie können diesen Token jetzt verwenden, um API-Anfragen zu stellen.","profile_oauth_confidential":"Vertraulich","profile_oauth_confidential_help":"Der Client muss sich mit einem Secret authentifizieren. Vertrauliche Clients können die Anmeldedaten speichern, ohne diese unautorisierten Akteuren mitzuteilen. Öffentliche Anwendungen wie native Desktop- oder JavaScript-SPA-Anwendungen können Geheimnisse nicht sicher speichern.","multi_account_warning_unknown":"Abhängig von der Art der Buchung, die Sie anlegen, kann das Quell- und/oder Zielkonto nachfolgender Aufteilungen durch das überschrieben werden, was in der ersten Aufteilung der Buchung definiert wurde.","multi_account_warning_withdrawal":"Bedenken Sie, dass das Quellkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Abhebung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_deposit":"Bedenken Sie, dass das Zielkonto nachfolgender Aufteilungen von dem, was in der ersten Aufteilung der Einzahlung definiert ist, außer Kraft gesetzt wird.","multi_account_warning_transfer":"Bedenken Sie, dass das Quell- und Zielkonto nachfolgender Aufteilungen durch das, was in der ersten Aufteilung der Übertragung definiert ist, außer Kraft gesetzt wird."},"form":{"interest_date":"Zinstermin","book_date":"Buchungsdatum","process_date":"Bearbeitungsdatum","due_date":"Fälligkeitstermin","foreign_amount":"Ausländischer Betrag","payment_date":"Zahlungsdatum","invoice_date":"Rechnungsdatum","internal_reference":"Interner Verweis"},"config":{"html_language":"de"}}')},1410:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Τι παίζει;","flash_error":"Σφάλμα!","flash_success":"Επιτυχία!","close":"Κλείσιμο","split_transaction_title":"Περιγραφή της συναλλαγής με διαχωρισμό","errors_submission":"Υπήρξε κάποιο λάθος με την υποβολή σας. Παρακαλώ ελέγξτε τα σφάλματα.","split":"Διαχωρισμός","single_split":"Διαχωρισμός","transaction_stored_link":"Η συναλλαγή #{ID} (\\"{title}\\") έχει αποθηκευτεί.","transaction_updated_link":"Η συναλλαγή #{ID} έχει ενημερωθεί.","transaction_new_stored_link":"Η συναλλαγή #{ID} έχει αποθηκευτεί.","transaction_journal_information":"Πληροφορίες συναλλαγής","no_budget_pointer":"Φαίνεται πως δεν έχετε ορίσει προϋπολογισμούς ακόμη. Πρέπει να δημιουργήσετε κάποιον στη σελίδα προϋπολογισμών. Οι προϋπολογισμοί σας βοηθούν να επιβλέπετε τις δαπάνες σας.","no_bill_pointer":"Φαίνεται πως δεν έχετε ορίσει πάγια έξοδα ακόμη. Πρέπει να δημιουργήσετε κάποιο στη σελίδα πάγιων εξόδων. Τα πάγια έξοδα σας βοηθούν να επιβλέπετε τις δαπάνες σας.","source_account":"Λογαριασμός προέλευσης","hidden_fields_preferences":"Μπορείτε να ενεργοποιήσετε περισσότερες επιλογές συναλλαγών στις προτιμήσεις.","destination_account":"Λογαριασμός προορισμού","add_another_split":"Προσθήκη ενός ακόμα διαχωρισμού","submission":"Υποβολή","create_another":"Μετά την αποθήκευση, επιστρέψτε εδώ για να δημιουργήσετε ακόμη ένα.","reset_after":"Επαναφορά φόρμας μετά την υποβολή","submit":"Υποβολή","amount":"Ποσό","date":"Ημερομηνία","tags":"Ετικέτες","no_budget":"(χωρίς προϋπολογισμό)","no_bill":"(χωρίς πάγιο έξοδο)","category":"Κατηγορία","attachments":"Συνημμένα","notes":"Σημειώσεις","external_uri":"External URL","update_transaction":"Ενημέρωση συναλλαγής","after_update_create_another":"Μετά την ενημέρωση, επιστρέψτε εδώ για να συνεχίσετε την επεξεργασία.","store_as_new":"Αποθήκευση ως νέα συναλλαγή αντί για ενημέρωση.","split_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","none_in_select_list":"(τίποτα)","no_piggy_bank":"(χωρίς κουμπαρά)","description":"Περιγραφή","split_transaction_title_help":"Εάν δημιουργήσετε μια διαχωρισμένη συναλλαγή, πρέπει να υπάρχει μια καθολική περιγραφή για όλους τους διαχωρισμούς της συναλλαγής.","destination_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προορισμού σε μια συναλλαγή τακτοποίησης.","source_account_reconciliation":"Δεν μπορείτε να τροποποιήσετε τον λογαριασμό προέλευσης σε μια συναλλαγή τακτοποίησης.","budget":"Προϋπολογισμός","bill":"Πάγιο έξοδο","you_create_withdrawal":"Δημιουργείτε μια ανάληψη.","you_create_transfer":"Δημιουργείτε μια μεταφορά.","you_create_deposit":"Δημιουργείτε μια κατάθεση.","edit":"Επεξεργασία","delete":"Διαγραφή","name":"Όνομα","profile_whoops":"Ούπς!","profile_something_wrong":"Κάτι πήγε στραβά!","profile_try_again":"Κάτι πήγε στραβά. Παρακαλώ προσπαθήστε ξανά.","profile_oauth_clients":"Πελάτες OAuth","profile_oauth_no_clients":"Δεν έχετε δημιουργήσει πελάτες OAuth.","profile_oauth_clients_header":"Πελάτες","profile_oauth_client_id":"Αναγνωριστικό πελάτη","profile_oauth_client_name":"Όνομα","profile_oauth_client_secret":"Μυστικό","profile_oauth_create_new_client":"Δημιουργία νέου πελάτη","profile_oauth_create_client":"Δημιουργία πελάτη","profile_oauth_edit_client":"Επεξεργασία πελάτη","profile_oauth_name_help":"Κάτι που οι χρήστες σας θα αναγνωρίζουν και θα εμπιστεύονται.","profile_oauth_redirect_url":"URL ανακατεύθυνσης","profile_oauth_redirect_url_help":"To authorization callback URL της εφαρμογής σας.","profile_authorized_apps":"Εξουσιοδοτημένες εφαρμογές","profile_authorized_clients":"Εξουσιοδοτημένοι πελάτες","profile_scopes":"Πεδία εφαρμογής","profile_revoke":"Ανάκληση","profile_personal_access_tokens":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token":"Διακριτικά προσωπικής πρόσβασης","profile_personal_access_token_explanation":"Εδώ είναι το νέο διακριτικό προσωπικής πρόσβασης. Αυτή είναι η μόνη φορά που θα εμφανιστεί, οπότε μη το χάσετε! Μπορείτε να χρησιμοποιείτε αυτό το διακριτικό για να κάνετε κλήσεις API.","profile_no_personal_access_token":"Δεν έχετε δημιουργήσει προσωπικά διακριτικά πρόσβασης.","profile_create_new_token":"Δημιουργία νέου διακριτικού","profile_create_token":"Δημιουργία διακριτικού","profile_create":"Δημιουργία","profile_save_changes":"Αποθήκευση αλλαγών","default_group_title_name":"(χωρίς ομάδα)","piggy_bank":"Κουμπαράς","profile_oauth_client_secret_title":"Μυστικό Πελάτη","profile_oauth_client_secret_expl":"Εδώ είναι το νέο σας μυστικό πελάτη. Αυτή είναι η μόνη φορά που θα σας εμφανιστεί, οπότε μην το χάσετε! Μπορείτε να το χρησιμοποιείτε για να κάνετε αιτήματα API.","profile_oauth_confidential":"Εμπιστευτικό","profile_oauth_confidential_help":"Απαιτήστε από το πρόγραμμα πελάτη να πραγματοποιήσει έλεγχο ταυτότητας με ένα μυστικό. Οι έμπιστοι πελάτες μπορούν να διατηρούν διαπιστευτήρια με ασφαλή τρόπο χωρίς να τα εκθέτουν σε μη εξουσιοδοτημένα μέρη. Οι δημόσιες εφαρμογές, όπως οι εγγενείς εφαρμογές για επιτραπέζιους υπολογιστές ή JavaScript SPA, δεν μπορούν να κρατήσουν μυστικά με ασφάλεια.","multi_account_warning_unknown":"Ανάλογα με τον τύπο της συναλλαγής που δημιουργείτε, ο λογαριασμός προέλευσης ή/και προορισμού των επόμενων διαχωρισμών ενδέχεται να παρακαμφθεί από αυτό που ορίζεται στο πρώτο διαχωρισμό της συναλλαγής.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ημερομηνία τοκισμού","book_date":"Ημερομηνία εγγραφής","process_date":"Ημερομηνία επεξεργασίας","due_date":"Ημερομηνία προθεσμίας","foreign_amount":"Ποσό σε ξένο νόμισμα","payment_date":"Ημερομηνία πληρωμής","invoice_date":"Ημερομηνία τιμολόγησης","internal_reference":"Εσωτερική αναφορά"},"config":{"html_language":"el"}}')},5642:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en-gb"}}')},6886:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Error!","flash_success":"Success!","close":"Close","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Split","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaction information","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Add another split","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Submit","amount":"Amount","date":"Date","tags":"Tags","no_budget":"(no budget)","no_bill":"(no bill)","category":"Category","attachments":"Attachments","notes":"Notes","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(none)","no_piggy_bank":"(no piggy bank)","description":"Description","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Budget","bill":"Bill","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Edit","delete":"Delete","name":"Name","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Piggy bank","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Interest date","book_date":"Book date","process_date":"Processing date","due_date":"Due date","foreign_amount":"Foreign amount","payment_date":"Payment date","invoice_date":"Invoice date","internal_reference":"Internal reference"},"config":{"html_language":"en"}}')},2360:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"¿Qué está pasando?","flash_error":"¡Error!","flash_success":"¡Operación correcta!","close":"Cerrar","split_transaction_title":"Descripción de la transacción dividida","errors_submission":"Hubo un problema con su envío. Por favor, compruebe los errores.","split":"Separar","single_split":"División","transaction_stored_link":"La transacción #{ID} (\\"{title}\\") ha sido almacenada.","transaction_updated_link":"La transacción #{ID} ha sido actualizada.","transaction_new_stored_link":"La transacción #{ID} ha sido guardada.","transaction_journal_information":"Información de transacción","no_budget_pointer":"Parece que aún no tienes presupuestos. Debes crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.","no_bill_pointer":"Parece que aún no tienes facturas. Deberías crear algunas en la página de facturas. Las facturas pueden ayudarte a llevar un seguimiento de los gastos.","source_account":"Cuenta origen","hidden_fields_preferences":"Puede habilitar más opciones de transacción en sus ajustes .","destination_account":"Cuenta destino","add_another_split":"Añadir otra división","submission":"Envío","create_another":"Después de guardar, vuelve aquí para crear otro.","reset_after":"Restablecer formulario después del envío","submit":"Enviar","amount":"Cantidad","date":"Fecha","tags":"Etiquetas","no_budget":"(sin presupuesto)","no_bill":"(sin factura)","category":"Categoria","attachments":"Archivos adjuntos","notes":"Notas","external_uri":"External URL","update_transaction":"Actualizar transacción","after_update_create_another":"Después de actualizar, vuelve aquí para continuar editando.","store_as_new":"Almacenar como una nueva transacción en lugar de actualizar.","split_title_help":"Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.","none_in_select_list":"(ninguno)","no_piggy_bank":"(sin hucha)","description":"Descripción","split_transaction_title_help":"Si crea una transacción dividida, debe existir una descripción global para todas las divisiones de la transacción.","destination_account_reconciliation":"No puedes editar la cuenta de destino de una transacción de reconciliación.","source_account_reconciliation":"No puedes editar la cuenta de origen de una transacción de reconciliación.","budget":"Presupuesto","bill":"Factura","you_create_withdrawal":"Está creando un retiro.","you_create_transfer":"Está creando una transferencia.","you_create_deposit":"Está creando un depósito.","edit":"Editar","delete":"Eliminar","name":"Nombre","profile_whoops":"¡Ups!","profile_something_wrong":"¡Algo salió mal!","profile_try_again":"Algo salió mal. Por favor, vuelva a intentarlo.","profile_oauth_clients":"Clientes de OAuth","profile_oauth_no_clients":"No ha creado ningún cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID del cliente","profile_oauth_client_name":"Nombre","profile_oauth_client_secret":"Secreto","profile_oauth_create_new_client":"Crear un Nuevo Cliente","profile_oauth_create_client":"Crear Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que sus usuarios reconocerán y confiarán.","profile_oauth_redirect_url":"Redirigir URL","profile_oauth_redirect_url_help":"La URL de devolución de autorización de su aplicación.","profile_authorized_apps":"Aplicaciones autorizadas","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Ámbitos","profile_revoke":"Revocar","profile_personal_access_tokens":"Tokens de acceso personal","profile_personal_access_token":"Token de acceso personal","profile_personal_access_token_explanation":"Aquí está su nuevo token de acceso personal. Esta es la única vez que se mostrará así que ¡no lo pierda! Ahora puede usar este token para hacer solicitudes de la API.","profile_no_personal_access_token":"No ha creado ningún token de acceso personal.","profile_create_new_token":"Crear nuevo token","profile_create_token":"Crear token","profile_create":"Crear","profile_save_changes":"Guardar cambios","default_group_title_name":"(sin agrupación)","piggy_bank":"Hucha","profile_oauth_client_secret_title":"Secreto del Cliente","profile_oauth_client_secret_expl":"Aquí está su nuevo secreto de cliente. Esta es la única vez que se mostrará así que no lo pierda! Ahora puede usar este secreto para hacer solicitudes de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Requerir que el cliente se autentifique con un secreto. Los clientes confidenciales pueden mantener las credenciales de forma segura sin exponerlas a partes no autorizadas. Las aplicaciones públicas, como aplicaciones de escritorio nativo o SPA de JavaScript, no pueden guardar secretos de forma segura.","multi_account_warning_unknown":"Dependiendo del tipo de transacción que cree, la cuenta de origen y/o destino de divisiones posteriores puede ser anulada por lo que se define en la primera división de la transacción.","multi_account_warning_withdrawal":"Tenga en cuenta que la cuenta de origen de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_deposit":"Tenga en cuenta que la cuenta de destino de las divisiones posteriores será anulada por lo que se defina en la primera división del retiro.","multi_account_warning_transfer":"Tenga en cuenta que la cuenta de origen + destino de divisiones posteriores será anulada por lo que se defina en la primera división de la transferencia."},"form":{"interest_date":"Fecha de interés","book_date":"Fecha de registro","process_date":"Fecha de procesamiento","due_date":"Fecha de vencimiento","foreign_amount":"Cantidad extranjera","payment_date":"Fecha de pago","invoice_date":"Fecha de la factura","internal_reference":"Referencia interna"},"config":{"html_language":"es"}}')},3684:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mitä kuuluu?","flash_error":"Virhe!","flash_success":"Valmista tuli!","close":"Sulje","split_transaction_title":"Jaetun tapahtuman kuvaus","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Jaa","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Tapahtumatiedot","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Lähdetili","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Kohdetili","add_another_split":"Lisää tapahtumaan uusi osa","submission":"Vahvistus","create_another":"Tallennuksen jälkeen, palaa takaisin luomaan uusi tapahtuma.","reset_after":"Tyhjennä lomake lähetyksen jälkeen","submit":"Vahvista","amount":"Summa","date":"Päivämäärä","tags":"Tägit","no_budget":"(ei budjettia)","no_bill":"(no bill)","category":"Kategoria","attachments":"Liitteet","notes":"Muistiinpanot","external_uri":"External URL","update_transaction":"Päivitä tapahtuma","after_update_create_another":"Päivityksen jälkeen, palaa takaisin jatkamaan muokkausta.","store_as_new":"Tallenna uutena tapahtumana päivityksen sijaan.","split_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","none_in_select_list":"(ei mitään)","no_piggy_bank":"(ei säästöpossu)","description":"Kuvaus","split_transaction_title_help":"Jos luot jaetun tapahtuman, kokonaisuudelle tarvitaan nimi.","destination_account_reconciliation":"Et voi muokata täsmäytystapahtuman kohdetiliä.","source_account_reconciliation":"Et voi muokata täsmäytystapahtuman lähdetiliä.","budget":"Budjetti","bill":"Lasku","you_create_withdrawal":"Olet luomassa nostoa.","you_create_transfer":"Olet luomassa siirtoa.","you_create_deposit":"Olet luomassa talletusta.","edit":"Muokkaa","delete":"Poista","name":"Nimi","profile_whoops":"Hupsis!","profile_something_wrong":"Jokin meni vikaan!","profile_try_again":"Jokin meni vikaan. Yritä uudelleen.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Asiakasohjelmat","profile_oauth_client_id":"Asiakastunnus","profile_oauth_client_name":"Nimi","profile_oauth_client_secret":"Salaisuus","profile_oauth_create_new_client":"Luo Uusi Asiakas","profile_oauth_create_client":"Luo Asiakas","profile_oauth_edit_client":"Muokkaa asiakasta","profile_oauth_name_help":"Jotain käyttäjillesi tuttua ja luotettavaa.","profile_oauth_redirect_url":"URL:n uudelleenohjaus","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Peruuta","profile_personal_access_tokens":"Henkilökohtaiset Käyttöoikeuskoodit","profile_personal_access_token":"Henkilökohtainen Käyttöoikeuskoodi","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Luo uusi tunnus","profile_create_token":"Luo tunnus","profile_create":"Luo","profile_save_changes":"Tallenna muutokset","default_group_title_name":"(ryhmittelemättömät)","piggy_bank":"Säästöpossu","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Korkopäivä","book_date":"Kirjauspäivä","process_date":"Käsittelypäivä","due_date":"Eräpäivä","foreign_amount":"Ulkomaan summa","payment_date":"Maksupäivä","invoice_date":"Laskun päivämäärä","internal_reference":"Sisäinen viite"},"config":{"html_language":"fi"}}')},6833:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Quoi de neuf ?","flash_error":"Erreur !","flash_success":"Super !","close":"Fermer","split_transaction_title":"Description de l\'opération ventilée","errors_submission":"Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs.","split":"Ventiler","single_split":"Ventilation","transaction_stored_link":"L\'opération n°{ID} (\\"{title}\\") a été enregistrée.","transaction_updated_link":"L\'opération n°{ID} a été mise à jour.","transaction_new_stored_link":"L\'opération n°{ID} a été enregistrée.","transaction_journal_information":"Informations sur l\'opération","no_budget_pointer":"Vous semblez n’avoir encore aucun budget. Vous devriez en créer un sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.","no_bill_pointer":"Vous semblez n\'avoir encore aucune facture. Vous devriez en créer une sur la page factures-. Les factures peuvent vous aider à garder une trace des dépenses.","source_account":"Compte source","hidden_fields_preferences":"Vous pouvez activer plus d\'options d\'opérations dans vos paramètres.","destination_account":"Compte de destination","add_another_split":"Ajouter une autre fraction","submission":"Soumission","create_another":"Après enregistrement, revenir ici pour en créer un nouveau.","reset_after":"Réinitialiser le formulaire après soumission","submit":"Soumettre","amount":"Montant","date":"Date","tags":"Tags","no_budget":"(pas de budget)","no_bill":"(aucune facture)","category":"Catégorie","attachments":"Pièces jointes","notes":"Notes","external_uri":"URL externe","update_transaction":"Mettre à jour l\'opération","after_update_create_another":"Après la mise à jour, revenir ici pour continuer l\'édition.","store_as_new":"Enregistrer comme une nouvelle opération au lieu de mettre à jour.","split_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.","none_in_select_list":"(aucun)","no_piggy_bank":"(aucune tirelire)","description":"Description","split_transaction_title_help":"Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fraction de l\'opération.","destination_account_reconciliation":"Vous ne pouvez pas modifier le compte de destination d\'une opération de rapprochement.","source_account_reconciliation":"Vous ne pouvez pas modifier le compte source d\'une opération de rapprochement.","budget":"Budget","bill":"Facture","you_create_withdrawal":"Vous saisissez une dépense.","you_create_transfer":"Vous saisissez un transfert.","you_create_deposit":"Vous saisissez un dépôt.","edit":"Modifier","delete":"Supprimer","name":"Nom","profile_whoops":"Oups !","profile_something_wrong":"Une erreur s\'est produite !","profile_try_again":"Une erreur s’est produite. Merci d’essayer à nouveau.","profile_oauth_clients":"Clients OAuth","profile_oauth_no_clients":"Vous n’avez pas encore créé de client OAuth.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Identifiant","profile_oauth_client_name":"Nom","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Créer un nouveau client","profile_oauth_create_client":"Créer un client","profile_oauth_edit_client":"Modifier le client","profile_oauth_name_help":"Quelque chose que vos utilisateurs reconnaîtront et qui inspirera confiance.","profile_oauth_redirect_url":"URL de redirection","profile_oauth_redirect_url_help":"URL de callback de votre application.","profile_authorized_apps":"Applications autorisées","profile_authorized_clients":"Clients autorisés","profile_scopes":"Permissions","profile_revoke":"Révoquer","profile_personal_access_tokens":"Jetons d\'accès personnels","profile_personal_access_token":"Jeton d\'accès personnel","profile_personal_access_token_explanation":"Voici votre nouveau jeton d’accès personnel. Ceci est la seule fois où vous pourrez le voir, ne le perdez pas ! Vous pouvez dès à présent utiliser ce jeton pour lancer des requêtes avec l’API.","profile_no_personal_access_token":"Vous n’avez pas encore créé de jeton d’accès personnel.","profile_create_new_token":"Créer un nouveau jeton","profile_create_token":"Créer un jeton","profile_create":"Créer","profile_save_changes":"Enregistrer les modifications","default_group_title_name":"(Sans groupement)","piggy_bank":"Tirelire","profile_oauth_client_secret_title":"Secret du client","profile_oauth_client_secret_expl":"Voici votre nouveau secret de client. C\'est la seule fois qu\'il sera affiché, donc ne le perdez pas ! Vous pouvez maintenant utiliser ce secret pour faire des requêtes d\'API.","profile_oauth_confidential":"Confidentiel","profile_oauth_confidential_help":"Exiger que le client s\'authentifie avec un secret. Les clients confidentiels peuvent détenir des informations d\'identification de manière sécurisée sans les exposer à des tiers non autorisés. Les applications publiques, telles que les applications de bureau natif ou les SPA JavaScript, ne peuvent pas tenir des secrets en toute sécurité.","multi_account_warning_unknown":"Selon le type d\'opération que vous créez, le(s) compte(s) source et/ou de destination des ventilations suivantes peuvent être remplacés par celui de la première ventilation de l\'opération.","multi_account_warning_withdrawal":"Gardez en tête que le compte source des ventilations suivantes peut être remplacé par celui de la première ventilation de la dépense.","multi_account_warning_deposit":"Gardez en tête que le compte de destination des ventilations suivantes peut être remplacé par celui de la première ventilation du dépôt.","multi_account_warning_transfer":"Gardez en tête que les comptes source et de destination des ventilations suivantes peuvent être remplacés par ceux de la première ventilation du transfert."},"form":{"interest_date":"Date de valeur (intérêts)","book_date":"Date de réservation","process_date":"Date de traitement","due_date":"Échéance","foreign_amount":"Montant en devise étrangère","payment_date":"Date de paiement","invoice_date":"Date de facturation","internal_reference":"Référence interne"},"config":{"html_language":"fr"}}')},6477:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Mi a helyzet?","flash_error":"Hiba!","flash_success":"Siker!","close":"Bezárás","split_transaction_title":"Felosztott tranzakció leírása","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Felosztás","single_split":"Felosztás","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") mentve.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} mentve.","transaction_journal_information":"Tranzakciós információk","no_budget_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","no_bill_pointer":"Úgy tűnik, még nincsenek költségkeretek. Költségkereteket a költségkeretek oldalon lehet létrehozni. A költségkeretek segítenek nyomon követni a költségeket.","source_account":"Forrás számla","hidden_fields_preferences":"A beállításokban több mező is engedélyezhető.","destination_account":"Célszámla","add_another_split":"Másik felosztás hozzáadása","submission":"Feliratkozás","create_another":"A tárolás után térjen vissza ide új létrehozásához.","reset_after":"Űrlap törlése a beküldés után","submit":"Beküldés","amount":"Összeg","date":"Dátum","tags":"Címkék","no_budget":"(nincs költségkeret)","no_bill":"(no bill)","category":"Kategória","attachments":"Mellékletek","notes":"Megjegyzések","external_uri":"External URL","update_transaction":"Tranzakció frissítése","after_update_create_another":"A frissítés után térjen vissza ide a szerkesztés folytatásához.","store_as_new":"Tárolás új tranzakcióként frissítés helyett.","split_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","none_in_select_list":"(nincs)","no_piggy_bank":"(nincs malacpersely)","description":"Leírás","split_transaction_title_help":"Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.","destination_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció célszámláját.","source_account_reconciliation":"Nem lehet szerkeszteni egy egyeztetett tranzakció forrásszámláját.","budget":"Költségkeret","bill":"Számla","you_create_withdrawal":"Egy költség létrehozása.","you_create_transfer":"Egy átutalás létrehozása.","you_create_deposit":"Egy bevétel létrehozása.","edit":"Szerkesztés","delete":"Törlés","name":"Név","profile_whoops":"Hoppá!","profile_something_wrong":"Hiba történt!","profile_try_again":"Hiba történt. Kérjük, próbálja meg újra.","profile_oauth_clients":"OAuth kliensek","profile_oauth_no_clients":"Nincs létrehozva egyetlen OAuth kliens sem.","profile_oauth_clients_header":"Kliensek","profile_oauth_client_id":"Kliens ID","profile_oauth_client_name":"Megnevezés","profile_oauth_client_secret":"Titkos kód","profile_oauth_create_new_client":"Új kliens létrehozása","profile_oauth_create_client":"Kliens létrehozása","profile_oauth_edit_client":"Kliens szerkesztése","profile_oauth_name_help":"Segítség, hogy a felhasználók tudják mihez kapcsolódik.","profile_oauth_redirect_url":"Átirányítási URL","profile_oauth_redirect_url_help":"Az alkalmazásban használt autentikációs URL.","profile_authorized_apps":"Engedélyezett alkalmazások","profile_authorized_clients":"Engedélyezett kliensek","profile_scopes":"Hatáskörök","profile_revoke":"Visszavonás","profile_personal_access_tokens":"Személyes hozzáférési tokenek","profile_personal_access_token":"Személyes hozzáférési token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"Nincs létrehozva egyetlen személyes hozzáférési token sem.","profile_create_new_token":"Új token létrehozása","profile_create_token":"Token létrehozása","profile_create":"Létrehozás","profile_save_changes":"Módosítások mentése","default_group_title_name":"(nem csoportosított)","piggy_bank":"Malacpersely","profile_oauth_client_secret_title":"Kliens titkos kódja","profile_oauth_client_secret_expl":"Ez a kliens titkos kódja. Ez az egyetlen alkalom, amikor meg van jelenítve, ne hagyd el! Ezzel a kóddal végezhetsz API hívásokat.","profile_oauth_confidential":"Bizalmas","profile_oauth_confidential_help":"Titkos kód használata a kliens bejelentkezéséhez. Bizonyos kliensek biztonságosan tudnak hitelesítő adatokat tárolni, anélkül hogy jogosulatlan fél hozzáférhetne. Nyilvános kliensek, például mint asztali vagy JavaScript SPA alkalmazások nem tudnak biztonságosan titkos kódot tárolni.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Kamatfizetési időpont","book_date":"Könyvelés dátuma","process_date":"Feldolgozás dátuma","due_date":"Lejárati időpont","foreign_amount":"Külföldi összeg","payment_date":"Fizetés dátuma","invoice_date":"Számla dátuma","internal_reference":"Belső hivatkozás"},"config":{"html_language":"hu"}}')},3092:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"La tua situazione finanziaria","flash_error":"Errore!","flash_success":"Successo!","close":"Chiudi","split_transaction_title":"Descrizione della transazione suddivisa","errors_submission":"Errore durante l\'invio. Controlla gli errori segnalati qui sotto.","split":"Dividi","single_split":"Divisione","transaction_stored_link":"La transazione #{ID} (\\"{title}\\") è stata salvata.","transaction_updated_link":"La transazione #{ID} è stata aggiornata.","transaction_new_stored_link":"La transazione #{ID} è stata salvata.","transaction_journal_information":"Informazioni transazione","no_budget_pointer":"Sembra che tu non abbia ancora dei budget. Dovresti crearne alcuni nella pagina dei budget. I budget possono aiutarti a tenere traccia delle spese.","no_bill_pointer":"Sembra che tu non abbia ancora delle bollette. Dovresti crearne alcune nella pagina delle bollette. Le bollette possono aiutarti a tenere traccia delle spese.","source_account":"Conto di origine","hidden_fields_preferences":"Puoi abilitare maggiori opzioni per le transazioni nelle tue impostazioni.","destination_account":"Conto destinazione","add_another_split":"Aggiungi un\'altra divisione","submission":"Invio","create_another":"Dopo il salvataggio, torna qui per crearne un\'altra.","reset_after":"Resetta il modulo dopo l\'invio","submit":"Invia","amount":"Importo","date":"Data","tags":"Etichette","no_budget":"(nessun budget)","no_bill":"(nessuna bolletta)","category":"Categoria","attachments":"Allegati","notes":"Note","external_uri":"URL esterno","update_transaction":"Aggiorna transazione","after_update_create_another":"Dopo l\'aggiornamento, torna qui per continuare la modifica.","store_as_new":"Salva come nuova transazione invece di aggiornarla.","split_title_help":"Se crei una transazione suddivisa è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","none_in_select_list":"(nessuna)","no_piggy_bank":"(nessun salvadanaio)","description":"Descrizione","split_transaction_title_help":"Se crei una transazione suddivisa, è necessario che ci sia una descrizione globale per tutte le suddivisioni della transazione.","destination_account_reconciliation":"Non è possibile modificare il conto di destinazione di una transazione di riconciliazione.","source_account_reconciliation":"Non puoi modificare il conto di origine di una transazione di riconciliazione.","budget":"Budget","bill":"Bolletta","you_create_withdrawal":"Stai creando un prelievo.","you_create_transfer":"Stai creando un trasferimento.","you_create_deposit":"Stai creando un deposito.","edit":"Modifica","delete":"Elimina","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Qualcosa non ha funzionato!","profile_try_again":"Qualcosa non ha funzionato. Riprova.","profile_oauth_clients":"Client OAuth","profile_oauth_no_clients":"Non hai creato nessun client OAuth.","profile_oauth_clients_header":"Client","profile_oauth_client_id":"ID client","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segreto","profile_oauth_create_new_client":"Crea nuovo client","profile_oauth_create_client":"Crea client","profile_oauth_edit_client":"Modifica client","profile_oauth_name_help":"Qualcosa di cui i tuoi utenti potranno riconoscere e fidarsi.","profile_oauth_redirect_url":"URL di reindirizzamento","profile_oauth_redirect_url_help":"L\'URL di callback dell\'autorizzazione della tua applicazione.","profile_authorized_apps":"Applicazioni autorizzate","profile_authorized_clients":"Client autorizzati","profile_scopes":"Ambiti","profile_revoke":"Revoca","profile_personal_access_tokens":"Token di acceso personale","profile_personal_access_token":"Token di acceso personale","profile_personal_access_token_explanation":"Ecco il tuo nuovo token di accesso personale. Questa è l\'unica volta che ti viene mostrato per cui non perderlo! Da adesso puoi utilizzare questo token per effettuare delle richieste API.","profile_no_personal_access_token":"Non hai creato alcun token di accesso personale.","profile_create_new_token":"Crea nuovo token","profile_create_token":"Crea token","profile_create":"Crea","profile_save_changes":"Salva modifiche","default_group_title_name":"(non in un gruppo)","piggy_bank":"Salvadanaio","profile_oauth_client_secret_title":"Segreto del client","profile_oauth_client_secret_expl":"Ecco il segreto del nuovo client. Questa è l\'unica occasione in cui viene mostrato pertanto non perderlo! Ora puoi usare questo segreto per effettuare delle richieste alle API.","profile_oauth_confidential":"Riservato","profile_oauth_confidential_help":"Richiede al client di autenticarsi con un segreto. I client riservati possono conservare le credenziali in modo sicuro senza esporle a soggetti non autorizzati. Le applicazioni pubbliche, come le applicazioni desktop native o JavaScript SPA, non sono in grado di conservare i segreti in modo sicuro.","multi_account_warning_unknown":"A seconda del tipo di transazione che hai creato, il conto di origine e/o destinazione delle successive suddivisioni può essere sovrascritto da qualsiasi cosa sia definita nella prima suddivisione della transazione.","multi_account_warning_withdrawal":"Ricorda che il conto di origine delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del prelievo.","multi_account_warning_deposit":"Ricorda che il conto di destinazione delle successive suddivisioni verrà sovrascritto da quello definito nella prima suddivisione del deposito.","multi_account_warning_transfer":"Ricorda che il conto di origine e il conto di destinazione delle successive suddivisioni verranno sovrascritti da quelli definiti nella prima suddivisione del trasferimento."},"form":{"interest_date":"Data di valuta","book_date":"Data contabile","process_date":"Data elaborazione","due_date":"Data scadenza","foreign_amount":"Importo estero","payment_date":"Data pagamento","invoice_date":"Data fatturazione","internal_reference":"Riferimento interno"},"config":{"html_language":"it"}}')},2502:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"Feil!","flash_success":"Suksess!","close":"Lukk","split_transaction_title":"Description of the split transaction","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Del opp","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"Transaksjonsinformasjon","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"Legg til en oppdeling til","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"Send inn","amount":"Beløp","date":"Dato","tags":"Tagger","no_budget":"(ingen budsjett)","no_bill":"(no bill)","category":"Kategori","attachments":"Vedlegg","notes":"Notater","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","none_in_select_list":"(ingen)","no_piggy_bank":"(no piggy bank)","description":"Beskrivelse","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"Busjett","bill":"Regning","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"Rediger","delete":"Slett","name":"Navn","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"Sparegris","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Rentedato","book_date":"Bokføringsdato","process_date":"Prosesseringsdato","due_date":"Forfallsdato","foreign_amount":"Utenlandske beløp","payment_date":"Betalingsdato","invoice_date":"Fakturadato","internal_reference":"Intern referanse"},"config":{"html_language":"nb"}}')},78:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Hoe staat het er voor?","flash_error":"Fout!","flash_success":"Gelukt!","close":"Sluiten","split_transaction_title":"Beschrijving van de gesplitste transactie","errors_submission":"Er ging iets mis. Check de errors.","split":"Splitsen","single_split":"Split","transaction_stored_link":"Transactie #{ID} (\\"{title}\\") is opgeslagen.","transaction_updated_link":"Transactie #{ID} is geüpdatet.","transaction_new_stored_link":"Transactie #{ID} is opgeslagen.","transaction_journal_information":"Transactieinformatie","no_budget_pointer":"Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.","no_bill_pointer":"Je hebt nog geen contracten. Maak er een aantal op de contracten-pagina. Met contracten kan je je uitgaven beter bijhouden.","source_account":"Bronrekening","hidden_fields_preferences":"Je kan meer transactieopties inschakelen in je instellingen.","destination_account":"Doelrekening","add_another_split":"Voeg een split toe","submission":"Indienen","create_another":"Terug naar deze pagina voor een nieuwe transactie.","reset_after":"Reset formulier na opslaan","submit":"Invoeren","amount":"Bedrag","date":"Datum","tags":"Tags","no_budget":"(geen budget)","no_bill":"(geen contract)","category":"Categorie","attachments":"Bijlagen","notes":"Notities","external_uri":"Externe URL","update_transaction":"Update transactie","after_update_create_another":"Na het opslaan terug om door te gaan met wijzigen.","store_as_new":"Opslaan als nieuwe transactie ipv de huidige bij te werken.","split_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","none_in_select_list":"(geen)","no_piggy_bank":"(geen spaarpotje)","description":"Omschrijving","split_transaction_title_help":"Als je een gesplitste transactie maakt, moet er een algemene beschrijving zijn voor alle splitsingen van de transactie.","destination_account_reconciliation":"Je kan de doelrekening van een afstemming niet wijzigen.","source_account_reconciliation":"Je kan de bronrekening van een afstemming niet wijzigen.","budget":"Budget","bill":"Contract","you_create_withdrawal":"Je maakt een uitgave.","you_create_transfer":"Je maakt een overschrijving.","you_create_deposit":"Je maakt inkomsten.","edit":"Wijzig","delete":"Verwijder","name":"Naam","profile_whoops":"Oeps!","profile_something_wrong":"Er is iets mis gegaan!","profile_try_again":"Er is iets misgegaan. Probeer het nogmaals.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Je hebt nog geen OAuth-clients aangemaakt.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Naam","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Nieuwe client aanmaken","profile_oauth_create_client":"Client aanmaken","profile_oauth_edit_client":"Client bewerken","profile_oauth_name_help":"Iets dat je gebruikers herkennen en vertrouwen.","profile_oauth_redirect_url":"Redirect-URL","profile_oauth_redirect_url_help":"De authorisatie-callback-url van jouw applicatie.","profile_authorized_apps":"Geautoriseerde toepassingen","profile_authorized_clients":"Geautoriseerde clients","profile_scopes":"Scopes","profile_revoke":"Intrekken","profile_personal_access_tokens":"Persoonlijke toegangstokens","profile_personal_access_token":"Persoonlijk toegangstoken","profile_personal_access_token_explanation":"Hier is je nieuwe persoonlijke toegangstoken. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan deze toegangstoken gebruiken om API-aanvragen te maken.","profile_no_personal_access_token":"Je hebt nog geen persoonlijke toegangstokens aangemaakt.","profile_create_new_token":"Nieuwe token aanmaken","profile_create_token":"Token aanmaken","profile_create":"Creër","profile_save_changes":"Aanpassingen opslaan","default_group_title_name":"(ongegroepeerd)","piggy_bank":"Spaarpotje","profile_oauth_client_secret_title":"Client secret","profile_oauth_client_secret_expl":"Hier is je nieuwe client secret. Dit is de enige keer dat deze getoond wordt dus verlies deze niet! Je kan dit secret gebruiken om API-aanvragen te maken.","profile_oauth_confidential":"Vertrouwelijk","profile_oauth_confidential_help":"Dit vinkje is bedoeld voor applicaties die geheimen kunnen bewaren. Applicaties zoals sommige desktop-apps en Javascript apps kunnen dit niet. In zo\'n geval haal je het vinkje weg.","multi_account_warning_unknown":"Afhankelijk van het type transactie wordt de bron- en/of doelrekening overschreven door wat er in de eerste split staat.","multi_account_warning_withdrawal":"De bronrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_deposit":"De doelrekening wordt overschreven door wat er in de eerste split staat.","multi_account_warning_transfer":"De bron + doelrekening wordt overschreven door wat er in de eerste split staat."},"form":{"interest_date":"Rentedatum","book_date":"Boekdatum","process_date":"Verwerkingsdatum","due_date":"Vervaldatum","foreign_amount":"Bedrag in vreemde valuta","payment_date":"Betalingsdatum","invoice_date":"Factuurdatum","internal_reference":"Interne verwijzing"},"config":{"html_language":"nl"}}')},8691:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Co jest grane?","flash_error":"Błąd!","flash_success":"Sukces!","close":"Zamknij","split_transaction_title":"Opis podzielonej transakcji","errors_submission":"Coś poszło nie tak w czasie zapisu. Proszę sprawdź błędy.","split":"Podziel","single_split":"Podział","transaction_stored_link":"Transakcja #{ID} (\\"{title}\\") została zapisana.","transaction_updated_link":"Transakcja #{ID} została zaktualizowana.","transaction_new_stored_link":"Transakcja #{ID} została zapisana.","transaction_journal_information":"Informacje o transakcji","no_budget_pointer":"Wygląda na to, że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżetów. Budżety mogą Ci pomóc śledzić wydatki.","no_bill_pointer":"Wygląda na to, że nie masz jeszcze rachunków. Powinieneś utworzyć kilka na stronie rachunków. Rachunki mogą Ci pomóc śledzić wydatki.","source_account":"Konto źródłowe","hidden_fields_preferences":"Możesz włączyć więcej opcji transakcji w swoich ustawieniach.","destination_account":"Konto docelowe","add_another_split":"Dodaj kolejny podział","submission":"Zapisz","create_another":"Po zapisaniu wróć tutaj, aby utworzyć kolejny.","reset_after":"Wyczyść formularz po zapisaniu","submit":"Prześlij","amount":"Kwota","date":"Data","tags":"Tagi","no_budget":"(brak budżetu)","no_bill":"(brak rachunku)","category":"Kategoria","attachments":"Załączniki","notes":"Notatki","external_uri":"Zewnętrzny adres URL","update_transaction":"Zaktualizuj transakcję","after_update_create_another":"Po aktualizacji wróć tutaj, aby kontynuować edycję.","store_as_new":"Zapisz jako nową zamiast aktualizować.","split_title_help":"Podzielone transakcje muszą posiadać globalny opis.","none_in_select_list":"(żadne)","no_piggy_bank":"(brak skarbonki)","description":"Opis","split_transaction_title_help":"Jeśli tworzysz podzieloną transakcję, musi ona posiadać globalny opis dla wszystkich podziałów w transakcji.","destination_account_reconciliation":"Nie możesz edytować konta docelowego transakcji uzgadniania.","source_account_reconciliation":"Nie możesz edytować konta źródłowego transakcji uzgadniania.","budget":"Budżet","bill":"Rachunek","you_create_withdrawal":"Tworzysz wydatek.","you_create_transfer":"Tworzysz przelew.","you_create_deposit":"Tworzysz wpłatę.","edit":"Modyfikuj","delete":"Usuń","name":"Nazwa","profile_whoops":"Uuuups!","profile_something_wrong":"Coś poszło nie tak!","profile_try_again":"Coś poszło nie tak. Spróbuj ponownie.","profile_oauth_clients":"Klienci OAuth","profile_oauth_no_clients":"Nie utworzyłeś żadnych klientów OAuth.","profile_oauth_clients_header":"Klienci","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Nazwa","profile_oauth_client_secret":"Sekretny klucz","profile_oauth_create_new_client":"Utwórz nowego klienta","profile_oauth_create_client":"Utwórz klienta","profile_oauth_edit_client":"Edytuj klienta","profile_oauth_name_help":"Coś, co Twoi użytkownicy będą rozpoznawać i ufać.","profile_oauth_redirect_url":"Przekierowanie URL","profile_oauth_redirect_url_help":"Adres URL wywołania zwrotnego autoryzacji aplikacji.","profile_authorized_apps":"Autoryzowane aplikacje","profile_authorized_clients":"Autoryzowani klienci","profile_scopes":"Zakresy","profile_revoke":"Unieważnij","profile_personal_access_tokens":"Osobiste tokeny dostępu","profile_personal_access_token":"Osobisty token dostępu","profile_personal_access_token_explanation":"Oto twój nowy osobisty token dostępu. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego tokenu, aby wykonać zapytania API.","profile_no_personal_access_token":"Nie utworzyłeś żadnych osobistych tokenów.","profile_create_new_token":"Utwórz nowy token","profile_create_token":"Utwórz token","profile_create":"Utwórz","profile_save_changes":"Zapisz zmiany","default_group_title_name":"(bez grupy)","piggy_bank":"Skarbonka","profile_oauth_client_secret_title":"Sekret klienta","profile_oauth_client_secret_expl":"Oto twój nowy sekret klienta. Jest to jedyny raz, gdy zostanie wyświetlony, więc nie zgub go! Możesz teraz użyć tego sekretu, aby wykonać zapytania API.","profile_oauth_confidential":"Poufne","profile_oauth_confidential_help":"Wymagaj od klienta uwierzytelnienia za pomocą sekretu. Poufni klienci mogą przechowywać poświadczenia w bezpieczny sposób bez narażania ich na dostęp przez nieuprawnione strony. Publiczne aplikacje, takie jak natywne aplikacje desktopowe lub JavaScript SPA, nie są w stanie bezpiecznie trzymać sekretów.","multi_account_warning_unknown":"W zależności od rodzaju transakcji, którą tworzysz, konto źródłowe i/lub docelowe kolejnych podziałów może zostać ustawione na konto zdefiniowane w pierwszym podziale transakcji.","multi_account_warning_withdrawal":"Pamiętaj, że konto źródłowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wypłaty.","multi_account_warning_deposit":"Pamiętaj, że konto docelowe kolejnych podziałów zostanie ustawione na konto zdefiniowane w pierwszym podziale wpłaty.","multi_account_warning_transfer":"Pamiętaj, że konta źródłowe i docelowe kolejnych podziałów zostaną ustawione na konto zdefiniowane w pierwszym podziale transferu."},"form":{"interest_date":"Data odsetek","book_date":"Data księgowania","process_date":"Data przetworzenia","due_date":"Termin realizacji","foreign_amount":"Kwota zagraniczna","payment_date":"Data płatności","invoice_date":"Data faktury","internal_reference":"Wewnętrzny numer"},"config":{"html_language":"pl"}}')},122:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"O que está acontecendo?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transação dividida","errors_submission":"Há algo de errado com o seu envio. Por favor, verifique os erros abaixo.","split":"Dividir","single_split":"Divisão","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi salva.","transaction_updated_link":"Transação #{ID} foi atualizada.","transaction_new_stored_link":"Transação #{ID} foi salva.","transaction_journal_information":"Informação da transação","no_budget_pointer":"Parece que você ainda não tem orçamentos. Você deve criar alguns na página de orçamentos. Orçamentos podem ajudá-lo a manter o controle das despesas.","no_bill_pointer":"Parece que você ainda não tem contas. Você deve criar algumas em contas. Contas podem ajudar você a manter o controle de despesas.","source_account":"Conta origem","hidden_fields_preferences":"Você pode habilitar mais opções de transação em suas preferências.","destination_account":"Conta destino","add_another_split":"Adicionar outra divisão","submission":"Envio","create_another":"Depois de armazenar, retorne aqui para criar outro.","reset_after":"Resetar o formulário após o envio","submit":"Enviar","amount":"Valor","date":"Data","tags":"Tags","no_budget":"(sem orçamento)","no_bill":"(sem conta)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL externa","update_transaction":"Atualizar transação","after_update_create_another":"Depois de atualizar, retorne aqui para continuar editando.","store_as_new":"Armazene como uma nova transação em vez de atualizar.","split_title_help":"Se você criar uma transação dividida, é necessário haver uma descrição global para todas as partes da transação.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum cofrinho)","description":"Descrição","split_transaction_title_help":"Se você criar uma transação dividida, deve haver uma descrição global para todas as partes da transação.","destination_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","source_account_reconciliation":"Você não pode editar a conta de origem de uma transação de reconciliação.","budget":"Orçamento","bill":"Fatura","you_create_withdrawal":"Você está criando uma saída.","you_create_transfer":"Você está criando uma transferência.","you_create_deposit":"Você está criando uma entrada.","edit":"Editar","delete":"Apagar","name":"Nome","profile_whoops":"Ops!","profile_something_wrong":"Alguma coisa deu errado!","profile_try_again":"Algo deu errado. Por favor tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Você não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Segredo","profile_oauth_create_new_client":"Criar um novo cliente","profile_oauth_create_client":"Criar um cliente","profile_oauth_edit_client":"Editar cliente","profile_oauth_name_help":"Alguma coisa que seus usuários vão reconhecer e identificar.","profile_oauth_redirect_url":"URL de redirecionamento","profile_oauth_redirect_url_help":"A URL de retorno da sua solicitação de autorização.","profile_authorized_apps":"Aplicativos autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Escopos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está seu novo token de acesso pessoal. Esta é a única vez que ela será mostrada então não perca! Agora você pode usar esse token para fazer solicitações de API.","profile_no_personal_access_token":"Você não criou nenhum token de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Salvar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Cofrinho","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu novo segredo de cliente. Esta é a única vez que ela será mostrada, então não o perca! Agora você pode usar este segredo para fazer requisições de API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exige que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expô-las à partes não autorizadas. Aplicações públicas, como aplicações de área de trabalho nativas ou JavaScript SPA, são incapazes de manter segredos com segurança.","multi_account_warning_unknown":"Dependendo do tipo de transação que você criar, a conta de origem e/ou de destino das divisões subsequentes pode ser sobrescrita pelo que estiver definido na primeira divisão da transação.","multi_account_warning_withdrawal":"Tenha em mente que a conta de origem das subsequentes divisões será sobrescrita pelo que estiver definido na primeira divisão da saída.","multi_account_warning_deposit":"Tenha em mente que a conta de destino das divisões subsequentes será sobrescrita pelo que estiver definido na primeira divisão da entrada.","multi_account_warning_transfer":"Tenha em mente que a conta de origem + de destino das divisões subsequentes será sobrescrita pelo que for definido na primeira divisão da transferência."},"form":{"interest_date":"Data de interesse","book_date":"Data reserva","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante em moeda estrangeira","payment_date":"Data de pagamento","invoice_date":"Data da Fatura","internal_reference":"Referência interna"},"config":{"html_language":"pt-br"}}')},4895:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Tudo bem?","flash_error":"Erro!","flash_success":"Sucesso!","close":"Fechar","split_transaction_title":"Descrição da transacção dividida","errors_submission":"Aconteceu algo errado com a sua submissão. Por favor, verifique os erros.","split":"Dividir","single_split":"Dividir","transaction_stored_link":"Transação #{ID} (\\"{title}\\") foi guardada.","transaction_updated_link":"Transação#{ID} foi atualizada.","transaction_new_stored_link":"Transação#{ID} foi guardada.","transaction_journal_information":"Informacao da transaccao","no_budget_pointer":"Parece que ainda não tem orçamentos. Pode criar-los na página de orçamentos. Orçamentos podem ajudá-lo a controlar as despesas.","no_bill_pointer":"Parece que ainda não tem contas. Pode criar-las na página de contas. Contas podem ajudá-lo a controlar as despesas.","source_account":"Conta de origem","hidden_fields_preferences":"Pode ativar mais opções de transações nas suas preferências.","destination_account":"Conta de destino","add_another_split":"Adicionar outra divisão","submission":"Submissão","create_another":"Depois de guardar, voltar aqui para criar outra.","reset_after":"Repor o formulário após o envio","submit":"Enviar","amount":"Montante","date":"Data","tags":"Tags","no_budget":"(sem orcamento)","no_bill":"(sem contas)","category":"Categoria","attachments":"Anexos","notes":"Notas","external_uri":"URL Externo","update_transaction":"Actualizar transacção","after_update_create_another":"Após a atualização, regresse aqui para continuar a editar.","store_as_new":"Guarde como uma nova transação em vez de atualizar.","split_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","none_in_select_list":"(nenhum)","no_piggy_bank":"(nenhum mealheiro)","description":"Descricao","split_transaction_title_help":"Se criar uma transacção dividida, deve haver uma descrição global para todas as partes da transacção.","destination_account_reconciliation":"Não pode editar a conta de destino de uma transacção de reconciliação.","source_account_reconciliation":"Não pode editar a conta de origem de uma transacção de reconciliação.","budget":"Orcamento","bill":"Conta","you_create_withdrawal":"Está a criar um levantamento.","you_create_transfer":"Está a criar uma transferência.","you_create_deposit":"Está a criar um deposito.","edit":"Alterar","delete":"Apagar","name":"Nome","profile_whoops":"Oops!","profile_something_wrong":"Algo correu mal!","profile_try_again":"Algo correu mal. Por favor, tente novamente.","profile_oauth_clients":"Clientes OAuth","profile_oauth_no_clients":"Não criou nenhum cliente OAuth.","profile_oauth_clients_header":"Clientes","profile_oauth_client_id":"ID do Cliente","profile_oauth_client_name":"Nome","profile_oauth_client_secret":"Código secreto","profile_oauth_create_new_client":"Criar Novo Cliente","profile_oauth_create_client":"Criar Cliente","profile_oauth_edit_client":"Editar Cliente","profile_oauth_name_help":"Algo que os utilizadores reconheçam e confiem.","profile_oauth_redirect_url":"URL de redireccionamento","profile_oauth_redirect_url_help":"URL de callback de autorização da aplicação.","profile_authorized_apps":"Aplicações autorizados","profile_authorized_clients":"Clientes autorizados","profile_scopes":"Contextos","profile_revoke":"Revogar","profile_personal_access_tokens":"Tokens de acesso pessoal","profile_personal_access_token":"Token de acesso pessoal","profile_personal_access_token_explanation":"Aqui está o seu novo token de acesso pessoal. Esta é a única vês que o mesmo será mostrado portanto não o perca! Pode utiliza-lo para fazer pedidos de API.","profile_no_personal_access_token":"Você ainda não criou tokens de acesso pessoal.","profile_create_new_token":"Criar novo token","profile_create_token":"Criar token","profile_create":"Criar","profile_save_changes":"Guardar alterações","default_group_title_name":"(não agrupado)","piggy_bank":"Mealheiro","profile_oauth_client_secret_title":"Segredo do cliente","profile_oauth_client_secret_expl":"Aqui está o seu segredo de cliente. Apenas estará visível uma vez portanto não o perca! Pode agora utilizar este segredo para fazer pedidos à API.","profile_oauth_confidential":"Confidencial","profile_oauth_confidential_help":"Exigir que o cliente se autentique com um segredo. Clientes confidenciais podem manter credenciais de forma segura sem expor as mesmas a terceiros não autorizadas. Aplicações públicas, como por exemplo aplicações nativas de sistema operativo ou SPA JavaScript, são incapazes de garantir a segurança dos segredos.","multi_account_warning_unknown":"Dependendo do tipo de transição que quer criar, a conta de origem e/ou a destino de subsequentes divisões pode ser sub-escrita por quaisquer regra definida na primeira divisão da transação.","multi_account_warning_withdrawal":"Mantenha em mente que a conta de origem de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do levantamento.","multi_account_warning_deposit":"Mantenha em mente que a conta de destino de divisões subsequentes será sobre-escrita por quaisquer regra definida na primeira divisão do depósito.","multi_account_warning_transfer":"Mantenha em mente que a conta de origem + destino de divisões subsequentes serão sobre-escritas por quaisquer regras definidas na divisão da transferência."},"form":{"interest_date":"Data de juros","book_date":"Data de registo","process_date":"Data de processamento","due_date":"Data de vencimento","foreign_amount":"Montante estrangeiro","payment_date":"Data de pagamento","invoice_date":"Data da factura","internal_reference":"Referencia interna"},"config":{"html_language":"pt"}}')},403:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ce se redă?","flash_error":"Eroare!","flash_success":"Succes!","close":"Închide","split_transaction_title":"Descrierea tranzacției divizate","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Împarte","single_split":"Împarte","transaction_stored_link":"Tranzacția #{ID} (\\"{title}\\") a fost stocată.","transaction_updated_link":"Tranzacția #{ID} a fost actualizată.","transaction_new_stored_link":"Tranzacția #{ID} a fost stocată.","transaction_journal_information":"Informații despre tranzacții","no_budget_pointer":"Se pare că nu aveți încă bugete. Ar trebui să creați câteva pe pagina bugete. Bugetele vă pot ajuta să țineți evidența cheltuielilor.","no_bill_pointer":"Se pare că nu aveți încă facturi. Ar trebui să creați unele pe pagina facturi. Facturile vă pot ajuta să țineți evidența cheltuielilor.","source_account":"Contul sursă","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Contul de destinație","add_another_split":"Adăugați o divizare","submission":"Transmitere","create_another":"După stocare, reveniți aici pentru a crea alta.","reset_after":"Resetați formularul după trimitere","submit":"Trimite","amount":"Sumă","date":"Dată","tags":"Etichete","no_budget":"(nici un buget)","no_bill":"(no bill)","category":"Categorie","attachments":"Atașamente","notes":"Notițe","external_uri":"External URL","update_transaction":"Actualizați tranzacția","after_update_create_another":"După actualizare, reveniți aici pentru a continua editarea.","store_as_new":"Stocați ca o tranzacție nouă în loc să actualizați.","split_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","none_in_select_list":"(nici unul)","no_piggy_bank":"(nicio pușculiță)","description":"Descriere","split_transaction_title_help":"Dacă creați o tranzacție divizată, trebuie să existe o descriere globală pentru toate diviziunile tranzacției.","destination_account_reconciliation":"Nu puteți edita contul de destinație al unei tranzacții de reconciliere.","source_account_reconciliation":"Nu puteți edita contul sursă al unei tranzacții de reconciliere.","budget":"Buget","bill":"Factură","you_create_withdrawal":"Creezi o retragere.","you_create_transfer":"Creezi un transfer.","you_create_deposit":"Creezi un depozit.","edit":"Editează","delete":"Șterge","name":"Nume","profile_whoops":"Hopaa!","profile_something_wrong":"A apărut o eroare!","profile_try_again":"A apărut o problemă. Încercați din nou.","profile_oauth_clients":"Clienți OAuth","profile_oauth_no_clients":"Nu ați creat niciun client OAuth.","profile_oauth_clients_header":"Clienți","profile_oauth_client_id":"ID Client","profile_oauth_client_name":"Nume","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Creare client nou","profile_oauth_create_client":"Creare client","profile_oauth_edit_client":"Editare client","profile_oauth_name_help":"Ceva ce utilizatorii vor recunoaște și vor avea încredere.","profile_oauth_redirect_url":"Redirectioneaza URL","profile_oauth_redirect_url_help":"URL-ul de retroapelare al aplicației dvs.","profile_authorized_apps":"Aplicațiile dvs autorizate","profile_authorized_clients":"Clienți autorizați","profile_scopes":"Domenii","profile_revoke":"Revocați","profile_personal_access_tokens":"Token de acces personal","profile_personal_access_token":"Token de acces personal","profile_personal_access_token_explanation":"Aici este noul dvs. token de acces personal. Este singura dată când va fi afișat așa că nu îl pierde! Acum poți folosi acest token pentru a face cereri API.","profile_no_personal_access_token":"Nu aţi creat nici un token personal de acces.","profile_create_new_token":"Crează un nou token","profile_create_token":"Crează token","profile_create":"Crează","profile_save_changes":"Salvează modificările","default_group_title_name":"(ungrouped)","piggy_bank":"Pușculiță","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Data de interes","book_date":"Rezervă dată","process_date":"Data procesării","due_date":"Data scadentă","foreign_amount":"Sumă străină","payment_date":"Data de plată","invoice_date":"Data facturii","internal_reference":"Referință internă"},"config":{"html_language":"ro"}}')},7448:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Что происходит с моими финансами?","flash_error":"Ошибка!","flash_success":"Успешно!","close":"Закрыть","split_transaction_title":"Описание разделённой транзакции","errors_submission":"При отправке что-то пошло не так. Пожалуйста, проверьте ошибки ниже.","split":"Разделить","single_split":"Разделённая транзакция","transaction_stored_link":"Транзакция #{ID} (\\"{title}\\") сохранена.","transaction_updated_link":"Транзакция #{ID} обновлена.","transaction_new_stored_link":"Транзакция #{ID} сохранена.","transaction_journal_information":"Информация о транзакции","no_budget_pointer":"Похоже, у вас пока нет бюджетов. Вы должны создать их на странице Бюджеты. Бюджеты могут помочь вам отслеживать расходы.","no_bill_pointer":"Похоже, у вас пока нет счетов на оплату. Вы должны создать их на странице Счета на оплату. Счета на оплату могут помочь вам отслеживать расходы.","source_account":"Счёт-источник","hidden_fields_preferences":"Вы можете включить больше параметров транзакции в настройках.","destination_account":"Счёт назначения","add_another_split":"Добавить еще одну часть","submission":"Отправить","create_another":"После сохранения вернуться сюда и создать ещё одну аналогичную запись.","reset_after":"Сбросить форму после отправки","submit":"Подтвердить","amount":"Сумма","date":"Дата","tags":"Метки","no_budget":"(вне бюджета)","no_bill":"(нет счёта на оплату)","category":"Категория","attachments":"Вложения","notes":"Заметки","external_uri":"Внешний URL","update_transaction":"Обновить транзакцию","after_update_create_another":"После обновления вернитесь сюда, чтобы продолжить редактирование.","store_as_new":"Сохранить как новую транзакцию вместо обновления.","split_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание дле всех её составляющих.","none_in_select_list":"(нет)","no_piggy_bank":"(нет копилки)","description":"Описание","split_transaction_title_help":"Если вы создаёте разделённую транзакцию, то должны указать общее описание для всех её составляющих.","destination_account_reconciliation":"Вы не можете редактировать счёт назначения для сверяемой транзакции.","source_account_reconciliation":"Вы не можете редактировать счёт-источник для сверяемой транзакции.","budget":"Бюджет","bill":"Счёт к оплате","you_create_withdrawal":"Вы создаёте расход.","you_create_transfer":"Вы создаёте перевод.","you_create_deposit":"Вы создаёте доход.","edit":"Изменить","delete":"Удалить","name":"Название","profile_whoops":"Ууупс!","profile_something_wrong":"Что-то пошло не так!","profile_try_again":"Произошла ошибка. Пожалуйста, попробуйте снова.","profile_oauth_clients":"Клиенты OAuth","profile_oauth_no_clients":"У вас пока нет клиентов OAuth.","profile_oauth_clients_header":"Клиенты","profile_oauth_client_id":"ID клиента","profile_oauth_client_name":"Название","profile_oauth_client_secret":"Секретный ключ","profile_oauth_create_new_client":"Создать нового клиента","profile_oauth_create_client":"Создать клиента","profile_oauth_edit_client":"Изменить клиента","profile_oauth_name_help":"Что-то, что ваши пользователи знают, и чему доверяют.","profile_oauth_redirect_url":"URL редиректа","profile_oauth_redirect_url_help":"URL обратного вызова для вашего приложения.","profile_authorized_apps":"Авторизованные приложения","profile_authorized_clients":"Авторизованные клиенты","profile_scopes":"Разрешения","profile_revoke":"Отключить","profile_personal_access_tokens":"Персональные Access Tokens","profile_personal_access_token":"Персональный Access Token","profile_personal_access_token_explanation":"Вот ваш новый персональный токен доступа. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот токен, чтобы делать запросы по API.","profile_no_personal_access_token":"Вы не создали ни одного персонального токена доступа.","profile_create_new_token":"Создать новый токен","profile_create_token":"Создать токен","profile_create":"Создать","profile_save_changes":"Сохранить изменения","default_group_title_name":"(без группировки)","piggy_bank":"Копилка","profile_oauth_client_secret_title":"Ключ клиента","profile_oauth_client_secret_expl":"Вот ваш новый ключ клиента. Он будет показан вам только сейчас, поэтому не потеряйте его! Теперь вы можете использовать этот ключ, чтобы делать запросы по API.","profile_oauth_confidential":"Конфиденциальный","profile_oauth_confidential_help":"Требовать, чтобы клиент аутентифицировался с секретным ключом. Конфиденциальные клиенты могут хранить учётные данные в надёжном виде, защищая их от несанкционированного доступа. Публичные приложения, такие как обычный рабочий стол или приложения JavaScript SPA, не могут надёжно хранить ваши ключи.","multi_account_warning_unknown":"В зависимости от типа транзакции, которую вы создаёте, счёт-источник и/или счёт назначения следующих частей разделённой транзакции могут быть заменены теми, которые указаны для первой части транзакции.","multi_account_warning_withdrawal":"Имейте в виду, что счёт-источник в других частях разделённой транзакции будет таким же, как в первой части расхода.","multi_account_warning_deposit":"Имейте в виду, что счёт назначения в других частях разделённой транзакции будет таким же, как в первой части дохода.","multi_account_warning_transfer":"Имейте в виду, что счёт-источник и счёт назначения в других частях разделённой транзакции будут такими же, как в первой части перевода."},"form":{"interest_date":"Дата начисления процентов","book_date":"Дата бронирования","process_date":"Дата обработки","due_date":"Срок оплаты","foreign_amount":"Сумма в иностранной валюте","payment_date":"Дата платежа","invoice_date":"Дата выставления счёта","internal_reference":"Внутренняя ссылка"},"config":{"html_language":"ru"}}')},6949:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Ako to ide?","flash_error":"Chyba!","flash_success":"Hotovo!","close":"Zavrieť","split_transaction_title":"Popis rozúčtovania","errors_submission":"Pri odosielaní sa niečo nepodarilo. Skontrolujte prosím chyby.","split":"Rozúčtovať","single_split":"Rozúčtovať","transaction_stored_link":"Transakcia #{ID} (\\"{title}\\") bola uložená.","transaction_updated_link":"Transakcia #{ID} bola aktualizovaná.","transaction_new_stored_link":"Transakcia #{ID} bola uložená.","transaction_journal_information":"Informácie o transakcii","no_budget_pointer":"Zdá sa, že zatiaľ nemáte žiadne rozpočty. Na stránke rozpočty by ste si nejaké mali vytvoriť. Rozpočty môžu pomôcť udržať prehľad vo výdavkoch.","no_bill_pointer":"Zdá sa, že zatiaľ nemáte žiadne účty. Na stránke účty by ste mali nejaké vytvoriť. Účty môžu pomôcť udržať si prehľad vo výdavkoch.","source_account":"Zdrojový účet","hidden_fields_preferences":"Viac možností transakcií môžete povoliť vo svojich nastaveniach.","destination_account":"Cieľový účet","add_another_split":"Pridať ďalšie rozúčtovanie","submission":"Odoslanie","create_another":"Po uložení sa vrátiť späť sem a vytvoriť ďalší.","reset_after":"Po odoslaní vynulovať formulár","submit":"Odoslať","amount":"Suma","date":"Dátum","tags":"Štítky","no_budget":"(žiadny rozpočet)","no_bill":"(žiadny účet)","category":"Kategória","attachments":"Prílohy","notes":"Poznámky","external_uri":"Externá URL","update_transaction":"Upraviť transakciu","after_update_create_another":"Po aktualizácii sa vrátiť späť a pokračovať v úpravách.","store_as_new":"Namiesto aktualizácie uložiť ako novú transakciu.","split_title_help":"Ak vytvoríte rozúčtovanie transakcie, je potrebné, aby ste určili všeobecný popis pre všetky rozúčtovania danej transakcie.","none_in_select_list":"(žiadne)","no_piggy_bank":"(žiadna pokladnička)","description":"Popis","split_transaction_title_help":"Ak vytvoríte rozúčtovanú transakciu, musí existovať globálny popis všetkých rozúčtovaní transakcie.","destination_account_reconciliation":"Nemôžete upraviť cieľový účet zúčtovacej transakcie.","source_account_reconciliation":"Nemôžete upraviť zdrojový účet zúčtovacej transakcie.","budget":"Rozpočet","bill":"Účet","you_create_withdrawal":"Vytvárate výber.","you_create_transfer":"Vytvárate prevod.","you_create_deposit":"Vytvárate vklad.","edit":"Upraviť","delete":"Odstrániť","name":"Názov","profile_whoops":"Ajaj!","profile_something_wrong":"Niečo sa pokazilo!","profile_try_again":"Niečo sa pokazilo. Prosím, skúste znova.","profile_oauth_clients":"OAuth klienti","profile_oauth_no_clients":"Zatiaľ ste nevytvorili žiadneho OAuth klienta.","profile_oauth_clients_header":"Klienti","profile_oauth_client_id":"ID klienta","profile_oauth_client_name":"Meno/Názov","profile_oauth_client_secret":"Tajný kľúč","profile_oauth_create_new_client":"Vytvoriť nového klienta","profile_oauth_create_client":"Vytvoriť klienta","profile_oauth_edit_client":"Upraviť klienta","profile_oauth_name_help":"Niečo, čo vaši použivatelia poznajú a budú tomu dôverovať.","profile_oauth_redirect_url":"URL presmerovania","profile_oauth_redirect_url_help":"Spätná URL pre overenie autorizácie vašej aplikácie.","profile_authorized_apps":"Povolené aplikácie","profile_authorized_clients":"Autorizovaní klienti","profile_scopes":"Rozsahy","profile_revoke":"Odvolať","profile_personal_access_tokens":"Osobné prístupové tokeny","profile_personal_access_token":"Osobný prístupový token","profile_personal_access_token_explanation":"Toto je váš nový osobný prístupový token. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz ho môžete používať pre prístup k API.","profile_no_personal_access_token":"Ešte ste nevytvorili žiadne osobné prístupové tokeny.","profile_create_new_token":"Vytvoriť nový token","profile_create_token":"Vytvoriť token","profile_create":"Vytvoriť","profile_save_changes":"Uložiť zmeny","default_group_title_name":"(nezoskupené)","piggy_bank":"Pokladnička","profile_oauth_client_secret_title":"Tajný kľúč klienta","profile_oauth_client_secret_expl":"Toto je váš tajný kľúč klienta. Toto je jediný raz, kedy sa zobrazí - nestraťte ho! Odteraz môžete tento tajný kľúč používať pre prístup k API.","profile_oauth_confidential":"Dôverné","profile_oauth_confidential_help":"Vyžadujte od klienta autentifikáciu pomocou tajného kľúča. Dôverní klienti môžu uchovávať poverenia bezpečným spôsobom bez toho, aby boli vystavení neoprávneným stranám. Verejné aplikácie, ako napríklad natívna pracovná plocha alebo aplikácie Java SPA, nedokážu tajné kľúče bezpečne uchovať.","multi_account_warning_unknown":"V závislosti od typu vytvorenej transakcie, môže byť zdrojový a/alebo cieľový účet následných rozúčtovaní prepísaný údajmi v prvom rozdelení transakcie.","multi_account_warning_withdrawal":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozdelení výberu.","multi_account_warning_deposit":"Majte na pamäti, že zdrojový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní vkladu.","multi_account_warning_transfer":"Majte na pamäti, že zdrojový a cieľový bankový účet následných rozúčtovaní bude prepísaný tým, čo je definované v prvom rozúčtovaní prevodu."},"form":{"interest_date":"Úrokový dátum","book_date":"Dátum rezervácie","process_date":"Dátum spracovania","due_date":"Dátum splatnosti","foreign_amount":"Suma v cudzej mene","payment_date":"Dátum úhrady","invoice_date":"Dátum vystavenia","internal_reference":"Interná referencia"},"config":{"html_language":"sk"}}')},2285:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Vad spelas?","flash_error":"Fel!","flash_success":"Slutförd!","close":"Stäng","split_transaction_title":"Beskrivning av delad transaktion","errors_submission":"Något fel uppstod med inskickningen. Vänligen kontrollera felen nedan.","split":"Dela","single_split":"Dela","transaction_stored_link":"Transaktion #{ID} (\\"{title}\\") sparades.","transaction_updated_link":"Transaktion #{ID} uppdaterades.","transaction_new_stored_link":"Transaktion #{ID} sparades.","transaction_journal_information":"Transaktionsinformation","no_budget_pointer":"Du verkar inte ha några budgetar än. Du bör skapa några på budgetar-sidan. Budgetar kan hjälpa dig att hålla reda på utgifter.","no_bill_pointer":"Du verkar inte ha några räkningar ännu. Du bör skapa några på räkningar-sidan. Räkningar kan hjälpa dig att hålla reda på utgifter.","source_account":"Källkonto","hidden_fields_preferences":"Du kan aktivera fler transaktionsalternativ i dina inställningar.","destination_account":"Till konto","add_another_split":"Lägga till en annan delning","submission":"Inskickning","create_another":"Efter sparat, återkom hit för att skapa ytterligare en.","reset_after":"Återställ formulär efter inskickat","submit":"Skicka","amount":"Belopp","date":"Datum","tags":"Etiketter","no_budget":"(ingen budget)","no_bill":"(ingen räkning)","category":"Kategori","attachments":"Bilagor","notes":"Noteringar","external_uri":"External URL","update_transaction":"Uppdatera transaktion","after_update_create_another":"Efter uppdaterat, återkom hit för att fortsätta redigera.","store_as_new":"Spara en ny transaktion istället för att uppdatera.","split_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","none_in_select_list":"(Ingen)","no_piggy_bank":"(ingen spargris)","description":"Beskrivning","split_transaction_title_help":"Om du skapar en delad transaktion måste det finnas en global beskrivning för alla delningar av transaktionen.","destination_account_reconciliation":"Du kan inte redigera destinationskontot för en avstämningstransaktion.","source_account_reconciliation":"Du kan inte redigera källkontot för en avstämningstransaktion.","budget":"Budget","bill":"Nota","you_create_withdrawal":"Du skapar ett uttag.","you_create_transfer":"Du skapar en överföring.","you_create_deposit":"Du skapar en insättning.","edit":"Redigera","delete":"Ta bort","name":"Namn","profile_whoops":"Hoppsan!","profile_something_wrong":"Något gick fel!","profile_try_again":"Något gick fel. Försök igen.","profile_oauth_clients":"OAuth klienter","profile_oauth_no_clients":"Du har inte skapat några OAuth klienter.","profile_oauth_clients_header":"Klienter","profile_oauth_client_id":"Klient ID","profile_oauth_client_name":"Namn","profile_oauth_client_secret":"Hemlighet","profile_oauth_create_new_client":"Skapa ny klient","profile_oauth_create_client":"Skapa klient","profile_oauth_edit_client":"Redigera klient","profile_oauth_name_help":"Något som dina användare kommer att känna igen och lita på.","profile_oauth_redirect_url":"Omdirigera URL","profile_oauth_redirect_url_help":"Din applikations auktorisering callback URL.","profile_authorized_apps":"Auktoriserade applikationer","profile_authorized_clients":"Auktoriserade klienter","profile_scopes":"Omfattningar","profile_revoke":"Återkalla","profile_personal_access_tokens":"Personliga åtkomst-Tokens","profile_personal_access_token":"Personlig åtkomsttoken","profile_personal_access_token_explanation":"Här är din nya personliga tillgångs token. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna token för att göra API-förfrågningar.","profile_no_personal_access_token":"Du har inte skapat några personliga åtkomsttokens.","profile_create_new_token":"Skapa ny token","profile_create_token":"Skapa token","profile_create":"Skapa","profile_save_changes":"Spara ändringar","default_group_title_name":"(ogrupperad)","piggy_bank":"Spargris","profile_oauth_client_secret_title":"Klienthemlighet","profile_oauth_client_secret_expl":"Här är din nya klient hemlighet. Detta är den enda gången det kommer att visas så förlora inte det! Du kan nu använda denna hemlighet för att göra API-förfrågningar.","profile_oauth_confidential":"Konfidentiell","profile_oauth_confidential_help":"Kräv att klienten autentiserar med en hemlighet. Konfidentiella klienter kan hålla autentiseringsuppgifter på ett säkert sätt utan att utsätta dem för obehöriga parter. Publika applikationer, som skrivbord eller JavaScript-SPA-applikationer, kan inte hålla hemligheter på ett säkert sätt.","multi_account_warning_unknown":"Beroende på vilken typ av transaktion du skapar, källan och/eller destinationskontot för efterföljande delningar kan åsidosättas av vad som än definieras i den första delningen av transaktionen.","multi_account_warning_withdrawal":"Tänk på att källkontot för efterföljande uppdelningar kommer att upphävas av vad som än definieras i den första uppdelningen av uttaget.","multi_account_warning_deposit":"Tänk på att destinationskontot för efterföljande uppdelningar kommer att styras av vad som än definieras i den första uppdelningen av insättningen.","multi_account_warning_transfer":"Tänk på att käll + destinationskonto av efterföljande delningar kommer att styras av vad som definieras i den första uppdelningen av överföringen."},"form":{"interest_date":"Räntedatum","book_date":"Bokföringsdatum","process_date":"Behandlingsdatum","due_date":"Förfallodatum","foreign_amount":"Utländskt belopp","payment_date":"Betalningsdatum","invoice_date":"Fakturadatum","internal_reference":"Intern referens"},"config":{"html_language":"sv"}}')},9783:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"Chào mừng trở lại?","flash_error":"Lỗi!","flash_success":"Thành công!","close":"Đóng","split_transaction_title":"Mô tả giao dịch tách","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"Chia ra","single_split":"Split","transaction_stored_link":"Giao dịch #{ID} (\\"{title}\\") đã được lưu trữ.","transaction_updated_link":"Giao dịch#{ID} đã được cập nhật.","transaction_new_stored_link":" Giao dịch #{ID} đã được lưu trữ.","transaction_journal_information":"Thông tin giao dịch","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Nguồn tài khoản","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Tài khoản đích","add_another_split":"Thêm một phân chia khác","submission":"Gửi","create_another":"Sau khi lưu trữ, quay trở lại đây để tạo một cái khác.","reset_after":"Đặt lại mẫu sau khi gửi","submit":"Gửi","amount":"Số tiền","date":"Ngày","tags":"Nhãn","no_budget":"(không có ngân sách)","no_bill":"(no bill)","category":"Danh mục","attachments":"Tệp đính kèm","notes":"Ghi chú","external_uri":"External URL","update_transaction":"Cập nhật giao dịch","after_update_create_another":"Sau khi cập nhật, quay lại đây để tiếp tục chỉnh sửa.","store_as_new":"Lưu trữ như một giao dịch mới thay vì cập nhật.","split_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","none_in_select_list":"(Trống)","no_piggy_bank":"(chưa có heo đất)","description":"Sự miêu tả","split_transaction_title_help":"Nếu bạn tạo một giao dịch phân tách, phải có một mô tả toàn cầu cho tất cả các phân chia của giao dịch.","destination_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản đích của giao dịch đối chiếu.","source_account_reconciliation":"Bạn không thể chỉnh sửa tài khoản nguồn của giao dịch đối chiếu.","budget":"Ngân sách","bill":"Hóa đơn","you_create_withdrawal":"Bạn đang tạo một rút tiền.","you_create_transfer":"Bạn đang tạo một chuyển khoản.","you_create_deposit":"Bạn đang tạo một tiền gửi.","edit":"Sửa","delete":"Xóa","name":"Tên","profile_whoops":"Rất tiếc!","profile_something_wrong":"Có lỗi xảy ra!","profile_try_again":"Xảy ra lỗi. Vui lòng thử lại.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"Bạn đã không tạo ra bất kỳ OAuth clients nào.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Tên","profile_oauth_client_secret":"Mã bí mật","profile_oauth_create_new_client":"Tạo mới Client","profile_oauth_create_client":"Tạo Client","profile_oauth_edit_client":"Sửa Client","profile_oauth_name_help":"Một cái gì đó người dùng của bạn sẽ nhận ra và tin tưởng.","profile_oauth_redirect_url":"URL chuyển tiếp","profile_oauth_redirect_url_help":"URL gọi lại ủy quyền của ứng dụng của bạn.","profile_authorized_apps":"Uỷ quyền ứng dụng","profile_authorized_clients":"Client ủy quyền","profile_scopes":"Phạm vi","profile_revoke":"Thu hồi","profile_personal_access_tokens":"Mã truy cập cá nhân","profile_personal_access_token":"Mã truy cập cá nhân","profile_personal_access_token_explanation":"Đây là mã thông báo truy cập cá nhân mới của bạn. Đây là lần duy nhất nó sẽ được hiển thị vì vậy đừng đánh mất nó! Bây giờ bạn có thể sử dụng mã thông báo này để thực hiện API.","profile_no_personal_access_token":"Bạn chưa tạo bất kỳ mã thông báo truy cập cá nhân nào.","profile_create_new_token":"Tạo mã mới","profile_create_token":"Tạo mã","profile_create":"Tạo","profile_save_changes":"Lưu thay đổi","default_group_title_name":"(chưa nhóm)","piggy_bank":"Heo đất","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"Ngày lãi","book_date":"Ngày đặt sách","process_date":"Ngày xử lý","due_date":"Ngày đáo hạn","foreign_amount":"Ngoại tệ","payment_date":"Ngày thanh toán","invoice_date":"Ngày hóa đơn","internal_reference":"Tài liệu tham khảo nội bộ"},"config":{"html_language":"vi"}}')},1922:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"今天理财了吗?","flash_error":"错误!","flash_success":"成功!","close":"关闭","split_transaction_title":"拆分交易的描述","errors_submission":"您提交的内容有误,请检查错误信息。","split":"拆分","single_split":"拆分","transaction_stored_link":"交易 #{ID} (“{title}”) 已保存。","transaction_updated_link":"交易 #{ID} 已更新。","transaction_new_stored_link":"交易 #{ID} 已保存。","transaction_journal_information":"交易信息","no_budget_pointer":"您还没有预算,您应该在预算页面进行创建。预算可以帮助您追踪支出。","no_bill_pointer":"您还没有账单,您应该在账单页面进行创建。账单可以帮助您追踪支出。","source_account":"来源账户","hidden_fields_preferences":"您可以在偏好设定中启用更多交易选项。","destination_account":"目标账户","add_another_split":"增加另一笔拆分","submission":"提交","create_another":"保存后,返回此页面以创建新记录","reset_after":"提交后重置表单","submit":"提交","amount":"金额","date":"日期","tags":"标签","no_budget":"(无预算)","no_bill":"(无账单)","category":"分类","attachments":"附件","notes":"备注","external_uri":"外部链接","update_transaction":"更新交易","after_update_create_another":"更新后,返回此页面继续编辑。","store_as_new":"保存为新交易而不是更新此交易。","split_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","none_in_select_list":"(空)","no_piggy_bank":"(无存钱罐)","description":"描述","split_transaction_title_help":"如果您创建了一笔拆分交易,必须有一个所有拆分的全局描述。","destination_account_reconciliation":"您不能编辑对账交易的目标账户","source_account_reconciliation":"您不能编辑对账交易的来源账户。","budget":"预算","bill":"账单","you_create_withdrawal":"您正在创建一笔支出","you_create_transfer":"您正在创建一笔转账","you_create_deposit":"您正在创建一笔收入","edit":"编辑","delete":"删除","name":"名称","profile_whoops":"很抱歉!","profile_something_wrong":"发生错误!","profile_try_again":"发生错误,请稍后再试。","profile_oauth_clients":"OAuth 客户端","profile_oauth_no_clients":"您尚未创建任何 OAuth 客户端。","profile_oauth_clients_header":"客户端","profile_oauth_client_id":"客户端 ID","profile_oauth_client_name":"名称","profile_oauth_client_secret":"密钥","profile_oauth_create_new_client":"创建新客户端","profile_oauth_create_client":"创建客户端","profile_oauth_edit_client":"编辑客户端","profile_oauth_name_help":"您的用户可以识别并信任的信息","profile_oauth_redirect_url":"跳转网址","profile_oauth_redirect_url_help":"您的应用程序的授权回调网址","profile_authorized_apps":"已授权应用","profile_authorized_clients":"已授权客户端","profile_scopes":"范围","profile_revoke":"撤消","profile_personal_access_tokens":"个人访问令牌","profile_personal_access_token":"个人访问令牌","profile_personal_access_token_explanation":"请妥善保存您的新个人访问令牌,此令牌仅会在这里展示一次。您现在已可以使用此令牌进行 API 请求。","profile_no_personal_access_token":"您还没有创建个人访问令牌。","profile_create_new_token":"创建新令牌","profile_create_token":"创建令牌","profile_create":"创建","profile_save_changes":"保存更改","default_group_title_name":"(未分组)","piggy_bank":"存钱罐","profile_oauth_client_secret_title":"客户端密钥","profile_oauth_client_secret_expl":"请妥善保存您的新客户端的密钥,此密钥仅会在这里展示一次。您现在已可以使用此密钥进行 API 请求。","profile_oauth_confidential":"使用加密","profile_oauth_confidential_help":"要求客户端使用密钥进行认证。加密客户端可以安全储存凭据且不将其泄露给未授权方,而公共应用程序(例如本地计算机或 JavaScript SPA 应用程序)无法保证凭据的安全性。","multi_account_warning_unknown":"根据您创建的交易类型,后续拆分的来源和/或目标账户可能被交易的首笔拆分的配置所覆盖。","multi_account_warning_withdrawal":"请注意,后续拆分的来源账户将会被支出的首笔拆分的配置所覆盖。","multi_account_warning_deposit":"请注意,后续拆分的目标账户将会被收入的首笔拆分的配置所覆盖。","multi_account_warning_transfer":"请注意,后续拆分的来源和目标账户将会被转账的首笔拆分的配置所覆盖。"},"form":{"interest_date":"利息日期","book_date":"登记日期","process_date":"处理日期","due_date":"到期日","foreign_amount":"外币金额","payment_date":"付款日期","invoice_date":"发票日期","internal_reference":"内部引用"},"config":{"html_language":"zh-cn"}}')},4963:e=>{"use strict";e.exports=JSON.parse('{"firefly":{"welcome_back":"What\'s playing?","flash_error":"錯誤!","flash_success":"成功!","close":"關閉","split_transaction_title":"拆分交易的描述","errors_submission":"There was something wrong with your submission. Please check out the errors.","split":"分割","single_split":"Split","transaction_stored_link":"Transaction #{ID} (\\"{title}\\") has been stored.","transaction_updated_link":"Transaction #{ID} has been updated.","transaction_new_stored_link":"Transaction #{ID} has been stored.","transaction_journal_information":"交易資訊","no_budget_pointer":"You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.","no_bill_pointer":"You seem to have no bills yet. You should create some on the bills-page. Bills can help you keep track of expenses.","source_account":"Source account","hidden_fields_preferences":"You can enable more transaction options in your preferences.","destination_account":"Destination account","add_another_split":"增加拆分","submission":"Submission","create_another":"After storing, return here to create another one.","reset_after":"Reset form after submission","submit":"送出","amount":"金額","date":"日期","tags":"標籤","no_budget":"(無預算)","no_bill":"(no bill)","category":"分類","attachments":"附加檔案","notes":"備註","external_uri":"External URL","update_transaction":"Update transaction","after_update_create_another":"After updating, return here to continue editing.","store_as_new":"Store as a new transaction instead of updating.","split_title_help":"若您建立一筆拆分交易,須有一個有關交易所有拆分的整體描述。","none_in_select_list":"(空)","no_piggy_bank":"(no piggy bank)","description":"描述","split_transaction_title_help":"If you create a split transaction, there must be a global description for all splits of the transaction.","destination_account_reconciliation":"You can\'t edit the destination account of a reconciliation transaction.","source_account_reconciliation":"You can\'t edit the source account of a reconciliation transaction.","budget":"預算","bill":"帳單","you_create_withdrawal":"You\'re creating a withdrawal.","you_create_transfer":"You\'re creating a transfer.","you_create_deposit":"You\'re creating a deposit.","edit":"編輯","delete":"刪除","name":"名稱","profile_whoops":"Whoops!","profile_something_wrong":"Something went wrong!","profile_try_again":"Something went wrong. Please try again.","profile_oauth_clients":"OAuth Clients","profile_oauth_no_clients":"You have not created any OAuth clients.","profile_oauth_clients_header":"Clients","profile_oauth_client_id":"Client ID","profile_oauth_client_name":"Name","profile_oauth_client_secret":"Secret","profile_oauth_create_new_client":"Create New Client","profile_oauth_create_client":"Create Client","profile_oauth_edit_client":"Edit Client","profile_oauth_name_help":"Something your users will recognize and trust.","profile_oauth_redirect_url":"Redirect URL","profile_oauth_redirect_url_help":"Your application\'s authorization callback URL.","profile_authorized_apps":"Authorized applications","profile_authorized_clients":"Authorized clients","profile_scopes":"Scopes","profile_revoke":"Revoke","profile_personal_access_tokens":"Personal Access Tokens","profile_personal_access_token":"Personal Access Token","profile_personal_access_token_explanation":"Here is your new personal access token. This is the only time it will be shown so don\'t lose it! You may now use this token to make API requests.","profile_no_personal_access_token":"You have not created any personal access tokens.","profile_create_new_token":"Create new token","profile_create_token":"Create token","profile_create":"Create","profile_save_changes":"Save changes","default_group_title_name":"(ungrouped)","piggy_bank":"小豬撲滿","profile_oauth_client_secret_title":"Client Secret","profile_oauth_client_secret_expl":"Here is your new client secret. This is the only time it will be shown so don\'t lose it! You may now use this secret to make API requests.","profile_oauth_confidential":"Confidential","profile_oauth_confidential_help":"Require the client to authenticate with a secret. Confidential clients can hold credentials in a secure way without exposing them to unauthorized parties. Public applications, such as native desktop or JavaScript SPA applications, are unable to hold secrets securely.","multi_account_warning_unknown":"Depending on the type of transaction you create, the source and/or destination account of subsequent splits may be overruled by whatever is defined in the first split of the transaction.","multi_account_warning_withdrawal":"Keep in mind that the source account of subsequent splits will be overruled by whatever is defined in the first split of the withdrawal.","multi_account_warning_deposit":"Keep in mind that the destination account of subsequent splits will be overruled by whatever is defined in the first split of the deposit.","multi_account_warning_transfer":"Keep in mind that the source + destination account of subsequent splits will be overruled by whatever is defined in the first split of the transfer."},"form":{"interest_date":"利率日期","book_date":"登記日期","process_date":"處理日期","due_date":"到期日","foreign_amount":"外幣金額","payment_date":"付款日期","invoice_date":"發票日期","internal_reference":"內部參考"},"config":{"html_language":"zh-tw"}}')}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={id:n,exports:{}};return e[n](i,i.exports,a),i.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}const t={data:function(){return{clients:[],clientSecret:null,createForm:{errors:[],name:"",redirect:"",confidential:!0},editForm:{errors:[],name:"",redirect:""}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getClients(),$("#modal-create-client").on("shown.bs.modal",(function(){$("#create-client-name").focus()})),$("#modal-edit-client").on("shown.bs.modal",(function(){$("#edit-client-name").focus()}))},getClients:function(){var e=this;axios.get("./oauth/clients").then((function(t){e.clients=t.data}))},showCreateClientForm:function(){$("#modal-create-client").modal("show")},store:function(){this.persistClient("post","./oauth/clients",this.createForm,"#modal-create-client")},edit:function(e){this.editForm.id=e.id,this.editForm.name=e.name,this.editForm.redirect=e.redirect,$("#modal-edit-client").modal("show")},update:function(){this.persistClient("put","./oauth/clients/"+this.editForm.id,this.editForm,"#modal-edit-client")},persistClient:function(t,a,n,o){var i=this;n.errors=[],axios[t](a,n).then((function(e){i.getClients(),n.name="",n.redirect="",n.errors=[],$(o).modal("hide"),e.data.plainSecret&&i.showClientSecret(e.data.plainSecret)})).catch((function(t){"object"===e(t.response.data)?n.errors=_.flatten(_.toArray(t.response.data.errors)):n.errors=["Something went wrong. Please try again."]}))},showClientSecret:function(e){this.clientSecret=e,$("#modal-client-secret").modal("show")},destroy:function(e){var t=this;axios.delete("./oauth/clients/"+e.id).then((function(e){t.getClients()}))}}};var n=a(3379),o=a.n(n),i=a(4130),r={insert:"head",singleton:!1};o()(i.Z,r);i.Z.locals;function s(e,t,a,n,o,i,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=a,c._compiled=!0),n&&(c.functional=!0),i&&(c._scopeId="data-v-"+i),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):o&&(l=s?function(){o.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:o),l)if(c.functional){c._injectStyles=l;var _=c.render;c.render=function(e,t){return l.call(t),_(e,t)}}else{var u=c.beforeCreate;c.beforeCreate=u?[].concat(u,l):[l]}return{exports:e,options:c}}const l=s(t,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("div",{staticClass:"box box-default"},[a("div",{staticClass:"box-header with-border"},[a("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_clients"))+"\n ")]),e._v(" "),a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateClientForm}},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_create_new_client"))+"\n ")])]),e._v(" "),a("div",{staticClass:"box-body"},[0===e.clients.length?a("p",{staticClass:"mb-0"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_no_clients"))+"\n ")]):e._e(),e._v(" "),e.clients.length>0?a("table",{staticClass:"table table-responsive table-borderless mb-0"},[a("caption",[e._v(e._s(e.$t("firefly.profile_oauth_clients_header")))]),e._v(" "),a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.profile_oauth_client_id")))]),e._v(" "),a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.profile_oauth_client_secret")))]),e._v(" "),a("th",{attrs:{scope:"col"}}),e._v(" "),a("th",{attrs:{scope:"col"}})])]),e._v(" "),a("tbody",e._l(e.clients,(function(t){return a("tr",[a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.id)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.name)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("code",[e._v(e._s(t.secret?t.secret:"-"))])]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link",attrs:{tabindex:"-1"},on:{click:function(a){return e.edit(t)}}},[e._v("\n "+e._s(e.$t("firefly.edit"))+"\n ")])]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link text-danger",on:{click:function(a){return e.destroy(t)}}},[e._v("\n "+e._s(e.$t("firefly.delete"))+"\n ")])])])})),0)]):e._e()]),e._v(" "),a("div",{staticClass:"box-footer"},[a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateClientForm}},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_create_new_client"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-create-client",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_create_client"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[e.createForm.errors.length>0?a("div",{staticClass:"alert alert-danger"},[a("p",{staticClass:"mb-0"},[a("strong",[e._v(e._s(e.$t("firefly.profile_whoops")))]),e._v(" "+e._s(e.$t("firefly.profile_something_wrong")))]),e._v(" "),a("br"),e._v(" "),a("ul",e._l(e.createForm.errors,(function(t){return a("li",[e._v("\n "+e._s(t)+"\n ")])})),0)]):e._e(),e._v(" "),a("form",{attrs:{role:"form","aria-label":"form"}},[a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.name,expression:"createForm.name"}],staticClass:"form-control",attrs:{id:"create-client-name",type:"text"},domProps:{value:e.createForm.name},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.store(t)},input:function(t){t.target.composing||e.$set(e.createForm,"name",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_name_help"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.profile_oauth_redirect_url")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.redirect,expression:"createForm.redirect"}],staticClass:"form-control",attrs:{name:"redirect",type:"text"},domProps:{value:e.createForm.redirect},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.store(t)},input:function(t){t.target.composing||e.$set(e.createForm,"redirect",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_redirect_url_help"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.profile_oauth_confidential")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("div",{staticClass:"checkbox"},[a("label",[a("input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.confidential,expression:"createForm.confidential"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.createForm.confidential)?e._i(e.createForm.confidential,null)>-1:e.createForm.confidential},on:{change:function(t){var a=e.createForm.confidential,n=t.target,o=!!n.checked;if(Array.isArray(a)){var i=e._i(a,null);n.checked?i<0&&e.$set(e.createForm,"confidential",a.concat([null])):i>-1&&e.$set(e.createForm,"confidential",a.slice(0,i).concat(a.slice(i+1)))}else e.$set(e.createForm,"confidential",o)}}})])]),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_confidential_help"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))]),e._v(" "),a("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:e.store}},[e._v("\n "+e._s(e.$t("firefly.profile_create"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-edit-client",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_edit_client"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[e.editForm.errors.length>0?a("div",{staticClass:"alert alert-danger"},[a("p",{staticClass:"mb-0"},[a("strong",[e._v(e._s(e.$t("firefly.profile_whoops")))]),e._v(" "+e._s(e.$t("firefly.profile_something_wrong")))]),e._v(" "),a("br"),e._v(" "),a("ul",e._l(e.editForm.errors,(function(t){return a("li",[e._v("\n "+e._s(t)+"\n ")])})),0)]):e._e(),e._v(" "),a("form",{attrs:{role:"form","aria-label":"form"}},[a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.editForm.name,expression:"editForm.name"}],staticClass:"form-control",attrs:{id:"edit-client-name",type:"text"},domProps:{value:e.editForm.name},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.update(t)},input:function(t){t.target.composing||e.$set(e.editForm,"name",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_name_help"))+"\n ")])])]),e._v(" "),a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-3 col-form-label"},[e._v(e._s(e.$t("firefly.profile_oauth_redirect_url")))]),e._v(" "),a("div",{staticClass:"col-md-9"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.editForm.redirect,expression:"editForm.redirect"}],staticClass:"form-control",attrs:{name:"redirect",type:"text"},domProps:{value:e.editForm.redirect},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.update(t)},input:function(t){t.target.composing||e.$set(e.editForm,"redirect",t.target.value)}}}),e._v(" "),a("span",{staticClass:"form-text text-muted"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_redirect_url_help"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))]),e._v(" "),a("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:e.update}},[e._v("\n "+e._s(e.$t("firefly.profile_save_changes"))+"\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-client-secret",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_oauth_client_secret_title"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[a("p",[e._v("\n "+e._s(e.$t("firefly.profile_oauth_client_secret_expl"))+"\n ")]),e._v(" "),a("input",{directives:[{name:"model",rawName:"v-model",value:e.clientSecret,expression:"clientSecret"}],staticClass:"form-control",attrs:{type:"text"},domProps:{value:e.clientSecret},on:{input:function(t){t.target.composing||(e.clientSecret=t.target.value)}}})]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))])])])])])])}),[],!1,null,"5006d7a4",null).exports;const c={data:function(){return{tokens:[]}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens()},getTokens:function(){var e=this;axios.get("./oauth/tokens").then((function(t){e.tokens=t.data}))},revoke:function(e){var t=this;axios.delete("./oauth/tokens/"+e.id).then((function(e){t.getTokens()}))}}};var u=a(1954),d={insert:"head",singleton:!1};o()(u.Z,d);u.Z.locals;const p=s(c,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[e.tokens.length>0?a("div",[a("div",{staticClass:"box box-default"},[a("div",{staticClass:"box-header"},[a("h3",{staticClass:"box-title"},[e._v("\n "+e._s(e.$t("firefly.profile_authorized_apps"))+"\n ")])]),e._v(" "),a("div",{staticClass:"box-body"},[a("table",{staticClass:"table table-responsive table-borderless mb-0"},[a("caption",{staticStyle:{display:"none"}},[e._v(e._s(e.$t("firefly.profile_authorized_apps")))]),e._v(" "),a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.profile_scopes")))]),e._v(" "),a("th",{attrs:{scope:"col"}})])]),e._v(" "),a("tbody",e._l(e.tokens,(function(t){return a("tr",[a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.client.name)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[t.scopes.length>0?a("span",[e._v("\n "+e._s(t.scopes.join(", "))+"\n ")]):e._e()]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link text-danger",on:{click:function(a){return e.revoke(t)}}},[e._v("\n "+e._s(e.$t("firefly.profile_revoke"))+"\n ")])])])})),0)])])])]):e._e()])}),[],!1,null,"da1c7f80",null).exports;function f(e){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}const h={data:function(){return{accessToken:null,tokens:[],scopes:[],form:{name:"",scopes:[],errors:[]}}},ready:function(){this.prepareComponent()},mounted:function(){this.prepareComponent()},methods:{prepareComponent:function(){this.getTokens(),this.getScopes(),$("#modal-create-token").on("shown.bs.modal",(function(){$("#create-token-name").focus()}))},getTokens:function(){var e=this;axios.get("./oauth/personal-access-tokens").then((function(t){e.tokens=t.data}))},getScopes:function(){var e=this;axios.get("./oauth/scopes").then((function(t){e.scopes=t.data}))},showCreateTokenForm:function(){$("#modal-create-token").modal("show")},store:function(){var e=this;this.accessToken=null,this.form.errors=[],axios.post("./oauth/personal-access-tokens",this.form).then((function(t){e.form.name="",e.form.scopes=[],e.form.errors=[],e.tokens.push(t.data.token),e.showAccessToken(t.data.accessToken)})).catch((function(t){"object"===f(t.response.data)?e.form.errors=_.flatten(_.toArray(t.response.data.errors)):e.form.errors=["Something went wrong. Please try again."]}))},toggleScope:function(e){this.scopeIsAssigned(e)?this.form.scopes=_.reject(this.form.scopes,(function(t){return t==e})):this.form.scopes.push(e)},scopeIsAssigned:function(e){return _.indexOf(this.form.scopes,e)>=0},showAccessToken:function(e){$("#modal-create-token").modal("hide"),this.accessToken=e,$("#modal-access-token").modal("show")},revoke:function(e){var t=this;axios.delete("./oauth/personal-access-tokens/"+e.id).then((function(e){t.getTokens()}))}}};var m=a(1672),g={insert:"head",singleton:!1};o()(m.Z,g);m.Z.locals;const k=s(h,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("div",[a("div",{staticClass:"box box-default"},[a("div",{staticClass:"box-header"},[a("h3",{staticClass:"box-title"},[e._v(e._s(e.$t("firefly.profile_personal_access_tokens")))]),e._v(" "),a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateTokenForm}},[e._v("\n "+e._s(e.$t("firefly.profile_create_new_token"))+"\n ")])]),e._v(" "),a("div",{staticClass:"box-body"},[0===e.tokens.length?a("p",{staticClass:"mb-0"},[e._v("\n "+e._s(e.$t("firefly.profile_no_personal_access_token"))+"\n ")]):e._e(),e._v(" "),e.tokens.length>0?a("table",{staticClass:"table table-responsive table-borderless mb-0"},[a("caption",{staticStyle:{display:"none"}},[e._v(e._s(e.$t("firefly.profile_personal_access_tokens")))]),e._v(" "),a("thead",[a("tr",[a("th",{attrs:{scope:"col"}},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("th",{attrs:{scope:"col"}})])]),e._v(" "),a("tbody",e._l(e.tokens,(function(t){return a("tr",[a("td",{staticStyle:{"vertical-align":"middle"}},[e._v("\n "+e._s(t.name)+"\n ")]),e._v(" "),a("td",{staticStyle:{"vertical-align":"middle"}},[a("a",{staticClass:"action-link text-danger",on:{click:function(a){return e.revoke(t)}}},[e._v("\n "+e._s(e.$t("firefly.delete"))+"\n ")])])])})),0)]):e._e()]),e._v(" "),a("div",{staticClass:"box-footer"},[a("a",{staticClass:"btn btn-default pull-right",attrs:{tabindex:"-1"},on:{click:e.showCreateTokenForm}},[e._v("\n "+e._s(e.$t("firefly.profile_create_new_token"))+"\n ")])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-create-token",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_create_token"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[e.form.errors.length>0?a("div",{staticClass:"alert alert-danger"},[a("p",{staticClass:"mb-0"},[a("strong",[e._v(e._s(e.$t("firefly.profile_whoops")))]),e._v("\n "+e._s(e.$t("firefly.profile_something_wrong")))]),e._v(" "),a("br"),e._v(" "),a("ul",e._l(e.form.errors,(function(t){return a("li",[e._v("\n "+e._s(t)+"\n ")])})),0)]):e._e(),e._v(" "),a("form",{attrs:{role:"form"},on:{submit:function(t){return t.preventDefault(),e.store(t)}}},[a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-4 col-form-label"},[e._v(e._s(e.$t("firefly.name")))]),e._v(" "),a("div",{staticClass:"col-md-6"},[a("input",{directives:[{name:"model",rawName:"v-model",value:e.form.name,expression:"form.name"}],staticClass:"form-control",attrs:{id:"create-token-name",name:"name",type:"text"},domProps:{value:e.form.name},on:{input:function(t){t.target.composing||e.$set(e.form,"name",t.target.value)}}})])]),e._v(" "),e.scopes.length>0?a("div",{staticClass:"form-group row"},[a("label",{staticClass:"col-md-4 col-form-label"},[e._v(e._s(e.$t("firefly.profile_scopes")))]),e._v(" "),a("div",{staticClass:"col-md-6"},e._l(e.scopes,(function(t){return a("div",[a("div",{staticClass:"checkbox"},[a("label",[a("input",{attrs:{type:"checkbox"},domProps:{checked:e.scopeIsAssigned(t.id)},on:{click:function(a){return e.toggleScope(t.id)}}}),e._v("\n\n "+e._s(t.id)+"\n ")])])])})),0)]):e._e()])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))]),e._v(" "),a("button",{staticClass:"btn btn-primary",attrs:{type:"button"},on:{click:e.store}},[e._v("\n Create\n ")])])])])]),e._v(" "),a("div",{staticClass:"modal fade",attrs:{id:"modal-access-token",role:"dialog",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog"},[a("div",{staticClass:"modal-content"},[a("div",{staticClass:"modal-header"},[a("h4",{staticClass:"modal-title"},[e._v("\n "+e._s(e.$t("firefly.profile_personal_access_token"))+"\n ")]),e._v(" "),a("button",{staticClass:"close",attrs:{"aria-hidden":"true","data-dismiss":"modal",type:"button"}},[e._v("×")])]),e._v(" "),a("div",{staticClass:"modal-body"},[a("p",[e._v("\n "+e._s(e.$t("firefly.profile_personal_access_token_explanation"))+"\n ")]),e._v(" "),a("textarea",{staticClass:"form-control",staticStyle:{width:"100%"},attrs:{readonly:"",rows:"20"}},[e._v(e._s(e.accessToken))])]),e._v(" "),a("div",{staticClass:"modal-footer"},[a("button",{staticClass:"btn btn-secondary",attrs:{"data-dismiss":"modal",type:"button"}},[e._v(e._s(e.$t("firefly.close")))])])])])])])}),[],!1,null,"5b4ee38c",null).exports;const v=s({name:"ProfileOptions"},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("div",{staticClass:"row"},[a("div",{staticClass:"col-lg-12"},[a("passport-clients")],1)]),e._v(" "),a("div",{staticClass:"row"},[a("div",{staticClass:"col-lg-12"},[a("passport-authorized-clients")],1)]),e._v(" "),a("div",{staticClass:"row"},[a("div",{staticClass:"col-lg-12"},[a("passport-personal-access-tokens")],1)])])}),[],!1,null,null,null).exports;a(9703),Vue.component("passport-clients",l),Vue.component("passport-authorized-clients",p),Vue.component("passport-personal-access-tokens",k),Vue.component("profile-options",v);var b=a(5299),w={};new Vue({i18n:b,el:"#passport_clients",render:function(e){return e(v,{props:w})}})})()})(); \ No newline at end of file diff --git a/public/v2/css/app.css b/public/v2/css/app.css index acfe0da8dc..d2b4b62fd8 100755 --- a/public/v2/css/app.css +++ b/public/v2/css/app.css @@ -1,7 +1,7 @@ /*! - * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com + * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\F26E"}.fa-accessible-icon:before{content:"\F368"}.fa-accusoft:before{content:"\F369"}.fa-acquisitions-incorporated:before{content:"\F6AF"}.fa-ad:before{content:"\F641"}.fa-address-book:before{content:"\F2B9"}.fa-address-card:before{content:"\F2BB"}.fa-adjust:before{content:"\F042"}.fa-adn:before{content:"\F170"}.fa-adversal:before{content:"\F36A"}.fa-affiliatetheme:before{content:"\F36B"}.fa-air-freshener:before{content:"\F5D0"}.fa-airbnb:before{content:"\F834"}.fa-algolia:before{content:"\F36C"}.fa-align-center:before{content:"\F037"}.fa-align-justify:before{content:"\F039"}.fa-align-left:before{content:"\F036"}.fa-align-right:before{content:"\F038"}.fa-alipay:before{content:"\F642"}.fa-allergies:before{content:"\F461"}.fa-amazon:before{content:"\F270"}.fa-amazon-pay:before{content:"\F42C"}.fa-ambulance:before{content:"\F0F9"}.fa-american-sign-language-interpreting:before{content:"\F2A3"}.fa-amilia:before{content:"\F36D"}.fa-anchor:before{content:"\F13D"}.fa-android:before{content:"\F17B"}.fa-angellist:before{content:"\F209"}.fa-angle-double-down:before{content:"\F103"}.fa-angle-double-left:before{content:"\F100"}.fa-angle-double-right:before{content:"\F101"}.fa-angle-double-up:before{content:"\F102"}.fa-angle-down:before{content:"\F107"}.fa-angle-left:before{content:"\F104"}.fa-angle-right:before{content:"\F105"}.fa-angle-up:before{content:"\F106"}.fa-angry:before{content:"\F556"}.fa-angrycreative:before{content:"\F36E"}.fa-angular:before{content:"\F420"}.fa-ankh:before{content:"\F644"}.fa-app-store:before{content:"\F36F"}.fa-app-store-ios:before{content:"\F370"}.fa-apper:before{content:"\F371"}.fa-apple:before{content:"\F179"}.fa-apple-alt:before{content:"\F5D1"}.fa-apple-pay:before{content:"\F415"}.fa-archive:before{content:"\F187"}.fa-archway:before{content:"\F557"}.fa-arrow-alt-circle-down:before{content:"\F358"}.fa-arrow-alt-circle-left:before{content:"\F359"}.fa-arrow-alt-circle-right:before{content:"\F35A"}.fa-arrow-alt-circle-up:before{content:"\F35B"}.fa-arrow-circle-down:before{content:"\F0AB"}.fa-arrow-circle-left:before{content:"\F0A8"}.fa-arrow-circle-right:before{content:"\F0A9"}.fa-arrow-circle-up:before{content:"\F0AA"}.fa-arrow-down:before{content:"\F063"}.fa-arrow-left:before{content:"\F060"}.fa-arrow-right:before{content:"\F061"}.fa-arrow-up:before{content:"\F062"}.fa-arrows-alt:before{content:"\F0B2"}.fa-arrows-alt-h:before{content:"\F337"}.fa-arrows-alt-v:before{content:"\F338"}.fa-artstation:before{content:"\F77A"}.fa-assistive-listening-systems:before{content:"\F2A2"}.fa-asterisk:before{content:"\F069"}.fa-asymmetrik:before{content:"\F372"}.fa-at:before{content:"\F1FA"}.fa-atlas:before{content:"\F558"}.fa-atlassian:before{content:"\F77B"}.fa-atom:before{content:"\F5D2"}.fa-audible:before{content:"\F373"}.fa-audio-description:before{content:"\F29E"}.fa-autoprefixer:before{content:"\F41C"}.fa-avianex:before{content:"\F374"}.fa-aviato:before{content:"\F421"}.fa-award:before{content:"\F559"}.fa-aws:before{content:"\F375"}.fa-baby:before{content:"\F77C"}.fa-baby-carriage:before{content:"\F77D"}.fa-backspace:before{content:"\F55A"}.fa-backward:before{content:"\F04A"}.fa-bacon:before{content:"\F7E5"}.fa-bacteria:before{content:"\E059"}.fa-bacterium:before{content:"\E05A"}.fa-bahai:before{content:"\F666"}.fa-balance-scale:before{content:"\F24E"}.fa-balance-scale-left:before{content:"\F515"}.fa-balance-scale-right:before{content:"\F516"}.fa-ban:before{content:"\F05E"}.fa-band-aid:before{content:"\F462"}.fa-bandcamp:before{content:"\F2D5"}.fa-barcode:before{content:"\F02A"}.fa-bars:before{content:"\F0C9"}.fa-baseball-ball:before{content:"\F433"}.fa-basketball-ball:before{content:"\F434"}.fa-bath:before{content:"\F2CD"}.fa-battery-empty:before{content:"\F244"}.fa-battery-full:before{content:"\F240"}.fa-battery-half:before{content:"\F242"}.fa-battery-quarter:before{content:"\F243"}.fa-battery-three-quarters:before{content:"\F241"}.fa-battle-net:before{content:"\F835"}.fa-bed:before{content:"\F236"}.fa-beer:before{content:"\F0FC"}.fa-behance:before{content:"\F1B4"}.fa-behance-square:before{content:"\F1B5"}.fa-bell:before{content:"\F0F3"}.fa-bell-slash:before{content:"\F1F6"}.fa-bezier-curve:before{content:"\F55B"}.fa-bible:before{content:"\F647"}.fa-bicycle:before{content:"\F206"}.fa-biking:before{content:"\F84A"}.fa-bimobject:before{content:"\F378"}.fa-binoculars:before{content:"\F1E5"}.fa-biohazard:before{content:"\F780"}.fa-birthday-cake:before{content:"\F1FD"}.fa-bitbucket:before{content:"\F171"}.fa-bitcoin:before{content:"\F379"}.fa-bity:before{content:"\F37A"}.fa-black-tie:before{content:"\F27E"}.fa-blackberry:before{content:"\F37B"}.fa-blender:before{content:"\F517"}.fa-blender-phone:before{content:"\F6B6"}.fa-blind:before{content:"\F29D"}.fa-blog:before{content:"\F781"}.fa-blogger:before{content:"\F37C"}.fa-blogger-b:before{content:"\F37D"}.fa-bluetooth:before{content:"\F293"}.fa-bluetooth-b:before{content:"\F294"}.fa-bold:before{content:"\F032"}.fa-bolt:before{content:"\F0E7"}.fa-bomb:before{content:"\F1E2"}.fa-bone:before{content:"\F5D7"}.fa-bong:before{content:"\F55C"}.fa-book:before{content:"\F02D"}.fa-book-dead:before{content:"\F6B7"}.fa-book-medical:before{content:"\F7E6"}.fa-book-open:before{content:"\F518"}.fa-book-reader:before{content:"\F5DA"}.fa-bookmark:before{content:"\F02E"}.fa-bootstrap:before{content:"\F836"}.fa-border-all:before{content:"\F84C"}.fa-border-none:before{content:"\F850"}.fa-border-style:before{content:"\F853"}.fa-bowling-ball:before{content:"\F436"}.fa-box:before{content:"\F466"}.fa-box-open:before{content:"\F49E"}.fa-box-tissue:before{content:"\E05B"}.fa-boxes:before{content:"\F468"}.fa-braille:before{content:"\F2A1"}.fa-brain:before{content:"\F5DC"}.fa-bread-slice:before{content:"\F7EC"}.fa-briefcase:before{content:"\F0B1"}.fa-briefcase-medical:before{content:"\F469"}.fa-broadcast-tower:before{content:"\F519"}.fa-broom:before{content:"\F51A"}.fa-brush:before{content:"\F55D"}.fa-btc:before{content:"\F15A"}.fa-buffer:before{content:"\F837"}.fa-bug:before{content:"\F188"}.fa-building:before{content:"\F1AD"}.fa-bullhorn:before{content:"\F0A1"}.fa-bullseye:before{content:"\F140"}.fa-burn:before{content:"\F46A"}.fa-buromobelexperte:before{content:"\F37F"}.fa-bus:before{content:"\F207"}.fa-bus-alt:before{content:"\F55E"}.fa-business-time:before{content:"\F64A"}.fa-buy-n-large:before{content:"\F8A6"}.fa-buysellads:before{content:"\F20D"}.fa-calculator:before{content:"\F1EC"}.fa-calendar:before{content:"\F133"}.fa-calendar-alt:before{content:"\F073"}.fa-calendar-check:before{content:"\F274"}.fa-calendar-day:before{content:"\F783"}.fa-calendar-minus:before{content:"\F272"}.fa-calendar-plus:before{content:"\F271"}.fa-calendar-times:before{content:"\F273"}.fa-calendar-week:before{content:"\F784"}.fa-camera:before{content:"\F030"}.fa-camera-retro:before{content:"\F083"}.fa-campground:before{content:"\F6BB"}.fa-canadian-maple-leaf:before{content:"\F785"}.fa-candy-cane:before{content:"\F786"}.fa-cannabis:before{content:"\F55F"}.fa-capsules:before{content:"\F46B"}.fa-car:before{content:"\F1B9"}.fa-car-alt:before{content:"\F5DE"}.fa-car-battery:before{content:"\F5DF"}.fa-car-crash:before{content:"\F5E1"}.fa-car-side:before{content:"\F5E4"}.fa-caravan:before{content:"\F8FF"}.fa-caret-down:before{content:"\F0D7"}.fa-caret-left:before{content:"\F0D9"}.fa-caret-right:before{content:"\F0DA"}.fa-caret-square-down:before{content:"\F150"}.fa-caret-square-left:before{content:"\F191"}.fa-caret-square-right:before{content:"\F152"}.fa-caret-square-up:before{content:"\F151"}.fa-caret-up:before{content:"\F0D8"}.fa-carrot:before{content:"\F787"}.fa-cart-arrow-down:before{content:"\F218"}.fa-cart-plus:before{content:"\F217"}.fa-cash-register:before{content:"\F788"}.fa-cat:before{content:"\F6BE"}.fa-cc-amazon-pay:before{content:"\F42D"}.fa-cc-amex:before{content:"\F1F3"}.fa-cc-apple-pay:before{content:"\F416"}.fa-cc-diners-club:before{content:"\F24C"}.fa-cc-discover:before{content:"\F1F2"}.fa-cc-jcb:before{content:"\F24B"}.fa-cc-mastercard:before{content:"\F1F1"}.fa-cc-paypal:before{content:"\F1F4"}.fa-cc-stripe:before{content:"\F1F5"}.fa-cc-visa:before{content:"\F1F0"}.fa-centercode:before{content:"\F380"}.fa-centos:before{content:"\F789"}.fa-certificate:before{content:"\F0A3"}.fa-chair:before{content:"\F6C0"}.fa-chalkboard:before{content:"\F51B"}.fa-chalkboard-teacher:before{content:"\F51C"}.fa-charging-station:before{content:"\F5E7"}.fa-chart-area:before{content:"\F1FE"}.fa-chart-bar:before{content:"\F080"}.fa-chart-line:before{content:"\F201"}.fa-chart-pie:before{content:"\F200"}.fa-check:before{content:"\F00C"}.fa-check-circle:before{content:"\F058"}.fa-check-double:before{content:"\F560"}.fa-check-square:before{content:"\F14A"}.fa-cheese:before{content:"\F7EF"}.fa-chess:before{content:"\F439"}.fa-chess-bishop:before{content:"\F43A"}.fa-chess-board:before{content:"\F43C"}.fa-chess-king:before{content:"\F43F"}.fa-chess-knight:before{content:"\F441"}.fa-chess-pawn:before{content:"\F443"}.fa-chess-queen:before{content:"\F445"}.fa-chess-rook:before{content:"\F447"}.fa-chevron-circle-down:before{content:"\F13A"}.fa-chevron-circle-left:before{content:"\F137"}.fa-chevron-circle-right:before{content:"\F138"}.fa-chevron-circle-up:before{content:"\F139"}.fa-chevron-down:before{content:"\F078"}.fa-chevron-left:before{content:"\F053"}.fa-chevron-right:before{content:"\F054"}.fa-chevron-up:before{content:"\F077"}.fa-child:before{content:"\F1AE"}.fa-chrome:before{content:"\F268"}.fa-chromecast:before{content:"\F838"}.fa-church:before{content:"\F51D"}.fa-circle:before{content:"\F111"}.fa-circle-notch:before{content:"\F1CE"}.fa-city:before{content:"\F64F"}.fa-clinic-medical:before{content:"\F7F2"}.fa-clipboard:before{content:"\F328"}.fa-clipboard-check:before{content:"\F46C"}.fa-clipboard-list:before{content:"\F46D"}.fa-clock:before{content:"\F017"}.fa-clone:before{content:"\F24D"}.fa-closed-captioning:before{content:"\F20A"}.fa-cloud:before{content:"\F0C2"}.fa-cloud-download-alt:before{content:"\F381"}.fa-cloud-meatball:before{content:"\F73B"}.fa-cloud-moon:before{content:"\F6C3"}.fa-cloud-moon-rain:before{content:"\F73C"}.fa-cloud-rain:before{content:"\F73D"}.fa-cloud-showers-heavy:before{content:"\F740"}.fa-cloud-sun:before{content:"\F6C4"}.fa-cloud-sun-rain:before{content:"\F743"}.fa-cloud-upload-alt:before{content:"\F382"}.fa-cloudflare:before{content:"\E07D"}.fa-cloudscale:before{content:"\F383"}.fa-cloudsmith:before{content:"\F384"}.fa-cloudversify:before{content:"\F385"}.fa-cocktail:before{content:"\F561"}.fa-code:before{content:"\F121"}.fa-code-branch:before{content:"\F126"}.fa-codepen:before{content:"\F1CB"}.fa-codiepie:before{content:"\F284"}.fa-coffee:before{content:"\F0F4"}.fa-cog:before{content:"\F013"}.fa-cogs:before{content:"\F085"}.fa-coins:before{content:"\F51E"}.fa-columns:before{content:"\F0DB"}.fa-comment:before{content:"\F075"}.fa-comment-alt:before{content:"\F27A"}.fa-comment-dollar:before{content:"\F651"}.fa-comment-dots:before{content:"\F4AD"}.fa-comment-medical:before{content:"\F7F5"}.fa-comment-slash:before{content:"\F4B3"}.fa-comments:before{content:"\F086"}.fa-comments-dollar:before{content:"\F653"}.fa-compact-disc:before{content:"\F51F"}.fa-compass:before{content:"\F14E"}.fa-compress:before{content:"\F066"}.fa-compress-alt:before{content:"\F422"}.fa-compress-arrows-alt:before{content:"\F78C"}.fa-concierge-bell:before{content:"\F562"}.fa-confluence:before{content:"\F78D"}.fa-connectdevelop:before{content:"\F20E"}.fa-contao:before{content:"\F26D"}.fa-cookie:before{content:"\F563"}.fa-cookie-bite:before{content:"\F564"}.fa-copy:before{content:"\F0C5"}.fa-copyright:before{content:"\F1F9"}.fa-cotton-bureau:before{content:"\F89E"}.fa-couch:before{content:"\F4B8"}.fa-cpanel:before{content:"\F388"}.fa-creative-commons:before{content:"\F25E"}.fa-creative-commons-by:before{content:"\F4E7"}.fa-creative-commons-nc:before{content:"\F4E8"}.fa-creative-commons-nc-eu:before{content:"\F4E9"}.fa-creative-commons-nc-jp:before{content:"\F4EA"}.fa-creative-commons-nd:before{content:"\F4EB"}.fa-creative-commons-pd:before{content:"\F4EC"}.fa-creative-commons-pd-alt:before{content:"\F4ED"}.fa-creative-commons-remix:before{content:"\F4EE"}.fa-creative-commons-sa:before{content:"\F4EF"}.fa-creative-commons-sampling:before{content:"\F4F0"}.fa-creative-commons-sampling-plus:before{content:"\F4F1"}.fa-creative-commons-share:before{content:"\F4F2"}.fa-creative-commons-zero:before{content:"\F4F3"}.fa-credit-card:before{content:"\F09D"}.fa-critical-role:before{content:"\F6C9"}.fa-crop:before{content:"\F125"}.fa-crop-alt:before{content:"\F565"}.fa-cross:before{content:"\F654"}.fa-crosshairs:before{content:"\F05B"}.fa-crow:before{content:"\F520"}.fa-crown:before{content:"\F521"}.fa-crutch:before{content:"\F7F7"}.fa-css3:before{content:"\F13C"}.fa-css3-alt:before{content:"\F38B"}.fa-cube:before{content:"\F1B2"}.fa-cubes:before{content:"\F1B3"}.fa-cut:before{content:"\F0C4"}.fa-cuttlefish:before{content:"\F38C"}.fa-d-and-d:before{content:"\F38D"}.fa-d-and-d-beyond:before{content:"\F6CA"}.fa-dailymotion:before{content:"\E052"}.fa-dashcube:before{content:"\F210"}.fa-database:before{content:"\F1C0"}.fa-deaf:before{content:"\F2A4"}.fa-deezer:before{content:"\E077"}.fa-delicious:before{content:"\F1A5"}.fa-democrat:before{content:"\F747"}.fa-deploydog:before{content:"\F38E"}.fa-deskpro:before{content:"\F38F"}.fa-desktop:before{content:"\F108"}.fa-dev:before{content:"\F6CC"}.fa-deviantart:before{content:"\F1BD"}.fa-dharmachakra:before{content:"\F655"}.fa-dhl:before{content:"\F790"}.fa-diagnoses:before{content:"\F470"}.fa-diaspora:before{content:"\F791"}.fa-dice:before{content:"\F522"}.fa-dice-d20:before{content:"\F6CF"}.fa-dice-d6:before{content:"\F6D1"}.fa-dice-five:before{content:"\F523"}.fa-dice-four:before{content:"\F524"}.fa-dice-one:before{content:"\F525"}.fa-dice-six:before{content:"\F526"}.fa-dice-three:before{content:"\F527"}.fa-dice-two:before{content:"\F528"}.fa-digg:before{content:"\F1A6"}.fa-digital-ocean:before{content:"\F391"}.fa-digital-tachograph:before{content:"\F566"}.fa-directions:before{content:"\F5EB"}.fa-discord:before{content:"\F392"}.fa-discourse:before{content:"\F393"}.fa-disease:before{content:"\F7FA"}.fa-divide:before{content:"\F529"}.fa-dizzy:before{content:"\F567"}.fa-dna:before{content:"\F471"}.fa-dochub:before{content:"\F394"}.fa-docker:before{content:"\F395"}.fa-dog:before{content:"\F6D3"}.fa-dollar-sign:before{content:"\F155"}.fa-dolly:before{content:"\F472"}.fa-dolly-flatbed:before{content:"\F474"}.fa-donate:before{content:"\F4B9"}.fa-door-closed:before{content:"\F52A"}.fa-door-open:before{content:"\F52B"}.fa-dot-circle:before{content:"\F192"}.fa-dove:before{content:"\F4BA"}.fa-download:before{content:"\F019"}.fa-draft2digital:before{content:"\F396"}.fa-drafting-compass:before{content:"\F568"}.fa-dragon:before{content:"\F6D5"}.fa-draw-polygon:before{content:"\F5EE"}.fa-dribbble:before{content:"\F17D"}.fa-dribbble-square:before{content:"\F397"}.fa-dropbox:before{content:"\F16B"}.fa-drum:before{content:"\F569"}.fa-drum-steelpan:before{content:"\F56A"}.fa-drumstick-bite:before{content:"\F6D7"}.fa-drupal:before{content:"\F1A9"}.fa-dumbbell:before{content:"\F44B"}.fa-dumpster:before{content:"\F793"}.fa-dumpster-fire:before{content:"\F794"}.fa-dungeon:before{content:"\F6D9"}.fa-dyalog:before{content:"\F399"}.fa-earlybirds:before{content:"\F39A"}.fa-ebay:before{content:"\F4F4"}.fa-edge:before{content:"\F282"}.fa-edge-legacy:before{content:"\E078"}.fa-edit:before{content:"\F044"}.fa-egg:before{content:"\F7FB"}.fa-eject:before{content:"\F052"}.fa-elementor:before{content:"\F430"}.fa-ellipsis-h:before{content:"\F141"}.fa-ellipsis-v:before{content:"\F142"}.fa-ello:before{content:"\F5F1"}.fa-ember:before{content:"\F423"}.fa-empire:before{content:"\F1D1"}.fa-envelope:before{content:"\F0E0"}.fa-envelope-open:before{content:"\F2B6"}.fa-envelope-open-text:before{content:"\F658"}.fa-envelope-square:before{content:"\F199"}.fa-envira:before{content:"\F299"}.fa-equals:before{content:"\F52C"}.fa-eraser:before{content:"\F12D"}.fa-erlang:before{content:"\F39D"}.fa-ethereum:before{content:"\F42E"}.fa-ethernet:before{content:"\F796"}.fa-etsy:before{content:"\F2D7"}.fa-euro-sign:before{content:"\F153"}.fa-evernote:before{content:"\F839"}.fa-exchange-alt:before{content:"\F362"}.fa-exclamation:before{content:"\F12A"}.fa-exclamation-circle:before{content:"\F06A"}.fa-exclamation-triangle:before{content:"\F071"}.fa-expand:before{content:"\F065"}.fa-expand-alt:before{content:"\F424"}.fa-expand-arrows-alt:before{content:"\F31E"}.fa-expeditedssl:before{content:"\F23E"}.fa-external-link-alt:before{content:"\F35D"}.fa-external-link-square-alt:before{content:"\F360"}.fa-eye:before{content:"\F06E"}.fa-eye-dropper:before{content:"\F1FB"}.fa-eye-slash:before{content:"\F070"}.fa-facebook:before{content:"\F09A"}.fa-facebook-f:before{content:"\F39E"}.fa-facebook-messenger:before{content:"\F39F"}.fa-facebook-square:before{content:"\F082"}.fa-fan:before{content:"\F863"}.fa-fantasy-flight-games:before{content:"\F6DC"}.fa-fast-backward:before{content:"\F049"}.fa-fast-forward:before{content:"\F050"}.fa-faucet:before{content:"\E005"}.fa-fax:before{content:"\F1AC"}.fa-feather:before{content:"\F52D"}.fa-feather-alt:before{content:"\F56B"}.fa-fedex:before{content:"\F797"}.fa-fedora:before{content:"\F798"}.fa-female:before{content:"\F182"}.fa-fighter-jet:before{content:"\F0FB"}.fa-figma:before{content:"\F799"}.fa-file:before{content:"\F15B"}.fa-file-alt:before{content:"\F15C"}.fa-file-archive:before{content:"\F1C6"}.fa-file-audio:before{content:"\F1C7"}.fa-file-code:before{content:"\F1C9"}.fa-file-contract:before{content:"\F56C"}.fa-file-csv:before{content:"\F6DD"}.fa-file-download:before{content:"\F56D"}.fa-file-excel:before{content:"\F1C3"}.fa-file-export:before{content:"\F56E"}.fa-file-image:before{content:"\F1C5"}.fa-file-import:before{content:"\F56F"}.fa-file-invoice:before{content:"\F570"}.fa-file-invoice-dollar:before{content:"\F571"}.fa-file-medical:before{content:"\F477"}.fa-file-medical-alt:before{content:"\F478"}.fa-file-pdf:before{content:"\F1C1"}.fa-file-powerpoint:before{content:"\F1C4"}.fa-file-prescription:before{content:"\F572"}.fa-file-signature:before{content:"\F573"}.fa-file-upload:before{content:"\F574"}.fa-file-video:before{content:"\F1C8"}.fa-file-word:before{content:"\F1C2"}.fa-fill:before{content:"\F575"}.fa-fill-drip:before{content:"\F576"}.fa-film:before{content:"\F008"}.fa-filter:before{content:"\F0B0"}.fa-fingerprint:before{content:"\F577"}.fa-fire:before{content:"\F06D"}.fa-fire-alt:before{content:"\F7E4"}.fa-fire-extinguisher:before{content:"\F134"}.fa-firefox:before{content:"\F269"}.fa-firefox-browser:before{content:"\E007"}.fa-first-aid:before{content:"\F479"}.fa-first-order:before{content:"\F2B0"}.fa-first-order-alt:before{content:"\F50A"}.fa-firstdraft:before{content:"\F3A1"}.fa-fish:before{content:"\F578"}.fa-fist-raised:before{content:"\F6DE"}.fa-flag:before{content:"\F024"}.fa-flag-checkered:before{content:"\F11E"}.fa-flag-usa:before{content:"\F74D"}.fa-flask:before{content:"\F0C3"}.fa-flickr:before{content:"\F16E"}.fa-flipboard:before{content:"\F44D"}.fa-flushed:before{content:"\F579"}.fa-fly:before{content:"\F417"}.fa-folder:before{content:"\F07B"}.fa-folder-minus:before{content:"\F65D"}.fa-folder-open:before{content:"\F07C"}.fa-folder-plus:before{content:"\F65E"}.fa-font:before{content:"\F031"}.fa-font-awesome:before{content:"\F2B4"}.fa-font-awesome-alt:before{content:"\F35C"}.fa-font-awesome-flag:before{content:"\F425"}.fa-font-awesome-logo-full:before{content:"\F4E6"}.fa-fonticons:before{content:"\F280"}.fa-fonticons-fi:before{content:"\F3A2"}.fa-football-ball:before{content:"\F44E"}.fa-fort-awesome:before{content:"\F286"}.fa-fort-awesome-alt:before{content:"\F3A3"}.fa-forumbee:before{content:"\F211"}.fa-forward:before{content:"\F04E"}.fa-foursquare:before{content:"\F180"}.fa-free-code-camp:before{content:"\F2C5"}.fa-freebsd:before{content:"\F3A4"}.fa-frog:before{content:"\F52E"}.fa-frown:before{content:"\F119"}.fa-frown-open:before{content:"\F57A"}.fa-fulcrum:before{content:"\F50B"}.fa-funnel-dollar:before{content:"\F662"}.fa-futbol:before{content:"\F1E3"}.fa-galactic-republic:before{content:"\F50C"}.fa-galactic-senate:before{content:"\F50D"}.fa-gamepad:before{content:"\F11B"}.fa-gas-pump:before{content:"\F52F"}.fa-gavel:before{content:"\F0E3"}.fa-gem:before{content:"\F3A5"}.fa-genderless:before{content:"\F22D"}.fa-get-pocket:before{content:"\F265"}.fa-gg:before{content:"\F260"}.fa-gg-circle:before{content:"\F261"}.fa-ghost:before{content:"\F6E2"}.fa-gift:before{content:"\F06B"}.fa-gifts:before{content:"\F79C"}.fa-git:before{content:"\F1D3"}.fa-git-alt:before{content:"\F841"}.fa-git-square:before{content:"\F1D2"}.fa-github:before{content:"\F09B"}.fa-github-alt:before{content:"\F113"}.fa-github-square:before{content:"\F092"}.fa-gitkraken:before{content:"\F3A6"}.fa-gitlab:before{content:"\F296"}.fa-gitter:before{content:"\F426"}.fa-glass-cheers:before{content:"\F79F"}.fa-glass-martini:before{content:"\F000"}.fa-glass-martini-alt:before{content:"\F57B"}.fa-glass-whiskey:before{content:"\F7A0"}.fa-glasses:before{content:"\F530"}.fa-glide:before{content:"\F2A5"}.fa-glide-g:before{content:"\F2A6"}.fa-globe:before{content:"\F0AC"}.fa-globe-africa:before{content:"\F57C"}.fa-globe-americas:before{content:"\F57D"}.fa-globe-asia:before{content:"\F57E"}.fa-globe-europe:before{content:"\F7A2"}.fa-gofore:before{content:"\F3A7"}.fa-golf-ball:before{content:"\F450"}.fa-goodreads:before{content:"\F3A8"}.fa-goodreads-g:before{content:"\F3A9"}.fa-google:before{content:"\F1A0"}.fa-google-drive:before{content:"\F3AA"}.fa-google-pay:before{content:"\E079"}.fa-google-play:before{content:"\F3AB"}.fa-google-plus:before{content:"\F2B3"}.fa-google-plus-g:before{content:"\F0D5"}.fa-google-plus-square:before{content:"\F0D4"}.fa-google-wallet:before{content:"\F1EE"}.fa-gopuram:before{content:"\F664"}.fa-graduation-cap:before{content:"\F19D"}.fa-gratipay:before{content:"\F184"}.fa-grav:before{content:"\F2D6"}.fa-greater-than:before{content:"\F531"}.fa-greater-than-equal:before{content:"\F532"}.fa-grimace:before{content:"\F57F"}.fa-grin:before{content:"\F580"}.fa-grin-alt:before{content:"\F581"}.fa-grin-beam:before{content:"\F582"}.fa-grin-beam-sweat:before{content:"\F583"}.fa-grin-hearts:before{content:"\F584"}.fa-grin-squint:before{content:"\F585"}.fa-grin-squint-tears:before{content:"\F586"}.fa-grin-stars:before{content:"\F587"}.fa-grin-tears:before{content:"\F588"}.fa-grin-tongue:before{content:"\F589"}.fa-grin-tongue-squint:before{content:"\F58A"}.fa-grin-tongue-wink:before{content:"\F58B"}.fa-grin-wink:before{content:"\F58C"}.fa-grip-horizontal:before{content:"\F58D"}.fa-grip-lines:before{content:"\F7A4"}.fa-grip-lines-vertical:before{content:"\F7A5"}.fa-grip-vertical:before{content:"\F58E"}.fa-gripfire:before{content:"\F3AC"}.fa-grunt:before{content:"\F3AD"}.fa-guilded:before{content:"\E07E"}.fa-guitar:before{content:"\F7A6"}.fa-gulp:before{content:"\F3AE"}.fa-h-square:before{content:"\F0FD"}.fa-hacker-news:before{content:"\F1D4"}.fa-hacker-news-square:before{content:"\F3AF"}.fa-hackerrank:before{content:"\F5F7"}.fa-hamburger:before{content:"\F805"}.fa-hammer:before{content:"\F6E3"}.fa-hamsa:before{content:"\F665"}.fa-hand-holding:before{content:"\F4BD"}.fa-hand-holding-heart:before{content:"\F4BE"}.fa-hand-holding-medical:before{content:"\E05C"}.fa-hand-holding-usd:before{content:"\F4C0"}.fa-hand-holding-water:before{content:"\F4C1"}.fa-hand-lizard:before{content:"\F258"}.fa-hand-middle-finger:before{content:"\F806"}.fa-hand-paper:before{content:"\F256"}.fa-hand-peace:before{content:"\F25B"}.fa-hand-point-down:before{content:"\F0A7"}.fa-hand-point-left:before{content:"\F0A5"}.fa-hand-point-right:before{content:"\F0A4"}.fa-hand-point-up:before{content:"\F0A6"}.fa-hand-pointer:before{content:"\F25A"}.fa-hand-rock:before{content:"\F255"}.fa-hand-scissors:before{content:"\F257"}.fa-hand-sparkles:before{content:"\E05D"}.fa-hand-spock:before{content:"\F259"}.fa-hands:before{content:"\F4C2"}.fa-hands-helping:before{content:"\F4C4"}.fa-hands-wash:before{content:"\E05E"}.fa-handshake:before{content:"\F2B5"}.fa-handshake-alt-slash:before{content:"\E05F"}.fa-handshake-slash:before{content:"\E060"}.fa-hanukiah:before{content:"\F6E6"}.fa-hard-hat:before{content:"\F807"}.fa-hashtag:before{content:"\F292"}.fa-hat-cowboy:before{content:"\F8C0"}.fa-hat-cowboy-side:before{content:"\F8C1"}.fa-hat-wizard:before{content:"\F6E8"}.fa-hdd:before{content:"\F0A0"}.fa-head-side-cough:before{content:"\E061"}.fa-head-side-cough-slash:before{content:"\E062"}.fa-head-side-mask:before{content:"\E063"}.fa-head-side-virus:before{content:"\E064"}.fa-heading:before{content:"\F1DC"}.fa-headphones:before{content:"\F025"}.fa-headphones-alt:before{content:"\F58F"}.fa-headset:before{content:"\F590"}.fa-heart:before{content:"\F004"}.fa-heart-broken:before{content:"\F7A9"}.fa-heartbeat:before{content:"\F21E"}.fa-helicopter:before{content:"\F533"}.fa-highlighter:before{content:"\F591"}.fa-hiking:before{content:"\F6EC"}.fa-hippo:before{content:"\F6ED"}.fa-hips:before{content:"\F452"}.fa-hire-a-helper:before{content:"\F3B0"}.fa-history:before{content:"\F1DA"}.fa-hive:before{content:"\E07F"}.fa-hockey-puck:before{content:"\F453"}.fa-holly-berry:before{content:"\F7AA"}.fa-home:before{content:"\F015"}.fa-hooli:before{content:"\F427"}.fa-hornbill:before{content:"\F592"}.fa-horse:before{content:"\F6F0"}.fa-horse-head:before{content:"\F7AB"}.fa-hospital:before{content:"\F0F8"}.fa-hospital-alt:before{content:"\F47D"}.fa-hospital-symbol:before{content:"\F47E"}.fa-hospital-user:before{content:"\F80D"}.fa-hot-tub:before{content:"\F593"}.fa-hotdog:before{content:"\F80F"}.fa-hotel:before{content:"\F594"}.fa-hotjar:before{content:"\F3B1"}.fa-hourglass:before{content:"\F254"}.fa-hourglass-end:before{content:"\F253"}.fa-hourglass-half:before{content:"\F252"}.fa-hourglass-start:before{content:"\F251"}.fa-house-damage:before{content:"\F6F1"}.fa-house-user:before{content:"\E065"}.fa-houzz:before{content:"\F27C"}.fa-hryvnia:before{content:"\F6F2"}.fa-html5:before{content:"\F13B"}.fa-hubspot:before{content:"\F3B2"}.fa-i-cursor:before{content:"\F246"}.fa-ice-cream:before{content:"\F810"}.fa-icicles:before{content:"\F7AD"}.fa-icons:before{content:"\F86D"}.fa-id-badge:before{content:"\F2C1"}.fa-id-card:before{content:"\F2C2"}.fa-id-card-alt:before{content:"\F47F"}.fa-ideal:before{content:"\E013"}.fa-igloo:before{content:"\F7AE"}.fa-image:before{content:"\F03E"}.fa-images:before{content:"\F302"}.fa-imdb:before{content:"\F2D8"}.fa-inbox:before{content:"\F01C"}.fa-indent:before{content:"\F03C"}.fa-industry:before{content:"\F275"}.fa-infinity:before{content:"\F534"}.fa-info:before{content:"\F129"}.fa-info-circle:before{content:"\F05A"}.fa-innosoft:before{content:"\E080"}.fa-instagram:before{content:"\F16D"}.fa-instagram-square:before{content:"\E055"}.fa-instalod:before{content:"\E081"}.fa-intercom:before{content:"\F7AF"}.fa-internet-explorer:before{content:"\F26B"}.fa-invision:before{content:"\F7B0"}.fa-ioxhost:before{content:"\F208"}.fa-italic:before{content:"\F033"}.fa-itch-io:before{content:"\F83A"}.fa-itunes:before{content:"\F3B4"}.fa-itunes-note:before{content:"\F3B5"}.fa-java:before{content:"\F4E4"}.fa-jedi:before{content:"\F669"}.fa-jedi-order:before{content:"\F50E"}.fa-jenkins:before{content:"\F3B6"}.fa-jira:before{content:"\F7B1"}.fa-joget:before{content:"\F3B7"}.fa-joint:before{content:"\F595"}.fa-joomla:before{content:"\F1AA"}.fa-journal-whills:before{content:"\F66A"}.fa-js:before{content:"\F3B8"}.fa-js-square:before{content:"\F3B9"}.fa-jsfiddle:before{content:"\F1CC"}.fa-kaaba:before{content:"\F66B"}.fa-kaggle:before{content:"\F5FA"}.fa-key:before{content:"\F084"}.fa-keybase:before{content:"\F4F5"}.fa-keyboard:before{content:"\F11C"}.fa-keycdn:before{content:"\F3BA"}.fa-khanda:before{content:"\F66D"}.fa-kickstarter:before{content:"\F3BB"}.fa-kickstarter-k:before{content:"\F3BC"}.fa-kiss:before{content:"\F596"}.fa-kiss-beam:before{content:"\F597"}.fa-kiss-wink-heart:before{content:"\F598"}.fa-kiwi-bird:before{content:"\F535"}.fa-korvue:before{content:"\F42F"}.fa-landmark:before{content:"\F66F"}.fa-language:before{content:"\F1AB"}.fa-laptop:before{content:"\F109"}.fa-laptop-code:before{content:"\F5FC"}.fa-laptop-house:before{content:"\E066"}.fa-laptop-medical:before{content:"\F812"}.fa-laravel:before{content:"\F3BD"}.fa-lastfm:before{content:"\F202"}.fa-lastfm-square:before{content:"\F203"}.fa-laugh:before{content:"\F599"}.fa-laugh-beam:before{content:"\F59A"}.fa-laugh-squint:before{content:"\F59B"}.fa-laugh-wink:before{content:"\F59C"}.fa-layer-group:before{content:"\F5FD"}.fa-leaf:before{content:"\F06C"}.fa-leanpub:before{content:"\F212"}.fa-lemon:before{content:"\F094"}.fa-less:before{content:"\F41D"}.fa-less-than:before{content:"\F536"}.fa-less-than-equal:before{content:"\F537"}.fa-level-down-alt:before{content:"\F3BE"}.fa-level-up-alt:before{content:"\F3BF"}.fa-life-ring:before{content:"\F1CD"}.fa-lightbulb:before{content:"\F0EB"}.fa-line:before{content:"\F3C0"}.fa-link:before{content:"\F0C1"}.fa-linkedin:before{content:"\F08C"}.fa-linkedin-in:before{content:"\F0E1"}.fa-linode:before{content:"\F2B8"}.fa-linux:before{content:"\F17C"}.fa-lira-sign:before{content:"\F195"}.fa-list:before{content:"\F03A"}.fa-list-alt:before{content:"\F022"}.fa-list-ol:before{content:"\F0CB"}.fa-list-ul:before{content:"\F0CA"}.fa-location-arrow:before{content:"\F124"}.fa-lock:before{content:"\F023"}.fa-lock-open:before{content:"\F3C1"}.fa-long-arrow-alt-down:before{content:"\F309"}.fa-long-arrow-alt-left:before{content:"\F30A"}.fa-long-arrow-alt-right:before{content:"\F30B"}.fa-long-arrow-alt-up:before{content:"\F30C"}.fa-low-vision:before{content:"\F2A8"}.fa-luggage-cart:before{content:"\F59D"}.fa-lungs:before{content:"\F604"}.fa-lungs-virus:before{content:"\E067"}.fa-lyft:before{content:"\F3C3"}.fa-magento:before{content:"\F3C4"}.fa-magic:before{content:"\F0D0"}.fa-magnet:before{content:"\F076"}.fa-mail-bulk:before{content:"\F674"}.fa-mailchimp:before{content:"\F59E"}.fa-male:before{content:"\F183"}.fa-mandalorian:before{content:"\F50F"}.fa-map:before{content:"\F279"}.fa-map-marked:before{content:"\F59F"}.fa-map-marked-alt:before{content:"\F5A0"}.fa-map-marker:before{content:"\F041"}.fa-map-marker-alt:before{content:"\F3C5"}.fa-map-pin:before{content:"\F276"}.fa-map-signs:before{content:"\F277"}.fa-markdown:before{content:"\F60F"}.fa-marker:before{content:"\F5A1"}.fa-mars:before{content:"\F222"}.fa-mars-double:before{content:"\F227"}.fa-mars-stroke:before{content:"\F229"}.fa-mars-stroke-h:before{content:"\F22B"}.fa-mars-stroke-v:before{content:"\F22A"}.fa-mask:before{content:"\F6FA"}.fa-mastodon:before{content:"\F4F6"}.fa-maxcdn:before{content:"\F136"}.fa-mdb:before{content:"\F8CA"}.fa-medal:before{content:"\F5A2"}.fa-medapps:before{content:"\F3C6"}.fa-medium:before{content:"\F23A"}.fa-medium-m:before{content:"\F3C7"}.fa-medkit:before{content:"\F0FA"}.fa-medrt:before{content:"\F3C8"}.fa-meetup:before{content:"\F2E0"}.fa-megaport:before{content:"\F5A3"}.fa-meh:before{content:"\F11A"}.fa-meh-blank:before{content:"\F5A4"}.fa-meh-rolling-eyes:before{content:"\F5A5"}.fa-memory:before{content:"\F538"}.fa-mendeley:before{content:"\F7B3"}.fa-menorah:before{content:"\F676"}.fa-mercury:before{content:"\F223"}.fa-meteor:before{content:"\F753"}.fa-microblog:before{content:"\E01A"}.fa-microchip:before{content:"\F2DB"}.fa-microphone:before{content:"\F130"}.fa-microphone-alt:before{content:"\F3C9"}.fa-microphone-alt-slash:before{content:"\F539"}.fa-microphone-slash:before{content:"\F131"}.fa-microscope:before{content:"\F610"}.fa-microsoft:before{content:"\F3CA"}.fa-minus:before{content:"\F068"}.fa-minus-circle:before{content:"\F056"}.fa-minus-square:before{content:"\F146"}.fa-mitten:before{content:"\F7B5"}.fa-mix:before{content:"\F3CB"}.fa-mixcloud:before{content:"\F289"}.fa-mixer:before{content:"\E056"}.fa-mizuni:before{content:"\F3CC"}.fa-mobile:before{content:"\F10B"}.fa-mobile-alt:before{content:"\F3CD"}.fa-modx:before{content:"\F285"}.fa-monero:before{content:"\F3D0"}.fa-money-bill:before{content:"\F0D6"}.fa-money-bill-alt:before{content:"\F3D1"}.fa-money-bill-wave:before{content:"\F53A"}.fa-money-bill-wave-alt:before{content:"\F53B"}.fa-money-check:before{content:"\F53C"}.fa-money-check-alt:before{content:"\F53D"}.fa-monument:before{content:"\F5A6"}.fa-moon:before{content:"\F186"}.fa-mortar-pestle:before{content:"\F5A7"}.fa-mosque:before{content:"\F678"}.fa-motorcycle:before{content:"\F21C"}.fa-mountain:before{content:"\F6FC"}.fa-mouse:before{content:"\F8CC"}.fa-mouse-pointer:before{content:"\F245"}.fa-mug-hot:before{content:"\F7B6"}.fa-music:before{content:"\F001"}.fa-napster:before{content:"\F3D2"}.fa-neos:before{content:"\F612"}.fa-network-wired:before{content:"\F6FF"}.fa-neuter:before{content:"\F22C"}.fa-newspaper:before{content:"\F1EA"}.fa-nimblr:before{content:"\F5A8"}.fa-node:before{content:"\F419"}.fa-node-js:before{content:"\F3D3"}.fa-not-equal:before{content:"\F53E"}.fa-notes-medical:before{content:"\F481"}.fa-npm:before{content:"\F3D4"}.fa-ns8:before{content:"\F3D5"}.fa-nutritionix:before{content:"\F3D6"}.fa-object-group:before{content:"\F247"}.fa-object-ungroup:before{content:"\F248"}.fa-octopus-deploy:before{content:"\E082"}.fa-odnoklassniki:before{content:"\F263"}.fa-odnoklassniki-square:before{content:"\F264"}.fa-oil-can:before{content:"\F613"}.fa-old-republic:before{content:"\F510"}.fa-om:before{content:"\F679"}.fa-opencart:before{content:"\F23D"}.fa-openid:before{content:"\F19B"}.fa-opera:before{content:"\F26A"}.fa-optin-monster:before{content:"\F23C"}.fa-orcid:before{content:"\F8D2"}.fa-osi:before{content:"\F41A"}.fa-otter:before{content:"\F700"}.fa-outdent:before{content:"\F03B"}.fa-page4:before{content:"\F3D7"}.fa-pagelines:before{content:"\F18C"}.fa-pager:before{content:"\F815"}.fa-paint-brush:before{content:"\F1FC"}.fa-paint-roller:before{content:"\F5AA"}.fa-palette:before{content:"\F53F"}.fa-palfed:before{content:"\F3D8"}.fa-pallet:before{content:"\F482"}.fa-paper-plane:before{content:"\F1D8"}.fa-paperclip:before{content:"\F0C6"}.fa-parachute-box:before{content:"\F4CD"}.fa-paragraph:before{content:"\F1DD"}.fa-parking:before{content:"\F540"}.fa-passport:before{content:"\F5AB"}.fa-pastafarianism:before{content:"\F67B"}.fa-paste:before{content:"\F0EA"}.fa-patreon:before{content:"\F3D9"}.fa-pause:before{content:"\F04C"}.fa-pause-circle:before{content:"\F28B"}.fa-paw:before{content:"\F1B0"}.fa-paypal:before{content:"\F1ED"}.fa-peace:before{content:"\F67C"}.fa-pen:before{content:"\F304"}.fa-pen-alt:before{content:"\F305"}.fa-pen-fancy:before{content:"\F5AC"}.fa-pen-nib:before{content:"\F5AD"}.fa-pen-square:before{content:"\F14B"}.fa-pencil-alt:before{content:"\F303"}.fa-pencil-ruler:before{content:"\F5AE"}.fa-penny-arcade:before{content:"\F704"}.fa-people-arrows:before{content:"\E068"}.fa-people-carry:before{content:"\F4CE"}.fa-pepper-hot:before{content:"\F816"}.fa-perbyte:before{content:"\E083"}.fa-percent:before{content:"\F295"}.fa-percentage:before{content:"\F541"}.fa-periscope:before{content:"\F3DA"}.fa-person-booth:before{content:"\F756"}.fa-phabricator:before{content:"\F3DB"}.fa-phoenix-framework:before{content:"\F3DC"}.fa-phoenix-squadron:before{content:"\F511"}.fa-phone:before{content:"\F095"}.fa-phone-alt:before{content:"\F879"}.fa-phone-slash:before{content:"\F3DD"}.fa-phone-square:before{content:"\F098"}.fa-phone-square-alt:before{content:"\F87B"}.fa-phone-volume:before{content:"\F2A0"}.fa-photo-video:before{content:"\F87C"}.fa-php:before{content:"\F457"}.fa-pied-piper:before{content:"\F2AE"}.fa-pied-piper-alt:before{content:"\F1A8"}.fa-pied-piper-hat:before{content:"\F4E5"}.fa-pied-piper-pp:before{content:"\F1A7"}.fa-pied-piper-square:before{content:"\E01E"}.fa-piggy-bank:before{content:"\F4D3"}.fa-pills:before{content:"\F484"}.fa-pinterest:before{content:"\F0D2"}.fa-pinterest-p:before{content:"\F231"}.fa-pinterest-square:before{content:"\F0D3"}.fa-pizza-slice:before{content:"\F818"}.fa-place-of-worship:before{content:"\F67F"}.fa-plane:before{content:"\F072"}.fa-plane-arrival:before{content:"\F5AF"}.fa-plane-departure:before{content:"\F5B0"}.fa-plane-slash:before{content:"\E069"}.fa-play:before{content:"\F04B"}.fa-play-circle:before{content:"\F144"}.fa-playstation:before{content:"\F3DF"}.fa-plug:before{content:"\F1E6"}.fa-plus:before{content:"\F067"}.fa-plus-circle:before{content:"\F055"}.fa-plus-square:before{content:"\F0FE"}.fa-podcast:before{content:"\F2CE"}.fa-poll:before{content:"\F681"}.fa-poll-h:before{content:"\F682"}.fa-poo:before{content:"\F2FE"}.fa-poo-storm:before{content:"\F75A"}.fa-poop:before{content:"\F619"}.fa-portrait:before{content:"\F3E0"}.fa-pound-sign:before{content:"\F154"}.fa-power-off:before{content:"\F011"}.fa-pray:before{content:"\F683"}.fa-praying-hands:before{content:"\F684"}.fa-prescription:before{content:"\F5B1"}.fa-prescription-bottle:before{content:"\F485"}.fa-prescription-bottle-alt:before{content:"\F486"}.fa-print:before{content:"\F02F"}.fa-procedures:before{content:"\F487"}.fa-product-hunt:before{content:"\F288"}.fa-project-diagram:before{content:"\F542"}.fa-pump-medical:before{content:"\E06A"}.fa-pump-soap:before{content:"\E06B"}.fa-pushed:before{content:"\F3E1"}.fa-puzzle-piece:before{content:"\F12E"}.fa-python:before{content:"\F3E2"}.fa-qq:before{content:"\F1D6"}.fa-qrcode:before{content:"\F029"}.fa-question:before{content:"\F128"}.fa-question-circle:before{content:"\F059"}.fa-quidditch:before{content:"\F458"}.fa-quinscape:before{content:"\F459"}.fa-quora:before{content:"\F2C4"}.fa-quote-left:before{content:"\F10D"}.fa-quote-right:before{content:"\F10E"}.fa-quran:before{content:"\F687"}.fa-r-project:before{content:"\F4F7"}.fa-radiation:before{content:"\F7B9"}.fa-radiation-alt:before{content:"\F7BA"}.fa-rainbow:before{content:"\F75B"}.fa-random:before{content:"\F074"}.fa-raspberry-pi:before{content:"\F7BB"}.fa-ravelry:before{content:"\F2D9"}.fa-react:before{content:"\F41B"}.fa-reacteurope:before{content:"\F75D"}.fa-readme:before{content:"\F4D5"}.fa-rebel:before{content:"\F1D0"}.fa-receipt:before{content:"\F543"}.fa-record-vinyl:before{content:"\F8D9"}.fa-recycle:before{content:"\F1B8"}.fa-red-river:before{content:"\F3E3"}.fa-reddit:before{content:"\F1A1"}.fa-reddit-alien:before{content:"\F281"}.fa-reddit-square:before{content:"\F1A2"}.fa-redhat:before{content:"\F7BC"}.fa-redo:before{content:"\F01E"}.fa-redo-alt:before{content:"\F2F9"}.fa-registered:before{content:"\F25D"}.fa-remove-format:before{content:"\F87D"}.fa-renren:before{content:"\F18B"}.fa-reply:before{content:"\F3E5"}.fa-reply-all:before{content:"\F122"}.fa-replyd:before{content:"\F3E6"}.fa-republican:before{content:"\F75E"}.fa-researchgate:before{content:"\F4F8"}.fa-resolving:before{content:"\F3E7"}.fa-restroom:before{content:"\F7BD"}.fa-retweet:before{content:"\F079"}.fa-rev:before{content:"\F5B2"}.fa-ribbon:before{content:"\F4D6"}.fa-ring:before{content:"\F70B"}.fa-road:before{content:"\F018"}.fa-robot:before{content:"\F544"}.fa-rocket:before{content:"\F135"}.fa-rocketchat:before{content:"\F3E8"}.fa-rockrms:before{content:"\F3E9"}.fa-route:before{content:"\F4D7"}.fa-rss:before{content:"\F09E"}.fa-rss-square:before{content:"\F143"}.fa-ruble-sign:before{content:"\F158"}.fa-ruler:before{content:"\F545"}.fa-ruler-combined:before{content:"\F546"}.fa-ruler-horizontal:before{content:"\F547"}.fa-ruler-vertical:before{content:"\F548"}.fa-running:before{content:"\F70C"}.fa-rupee-sign:before{content:"\F156"}.fa-rust:before{content:"\E07A"}.fa-sad-cry:before{content:"\F5B3"}.fa-sad-tear:before{content:"\F5B4"}.fa-safari:before{content:"\F267"}.fa-salesforce:before{content:"\F83B"}.fa-sass:before{content:"\F41E"}.fa-satellite:before{content:"\F7BF"}.fa-satellite-dish:before{content:"\F7C0"}.fa-save:before{content:"\F0C7"}.fa-schlix:before{content:"\F3EA"}.fa-school:before{content:"\F549"}.fa-screwdriver:before{content:"\F54A"}.fa-scribd:before{content:"\F28A"}.fa-scroll:before{content:"\F70E"}.fa-sd-card:before{content:"\F7C2"}.fa-search:before{content:"\F002"}.fa-search-dollar:before{content:"\F688"}.fa-search-location:before{content:"\F689"}.fa-search-minus:before{content:"\F010"}.fa-search-plus:before{content:"\F00E"}.fa-searchengin:before{content:"\F3EB"}.fa-seedling:before{content:"\F4D8"}.fa-sellcast:before{content:"\F2DA"}.fa-sellsy:before{content:"\F213"}.fa-server:before{content:"\F233"}.fa-servicestack:before{content:"\F3EC"}.fa-shapes:before{content:"\F61F"}.fa-share:before{content:"\F064"}.fa-share-alt:before{content:"\F1E0"}.fa-share-alt-square:before{content:"\F1E1"}.fa-share-square:before{content:"\F14D"}.fa-shekel-sign:before{content:"\F20B"}.fa-shield-alt:before{content:"\F3ED"}.fa-shield-virus:before{content:"\E06C"}.fa-ship:before{content:"\F21A"}.fa-shipping-fast:before{content:"\F48B"}.fa-shirtsinbulk:before{content:"\F214"}.fa-shoe-prints:before{content:"\F54B"}.fa-shopify:before{content:"\E057"}.fa-shopping-bag:before{content:"\F290"}.fa-shopping-basket:before{content:"\F291"}.fa-shopping-cart:before{content:"\F07A"}.fa-shopware:before{content:"\F5B5"}.fa-shower:before{content:"\F2CC"}.fa-shuttle-van:before{content:"\F5B6"}.fa-sign:before{content:"\F4D9"}.fa-sign-in-alt:before{content:"\F2F6"}.fa-sign-language:before{content:"\F2A7"}.fa-sign-out-alt:before{content:"\F2F5"}.fa-signal:before{content:"\F012"}.fa-signature:before{content:"\F5B7"}.fa-sim-card:before{content:"\F7C4"}.fa-simplybuilt:before{content:"\F215"}.fa-sink:before{content:"\E06D"}.fa-sistrix:before{content:"\F3EE"}.fa-sitemap:before{content:"\F0E8"}.fa-sith:before{content:"\F512"}.fa-skating:before{content:"\F7C5"}.fa-sketch:before{content:"\F7C6"}.fa-skiing:before{content:"\F7C9"}.fa-skiing-nordic:before{content:"\F7CA"}.fa-skull:before{content:"\F54C"}.fa-skull-crossbones:before{content:"\F714"}.fa-skyatlas:before{content:"\F216"}.fa-skype:before{content:"\F17E"}.fa-slack:before{content:"\F198"}.fa-slack-hash:before{content:"\F3EF"}.fa-slash:before{content:"\F715"}.fa-sleigh:before{content:"\F7CC"}.fa-sliders-h:before{content:"\F1DE"}.fa-slideshare:before{content:"\F1E7"}.fa-smile:before{content:"\F118"}.fa-smile-beam:before{content:"\F5B8"}.fa-smile-wink:before{content:"\F4DA"}.fa-smog:before{content:"\F75F"}.fa-smoking:before{content:"\F48D"}.fa-smoking-ban:before{content:"\F54D"}.fa-sms:before{content:"\F7CD"}.fa-snapchat:before{content:"\F2AB"}.fa-snapchat-ghost:before{content:"\F2AC"}.fa-snapchat-square:before{content:"\F2AD"}.fa-snowboarding:before{content:"\F7CE"}.fa-snowflake:before{content:"\F2DC"}.fa-snowman:before{content:"\F7D0"}.fa-snowplow:before{content:"\F7D2"}.fa-soap:before{content:"\E06E"}.fa-socks:before{content:"\F696"}.fa-solar-panel:before{content:"\F5BA"}.fa-sort:before{content:"\F0DC"}.fa-sort-alpha-down:before{content:"\F15D"}.fa-sort-alpha-down-alt:before{content:"\F881"}.fa-sort-alpha-up:before{content:"\F15E"}.fa-sort-alpha-up-alt:before{content:"\F882"}.fa-sort-amount-down:before{content:"\F160"}.fa-sort-amount-down-alt:before{content:"\F884"}.fa-sort-amount-up:before{content:"\F161"}.fa-sort-amount-up-alt:before{content:"\F885"}.fa-sort-down:before{content:"\F0DD"}.fa-sort-numeric-down:before{content:"\F162"}.fa-sort-numeric-down-alt:before{content:"\F886"}.fa-sort-numeric-up:before{content:"\F163"}.fa-sort-numeric-up-alt:before{content:"\F887"}.fa-sort-up:before{content:"\F0DE"}.fa-soundcloud:before{content:"\F1BE"}.fa-sourcetree:before{content:"\F7D3"}.fa-spa:before{content:"\F5BB"}.fa-space-shuttle:before{content:"\F197"}.fa-speakap:before{content:"\F3F3"}.fa-speaker-deck:before{content:"\F83C"}.fa-spell-check:before{content:"\F891"}.fa-spider:before{content:"\F717"}.fa-spinner:before{content:"\F110"}.fa-splotch:before{content:"\F5BC"}.fa-spotify:before{content:"\F1BC"}.fa-spray-can:before{content:"\F5BD"}.fa-square:before{content:"\F0C8"}.fa-square-full:before{content:"\F45C"}.fa-square-root-alt:before{content:"\F698"}.fa-squarespace:before{content:"\F5BE"}.fa-stack-exchange:before{content:"\F18D"}.fa-stack-overflow:before{content:"\F16C"}.fa-stackpath:before{content:"\F842"}.fa-stamp:before{content:"\F5BF"}.fa-star:before{content:"\F005"}.fa-star-and-crescent:before{content:"\F699"}.fa-star-half:before{content:"\F089"}.fa-star-half-alt:before{content:"\F5C0"}.fa-star-of-david:before{content:"\F69A"}.fa-star-of-life:before{content:"\F621"}.fa-staylinked:before{content:"\F3F5"}.fa-steam:before{content:"\F1B6"}.fa-steam-square:before{content:"\F1B7"}.fa-steam-symbol:before{content:"\F3F6"}.fa-step-backward:before{content:"\F048"}.fa-step-forward:before{content:"\F051"}.fa-stethoscope:before{content:"\F0F1"}.fa-sticker-mule:before{content:"\F3F7"}.fa-sticky-note:before{content:"\F249"}.fa-stop:before{content:"\F04D"}.fa-stop-circle:before{content:"\F28D"}.fa-stopwatch:before{content:"\F2F2"}.fa-stopwatch-20:before{content:"\E06F"}.fa-store:before{content:"\F54E"}.fa-store-alt:before{content:"\F54F"}.fa-store-alt-slash:before{content:"\E070"}.fa-store-slash:before{content:"\E071"}.fa-strava:before{content:"\F428"}.fa-stream:before{content:"\F550"}.fa-street-view:before{content:"\F21D"}.fa-strikethrough:before{content:"\F0CC"}.fa-stripe:before{content:"\F429"}.fa-stripe-s:before{content:"\F42A"}.fa-stroopwafel:before{content:"\F551"}.fa-studiovinari:before{content:"\F3F8"}.fa-stumbleupon:before{content:"\F1A4"}.fa-stumbleupon-circle:before{content:"\F1A3"}.fa-subscript:before{content:"\F12C"}.fa-subway:before{content:"\F239"}.fa-suitcase:before{content:"\F0F2"}.fa-suitcase-rolling:before{content:"\F5C1"}.fa-sun:before{content:"\F185"}.fa-superpowers:before{content:"\F2DD"}.fa-superscript:before{content:"\F12B"}.fa-supple:before{content:"\F3F9"}.fa-surprise:before{content:"\F5C2"}.fa-suse:before{content:"\F7D6"}.fa-swatchbook:before{content:"\F5C3"}.fa-swift:before{content:"\F8E1"}.fa-swimmer:before{content:"\F5C4"}.fa-swimming-pool:before{content:"\F5C5"}.fa-symfony:before{content:"\F83D"}.fa-synagogue:before{content:"\F69B"}.fa-sync:before{content:"\F021"}.fa-sync-alt:before{content:"\F2F1"}.fa-syringe:before{content:"\F48E"}.fa-table:before{content:"\F0CE"}.fa-table-tennis:before{content:"\F45D"}.fa-tablet:before{content:"\F10A"}.fa-tablet-alt:before{content:"\F3FA"}.fa-tablets:before{content:"\F490"}.fa-tachometer-alt:before{content:"\F3FD"}.fa-tag:before{content:"\F02B"}.fa-tags:before{content:"\F02C"}.fa-tape:before{content:"\F4DB"}.fa-tasks:before{content:"\F0AE"}.fa-taxi:before{content:"\F1BA"}.fa-teamspeak:before{content:"\F4F9"}.fa-teeth:before{content:"\F62E"}.fa-teeth-open:before{content:"\F62F"}.fa-telegram:before{content:"\F2C6"}.fa-telegram-plane:before{content:"\F3FE"}.fa-temperature-high:before{content:"\F769"}.fa-temperature-low:before{content:"\F76B"}.fa-tencent-weibo:before{content:"\F1D5"}.fa-tenge:before{content:"\F7D7"}.fa-terminal:before{content:"\F120"}.fa-text-height:before{content:"\F034"}.fa-text-width:before{content:"\F035"}.fa-th:before{content:"\F00A"}.fa-th-large:before{content:"\F009"}.fa-th-list:before{content:"\F00B"}.fa-the-red-yeti:before{content:"\F69D"}.fa-theater-masks:before{content:"\F630"}.fa-themeco:before{content:"\F5C6"}.fa-themeisle:before{content:"\F2B2"}.fa-thermometer:before{content:"\F491"}.fa-thermometer-empty:before{content:"\F2CB"}.fa-thermometer-full:before{content:"\F2C7"}.fa-thermometer-half:before{content:"\F2C9"}.fa-thermometer-quarter:before{content:"\F2CA"}.fa-thermometer-three-quarters:before{content:"\F2C8"}.fa-think-peaks:before{content:"\F731"}.fa-thumbs-down:before{content:"\F165"}.fa-thumbs-up:before{content:"\F164"}.fa-thumbtack:before{content:"\F08D"}.fa-ticket-alt:before{content:"\F3FF"}.fa-tiktok:before{content:"\E07B"}.fa-times:before{content:"\F00D"}.fa-times-circle:before{content:"\F057"}.fa-tint:before{content:"\F043"}.fa-tint-slash:before{content:"\F5C7"}.fa-tired:before{content:"\F5C8"}.fa-toggle-off:before{content:"\F204"}.fa-toggle-on:before{content:"\F205"}.fa-toilet:before{content:"\F7D8"}.fa-toilet-paper:before{content:"\F71E"}.fa-toilet-paper-slash:before{content:"\E072"}.fa-toolbox:before{content:"\F552"}.fa-tools:before{content:"\F7D9"}.fa-tooth:before{content:"\F5C9"}.fa-torah:before{content:"\F6A0"}.fa-torii-gate:before{content:"\F6A1"}.fa-tractor:before{content:"\F722"}.fa-trade-federation:before{content:"\F513"}.fa-trademark:before{content:"\F25C"}.fa-traffic-light:before{content:"\F637"}.fa-trailer:before{content:"\E041"}.fa-train:before{content:"\F238"}.fa-tram:before{content:"\F7DA"}.fa-transgender:before{content:"\F224"}.fa-transgender-alt:before{content:"\F225"}.fa-trash:before{content:"\F1F8"}.fa-trash-alt:before{content:"\F2ED"}.fa-trash-restore:before{content:"\F829"}.fa-trash-restore-alt:before{content:"\F82A"}.fa-tree:before{content:"\F1BB"}.fa-trello:before{content:"\F181"}.fa-tripadvisor:before{content:"\F262"}.fa-trophy:before{content:"\F091"}.fa-truck:before{content:"\F0D1"}.fa-truck-loading:before{content:"\F4DE"}.fa-truck-monster:before{content:"\F63B"}.fa-truck-moving:before{content:"\F4DF"}.fa-truck-pickup:before{content:"\F63C"}.fa-tshirt:before{content:"\F553"}.fa-tty:before{content:"\F1E4"}.fa-tumblr:before{content:"\F173"}.fa-tumblr-square:before{content:"\F174"}.fa-tv:before{content:"\F26C"}.fa-twitch:before{content:"\F1E8"}.fa-twitter:before{content:"\F099"}.fa-twitter-square:before{content:"\F081"}.fa-typo3:before{content:"\F42B"}.fa-uber:before{content:"\F402"}.fa-ubuntu:before{content:"\F7DF"}.fa-uikit:before{content:"\F403"}.fa-umbraco:before{content:"\F8E8"}.fa-umbrella:before{content:"\F0E9"}.fa-umbrella-beach:before{content:"\F5CA"}.fa-uncharted:before{content:"\E084"}.fa-underline:before{content:"\F0CD"}.fa-undo:before{content:"\F0E2"}.fa-undo-alt:before{content:"\F2EA"}.fa-uniregistry:before{content:"\F404"}.fa-unity:before{content:"\E049"}.fa-universal-access:before{content:"\F29A"}.fa-university:before{content:"\F19C"}.fa-unlink:before{content:"\F127"}.fa-unlock:before{content:"\F09C"}.fa-unlock-alt:before{content:"\F13E"}.fa-unsplash:before{content:"\E07C"}.fa-untappd:before{content:"\F405"}.fa-upload:before{content:"\F093"}.fa-ups:before{content:"\F7E0"}.fa-usb:before{content:"\F287"}.fa-user:before{content:"\F007"}.fa-user-alt:before{content:"\F406"}.fa-user-alt-slash:before{content:"\F4FA"}.fa-user-astronaut:before{content:"\F4FB"}.fa-user-check:before{content:"\F4FC"}.fa-user-circle:before{content:"\F2BD"}.fa-user-clock:before{content:"\F4FD"}.fa-user-cog:before{content:"\F4FE"}.fa-user-edit:before{content:"\F4FF"}.fa-user-friends:before{content:"\F500"}.fa-user-graduate:before{content:"\F501"}.fa-user-injured:before{content:"\F728"}.fa-user-lock:before{content:"\F502"}.fa-user-md:before{content:"\F0F0"}.fa-user-minus:before{content:"\F503"}.fa-user-ninja:before{content:"\F504"}.fa-user-nurse:before{content:"\F82F"}.fa-user-plus:before{content:"\F234"}.fa-user-secret:before{content:"\F21B"}.fa-user-shield:before{content:"\F505"}.fa-user-slash:before{content:"\F506"}.fa-user-tag:before{content:"\F507"}.fa-user-tie:before{content:"\F508"}.fa-user-times:before{content:"\F235"}.fa-users:before{content:"\F0C0"}.fa-users-cog:before{content:"\F509"}.fa-users-slash:before{content:"\E073"}.fa-usps:before{content:"\F7E1"}.fa-ussunnah:before{content:"\F407"}.fa-utensil-spoon:before{content:"\F2E5"}.fa-utensils:before{content:"\F2E7"}.fa-vaadin:before{content:"\F408"}.fa-vector-square:before{content:"\F5CB"}.fa-venus:before{content:"\F221"}.fa-venus-double:before{content:"\F226"}.fa-venus-mars:before{content:"\F228"}.fa-vest:before{content:"\E085"}.fa-vest-patches:before{content:"\E086"}.fa-viacoin:before{content:"\F237"}.fa-viadeo:before{content:"\F2A9"}.fa-viadeo-square:before{content:"\F2AA"}.fa-vial:before{content:"\F492"}.fa-vials:before{content:"\F493"}.fa-viber:before{content:"\F409"}.fa-video:before{content:"\F03D"}.fa-video-slash:before{content:"\F4E2"}.fa-vihara:before{content:"\F6A7"}.fa-vimeo:before{content:"\F40A"}.fa-vimeo-square:before{content:"\F194"}.fa-vimeo-v:before{content:"\F27D"}.fa-vine:before{content:"\F1CA"}.fa-virus:before{content:"\E074"}.fa-virus-slash:before{content:"\E075"}.fa-viruses:before{content:"\E076"}.fa-vk:before{content:"\F189"}.fa-vnv:before{content:"\F40B"}.fa-voicemail:before{content:"\F897"}.fa-volleyball-ball:before{content:"\F45F"}.fa-volume-down:before{content:"\F027"}.fa-volume-mute:before{content:"\F6A9"}.fa-volume-off:before{content:"\F026"}.fa-volume-up:before{content:"\F028"}.fa-vote-yea:before{content:"\F772"}.fa-vr-cardboard:before{content:"\F729"}.fa-vuejs:before{content:"\F41F"}.fa-walking:before{content:"\F554"}.fa-wallet:before{content:"\F555"}.fa-warehouse:before{content:"\F494"}.fa-watchman-monitoring:before{content:"\E087"}.fa-water:before{content:"\F773"}.fa-wave-square:before{content:"\F83E"}.fa-waze:before{content:"\F83F"}.fa-weebly:before{content:"\F5CC"}.fa-weibo:before{content:"\F18A"}.fa-weight:before{content:"\F496"}.fa-weight-hanging:before{content:"\F5CD"}.fa-weixin:before{content:"\F1D7"}.fa-whatsapp:before{content:"\F232"}.fa-whatsapp-square:before{content:"\F40C"}.fa-wheelchair:before{content:"\F193"}.fa-whmcs:before{content:"\F40D"}.fa-wifi:before{content:"\F1EB"}.fa-wikipedia-w:before{content:"\F266"}.fa-wind:before{content:"\F72E"}.fa-window-close:before{content:"\F410"}.fa-window-maximize:before{content:"\F2D0"}.fa-window-minimize:before{content:"\F2D1"}.fa-window-restore:before{content:"\F2D2"}.fa-windows:before{content:"\F17A"}.fa-wine-bottle:before{content:"\F72F"}.fa-wine-glass:before{content:"\F4E3"}.fa-wine-glass-alt:before{content:"\F5CE"}.fa-wix:before{content:"\F5CF"}.fa-wizards-of-the-coast:before{content:"\F730"}.fa-wodu:before{content:"\E088"}.fa-wolf-pack-battalion:before{content:"\F514"}.fa-won-sign:before{content:"\F159"}.fa-wordpress:before{content:"\F19A"}.fa-wordpress-simple:before{content:"\F411"}.fa-wpbeginner:before{content:"\F297"}.fa-wpexplorer:before{content:"\F2DE"}.fa-wpforms:before{content:"\F298"}.fa-wpressr:before{content:"\F3E4"}.fa-wrench:before{content:"\F0AD"}.fa-x-ray:before{content:"\F497"}.fa-xbox:before{content:"\F412"}.fa-xing:before{content:"\F168"}.fa-xing-square:before{content:"\F169"}.fa-y-combinator:before{content:"\F23B"}.fa-yahoo:before{content:"\F19E"}.fa-yammer:before{content:"\F840"}.fa-yandex:before{content:"\F413"}.fa-yandex-international:before{content:"\F414"}.fa-yarn:before{content:"\F7E3"}.fa-yelp:before{content:"\F1E9"}.fa-yen-sign:before{content:"\F157"}.fa-yin-yang:before{content:"\F6AD"}.fa-yoast:before{content:"\F2B1"}.fa-youtube:before{content:"\F167"}.fa-youtube-square:before{content:"\F431"}.fa-zhihu:before{content:"\F63F"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;font-display:block;src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?d28c96cabe5302f1b2c90275cd3f4e69);src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?d28c96cabe5302f1b2c90275cd3f4e69?#iefix) format("embedded-opentype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff2?0c9f225e8f69c622f681cf1ed973cc3d) format("woff2"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff?0ce1e868452204695c8ac1c70f693c2d) format("woff"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.ttf?dfe5aa4344a2d8a29aec8d83fb3fb14e) format("truetype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.svg?5d10d00980077f67990f73b1961bc46e#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;font-display:block;src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.eot?0232fe8b09de812c88e6cc27f57a3a88);src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.eot?0232fe8b09de812c88e6cc27f57a3a88?#iefix) format("embedded-opentype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.woff2?847712aaabbeba674afdda86d31cab17) format("woff2"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.woff?3cace4a04d941b5981ba32c6ce9afae1) format("woff"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.ttf?398be22b2308585b84da8e858e2d7b60) format("truetype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.svg?d0fdc7c20b0b0b1aaf27327547735fa3#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;font-display:block;src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.eot?00bb62bc33034479d5e82a0fd1c5efe3);src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.eot?00bb62bc33034479d5e82a0fd1c5efe3?#iefix) format("embedded-opentype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2?9ae050d1876ac1763eb6afe4264e6d5a) format("woff2"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff?4bfbf7eb4b19d9ff9293eb177b6d0070) format("woff"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?260d033f79f75d670fd09d8cf7c8bf8d) format("truetype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.svg?2306f642b31b774ba1d8b6b784539e19#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900}/*! + */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\F26E"}.fa-accessible-icon:before{content:"\F368"}.fa-accusoft:before{content:"\F369"}.fa-acquisitions-incorporated:before{content:"\F6AF"}.fa-ad:before{content:"\F641"}.fa-address-book:before{content:"\F2B9"}.fa-address-card:before{content:"\F2BB"}.fa-adjust:before{content:"\F042"}.fa-adn:before{content:"\F170"}.fa-adversal:before{content:"\F36A"}.fa-affiliatetheme:before{content:"\F36B"}.fa-air-freshener:before{content:"\F5D0"}.fa-airbnb:before{content:"\F834"}.fa-algolia:before{content:"\F36C"}.fa-align-center:before{content:"\F037"}.fa-align-justify:before{content:"\F039"}.fa-align-left:before{content:"\F036"}.fa-align-right:before{content:"\F038"}.fa-alipay:before{content:"\F642"}.fa-allergies:before{content:"\F461"}.fa-amazon:before{content:"\F270"}.fa-amazon-pay:before{content:"\F42C"}.fa-ambulance:before{content:"\F0F9"}.fa-american-sign-language-interpreting:before{content:"\F2A3"}.fa-amilia:before{content:"\F36D"}.fa-anchor:before{content:"\F13D"}.fa-android:before{content:"\F17B"}.fa-angellist:before{content:"\F209"}.fa-angle-double-down:before{content:"\F103"}.fa-angle-double-left:before{content:"\F100"}.fa-angle-double-right:before{content:"\F101"}.fa-angle-double-up:before{content:"\F102"}.fa-angle-down:before{content:"\F107"}.fa-angle-left:before{content:"\F104"}.fa-angle-right:before{content:"\F105"}.fa-angle-up:before{content:"\F106"}.fa-angry:before{content:"\F556"}.fa-angrycreative:before{content:"\F36E"}.fa-angular:before{content:"\F420"}.fa-ankh:before{content:"\F644"}.fa-app-store:before{content:"\F36F"}.fa-app-store-ios:before{content:"\F370"}.fa-apper:before{content:"\F371"}.fa-apple:before{content:"\F179"}.fa-apple-alt:before{content:"\F5D1"}.fa-apple-pay:before{content:"\F415"}.fa-archive:before{content:"\F187"}.fa-archway:before{content:"\F557"}.fa-arrow-alt-circle-down:before{content:"\F358"}.fa-arrow-alt-circle-left:before{content:"\F359"}.fa-arrow-alt-circle-right:before{content:"\F35A"}.fa-arrow-alt-circle-up:before{content:"\F35B"}.fa-arrow-circle-down:before{content:"\F0AB"}.fa-arrow-circle-left:before{content:"\F0A8"}.fa-arrow-circle-right:before{content:"\F0A9"}.fa-arrow-circle-up:before{content:"\F0AA"}.fa-arrow-down:before{content:"\F063"}.fa-arrow-left:before{content:"\F060"}.fa-arrow-right:before{content:"\F061"}.fa-arrow-up:before{content:"\F062"}.fa-arrows-alt:before{content:"\F0B2"}.fa-arrows-alt-h:before{content:"\F337"}.fa-arrows-alt-v:before{content:"\F338"}.fa-artstation:before{content:"\F77A"}.fa-assistive-listening-systems:before{content:"\F2A2"}.fa-asterisk:before{content:"\F069"}.fa-asymmetrik:before{content:"\F372"}.fa-at:before{content:"\F1FA"}.fa-atlas:before{content:"\F558"}.fa-atlassian:before{content:"\F77B"}.fa-atom:before{content:"\F5D2"}.fa-audible:before{content:"\F373"}.fa-audio-description:before{content:"\F29E"}.fa-autoprefixer:before{content:"\F41C"}.fa-avianex:before{content:"\F374"}.fa-aviato:before{content:"\F421"}.fa-award:before{content:"\F559"}.fa-aws:before{content:"\F375"}.fa-baby:before{content:"\F77C"}.fa-baby-carriage:before{content:"\F77D"}.fa-backspace:before{content:"\F55A"}.fa-backward:before{content:"\F04A"}.fa-bacon:before{content:"\F7E5"}.fa-bacteria:before{content:"\E059"}.fa-bacterium:before{content:"\E05A"}.fa-bahai:before{content:"\F666"}.fa-balance-scale:before{content:"\F24E"}.fa-balance-scale-left:before{content:"\F515"}.fa-balance-scale-right:before{content:"\F516"}.fa-ban:before{content:"\F05E"}.fa-band-aid:before{content:"\F462"}.fa-bandcamp:before{content:"\F2D5"}.fa-barcode:before{content:"\F02A"}.fa-bars:before{content:"\F0C9"}.fa-baseball-ball:before{content:"\F433"}.fa-basketball-ball:before{content:"\F434"}.fa-bath:before{content:"\F2CD"}.fa-battery-empty:before{content:"\F244"}.fa-battery-full:before{content:"\F240"}.fa-battery-half:before{content:"\F242"}.fa-battery-quarter:before{content:"\F243"}.fa-battery-three-quarters:before{content:"\F241"}.fa-battle-net:before{content:"\F835"}.fa-bed:before{content:"\F236"}.fa-beer:before{content:"\F0FC"}.fa-behance:before{content:"\F1B4"}.fa-behance-square:before{content:"\F1B5"}.fa-bell:before{content:"\F0F3"}.fa-bell-slash:before{content:"\F1F6"}.fa-bezier-curve:before{content:"\F55B"}.fa-bible:before{content:"\F647"}.fa-bicycle:before{content:"\F206"}.fa-biking:before{content:"\F84A"}.fa-bimobject:before{content:"\F378"}.fa-binoculars:before{content:"\F1E5"}.fa-biohazard:before{content:"\F780"}.fa-birthday-cake:before{content:"\F1FD"}.fa-bitbucket:before{content:"\F171"}.fa-bitcoin:before{content:"\F379"}.fa-bity:before{content:"\F37A"}.fa-black-tie:before{content:"\F27E"}.fa-blackberry:before{content:"\F37B"}.fa-blender:before{content:"\F517"}.fa-blender-phone:before{content:"\F6B6"}.fa-blind:before{content:"\F29D"}.fa-blog:before{content:"\F781"}.fa-blogger:before{content:"\F37C"}.fa-blogger-b:before{content:"\F37D"}.fa-bluetooth:before{content:"\F293"}.fa-bluetooth-b:before{content:"\F294"}.fa-bold:before{content:"\F032"}.fa-bolt:before{content:"\F0E7"}.fa-bomb:before{content:"\F1E2"}.fa-bone:before{content:"\F5D7"}.fa-bong:before{content:"\F55C"}.fa-book:before{content:"\F02D"}.fa-book-dead:before{content:"\F6B7"}.fa-book-medical:before{content:"\F7E6"}.fa-book-open:before{content:"\F518"}.fa-book-reader:before{content:"\F5DA"}.fa-bookmark:before{content:"\F02E"}.fa-bootstrap:before{content:"\F836"}.fa-border-all:before{content:"\F84C"}.fa-border-none:before{content:"\F850"}.fa-border-style:before{content:"\F853"}.fa-bowling-ball:before{content:"\F436"}.fa-box:before{content:"\F466"}.fa-box-open:before{content:"\F49E"}.fa-box-tissue:before{content:"\E05B"}.fa-boxes:before{content:"\F468"}.fa-braille:before{content:"\F2A1"}.fa-brain:before{content:"\F5DC"}.fa-bread-slice:before{content:"\F7EC"}.fa-briefcase:before{content:"\F0B1"}.fa-briefcase-medical:before{content:"\F469"}.fa-broadcast-tower:before{content:"\F519"}.fa-broom:before{content:"\F51A"}.fa-brush:before{content:"\F55D"}.fa-btc:before{content:"\F15A"}.fa-buffer:before{content:"\F837"}.fa-bug:before{content:"\F188"}.fa-building:before{content:"\F1AD"}.fa-bullhorn:before{content:"\F0A1"}.fa-bullseye:before{content:"\F140"}.fa-burn:before{content:"\F46A"}.fa-buromobelexperte:before{content:"\F37F"}.fa-bus:before{content:"\F207"}.fa-bus-alt:before{content:"\F55E"}.fa-business-time:before{content:"\F64A"}.fa-buy-n-large:before{content:"\F8A6"}.fa-buysellads:before{content:"\F20D"}.fa-calculator:before{content:"\F1EC"}.fa-calendar:before{content:"\F133"}.fa-calendar-alt:before{content:"\F073"}.fa-calendar-check:before{content:"\F274"}.fa-calendar-day:before{content:"\F783"}.fa-calendar-minus:before{content:"\F272"}.fa-calendar-plus:before{content:"\F271"}.fa-calendar-times:before{content:"\F273"}.fa-calendar-week:before{content:"\F784"}.fa-camera:before{content:"\F030"}.fa-camera-retro:before{content:"\F083"}.fa-campground:before{content:"\F6BB"}.fa-canadian-maple-leaf:before{content:"\F785"}.fa-candy-cane:before{content:"\F786"}.fa-cannabis:before{content:"\F55F"}.fa-capsules:before{content:"\F46B"}.fa-car:before{content:"\F1B9"}.fa-car-alt:before{content:"\F5DE"}.fa-car-battery:before{content:"\F5DF"}.fa-car-crash:before{content:"\F5E1"}.fa-car-side:before{content:"\F5E4"}.fa-caravan:before{content:"\F8FF"}.fa-caret-down:before{content:"\F0D7"}.fa-caret-left:before{content:"\F0D9"}.fa-caret-right:before{content:"\F0DA"}.fa-caret-square-down:before{content:"\F150"}.fa-caret-square-left:before{content:"\F191"}.fa-caret-square-right:before{content:"\F152"}.fa-caret-square-up:before{content:"\F151"}.fa-caret-up:before{content:"\F0D8"}.fa-carrot:before{content:"\F787"}.fa-cart-arrow-down:before{content:"\F218"}.fa-cart-plus:before{content:"\F217"}.fa-cash-register:before{content:"\F788"}.fa-cat:before{content:"\F6BE"}.fa-cc-amazon-pay:before{content:"\F42D"}.fa-cc-amex:before{content:"\F1F3"}.fa-cc-apple-pay:before{content:"\F416"}.fa-cc-diners-club:before{content:"\F24C"}.fa-cc-discover:before{content:"\F1F2"}.fa-cc-jcb:before{content:"\F24B"}.fa-cc-mastercard:before{content:"\F1F1"}.fa-cc-paypal:before{content:"\F1F4"}.fa-cc-stripe:before{content:"\F1F5"}.fa-cc-visa:before{content:"\F1F0"}.fa-centercode:before{content:"\F380"}.fa-centos:before{content:"\F789"}.fa-certificate:before{content:"\F0A3"}.fa-chair:before{content:"\F6C0"}.fa-chalkboard:before{content:"\F51B"}.fa-chalkboard-teacher:before{content:"\F51C"}.fa-charging-station:before{content:"\F5E7"}.fa-chart-area:before{content:"\F1FE"}.fa-chart-bar:before{content:"\F080"}.fa-chart-line:before{content:"\F201"}.fa-chart-pie:before{content:"\F200"}.fa-check:before{content:"\F00C"}.fa-check-circle:before{content:"\F058"}.fa-check-double:before{content:"\F560"}.fa-check-square:before{content:"\F14A"}.fa-cheese:before{content:"\F7EF"}.fa-chess:before{content:"\F439"}.fa-chess-bishop:before{content:"\F43A"}.fa-chess-board:before{content:"\F43C"}.fa-chess-king:before{content:"\F43F"}.fa-chess-knight:before{content:"\F441"}.fa-chess-pawn:before{content:"\F443"}.fa-chess-queen:before{content:"\F445"}.fa-chess-rook:before{content:"\F447"}.fa-chevron-circle-down:before{content:"\F13A"}.fa-chevron-circle-left:before{content:"\F137"}.fa-chevron-circle-right:before{content:"\F138"}.fa-chevron-circle-up:before{content:"\F139"}.fa-chevron-down:before{content:"\F078"}.fa-chevron-left:before{content:"\F053"}.fa-chevron-right:before{content:"\F054"}.fa-chevron-up:before{content:"\F077"}.fa-child:before{content:"\F1AE"}.fa-chrome:before{content:"\F268"}.fa-chromecast:before{content:"\F838"}.fa-church:before{content:"\F51D"}.fa-circle:before{content:"\F111"}.fa-circle-notch:before{content:"\F1CE"}.fa-city:before{content:"\F64F"}.fa-clinic-medical:before{content:"\F7F2"}.fa-clipboard:before{content:"\F328"}.fa-clipboard-check:before{content:"\F46C"}.fa-clipboard-list:before{content:"\F46D"}.fa-clock:before{content:"\F017"}.fa-clone:before{content:"\F24D"}.fa-closed-captioning:before{content:"\F20A"}.fa-cloud:before{content:"\F0C2"}.fa-cloud-download-alt:before{content:"\F381"}.fa-cloud-meatball:before{content:"\F73B"}.fa-cloud-moon:before{content:"\F6C3"}.fa-cloud-moon-rain:before{content:"\F73C"}.fa-cloud-rain:before{content:"\F73D"}.fa-cloud-showers-heavy:before{content:"\F740"}.fa-cloud-sun:before{content:"\F6C4"}.fa-cloud-sun-rain:before{content:"\F743"}.fa-cloud-upload-alt:before{content:"\F382"}.fa-cloudflare:before{content:"\E07D"}.fa-cloudscale:before{content:"\F383"}.fa-cloudsmith:before{content:"\F384"}.fa-cloudversify:before{content:"\F385"}.fa-cocktail:before{content:"\F561"}.fa-code:before{content:"\F121"}.fa-code-branch:before{content:"\F126"}.fa-codepen:before{content:"\F1CB"}.fa-codiepie:before{content:"\F284"}.fa-coffee:before{content:"\F0F4"}.fa-cog:before{content:"\F013"}.fa-cogs:before{content:"\F085"}.fa-coins:before{content:"\F51E"}.fa-columns:before{content:"\F0DB"}.fa-comment:before{content:"\F075"}.fa-comment-alt:before{content:"\F27A"}.fa-comment-dollar:before{content:"\F651"}.fa-comment-dots:before{content:"\F4AD"}.fa-comment-medical:before{content:"\F7F5"}.fa-comment-slash:before{content:"\F4B3"}.fa-comments:before{content:"\F086"}.fa-comments-dollar:before{content:"\F653"}.fa-compact-disc:before{content:"\F51F"}.fa-compass:before{content:"\F14E"}.fa-compress:before{content:"\F066"}.fa-compress-alt:before{content:"\F422"}.fa-compress-arrows-alt:before{content:"\F78C"}.fa-concierge-bell:before{content:"\F562"}.fa-confluence:before{content:"\F78D"}.fa-connectdevelop:before{content:"\F20E"}.fa-contao:before{content:"\F26D"}.fa-cookie:before{content:"\F563"}.fa-cookie-bite:before{content:"\F564"}.fa-copy:before{content:"\F0C5"}.fa-copyright:before{content:"\F1F9"}.fa-cotton-bureau:before{content:"\F89E"}.fa-couch:before{content:"\F4B8"}.fa-cpanel:before{content:"\F388"}.fa-creative-commons:before{content:"\F25E"}.fa-creative-commons-by:before{content:"\F4E7"}.fa-creative-commons-nc:before{content:"\F4E8"}.fa-creative-commons-nc-eu:before{content:"\F4E9"}.fa-creative-commons-nc-jp:before{content:"\F4EA"}.fa-creative-commons-nd:before{content:"\F4EB"}.fa-creative-commons-pd:before{content:"\F4EC"}.fa-creative-commons-pd-alt:before{content:"\F4ED"}.fa-creative-commons-remix:before{content:"\F4EE"}.fa-creative-commons-sa:before{content:"\F4EF"}.fa-creative-commons-sampling:before{content:"\F4F0"}.fa-creative-commons-sampling-plus:before{content:"\F4F1"}.fa-creative-commons-share:before{content:"\F4F2"}.fa-creative-commons-zero:before{content:"\F4F3"}.fa-credit-card:before{content:"\F09D"}.fa-critical-role:before{content:"\F6C9"}.fa-crop:before{content:"\F125"}.fa-crop-alt:before{content:"\F565"}.fa-cross:before{content:"\F654"}.fa-crosshairs:before{content:"\F05B"}.fa-crow:before{content:"\F520"}.fa-crown:before{content:"\F521"}.fa-crutch:before{content:"\F7F7"}.fa-css3:before{content:"\F13C"}.fa-css3-alt:before{content:"\F38B"}.fa-cube:before{content:"\F1B2"}.fa-cubes:before{content:"\F1B3"}.fa-cut:before{content:"\F0C4"}.fa-cuttlefish:before{content:"\F38C"}.fa-d-and-d:before{content:"\F38D"}.fa-d-and-d-beyond:before{content:"\F6CA"}.fa-dailymotion:before{content:"\E052"}.fa-dashcube:before{content:"\F210"}.fa-database:before{content:"\F1C0"}.fa-deaf:before{content:"\F2A4"}.fa-deezer:before{content:"\E077"}.fa-delicious:before{content:"\F1A5"}.fa-democrat:before{content:"\F747"}.fa-deploydog:before{content:"\F38E"}.fa-deskpro:before{content:"\F38F"}.fa-desktop:before{content:"\F108"}.fa-dev:before{content:"\F6CC"}.fa-deviantart:before{content:"\F1BD"}.fa-dharmachakra:before{content:"\F655"}.fa-dhl:before{content:"\F790"}.fa-diagnoses:before{content:"\F470"}.fa-diaspora:before{content:"\F791"}.fa-dice:before{content:"\F522"}.fa-dice-d20:before{content:"\F6CF"}.fa-dice-d6:before{content:"\F6D1"}.fa-dice-five:before{content:"\F523"}.fa-dice-four:before{content:"\F524"}.fa-dice-one:before{content:"\F525"}.fa-dice-six:before{content:"\F526"}.fa-dice-three:before{content:"\F527"}.fa-dice-two:before{content:"\F528"}.fa-digg:before{content:"\F1A6"}.fa-digital-ocean:before{content:"\F391"}.fa-digital-tachograph:before{content:"\F566"}.fa-directions:before{content:"\F5EB"}.fa-discord:before{content:"\F392"}.fa-discourse:before{content:"\F393"}.fa-disease:before{content:"\F7FA"}.fa-divide:before{content:"\F529"}.fa-dizzy:before{content:"\F567"}.fa-dna:before{content:"\F471"}.fa-dochub:before{content:"\F394"}.fa-docker:before{content:"\F395"}.fa-dog:before{content:"\F6D3"}.fa-dollar-sign:before{content:"\F155"}.fa-dolly:before{content:"\F472"}.fa-dolly-flatbed:before{content:"\F474"}.fa-donate:before{content:"\F4B9"}.fa-door-closed:before{content:"\F52A"}.fa-door-open:before{content:"\F52B"}.fa-dot-circle:before{content:"\F192"}.fa-dove:before{content:"\F4BA"}.fa-download:before{content:"\F019"}.fa-draft2digital:before{content:"\F396"}.fa-drafting-compass:before{content:"\F568"}.fa-dragon:before{content:"\F6D5"}.fa-draw-polygon:before{content:"\F5EE"}.fa-dribbble:before{content:"\F17D"}.fa-dribbble-square:before{content:"\F397"}.fa-dropbox:before{content:"\F16B"}.fa-drum:before{content:"\F569"}.fa-drum-steelpan:before{content:"\F56A"}.fa-drumstick-bite:before{content:"\F6D7"}.fa-drupal:before{content:"\F1A9"}.fa-dumbbell:before{content:"\F44B"}.fa-dumpster:before{content:"\F793"}.fa-dumpster-fire:before{content:"\F794"}.fa-dungeon:before{content:"\F6D9"}.fa-dyalog:before{content:"\F399"}.fa-earlybirds:before{content:"\F39A"}.fa-ebay:before{content:"\F4F4"}.fa-edge:before{content:"\F282"}.fa-edge-legacy:before{content:"\E078"}.fa-edit:before{content:"\F044"}.fa-egg:before{content:"\F7FB"}.fa-eject:before{content:"\F052"}.fa-elementor:before{content:"\F430"}.fa-ellipsis-h:before{content:"\F141"}.fa-ellipsis-v:before{content:"\F142"}.fa-ello:before{content:"\F5F1"}.fa-ember:before{content:"\F423"}.fa-empire:before{content:"\F1D1"}.fa-envelope:before{content:"\F0E0"}.fa-envelope-open:before{content:"\F2B6"}.fa-envelope-open-text:before{content:"\F658"}.fa-envelope-square:before{content:"\F199"}.fa-envira:before{content:"\F299"}.fa-equals:before{content:"\F52C"}.fa-eraser:before{content:"\F12D"}.fa-erlang:before{content:"\F39D"}.fa-ethereum:before{content:"\F42E"}.fa-ethernet:before{content:"\F796"}.fa-etsy:before{content:"\F2D7"}.fa-euro-sign:before{content:"\F153"}.fa-evernote:before{content:"\F839"}.fa-exchange-alt:before{content:"\F362"}.fa-exclamation:before{content:"\F12A"}.fa-exclamation-circle:before{content:"\F06A"}.fa-exclamation-triangle:before{content:"\F071"}.fa-expand:before{content:"\F065"}.fa-expand-alt:before{content:"\F424"}.fa-expand-arrows-alt:before{content:"\F31E"}.fa-expeditedssl:before{content:"\F23E"}.fa-external-link-alt:before{content:"\F35D"}.fa-external-link-square-alt:before{content:"\F360"}.fa-eye:before{content:"\F06E"}.fa-eye-dropper:before{content:"\F1FB"}.fa-eye-slash:before{content:"\F070"}.fa-facebook:before{content:"\F09A"}.fa-facebook-f:before{content:"\F39E"}.fa-facebook-messenger:before{content:"\F39F"}.fa-facebook-square:before{content:"\F082"}.fa-fan:before{content:"\F863"}.fa-fantasy-flight-games:before{content:"\F6DC"}.fa-fast-backward:before{content:"\F049"}.fa-fast-forward:before{content:"\F050"}.fa-faucet:before{content:"\E005"}.fa-fax:before{content:"\F1AC"}.fa-feather:before{content:"\F52D"}.fa-feather-alt:before{content:"\F56B"}.fa-fedex:before{content:"\F797"}.fa-fedora:before{content:"\F798"}.fa-female:before{content:"\F182"}.fa-fighter-jet:before{content:"\F0FB"}.fa-figma:before{content:"\F799"}.fa-file:before{content:"\F15B"}.fa-file-alt:before{content:"\F15C"}.fa-file-archive:before{content:"\F1C6"}.fa-file-audio:before{content:"\F1C7"}.fa-file-code:before{content:"\F1C9"}.fa-file-contract:before{content:"\F56C"}.fa-file-csv:before{content:"\F6DD"}.fa-file-download:before{content:"\F56D"}.fa-file-excel:before{content:"\F1C3"}.fa-file-export:before{content:"\F56E"}.fa-file-image:before{content:"\F1C5"}.fa-file-import:before{content:"\F56F"}.fa-file-invoice:before{content:"\F570"}.fa-file-invoice-dollar:before{content:"\F571"}.fa-file-medical:before{content:"\F477"}.fa-file-medical-alt:before{content:"\F478"}.fa-file-pdf:before{content:"\F1C1"}.fa-file-powerpoint:before{content:"\F1C4"}.fa-file-prescription:before{content:"\F572"}.fa-file-signature:before{content:"\F573"}.fa-file-upload:before{content:"\F574"}.fa-file-video:before{content:"\F1C8"}.fa-file-word:before{content:"\F1C2"}.fa-fill:before{content:"\F575"}.fa-fill-drip:before{content:"\F576"}.fa-film:before{content:"\F008"}.fa-filter:before{content:"\F0B0"}.fa-fingerprint:before{content:"\F577"}.fa-fire:before{content:"\F06D"}.fa-fire-alt:before{content:"\F7E4"}.fa-fire-extinguisher:before{content:"\F134"}.fa-firefox:before{content:"\F269"}.fa-firefox-browser:before{content:"\E007"}.fa-first-aid:before{content:"\F479"}.fa-first-order:before{content:"\F2B0"}.fa-first-order-alt:before{content:"\F50A"}.fa-firstdraft:before{content:"\F3A1"}.fa-fish:before{content:"\F578"}.fa-fist-raised:before{content:"\F6DE"}.fa-flag:before{content:"\F024"}.fa-flag-checkered:before{content:"\F11E"}.fa-flag-usa:before{content:"\F74D"}.fa-flask:before{content:"\F0C3"}.fa-flickr:before{content:"\F16E"}.fa-flipboard:before{content:"\F44D"}.fa-flushed:before{content:"\F579"}.fa-fly:before{content:"\F417"}.fa-folder:before{content:"\F07B"}.fa-folder-minus:before{content:"\F65D"}.fa-folder-open:before{content:"\F07C"}.fa-folder-plus:before{content:"\F65E"}.fa-font:before{content:"\F031"}.fa-font-awesome:before{content:"\F2B4"}.fa-font-awesome-alt:before{content:"\F35C"}.fa-font-awesome-flag:before{content:"\F425"}.fa-font-awesome-logo-full:before{content:"\F4E6"}.fa-fonticons:before{content:"\F280"}.fa-fonticons-fi:before{content:"\F3A2"}.fa-football-ball:before{content:"\F44E"}.fa-fort-awesome:before{content:"\F286"}.fa-fort-awesome-alt:before{content:"\F3A3"}.fa-forumbee:before{content:"\F211"}.fa-forward:before{content:"\F04E"}.fa-foursquare:before{content:"\F180"}.fa-free-code-camp:before{content:"\F2C5"}.fa-freebsd:before{content:"\F3A4"}.fa-frog:before{content:"\F52E"}.fa-frown:before{content:"\F119"}.fa-frown-open:before{content:"\F57A"}.fa-fulcrum:before{content:"\F50B"}.fa-funnel-dollar:before{content:"\F662"}.fa-futbol:before{content:"\F1E3"}.fa-galactic-republic:before{content:"\F50C"}.fa-galactic-senate:before{content:"\F50D"}.fa-gamepad:before{content:"\F11B"}.fa-gas-pump:before{content:"\F52F"}.fa-gavel:before{content:"\F0E3"}.fa-gem:before{content:"\F3A5"}.fa-genderless:before{content:"\F22D"}.fa-get-pocket:before{content:"\F265"}.fa-gg:before{content:"\F260"}.fa-gg-circle:before{content:"\F261"}.fa-ghost:before{content:"\F6E2"}.fa-gift:before{content:"\F06B"}.fa-gifts:before{content:"\F79C"}.fa-git:before{content:"\F1D3"}.fa-git-alt:before{content:"\F841"}.fa-git-square:before{content:"\F1D2"}.fa-github:before{content:"\F09B"}.fa-github-alt:before{content:"\F113"}.fa-github-square:before{content:"\F092"}.fa-gitkraken:before{content:"\F3A6"}.fa-gitlab:before{content:"\F296"}.fa-gitter:before{content:"\F426"}.fa-glass-cheers:before{content:"\F79F"}.fa-glass-martini:before{content:"\F000"}.fa-glass-martini-alt:before{content:"\F57B"}.fa-glass-whiskey:before{content:"\F7A0"}.fa-glasses:before{content:"\F530"}.fa-glide:before{content:"\F2A5"}.fa-glide-g:before{content:"\F2A6"}.fa-globe:before{content:"\F0AC"}.fa-globe-africa:before{content:"\F57C"}.fa-globe-americas:before{content:"\F57D"}.fa-globe-asia:before{content:"\F57E"}.fa-globe-europe:before{content:"\F7A2"}.fa-gofore:before{content:"\F3A7"}.fa-golf-ball:before{content:"\F450"}.fa-goodreads:before{content:"\F3A8"}.fa-goodreads-g:before{content:"\F3A9"}.fa-google:before{content:"\F1A0"}.fa-google-drive:before{content:"\F3AA"}.fa-google-pay:before{content:"\E079"}.fa-google-play:before{content:"\F3AB"}.fa-google-plus:before{content:"\F2B3"}.fa-google-plus-g:before{content:"\F0D5"}.fa-google-plus-square:before{content:"\F0D4"}.fa-google-wallet:before{content:"\F1EE"}.fa-gopuram:before{content:"\F664"}.fa-graduation-cap:before{content:"\F19D"}.fa-gratipay:before{content:"\F184"}.fa-grav:before{content:"\F2D6"}.fa-greater-than:before{content:"\F531"}.fa-greater-than-equal:before{content:"\F532"}.fa-grimace:before{content:"\F57F"}.fa-grin:before{content:"\F580"}.fa-grin-alt:before{content:"\F581"}.fa-grin-beam:before{content:"\F582"}.fa-grin-beam-sweat:before{content:"\F583"}.fa-grin-hearts:before{content:"\F584"}.fa-grin-squint:before{content:"\F585"}.fa-grin-squint-tears:before{content:"\F586"}.fa-grin-stars:before{content:"\F587"}.fa-grin-tears:before{content:"\F588"}.fa-grin-tongue:before{content:"\F589"}.fa-grin-tongue-squint:before{content:"\F58A"}.fa-grin-tongue-wink:before{content:"\F58B"}.fa-grin-wink:before{content:"\F58C"}.fa-grip-horizontal:before{content:"\F58D"}.fa-grip-lines:before{content:"\F7A4"}.fa-grip-lines-vertical:before{content:"\F7A5"}.fa-grip-vertical:before{content:"\F58E"}.fa-gripfire:before{content:"\F3AC"}.fa-grunt:before{content:"\F3AD"}.fa-guilded:before{content:"\E07E"}.fa-guitar:before{content:"\F7A6"}.fa-gulp:before{content:"\F3AE"}.fa-h-square:before{content:"\F0FD"}.fa-hacker-news:before{content:"\F1D4"}.fa-hacker-news-square:before{content:"\F3AF"}.fa-hackerrank:before{content:"\F5F7"}.fa-hamburger:before{content:"\F805"}.fa-hammer:before{content:"\F6E3"}.fa-hamsa:before{content:"\F665"}.fa-hand-holding:before{content:"\F4BD"}.fa-hand-holding-heart:before{content:"\F4BE"}.fa-hand-holding-medical:before{content:"\E05C"}.fa-hand-holding-usd:before{content:"\F4C0"}.fa-hand-holding-water:before{content:"\F4C1"}.fa-hand-lizard:before{content:"\F258"}.fa-hand-middle-finger:before{content:"\F806"}.fa-hand-paper:before{content:"\F256"}.fa-hand-peace:before{content:"\F25B"}.fa-hand-point-down:before{content:"\F0A7"}.fa-hand-point-left:before{content:"\F0A5"}.fa-hand-point-right:before{content:"\F0A4"}.fa-hand-point-up:before{content:"\F0A6"}.fa-hand-pointer:before{content:"\F25A"}.fa-hand-rock:before{content:"\F255"}.fa-hand-scissors:before{content:"\F257"}.fa-hand-sparkles:before{content:"\E05D"}.fa-hand-spock:before{content:"\F259"}.fa-hands:before{content:"\F4C2"}.fa-hands-helping:before{content:"\F4C4"}.fa-hands-wash:before{content:"\E05E"}.fa-handshake:before{content:"\F2B5"}.fa-handshake-alt-slash:before{content:"\E05F"}.fa-handshake-slash:before{content:"\E060"}.fa-hanukiah:before{content:"\F6E6"}.fa-hard-hat:before{content:"\F807"}.fa-hashtag:before{content:"\F292"}.fa-hat-cowboy:before{content:"\F8C0"}.fa-hat-cowboy-side:before{content:"\F8C1"}.fa-hat-wizard:before{content:"\F6E8"}.fa-hdd:before{content:"\F0A0"}.fa-head-side-cough:before{content:"\E061"}.fa-head-side-cough-slash:before{content:"\E062"}.fa-head-side-mask:before{content:"\E063"}.fa-head-side-virus:before{content:"\E064"}.fa-heading:before{content:"\F1DC"}.fa-headphones:before{content:"\F025"}.fa-headphones-alt:before{content:"\F58F"}.fa-headset:before{content:"\F590"}.fa-heart:before{content:"\F004"}.fa-heart-broken:before{content:"\F7A9"}.fa-heartbeat:before{content:"\F21E"}.fa-helicopter:before{content:"\F533"}.fa-highlighter:before{content:"\F591"}.fa-hiking:before{content:"\F6EC"}.fa-hippo:before{content:"\F6ED"}.fa-hips:before{content:"\F452"}.fa-hire-a-helper:before{content:"\F3B0"}.fa-history:before{content:"\F1DA"}.fa-hive:before{content:"\E07F"}.fa-hockey-puck:before{content:"\F453"}.fa-holly-berry:before{content:"\F7AA"}.fa-home:before{content:"\F015"}.fa-hooli:before{content:"\F427"}.fa-hornbill:before{content:"\F592"}.fa-horse:before{content:"\F6F0"}.fa-horse-head:before{content:"\F7AB"}.fa-hospital:before{content:"\F0F8"}.fa-hospital-alt:before{content:"\F47D"}.fa-hospital-symbol:before{content:"\F47E"}.fa-hospital-user:before{content:"\F80D"}.fa-hot-tub:before{content:"\F593"}.fa-hotdog:before{content:"\F80F"}.fa-hotel:before{content:"\F594"}.fa-hotjar:before{content:"\F3B1"}.fa-hourglass:before{content:"\F254"}.fa-hourglass-end:before{content:"\F253"}.fa-hourglass-half:before{content:"\F252"}.fa-hourglass-start:before{content:"\F251"}.fa-house-damage:before{content:"\F6F1"}.fa-house-user:before{content:"\E065"}.fa-houzz:before{content:"\F27C"}.fa-hryvnia:before{content:"\F6F2"}.fa-html5:before{content:"\F13B"}.fa-hubspot:before{content:"\F3B2"}.fa-i-cursor:before{content:"\F246"}.fa-ice-cream:before{content:"\F810"}.fa-icicles:before{content:"\F7AD"}.fa-icons:before{content:"\F86D"}.fa-id-badge:before{content:"\F2C1"}.fa-id-card:before{content:"\F2C2"}.fa-id-card-alt:before{content:"\F47F"}.fa-ideal:before{content:"\E013"}.fa-igloo:before{content:"\F7AE"}.fa-image:before{content:"\F03E"}.fa-images:before{content:"\F302"}.fa-imdb:before{content:"\F2D8"}.fa-inbox:before{content:"\F01C"}.fa-indent:before{content:"\F03C"}.fa-industry:before{content:"\F275"}.fa-infinity:before{content:"\F534"}.fa-info:before{content:"\F129"}.fa-info-circle:before{content:"\F05A"}.fa-innosoft:before{content:"\E080"}.fa-instagram:before{content:"\F16D"}.fa-instagram-square:before{content:"\E055"}.fa-instalod:before{content:"\E081"}.fa-intercom:before{content:"\F7AF"}.fa-internet-explorer:before{content:"\F26B"}.fa-invision:before{content:"\F7B0"}.fa-ioxhost:before{content:"\F208"}.fa-italic:before{content:"\F033"}.fa-itch-io:before{content:"\F83A"}.fa-itunes:before{content:"\F3B4"}.fa-itunes-note:before{content:"\F3B5"}.fa-java:before{content:"\F4E4"}.fa-jedi:before{content:"\F669"}.fa-jedi-order:before{content:"\F50E"}.fa-jenkins:before{content:"\F3B6"}.fa-jira:before{content:"\F7B1"}.fa-joget:before{content:"\F3B7"}.fa-joint:before{content:"\F595"}.fa-joomla:before{content:"\F1AA"}.fa-journal-whills:before{content:"\F66A"}.fa-js:before{content:"\F3B8"}.fa-js-square:before{content:"\F3B9"}.fa-jsfiddle:before{content:"\F1CC"}.fa-kaaba:before{content:"\F66B"}.fa-kaggle:before{content:"\F5FA"}.fa-key:before{content:"\F084"}.fa-keybase:before{content:"\F4F5"}.fa-keyboard:before{content:"\F11C"}.fa-keycdn:before{content:"\F3BA"}.fa-khanda:before{content:"\F66D"}.fa-kickstarter:before{content:"\F3BB"}.fa-kickstarter-k:before{content:"\F3BC"}.fa-kiss:before{content:"\F596"}.fa-kiss-beam:before{content:"\F597"}.fa-kiss-wink-heart:before{content:"\F598"}.fa-kiwi-bird:before{content:"\F535"}.fa-korvue:before{content:"\F42F"}.fa-landmark:before{content:"\F66F"}.fa-language:before{content:"\F1AB"}.fa-laptop:before{content:"\F109"}.fa-laptop-code:before{content:"\F5FC"}.fa-laptop-house:before{content:"\E066"}.fa-laptop-medical:before{content:"\F812"}.fa-laravel:before{content:"\F3BD"}.fa-lastfm:before{content:"\F202"}.fa-lastfm-square:before{content:"\F203"}.fa-laugh:before{content:"\F599"}.fa-laugh-beam:before{content:"\F59A"}.fa-laugh-squint:before{content:"\F59B"}.fa-laugh-wink:before{content:"\F59C"}.fa-layer-group:before{content:"\F5FD"}.fa-leaf:before{content:"\F06C"}.fa-leanpub:before{content:"\F212"}.fa-lemon:before{content:"\F094"}.fa-less:before{content:"\F41D"}.fa-less-than:before{content:"\F536"}.fa-less-than-equal:before{content:"\F537"}.fa-level-down-alt:before{content:"\F3BE"}.fa-level-up-alt:before{content:"\F3BF"}.fa-life-ring:before{content:"\F1CD"}.fa-lightbulb:before{content:"\F0EB"}.fa-line:before{content:"\F3C0"}.fa-link:before{content:"\F0C1"}.fa-linkedin:before{content:"\F08C"}.fa-linkedin-in:before{content:"\F0E1"}.fa-linode:before{content:"\F2B8"}.fa-linux:before{content:"\F17C"}.fa-lira-sign:before{content:"\F195"}.fa-list:before{content:"\F03A"}.fa-list-alt:before{content:"\F022"}.fa-list-ol:before{content:"\F0CB"}.fa-list-ul:before{content:"\F0CA"}.fa-location-arrow:before{content:"\F124"}.fa-lock:before{content:"\F023"}.fa-lock-open:before{content:"\F3C1"}.fa-long-arrow-alt-down:before{content:"\F309"}.fa-long-arrow-alt-left:before{content:"\F30A"}.fa-long-arrow-alt-right:before{content:"\F30B"}.fa-long-arrow-alt-up:before{content:"\F30C"}.fa-low-vision:before{content:"\F2A8"}.fa-luggage-cart:before{content:"\F59D"}.fa-lungs:before{content:"\F604"}.fa-lungs-virus:before{content:"\E067"}.fa-lyft:before{content:"\F3C3"}.fa-magento:before{content:"\F3C4"}.fa-magic:before{content:"\F0D0"}.fa-magnet:before{content:"\F076"}.fa-mail-bulk:before{content:"\F674"}.fa-mailchimp:before{content:"\F59E"}.fa-male:before{content:"\F183"}.fa-mandalorian:before{content:"\F50F"}.fa-map:before{content:"\F279"}.fa-map-marked:before{content:"\F59F"}.fa-map-marked-alt:before{content:"\F5A0"}.fa-map-marker:before{content:"\F041"}.fa-map-marker-alt:before{content:"\F3C5"}.fa-map-pin:before{content:"\F276"}.fa-map-signs:before{content:"\F277"}.fa-markdown:before{content:"\F60F"}.fa-marker:before{content:"\F5A1"}.fa-mars:before{content:"\F222"}.fa-mars-double:before{content:"\F227"}.fa-mars-stroke:before{content:"\F229"}.fa-mars-stroke-h:before{content:"\F22B"}.fa-mars-stroke-v:before{content:"\F22A"}.fa-mask:before{content:"\F6FA"}.fa-mastodon:before{content:"\F4F6"}.fa-maxcdn:before{content:"\F136"}.fa-mdb:before{content:"\F8CA"}.fa-medal:before{content:"\F5A2"}.fa-medapps:before{content:"\F3C6"}.fa-medium:before{content:"\F23A"}.fa-medium-m:before{content:"\F3C7"}.fa-medkit:before{content:"\F0FA"}.fa-medrt:before{content:"\F3C8"}.fa-meetup:before{content:"\F2E0"}.fa-megaport:before{content:"\F5A3"}.fa-meh:before{content:"\F11A"}.fa-meh-blank:before{content:"\F5A4"}.fa-meh-rolling-eyes:before{content:"\F5A5"}.fa-memory:before{content:"\F538"}.fa-mendeley:before{content:"\F7B3"}.fa-menorah:before{content:"\F676"}.fa-mercury:before{content:"\F223"}.fa-meteor:before{content:"\F753"}.fa-microblog:before{content:"\E01A"}.fa-microchip:before{content:"\F2DB"}.fa-microphone:before{content:"\F130"}.fa-microphone-alt:before{content:"\F3C9"}.fa-microphone-alt-slash:before{content:"\F539"}.fa-microphone-slash:before{content:"\F131"}.fa-microscope:before{content:"\F610"}.fa-microsoft:before{content:"\F3CA"}.fa-minus:before{content:"\F068"}.fa-minus-circle:before{content:"\F056"}.fa-minus-square:before{content:"\F146"}.fa-mitten:before{content:"\F7B5"}.fa-mix:before{content:"\F3CB"}.fa-mixcloud:before{content:"\F289"}.fa-mixer:before{content:"\E056"}.fa-mizuni:before{content:"\F3CC"}.fa-mobile:before{content:"\F10B"}.fa-mobile-alt:before{content:"\F3CD"}.fa-modx:before{content:"\F285"}.fa-monero:before{content:"\F3D0"}.fa-money-bill:before{content:"\F0D6"}.fa-money-bill-alt:before{content:"\F3D1"}.fa-money-bill-wave:before{content:"\F53A"}.fa-money-bill-wave-alt:before{content:"\F53B"}.fa-money-check:before{content:"\F53C"}.fa-money-check-alt:before{content:"\F53D"}.fa-monument:before{content:"\F5A6"}.fa-moon:before{content:"\F186"}.fa-mortar-pestle:before{content:"\F5A7"}.fa-mosque:before{content:"\F678"}.fa-motorcycle:before{content:"\F21C"}.fa-mountain:before{content:"\F6FC"}.fa-mouse:before{content:"\F8CC"}.fa-mouse-pointer:before{content:"\F245"}.fa-mug-hot:before{content:"\F7B6"}.fa-music:before{content:"\F001"}.fa-napster:before{content:"\F3D2"}.fa-neos:before{content:"\F612"}.fa-network-wired:before{content:"\F6FF"}.fa-neuter:before{content:"\F22C"}.fa-newspaper:before{content:"\F1EA"}.fa-nimblr:before{content:"\F5A8"}.fa-node:before{content:"\F419"}.fa-node-js:before{content:"\F3D3"}.fa-not-equal:before{content:"\F53E"}.fa-notes-medical:before{content:"\F481"}.fa-npm:before{content:"\F3D4"}.fa-ns8:before{content:"\F3D5"}.fa-nutritionix:before{content:"\F3D6"}.fa-object-group:before{content:"\F247"}.fa-object-ungroup:before{content:"\F248"}.fa-octopus-deploy:before{content:"\E082"}.fa-odnoklassniki:before{content:"\F263"}.fa-odnoklassniki-square:before{content:"\F264"}.fa-oil-can:before{content:"\F613"}.fa-old-republic:before{content:"\F510"}.fa-om:before{content:"\F679"}.fa-opencart:before{content:"\F23D"}.fa-openid:before{content:"\F19B"}.fa-opera:before{content:"\F26A"}.fa-optin-monster:before{content:"\F23C"}.fa-orcid:before{content:"\F8D2"}.fa-osi:before{content:"\F41A"}.fa-otter:before{content:"\F700"}.fa-outdent:before{content:"\F03B"}.fa-page4:before{content:"\F3D7"}.fa-pagelines:before{content:"\F18C"}.fa-pager:before{content:"\F815"}.fa-paint-brush:before{content:"\F1FC"}.fa-paint-roller:before{content:"\F5AA"}.fa-palette:before{content:"\F53F"}.fa-palfed:before{content:"\F3D8"}.fa-pallet:before{content:"\F482"}.fa-paper-plane:before{content:"\F1D8"}.fa-paperclip:before{content:"\F0C6"}.fa-parachute-box:before{content:"\F4CD"}.fa-paragraph:before{content:"\F1DD"}.fa-parking:before{content:"\F540"}.fa-passport:before{content:"\F5AB"}.fa-pastafarianism:before{content:"\F67B"}.fa-paste:before{content:"\F0EA"}.fa-patreon:before{content:"\F3D9"}.fa-pause:before{content:"\F04C"}.fa-pause-circle:before{content:"\F28B"}.fa-paw:before{content:"\F1B0"}.fa-paypal:before{content:"\F1ED"}.fa-peace:before{content:"\F67C"}.fa-pen:before{content:"\F304"}.fa-pen-alt:before{content:"\F305"}.fa-pen-fancy:before{content:"\F5AC"}.fa-pen-nib:before{content:"\F5AD"}.fa-pen-square:before{content:"\F14B"}.fa-pencil-alt:before{content:"\F303"}.fa-pencil-ruler:before{content:"\F5AE"}.fa-penny-arcade:before{content:"\F704"}.fa-people-arrows:before{content:"\E068"}.fa-people-carry:before{content:"\F4CE"}.fa-pepper-hot:before{content:"\F816"}.fa-perbyte:before{content:"\E083"}.fa-percent:before{content:"\F295"}.fa-percentage:before{content:"\F541"}.fa-periscope:before{content:"\F3DA"}.fa-person-booth:before{content:"\F756"}.fa-phabricator:before{content:"\F3DB"}.fa-phoenix-framework:before{content:"\F3DC"}.fa-phoenix-squadron:before{content:"\F511"}.fa-phone:before{content:"\F095"}.fa-phone-alt:before{content:"\F879"}.fa-phone-slash:before{content:"\F3DD"}.fa-phone-square:before{content:"\F098"}.fa-phone-square-alt:before{content:"\F87B"}.fa-phone-volume:before{content:"\F2A0"}.fa-photo-video:before{content:"\F87C"}.fa-php:before{content:"\F457"}.fa-pied-piper:before{content:"\F2AE"}.fa-pied-piper-alt:before{content:"\F1A8"}.fa-pied-piper-hat:before{content:"\F4E5"}.fa-pied-piper-pp:before{content:"\F1A7"}.fa-pied-piper-square:before{content:"\E01E"}.fa-piggy-bank:before{content:"\F4D3"}.fa-pills:before{content:"\F484"}.fa-pinterest:before{content:"\F0D2"}.fa-pinterest-p:before{content:"\F231"}.fa-pinterest-square:before{content:"\F0D3"}.fa-pizza-slice:before{content:"\F818"}.fa-place-of-worship:before{content:"\F67F"}.fa-plane:before{content:"\F072"}.fa-plane-arrival:before{content:"\F5AF"}.fa-plane-departure:before{content:"\F5B0"}.fa-plane-slash:before{content:"\E069"}.fa-play:before{content:"\F04B"}.fa-play-circle:before{content:"\F144"}.fa-playstation:before{content:"\F3DF"}.fa-plug:before{content:"\F1E6"}.fa-plus:before{content:"\F067"}.fa-plus-circle:before{content:"\F055"}.fa-plus-square:before{content:"\F0FE"}.fa-podcast:before{content:"\F2CE"}.fa-poll:before{content:"\F681"}.fa-poll-h:before{content:"\F682"}.fa-poo:before{content:"\F2FE"}.fa-poo-storm:before{content:"\F75A"}.fa-poop:before{content:"\F619"}.fa-portrait:before{content:"\F3E0"}.fa-pound-sign:before{content:"\F154"}.fa-power-off:before{content:"\F011"}.fa-pray:before{content:"\F683"}.fa-praying-hands:before{content:"\F684"}.fa-prescription:before{content:"\F5B1"}.fa-prescription-bottle:before{content:"\F485"}.fa-prescription-bottle-alt:before{content:"\F486"}.fa-print:before{content:"\F02F"}.fa-procedures:before{content:"\F487"}.fa-product-hunt:before{content:"\F288"}.fa-project-diagram:before{content:"\F542"}.fa-pump-medical:before{content:"\E06A"}.fa-pump-soap:before{content:"\E06B"}.fa-pushed:before{content:"\F3E1"}.fa-puzzle-piece:before{content:"\F12E"}.fa-python:before{content:"\F3E2"}.fa-qq:before{content:"\F1D6"}.fa-qrcode:before{content:"\F029"}.fa-question:before{content:"\F128"}.fa-question-circle:before{content:"\F059"}.fa-quidditch:before{content:"\F458"}.fa-quinscape:before{content:"\F459"}.fa-quora:before{content:"\F2C4"}.fa-quote-left:before{content:"\F10D"}.fa-quote-right:before{content:"\F10E"}.fa-quran:before{content:"\F687"}.fa-r-project:before{content:"\F4F7"}.fa-radiation:before{content:"\F7B9"}.fa-radiation-alt:before{content:"\F7BA"}.fa-rainbow:before{content:"\F75B"}.fa-random:before{content:"\F074"}.fa-raspberry-pi:before{content:"\F7BB"}.fa-ravelry:before{content:"\F2D9"}.fa-react:before{content:"\F41B"}.fa-reacteurope:before{content:"\F75D"}.fa-readme:before{content:"\F4D5"}.fa-rebel:before{content:"\F1D0"}.fa-receipt:before{content:"\F543"}.fa-record-vinyl:before{content:"\F8D9"}.fa-recycle:before{content:"\F1B8"}.fa-red-river:before{content:"\F3E3"}.fa-reddit:before{content:"\F1A1"}.fa-reddit-alien:before{content:"\F281"}.fa-reddit-square:before{content:"\F1A2"}.fa-redhat:before{content:"\F7BC"}.fa-redo:before{content:"\F01E"}.fa-redo-alt:before{content:"\F2F9"}.fa-registered:before{content:"\F25D"}.fa-remove-format:before{content:"\F87D"}.fa-renren:before{content:"\F18B"}.fa-reply:before{content:"\F3E5"}.fa-reply-all:before{content:"\F122"}.fa-replyd:before{content:"\F3E6"}.fa-republican:before{content:"\F75E"}.fa-researchgate:before{content:"\F4F8"}.fa-resolving:before{content:"\F3E7"}.fa-restroom:before{content:"\F7BD"}.fa-retweet:before{content:"\F079"}.fa-rev:before{content:"\F5B2"}.fa-ribbon:before{content:"\F4D6"}.fa-ring:before{content:"\F70B"}.fa-road:before{content:"\F018"}.fa-robot:before{content:"\F544"}.fa-rocket:before{content:"\F135"}.fa-rocketchat:before{content:"\F3E8"}.fa-rockrms:before{content:"\F3E9"}.fa-route:before{content:"\F4D7"}.fa-rss:before{content:"\F09E"}.fa-rss-square:before{content:"\F143"}.fa-ruble-sign:before{content:"\F158"}.fa-ruler:before{content:"\F545"}.fa-ruler-combined:before{content:"\F546"}.fa-ruler-horizontal:before{content:"\F547"}.fa-ruler-vertical:before{content:"\F548"}.fa-running:before{content:"\F70C"}.fa-rupee-sign:before{content:"\F156"}.fa-rust:before{content:"\E07A"}.fa-sad-cry:before{content:"\F5B3"}.fa-sad-tear:before{content:"\F5B4"}.fa-safari:before{content:"\F267"}.fa-salesforce:before{content:"\F83B"}.fa-sass:before{content:"\F41E"}.fa-satellite:before{content:"\F7BF"}.fa-satellite-dish:before{content:"\F7C0"}.fa-save:before{content:"\F0C7"}.fa-schlix:before{content:"\F3EA"}.fa-school:before{content:"\F549"}.fa-screwdriver:before{content:"\F54A"}.fa-scribd:before{content:"\F28A"}.fa-scroll:before{content:"\F70E"}.fa-sd-card:before{content:"\F7C2"}.fa-search:before{content:"\F002"}.fa-search-dollar:before{content:"\F688"}.fa-search-location:before{content:"\F689"}.fa-search-minus:before{content:"\F010"}.fa-search-plus:before{content:"\F00E"}.fa-searchengin:before{content:"\F3EB"}.fa-seedling:before{content:"\F4D8"}.fa-sellcast:before{content:"\F2DA"}.fa-sellsy:before{content:"\F213"}.fa-server:before{content:"\F233"}.fa-servicestack:before{content:"\F3EC"}.fa-shapes:before{content:"\F61F"}.fa-share:before{content:"\F064"}.fa-share-alt:before{content:"\F1E0"}.fa-share-alt-square:before{content:"\F1E1"}.fa-share-square:before{content:"\F14D"}.fa-shekel-sign:before{content:"\F20B"}.fa-shield-alt:before{content:"\F3ED"}.fa-shield-virus:before{content:"\E06C"}.fa-ship:before{content:"\F21A"}.fa-shipping-fast:before{content:"\F48B"}.fa-shirtsinbulk:before{content:"\F214"}.fa-shoe-prints:before{content:"\F54B"}.fa-shopify:before{content:"\E057"}.fa-shopping-bag:before{content:"\F290"}.fa-shopping-basket:before{content:"\F291"}.fa-shopping-cart:before{content:"\F07A"}.fa-shopware:before{content:"\F5B5"}.fa-shower:before{content:"\F2CC"}.fa-shuttle-van:before{content:"\F5B6"}.fa-sign:before{content:"\F4D9"}.fa-sign-in-alt:before{content:"\F2F6"}.fa-sign-language:before{content:"\F2A7"}.fa-sign-out-alt:before{content:"\F2F5"}.fa-signal:before{content:"\F012"}.fa-signature:before{content:"\F5B7"}.fa-sim-card:before{content:"\F7C4"}.fa-simplybuilt:before{content:"\F215"}.fa-sink:before{content:"\E06D"}.fa-sistrix:before{content:"\F3EE"}.fa-sitemap:before{content:"\F0E8"}.fa-sith:before{content:"\F512"}.fa-skating:before{content:"\F7C5"}.fa-sketch:before{content:"\F7C6"}.fa-skiing:before{content:"\F7C9"}.fa-skiing-nordic:before{content:"\F7CA"}.fa-skull:before{content:"\F54C"}.fa-skull-crossbones:before{content:"\F714"}.fa-skyatlas:before{content:"\F216"}.fa-skype:before{content:"\F17E"}.fa-slack:before{content:"\F198"}.fa-slack-hash:before{content:"\F3EF"}.fa-slash:before{content:"\F715"}.fa-sleigh:before{content:"\F7CC"}.fa-sliders-h:before{content:"\F1DE"}.fa-slideshare:before{content:"\F1E7"}.fa-smile:before{content:"\F118"}.fa-smile-beam:before{content:"\F5B8"}.fa-smile-wink:before{content:"\F4DA"}.fa-smog:before{content:"\F75F"}.fa-smoking:before{content:"\F48D"}.fa-smoking-ban:before{content:"\F54D"}.fa-sms:before{content:"\F7CD"}.fa-snapchat:before{content:"\F2AB"}.fa-snapchat-ghost:before{content:"\F2AC"}.fa-snapchat-square:before{content:"\F2AD"}.fa-snowboarding:before{content:"\F7CE"}.fa-snowflake:before{content:"\F2DC"}.fa-snowman:before{content:"\F7D0"}.fa-snowplow:before{content:"\F7D2"}.fa-soap:before{content:"\E06E"}.fa-socks:before{content:"\F696"}.fa-solar-panel:before{content:"\F5BA"}.fa-sort:before{content:"\F0DC"}.fa-sort-alpha-down:before{content:"\F15D"}.fa-sort-alpha-down-alt:before{content:"\F881"}.fa-sort-alpha-up:before{content:"\F15E"}.fa-sort-alpha-up-alt:before{content:"\F882"}.fa-sort-amount-down:before{content:"\F160"}.fa-sort-amount-down-alt:before{content:"\F884"}.fa-sort-amount-up:before{content:"\F161"}.fa-sort-amount-up-alt:before{content:"\F885"}.fa-sort-down:before{content:"\F0DD"}.fa-sort-numeric-down:before{content:"\F162"}.fa-sort-numeric-down-alt:before{content:"\F886"}.fa-sort-numeric-up:before{content:"\F163"}.fa-sort-numeric-up-alt:before{content:"\F887"}.fa-sort-up:before{content:"\F0DE"}.fa-soundcloud:before{content:"\F1BE"}.fa-sourcetree:before{content:"\F7D3"}.fa-spa:before{content:"\F5BB"}.fa-space-shuttle:before{content:"\F197"}.fa-speakap:before{content:"\F3F3"}.fa-speaker-deck:before{content:"\F83C"}.fa-spell-check:before{content:"\F891"}.fa-spider:before{content:"\F717"}.fa-spinner:before{content:"\F110"}.fa-splotch:before{content:"\F5BC"}.fa-spotify:before{content:"\F1BC"}.fa-spray-can:before{content:"\F5BD"}.fa-square:before{content:"\F0C8"}.fa-square-full:before{content:"\F45C"}.fa-square-root-alt:before{content:"\F698"}.fa-squarespace:before{content:"\F5BE"}.fa-stack-exchange:before{content:"\F18D"}.fa-stack-overflow:before{content:"\F16C"}.fa-stackpath:before{content:"\F842"}.fa-stamp:before{content:"\F5BF"}.fa-star:before{content:"\F005"}.fa-star-and-crescent:before{content:"\F699"}.fa-star-half:before{content:"\F089"}.fa-star-half-alt:before{content:"\F5C0"}.fa-star-of-david:before{content:"\F69A"}.fa-star-of-life:before{content:"\F621"}.fa-staylinked:before{content:"\F3F5"}.fa-steam:before{content:"\F1B6"}.fa-steam-square:before{content:"\F1B7"}.fa-steam-symbol:before{content:"\F3F6"}.fa-step-backward:before{content:"\F048"}.fa-step-forward:before{content:"\F051"}.fa-stethoscope:before{content:"\F0F1"}.fa-sticker-mule:before{content:"\F3F7"}.fa-sticky-note:before{content:"\F249"}.fa-stop:before{content:"\F04D"}.fa-stop-circle:before{content:"\F28D"}.fa-stopwatch:before{content:"\F2F2"}.fa-stopwatch-20:before{content:"\E06F"}.fa-store:before{content:"\F54E"}.fa-store-alt:before{content:"\F54F"}.fa-store-alt-slash:before{content:"\E070"}.fa-store-slash:before{content:"\E071"}.fa-strava:before{content:"\F428"}.fa-stream:before{content:"\F550"}.fa-street-view:before{content:"\F21D"}.fa-strikethrough:before{content:"\F0CC"}.fa-stripe:before{content:"\F429"}.fa-stripe-s:before{content:"\F42A"}.fa-stroopwafel:before{content:"\F551"}.fa-studiovinari:before{content:"\F3F8"}.fa-stumbleupon:before{content:"\F1A4"}.fa-stumbleupon-circle:before{content:"\F1A3"}.fa-subscript:before{content:"\F12C"}.fa-subway:before{content:"\F239"}.fa-suitcase:before{content:"\F0F2"}.fa-suitcase-rolling:before{content:"\F5C1"}.fa-sun:before{content:"\F185"}.fa-superpowers:before{content:"\F2DD"}.fa-superscript:before{content:"\F12B"}.fa-supple:before{content:"\F3F9"}.fa-surprise:before{content:"\F5C2"}.fa-suse:before{content:"\F7D6"}.fa-swatchbook:before{content:"\F5C3"}.fa-swift:before{content:"\F8E1"}.fa-swimmer:before{content:"\F5C4"}.fa-swimming-pool:before{content:"\F5C5"}.fa-symfony:before{content:"\F83D"}.fa-synagogue:before{content:"\F69B"}.fa-sync:before{content:"\F021"}.fa-sync-alt:before{content:"\F2F1"}.fa-syringe:before{content:"\F48E"}.fa-table:before{content:"\F0CE"}.fa-table-tennis:before{content:"\F45D"}.fa-tablet:before{content:"\F10A"}.fa-tablet-alt:before{content:"\F3FA"}.fa-tablets:before{content:"\F490"}.fa-tachometer-alt:before{content:"\F3FD"}.fa-tag:before{content:"\F02B"}.fa-tags:before{content:"\F02C"}.fa-tape:before{content:"\F4DB"}.fa-tasks:before{content:"\F0AE"}.fa-taxi:before{content:"\F1BA"}.fa-teamspeak:before{content:"\F4F9"}.fa-teeth:before{content:"\F62E"}.fa-teeth-open:before{content:"\F62F"}.fa-telegram:before{content:"\F2C6"}.fa-telegram-plane:before{content:"\F3FE"}.fa-temperature-high:before{content:"\F769"}.fa-temperature-low:before{content:"\F76B"}.fa-tencent-weibo:before{content:"\F1D5"}.fa-tenge:before{content:"\F7D7"}.fa-terminal:before{content:"\F120"}.fa-text-height:before{content:"\F034"}.fa-text-width:before{content:"\F035"}.fa-th:before{content:"\F00A"}.fa-th-large:before{content:"\F009"}.fa-th-list:before{content:"\F00B"}.fa-the-red-yeti:before{content:"\F69D"}.fa-theater-masks:before{content:"\F630"}.fa-themeco:before{content:"\F5C6"}.fa-themeisle:before{content:"\F2B2"}.fa-thermometer:before{content:"\F491"}.fa-thermometer-empty:before{content:"\F2CB"}.fa-thermometer-full:before{content:"\F2C7"}.fa-thermometer-half:before{content:"\F2C9"}.fa-thermometer-quarter:before{content:"\F2CA"}.fa-thermometer-three-quarters:before{content:"\F2C8"}.fa-think-peaks:before{content:"\F731"}.fa-thumbs-down:before{content:"\F165"}.fa-thumbs-up:before{content:"\F164"}.fa-thumbtack:before{content:"\F08D"}.fa-ticket-alt:before{content:"\F3FF"}.fa-tiktok:before{content:"\E07B"}.fa-times:before{content:"\F00D"}.fa-times-circle:before{content:"\F057"}.fa-tint:before{content:"\F043"}.fa-tint-slash:before{content:"\F5C7"}.fa-tired:before{content:"\F5C8"}.fa-toggle-off:before{content:"\F204"}.fa-toggle-on:before{content:"\F205"}.fa-toilet:before{content:"\F7D8"}.fa-toilet-paper:before{content:"\F71E"}.fa-toilet-paper-slash:before{content:"\E072"}.fa-toolbox:before{content:"\F552"}.fa-tools:before{content:"\F7D9"}.fa-tooth:before{content:"\F5C9"}.fa-torah:before{content:"\F6A0"}.fa-torii-gate:before{content:"\F6A1"}.fa-tractor:before{content:"\F722"}.fa-trade-federation:before{content:"\F513"}.fa-trademark:before{content:"\F25C"}.fa-traffic-light:before{content:"\F637"}.fa-trailer:before{content:"\E041"}.fa-train:before{content:"\F238"}.fa-tram:before{content:"\F7DA"}.fa-transgender:before{content:"\F224"}.fa-transgender-alt:before{content:"\F225"}.fa-trash:before{content:"\F1F8"}.fa-trash-alt:before{content:"\F2ED"}.fa-trash-restore:before{content:"\F829"}.fa-trash-restore-alt:before{content:"\F82A"}.fa-tree:before{content:"\F1BB"}.fa-trello:before{content:"\F181"}.fa-tripadvisor:before{content:"\F262"}.fa-trophy:before{content:"\F091"}.fa-truck:before{content:"\F0D1"}.fa-truck-loading:before{content:"\F4DE"}.fa-truck-monster:before{content:"\F63B"}.fa-truck-moving:before{content:"\F4DF"}.fa-truck-pickup:before{content:"\F63C"}.fa-tshirt:before{content:"\F553"}.fa-tty:before{content:"\F1E4"}.fa-tumblr:before{content:"\F173"}.fa-tumblr-square:before{content:"\F174"}.fa-tv:before{content:"\F26C"}.fa-twitch:before{content:"\F1E8"}.fa-twitter:before{content:"\F099"}.fa-twitter-square:before{content:"\F081"}.fa-typo3:before{content:"\F42B"}.fa-uber:before{content:"\F402"}.fa-ubuntu:before{content:"\F7DF"}.fa-uikit:before{content:"\F403"}.fa-umbraco:before{content:"\F8E8"}.fa-umbrella:before{content:"\F0E9"}.fa-umbrella-beach:before{content:"\F5CA"}.fa-uncharted:before{content:"\E084"}.fa-underline:before{content:"\F0CD"}.fa-undo:before{content:"\F0E2"}.fa-undo-alt:before{content:"\F2EA"}.fa-uniregistry:before{content:"\F404"}.fa-unity:before{content:"\E049"}.fa-universal-access:before{content:"\F29A"}.fa-university:before{content:"\F19C"}.fa-unlink:before{content:"\F127"}.fa-unlock:before{content:"\F09C"}.fa-unlock-alt:before{content:"\F13E"}.fa-unsplash:before{content:"\E07C"}.fa-untappd:before{content:"\F405"}.fa-upload:before{content:"\F093"}.fa-ups:before{content:"\F7E0"}.fa-usb:before{content:"\F287"}.fa-user:before{content:"\F007"}.fa-user-alt:before{content:"\F406"}.fa-user-alt-slash:before{content:"\F4FA"}.fa-user-astronaut:before{content:"\F4FB"}.fa-user-check:before{content:"\F4FC"}.fa-user-circle:before{content:"\F2BD"}.fa-user-clock:before{content:"\F4FD"}.fa-user-cog:before{content:"\F4FE"}.fa-user-edit:before{content:"\F4FF"}.fa-user-friends:before{content:"\F500"}.fa-user-graduate:before{content:"\F501"}.fa-user-injured:before{content:"\F728"}.fa-user-lock:before{content:"\F502"}.fa-user-md:before{content:"\F0F0"}.fa-user-minus:before{content:"\F503"}.fa-user-ninja:before{content:"\F504"}.fa-user-nurse:before{content:"\F82F"}.fa-user-plus:before{content:"\F234"}.fa-user-secret:before{content:"\F21B"}.fa-user-shield:before{content:"\F505"}.fa-user-slash:before{content:"\F506"}.fa-user-tag:before{content:"\F507"}.fa-user-tie:before{content:"\F508"}.fa-user-times:before{content:"\F235"}.fa-users:before{content:"\F0C0"}.fa-users-cog:before{content:"\F509"}.fa-users-slash:before{content:"\E073"}.fa-usps:before{content:"\F7E1"}.fa-ussunnah:before{content:"\F407"}.fa-utensil-spoon:before{content:"\F2E5"}.fa-utensils:before{content:"\F2E7"}.fa-vaadin:before{content:"\F408"}.fa-vector-square:before{content:"\F5CB"}.fa-venus:before{content:"\F221"}.fa-venus-double:before{content:"\F226"}.fa-venus-mars:before{content:"\F228"}.fa-vest:before{content:"\E085"}.fa-vest-patches:before{content:"\E086"}.fa-viacoin:before{content:"\F237"}.fa-viadeo:before{content:"\F2A9"}.fa-viadeo-square:before{content:"\F2AA"}.fa-vial:before{content:"\F492"}.fa-vials:before{content:"\F493"}.fa-viber:before{content:"\F409"}.fa-video:before{content:"\F03D"}.fa-video-slash:before{content:"\F4E2"}.fa-vihara:before{content:"\F6A7"}.fa-vimeo:before{content:"\F40A"}.fa-vimeo-square:before{content:"\F194"}.fa-vimeo-v:before{content:"\F27D"}.fa-vine:before{content:"\F1CA"}.fa-virus:before{content:"\E074"}.fa-virus-slash:before{content:"\E075"}.fa-viruses:before{content:"\E076"}.fa-vk:before{content:"\F189"}.fa-vnv:before{content:"\F40B"}.fa-voicemail:before{content:"\F897"}.fa-volleyball-ball:before{content:"\F45F"}.fa-volume-down:before{content:"\F027"}.fa-volume-mute:before{content:"\F6A9"}.fa-volume-off:before{content:"\F026"}.fa-volume-up:before{content:"\F028"}.fa-vote-yea:before{content:"\F772"}.fa-vr-cardboard:before{content:"\F729"}.fa-vuejs:before{content:"\F41F"}.fa-walking:before{content:"\F554"}.fa-wallet:before{content:"\F555"}.fa-warehouse:before{content:"\F494"}.fa-watchman-monitoring:before{content:"\E087"}.fa-water:before{content:"\F773"}.fa-wave-square:before{content:"\F83E"}.fa-waze:before{content:"\F83F"}.fa-weebly:before{content:"\F5CC"}.fa-weibo:before{content:"\F18A"}.fa-weight:before{content:"\F496"}.fa-weight-hanging:before{content:"\F5CD"}.fa-weixin:before{content:"\F1D7"}.fa-whatsapp:before{content:"\F232"}.fa-whatsapp-square:before{content:"\F40C"}.fa-wheelchair:before{content:"\F193"}.fa-whmcs:before{content:"\F40D"}.fa-wifi:before{content:"\F1EB"}.fa-wikipedia-w:before{content:"\F266"}.fa-wind:before{content:"\F72E"}.fa-window-close:before{content:"\F410"}.fa-window-maximize:before{content:"\F2D0"}.fa-window-minimize:before{content:"\F2D1"}.fa-window-restore:before{content:"\F2D2"}.fa-windows:before{content:"\F17A"}.fa-wine-bottle:before{content:"\F72F"}.fa-wine-glass:before{content:"\F4E3"}.fa-wine-glass-alt:before{content:"\F5CE"}.fa-wix:before{content:"\F5CF"}.fa-wizards-of-the-coast:before{content:"\F730"}.fa-wodu:before{content:"\E088"}.fa-wolf-pack-battalion:before{content:"\F514"}.fa-won-sign:before{content:"\F159"}.fa-wordpress:before{content:"\F19A"}.fa-wordpress-simple:before{content:"\F411"}.fa-wpbeginner:before{content:"\F297"}.fa-wpexplorer:before{content:"\F2DE"}.fa-wpforms:before{content:"\F298"}.fa-wpressr:before{content:"\F3E4"}.fa-wrench:before{content:"\F0AD"}.fa-x-ray:before{content:"\F497"}.fa-xbox:before{content:"\F412"}.fa-xing:before{content:"\F168"}.fa-xing-square:before{content:"\F169"}.fa-y-combinator:before{content:"\F23B"}.fa-yahoo:before{content:"\F19E"}.fa-yammer:before{content:"\F840"}.fa-yandex:before{content:"\F413"}.fa-yandex-international:before{content:"\F414"}.fa-yarn:before{content:"\F7E3"}.fa-yelp:before{content:"\F1E9"}.fa-yen-sign:before{content:"\F157"}.fa-yin-yang:before{content:"\F6AD"}.fa-yoast:before{content:"\F2B1"}.fa-youtube:before{content:"\F167"}.fa-youtube-square:before{content:"\F431"}.fa-zhihu:before{content:"\F63F"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;font-display:block;src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?30cc681d4487d2f561035ba24a68c629);src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?30cc681d4487d2f561035ba24a68c629?#iefix) format("embedded-opentype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff2?f7307680c7fe85959f3ecf122493ea7d) format("woff2"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff?099a9556e1a63ece24f8a99859c94c7d) format("woff"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.ttf?3b89dd103490708d19a95adcae52210e) format("truetype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.svg?ba7ed552362f64d30f6d844974d89114#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;font-display:block;src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.eot?7630483dd4b0c48639d2ac54a894b450);src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.eot?7630483dd4b0c48639d2ac54a894b450?#iefix) format("embedded-opentype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.woff2?f0f8230116992e521526097a28f54066) format("woff2"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.woff?7124eb50fc8227c78269f2d995637ff5) format("woff"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.ttf?1f77739ca9ff2188b539c36f30ffa2be) format("truetype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-regular-400.svg?0bb428459c8ecfa61b22a03def1706e6#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;font-display:block;src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.eot?1042e8ca1ce821518a2d3e7055410839);src:url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.eot?1042e8ca1ce821518a2d3e7055410839?#iefix) format("embedded-opentype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff2?e8a427e15cc502bef99cfd722b37ea98) format("woff2"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff?9fe5a17c8ab036d20e6c5ba3fd2ac511) format("woff"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?605ed7926cf39a2ad5ec2d1f9d391d3d) format("truetype"),url(/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.svg?376c1f97f6553dea1ca9b3f9081889bd#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900}/*! * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * @@ -38,13 +38,6 @@ * along with this program. If not, see . */ -/*! - * Bootstrap v4.6.0 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;background-color:transparent}a,a:hover{text-decoration:none}a:hover{color:#0056b3}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;box-shadow:0 1px 2px rgba(0,0,0,.075)}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem;box-shadow:inset 0 -.1rem 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:7.5px;padding-left:7.5px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-7.5px;margin-left:-7.5px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.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-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:7.5px;padding-left:7.5px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;color:#212529;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#383f45}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#383f45}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;box-shadow:inset 0 0 0 transparent;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:inset 0 0 0 transparent}.form-control::-moz-placeholder{color:#939ba2;opacity:1}.form-control:-ms-input-placeholder{color:#939ba2;opacity:1}.form-control::placeholder{color:#939ba2;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:2.25rem;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 0 rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 0 rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 0 rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 0 rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:2.25rem;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 0 rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 0 rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 0 rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 0 rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{box-shadow:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff;box-shadow:none}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 0 rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d;box-shadow:none}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 0 rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745;box-shadow:none}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 0 rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8;box-shadow:none}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 0 rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(58,176,195,.5)}.btn-warning{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107;box-shadow:none}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#1f2d3d;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 0 rgba(221,171,15,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#1f2d3d;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(221,171,15,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545;box-shadow:none}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 0 rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(225,83,97,.5)}.btn-light{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa;box-shadow:none}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#1f2d3d;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 0 rgba(215,218,222,.5)}.btn-light.disabled,.btn-light:disabled{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#1f2d3d;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(215,218,222,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40;box-shadow:none}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 0 rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 0 rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 0 rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 0 rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 0 rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 0 rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 0 rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 0 rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 0 rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.175)}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle,.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.875rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.8125rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#007bff;background-color:#007bff;box-shadow:none}.custom-control-input:focus~.custom-control-label:before{box-shadow:inset 0 0 0 transparent,0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff;box-shadow:none}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#dee2e6;border:1px solid #adb5bd;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#007bff;background-color:#007bff;box-shadow:none}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23ffffff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23ffffff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#dee2e6;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select,.custom-select:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.custom-select:focus{border-color:#80bdff;outline:0}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.25rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:none}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(2.25rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;box-shadow:none}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.25rem;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0;margin-left:0;background-color:#007bff;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:.5rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#fff}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.75);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:0 solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:0 solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:.25rem .25rem 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:0 solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 .25rem .25rem}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:.25rem}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-img,.card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-deck .card{margin-bottom:7.5px}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-7.5px;margin-left:-7.5px}.card-deck .card{flex:1 0 0%;margin-right:7.5px;margin-bottom:0;margin-left:7.5px}}.card-group>.card{margin-bottom:7.5px}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#1f2d3d;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#1f2d3d;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#1f2d3d;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#1f2d3d;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem;box-shadow:inset 0 .1rem .1rem rgba(0,0,0,.1)}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .25rem .5rem rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #e9ecef;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-content{box-shadow:0 .5rem 1rem rgba(0,0,0,.5)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .25rem .5rem rgba(0,0,0,.2)}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.8571428571%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} - /*! * _variables.scss * Copyright (c) 2021 james@firefly-iii.org @@ -63,5 +56,12 @@ * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . - */html.scroll-smooth{scroll-behavior:smooth}.wrapper,body,html{min-height:100%}.wrapper{position:relative}.wrapper .content-wrapper{min-height:calc(100vh - 7rem - 2px)}.layout-boxed .wrapper{box-shadow:0 0 10 rgba(0,0,0,.3)}.layout-boxed .wrapper,.layout-boxed .wrapper:before{margin:0 auto;max-width:1250px}.layout-boxed .wrapper .main-sidebar{left:inherit}@supports not (-webkit-touch-callout:none){.layout-fixed .wrapper .sidebar{height:calc(100vh - 3.5rem - 1px)}.layout-fixed.text-sm .wrapper .sidebar{height:calc(100vh - 2.93725rem - 1px)}}.layout-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse .wrapper .brand-link,.layout-navbar-fixed.sidebar-mini.sidebar-collapse .wrapper .brand-link{height:calc(3.5rem + 1px);width:4.6rem}.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse.text-sm .wrapper .brand-link,.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse .wrapper .brand-link.text-sm,.layout-navbar-fixed.sidebar-mini.sidebar-collapse.text-sm .wrapper .brand-link,.layout-navbar-fixed.sidebar-mini.sidebar-collapse .wrapper .brand-link.text-sm{height:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .main-header{z-index:1033}.layout-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .control-sidebar{top:0}.layout-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .brand-link,.layout-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;z-index:1035}.layout-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-not-fixed .wrapper .brand-link{position:static}.layout-navbar-not-fixed .wrapper .content-wrapper,.layout-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-navbar-not-fixed .wrapper .main-header{position:static}.layout-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}@media (min-width:576px){.layout-sm-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-sm-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-sm-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-sm-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-sm-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed .wrapper .control-sidebar{top:0}.layout-sm-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-sm-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-sm-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-sm-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-sm-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-sm-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-sm-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-sm-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-sm-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-sm-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-sm-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-not-fixed .wrapper .brand-link{position:static}.layout-sm-navbar-not-fixed .wrapper .content-wrapper,.layout-sm-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-sm-navbar-not-fixed .wrapper .main-header{position:static}.layout-sm-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}@media (min-width:768px){.layout-md-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-md-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-md-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-md-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-md-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed .wrapper .control-sidebar{top:0}.layout-md-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-md-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-md-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-md-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-md-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-md-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-md-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-md-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-md-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-md-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-md-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-md-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-not-fixed .wrapper .brand-link{position:static}.layout-md-navbar-not-fixed .wrapper .content-wrapper,.layout-md-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-md-navbar-not-fixed .wrapper .main-header{position:static}.layout-md-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}@media (min-width:992px){.layout-lg-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-lg-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-lg-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-lg-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-lg-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed .wrapper .control-sidebar{top:0}.layout-lg-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-lg-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-lg-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-lg-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-lg-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-lg-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-lg-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-lg-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-lg-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-lg-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-lg-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-not-fixed .wrapper .brand-link{position:static}.layout-lg-navbar-not-fixed .wrapper .content-wrapper,.layout-lg-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-lg-navbar-not-fixed .wrapper .main-header{position:static}.layout-lg-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}@media (min-width:1200px){.layout-xl-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-xl-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-xl-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-xl-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-xl-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed .wrapper .control-sidebar{top:0}.layout-xl-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-xl-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-xl-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-xl-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-xl-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-xl-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-xl-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-xl-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-xl-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-xl-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-xl-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-not-fixed .wrapper .brand-link{position:static}.layout-xl-navbar-not-fixed .wrapper .content-wrapper,.layout-xl-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-xl-navbar-not-fixed .wrapper .main-header{position:static}.layout-xl-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}.layout-footer-not-fixed .wrapper .content-wrapper{margin-bottom:0}.layout-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-footer-not-fixed .wrapper .main-footer{position:static}@media (min-width:576px){.layout-sm-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-sm-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-sm-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-sm-footer-not-fixed .wrapper .main-footer{position:static}}@media (min-width:768px){.layout-md-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-md-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-md-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-md-footer-not-fixed .wrapper .main-footer{position:static}}@media (min-width:992px){.layout-lg-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-lg-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-lg-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-lg-footer-not-fixed .wrapper .main-footer{position:static}}@media (min-width:1200px){.layout-xl-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-xl-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-xl-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-xl-footer-not-fixed .wrapper .main-footer{position:static}}.layout-top-nav .wrapper{margin-left:0}.layout-top-nav .wrapper .main-header .brand-image{margin-top:-.5rem;margin-right:.2rem;height:33px}.layout-top-nav .wrapper .main-sidebar{bottom:inherit;height:inherit}.layout-top-nav .wrapper .content-wrapper,.layout-top-nav .wrapper .main-footer,.layout-top-nav .wrapper .main-header,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .content-wrapper,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .content-wrapper:before,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-footer,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-footer:before,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-header,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-header:before{margin-left:0}@media (min-width:768px){body:not(.sidebar-mini-md) .content-wrapper,body:not(.sidebar-mini-md) .main-footer,body:not(.sidebar-mini-md) .main-header{transition:margin-left .3s ease-in-out;margin-left:250px}}@media (min-width:768px) and (prefers-reduced-motion:reduce){body:not(.sidebar-mini-md) .content-wrapper,body:not(.sidebar-mini-md) .main-footer,body:not(.sidebar-mini-md) .main-header{transition:none}}@media (min-width:768px){.sidebar-collapse body:not(.sidebar-mini-md) .content-wrapper,.sidebar-collapse body:not(.sidebar-mini-md) .main-footer,.sidebar-collapse body:not(.sidebar-mini-md) .main-header{margin-left:0}}@media (max-width:991.98px){body:not(.sidebar-mini-md) .content-wrapper,body:not(.sidebar-mini-md) .content-wrapper:before,body:not(.sidebar-mini-md) .main-footer,body:not(.sidebar-mini-md) .main-footer:before,body:not(.sidebar-mini-md) .main-header,body:not(.sidebar-mini-md) .main-header:before{margin-left:0}}@media (min-width:768px){.sidebar-mini-md .content-wrapper,.sidebar-mini-md .main-footer,.sidebar-mini-md .main-header{transition:margin-left .3s ease-in-out;margin-left:250px}}@media (min-width:768px) and (prefers-reduced-motion:reduce){.sidebar-mini-md .content-wrapper,.sidebar-mini-md .main-footer,.sidebar-mini-md .main-header{transition:none}}@media (min-width:768px){.sidebar-collapse .sidebar-mini-md .content-wrapper,.sidebar-collapse .sidebar-mini-md .main-footer,.sidebar-collapse .sidebar-mini-md .main-header{margin-left:4.6rem}}@media (max-width:991.98px){.sidebar-mini-md .content-wrapper,.sidebar-mini-md .content-wrapper:before,.sidebar-mini-md .main-footer,.sidebar-mini-md .main-footer:before,.sidebar-mini-md .main-header,.sidebar-mini-md .main-header:before{margin-left:4.6rem}}.content-wrapper{background:#f4f6f9}.content-wrapper>.content{padding:0 .5rem}.main-sidebar,.main-sidebar:before{transition:margin-left .3s ease-in-out,width .3s ease-in-out;width:250px}@media (prefers-reduced-motion:reduce){.main-sidebar,.main-sidebar:before{transition:none}}.sidebar-collapse:not(.sidebar-mini):not(.sidebar-mini-md) .main-sidebar,.sidebar-collapse:not(.sidebar-mini):not(.sidebar-mini-md) .main-sidebar:before{box-shadow:none!important}.sidebar-collapse .main-sidebar,.sidebar-collapse .main-sidebar:before{margin-left:-250px}.sidebar-collapse .main-sidebar .nav-sidebar.nav-child-indent .nav-treeview{padding:0}@media (max-width:767.98px){.main-sidebar,.main-sidebar:before{box-shadow:none!important;margin-left:-250px}.sidebar-open .main-sidebar,.sidebar-open .main-sidebar:before{margin-left:0}}:not(.layout-fixed) .main-sidebar{height:inherit;min-height:100%;position:absolute;top:0}.layout-fixed .brand-link{width:250px}.layout-fixed .main-sidebar{left:0}.layout-fixed .control-sidebar,.layout-fixed .main-sidebar{bottom:0;float:none;height:100vh;position:fixed;top:0}.layout-fixed .control-sidebar .control-sidebar-content{height:calc(100vh - 3.5rem - 1px)}@supports (-webkit-touch-callout:none){.layout-fixed .main-sidebar{height:inherit}}.main-footer{background:#fff;border-top:1px solid #dee2e6;color:#869099;padding:1rem}.main-footer.text-sm,.text-sm .main-footer{padding:.812rem}.content-header{padding:15px .5rem}.text-sm .content-header{padding:10px .5rem}.content-header h1{font-size:1.8rem;margin:0}.text-sm .content-header h1{font-size:1.5rem}.content-header .breadcrumb{background:transparent;line-height:1.8rem;margin-bottom:0;padding:0}.text-sm .content-header .breadcrumb{line-height:1.5rem}.hold-transition .content-wrapper,.hold-transition .control-sidebar,.hold-transition .control-sidebar *,.hold-transition .main-footer,.hold-transition .main-header,.hold-transition .main-sidebar,.hold-transition .main-sidebar *{transition:none!important;-webkit-animation-duration:0s!important;animation-duration:0s!important}.main-header{border-bottom:1px solid #dee2e6;z-index:1034}.main-header .nav-link{height:2.5rem;position:relative}.main-header.text-sm .nav-link,.text-sm .main-header .nav-link{height:1.93725rem;padding:.35rem 1rem}.main-header.text-sm .nav-link>.fa,.main-header.text-sm .nav-link>.fab,.main-header.text-sm .nav-link>.far,.main-header.text-sm .nav-link>.fas,.main-header.text-sm .nav-link>.glyphicon,.main-header.text-sm .nav-link>.ion,.text-sm .main-header .nav-link>.fa,.text-sm .main-header .nav-link>.fab,.text-sm .main-header .nav-link>.far,.text-sm .main-header .nav-link>.fas,.text-sm .main-header .nav-link>.glyphicon,.text-sm .main-header .nav-link>.ion{font-size:.875rem}.main-header .navbar-nav .nav-item{margin:0}.main-header .navbar-nav[class*=-right] .dropdown-menu{left:auto;margin-top:-3px;right:0}@media (max-width:575.98px){.main-header .navbar-nav[class*=-right] .dropdown-menu{left:0;right:auto}}.navbar-img{height:calc(3.5rem + 1px)/2;width:auto}.navbar-badge{font-size:.6rem;font-weight:300;padding:2px 4px;position:absolute;right:5px;top:9px}.btn-navbar{background-color:transparent;border-left-width:0}.form-control-navbar{border-right-width:0}.form-control-navbar+.input-group-append{margin-left:0}.btn-navbar,.form-control-navbar{transition:none}.navbar-dark .btn-navbar,.navbar-dark .form-control-navbar{background-color:hsla(0,0%,100%,.2);border:0}.navbar-dark .form-control-navbar::-moz-placeholder{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar:-ms-input-placeholder{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar::placeholder{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar+.input-group-append>.btn-navbar{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar:focus,.navbar-dark .form-control-navbar:focus+.input-group-append .btn-navbar{background-color:hsla(0,0%,100%,.6);border:0!important;color:#343a40}.navbar-light .btn-navbar,.navbar-light .form-control-navbar{background-color:#f2f4f6;border:0}.navbar-light .form-control-navbar::-moz-placeholder{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar:-ms-input-placeholder{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar::placeholder{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar+.input-group-append>.btn-navbar{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar:focus,.navbar-light .form-control-navbar:focus+.input-group-append .btn-navbar{background-color:#e9ecef;border:0!important;color:#343a40}.brand-link{display:block;font-size:1.25rem;line-height:1.5;padding:.8125rem .5rem;transition:width .3s ease-in-out;white-space:nowrap}.brand-link:hover{color:#fff;text-decoration:none}.text-sm .brand-link{font-size:inherit}[class*=sidebar-dark] .brand-link{border-bottom:1px solid #4b545c;color:hsla(0,0%,100%,.8)}[class*=sidebar-light] .brand-link{border-bottom:1px solid #dee2e6;color:rgba(0,0,0,.8)}.brand-link .brand-image{float:left;line-height:.8;margin-left:.8rem;margin-right:.5rem;margin-top:-3px;max-height:33px;width:auto}.brand-link .brand-image-xs{float:left;line-height:.8;margin-top:-.1rem;max-height:33px;width:auto}.brand-link .brand-image-xl{line-height:.8;max-height:40px;width:auto}.brand-link .brand-image-xl.single{margin-top:-.3rem}.brand-link.text-sm .brand-image,.text-sm .brand-link .brand-image{height:29px;margin-bottom:-.25rem;margin-left:.95rem;margin-top:-.25rem}.brand-link.text-sm .brand-image-xs,.text-sm .brand-link .brand-image-xs{margin-top:-.2rem;max-height:29px}.brand-link.text-sm .brand-image-xl,.text-sm .brand-link .brand-image-xl{margin-top:-.225rem;max-height:38px}.main-sidebar{height:100vh;overflow-y:hidden;z-index:1038}.main-sidebar a:-moz-focusring{border:0;outline:none}.sidebar{height:calc(100% - 3.5rem - 1px);overflow-y:auto;padding:0 .5rem}.user-panel{position:relative}[class*=sidebar-dark] .user-panel{border-bottom:1px solid #4f5962}[class*=sidebar-light] .user-panel{border-bottom:1px solid #dee2e6}.user-panel,.user-panel .info{overflow:hidden;white-space:nowrap}.user-panel .image{display:inline-block;padding-left:.8rem}.user-panel img{height:auto;width:2.1rem}.user-panel .info{display:inline-block;padding:5px 5px 5px 10px}.user-panel .dropdown-menu,.user-panel .status{font-size:.875rem}.nav-sidebar .nav-item>.nav-link{margin-bottom:.2rem}.nav-sidebar .nav-item>.nav-link .right{transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-sidebar .nav-item>.nav-link .right{transition:none}}.nav-sidebar .nav-link>.right,.nav-sidebar .nav-link>p>.right{position:absolute;right:1rem;top:.7rem}.nav-sidebar .nav-link>.right i,.nav-sidebar .nav-link>.right span,.nav-sidebar .nav-link>p>.right i,.nav-sidebar .nav-link>p>.right span{margin-left:.5rem}.nav-sidebar .nav-link>.right:nth-child(2),.nav-sidebar .nav-link>p>.right:nth-child(2){right:2.2rem}.nav-sidebar .menu-open>.nav-treeview{display:block}.nav-sidebar .menu-open>.nav-link i.right{transform:rotate(-90deg)}.nav-sidebar>.nav-item{margin-bottom:0}.nav-sidebar>.nav-item .nav-icon{margin-left:.05rem;font-size:1.2rem;margin-right:.2rem;text-align:center;width:1.6rem}.nav-sidebar>.nav-item .nav-icon.fa,.nav-sidebar>.nav-item .nav-icon.fab,.nav-sidebar>.nav-item .nav-icon.far,.nav-sidebar>.nav-item .nav-icon.fas,.nav-sidebar>.nav-item .nav-icon.glyphicon,.nav-sidebar>.nav-item .nav-icon.ion{font-size:1.1rem}.nav-sidebar>.nav-item .float-right{margin-top:3px}.nav-sidebar .nav-treeview{display:none;list-style:none;padding:0}.nav-sidebar .nav-treeview>.nav-item>.nav-link>.nav-icon{width:1.6rem}.nav-sidebar.nav-child-indent .nav-treeview{transition:padding .3s ease-in-out;padding-left:1rem}.text-sm .nav-sidebar.nav-child-indent .nav-treeview{padding-left:.5rem}.nav-sidebar.nav-child-indent.nav-legacy .nav-treeview .nav-treeview{padding-left:2rem;margin-left:-1rem}.text-sm .nav-sidebar.nav-child-indent.nav-legacy .nav-treeview .nav-treeview{padding-left:1rem;margin-left:-.5rem}.nav-sidebar .nav-header{font-size:.9rem;padding:.5rem}.nav-sidebar .nav-header:not(:first-of-type){padding:1.7rem 1rem .5rem}.nav-sidebar .nav-link p{display:inline-block;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;margin:0}#sidebar-overlay{background-color:rgba(0,0,0,.1);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1037}@media (max-width:991.98px){.sidebar-open #sidebar-overlay{display:block}}[class*=sidebar-light-]{background-color:#fff}[class*=sidebar-light-] .user-panel a:hover{color:#212529}[class*=sidebar-light-] .user-panel .status{background:rgba(0,0,0,.1);color:#343a40}[class*=sidebar-light-] .user-panel .status:active,[class*=sidebar-light-] .user-panel .status:focus,[class*=sidebar-light-] .user-panel .status:hover{background:rgba(0,0,0,.1);color:#212529}[class*=sidebar-light-] .user-panel .dropdown-menu{box-shadow:0 2px 4px rgba(0,0,0,.4);border-color:rgba(0,0,0,.1)}[class*=sidebar-light-] .user-panel .dropdown-item{color:#212529}[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-link:active,[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-link:focus{color:#343a40}[class*=sidebar-light-] .nav-sidebar>.nav-item.menu-open>.nav-link,[class*=sidebar-light-] .nav-sidebar>.nav-item:hover>.nav-link{background-color:rgba(0,0,0,.1);color:#212529}[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-link.active{color:#000;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-treeview{background:transparent}[class*=sidebar-light-] .nav-header{background:inherit;color:#292d32}[class*=sidebar-light-] .sidebar a{color:#343a40}[class*=sidebar-light-] .sidebar a:hover{text-decoration:none}[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link{color:#777}[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link.active:hover{background-color:rgba(0,0,0,.1);color:#212529}[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link:hover{background-color:rgba(0,0,0,.1)}[class*=sidebar-light-] .nav-flat .nav-item .nav-treeview .nav-treeview,[class*=sidebar-light-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link,[class*=sidebar-light-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link.active{border-color:rgba(0,0,0,.1)}[class*=sidebar-dark-]{background-color:#343a40}[class*=sidebar-dark-] .user-panel a:hover{color:#fff}[class*=sidebar-dark-] .user-panel .status{background:hsla(0,0%,100%,.1);color:#c2c7d0}[class*=sidebar-dark-] .user-panel .status:active,[class*=sidebar-dark-] .user-panel .status:focus,[class*=sidebar-dark-] .user-panel .status:hover{background:rgba(245,255,240,.1);color:#fff}[class*=sidebar-dark-] .user-panel .dropdown-menu{box-shadow:0 2px 4px rgba(0,0,0,.4);border-color:rgba(238,255,230,.1)}[class*=sidebar-dark-] .user-panel .dropdown-item{color:#212529}[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-link:active{color:#c2c7d0}[class*=sidebar-dark-] .nav-sidebar>.nav-item.menu-open>.nav-link,[class*=sidebar-dark-] .nav-sidebar>.nav-item:hover>.nav-link,[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-link:focus{background-color:hsla(0,0%,100%,.1);color:#fff}[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-link.active{color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-treeview{background:transparent}[class*=sidebar-dark-] .nav-header{background:inherit;color:#d0d4db}[class*=sidebar-dark-] .sidebar a{color:#c2c7d0}[class*=sidebar-dark-] .sidebar a:focus,[class*=sidebar-dark-] .sidebar a:hover{text-decoration:none}[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link{color:#c2c7d0}[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link:focus,[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link:hover{background-color:hsla(0,0%,100%,.1);color:#fff}[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link.active:focus,[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link.active:hover{background-color:hsla(0,0%,100%,.9);color:#343a40}[class*=sidebar-dark-] .nav-flat .nav-item .nav-treeview .nav-treeview,[class*=sidebar-dark-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link,[class*=sidebar-dark-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link.active{border-color:hsla(0,0%,100%,.9)}.sidebar-dark-primary .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-primary .nav-sidebar>.nav-item>.nav-link.active{background-color:#007bff;color:#fff}.sidebar-dark-primary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-primary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#007bff}.sidebar-dark-secondary .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-secondary .nav-sidebar>.nav-item>.nav-link.active{background-color:#6c757d;color:#fff}.sidebar-dark-secondary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-secondary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6c757d}.sidebar-dark-success .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-success .nav-sidebar>.nav-item>.nav-link.active{background-color:#28a745;color:#fff}.sidebar-dark-success .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-success .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#28a745}.sidebar-dark-info .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-info .nav-sidebar>.nav-item>.nav-link.active{background-color:#17a2b8;color:#fff}.sidebar-dark-info .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-info .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#17a2b8}.sidebar-dark-warning .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-warning .nav-sidebar>.nav-item>.nav-link.active{background-color:#ffc107;color:#1f2d3d}.sidebar-dark-warning .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-warning .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#ffc107}.sidebar-dark-danger .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-danger .nav-sidebar>.nav-item>.nav-link.active{background-color:#dc3545;color:#fff}.sidebar-dark-danger .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-danger .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#dc3545}.sidebar-dark-light .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-light .nav-sidebar>.nav-item>.nav-link.active{background-color:#f8f9fa;color:#1f2d3d}.sidebar-dark-light .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-light .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#f8f9fa}.sidebar-dark-dark .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-dark .nav-sidebar>.nav-item>.nav-link.active{background-color:#343a40;color:#fff}.sidebar-dark-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#343a40}.sidebar-dark-lightblue .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-lightblue .nav-sidebar>.nav-item>.nav-link.active{background-color:#3c8dbc;color:#fff}.sidebar-dark-lightblue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-lightblue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#3c8dbc}.sidebar-dark-navy .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-navy .nav-sidebar>.nav-item>.nav-link.active{background-color:#001f3f;color:#fff}.sidebar-dark-navy .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-navy .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#001f3f}.sidebar-dark-olive .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-olive .nav-sidebar>.nav-item>.nav-link.active{background-color:#3d9970;color:#fff}.sidebar-dark-olive .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-olive .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#3d9970}.sidebar-dark-lime .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-lime .nav-sidebar>.nav-item>.nav-link.active{background-color:#01ff70;color:#1f2d3d}.sidebar-dark-lime .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-lime .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#01ff70}.sidebar-dark-fuchsia .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-fuchsia .nav-sidebar>.nav-item>.nav-link.active{background-color:#f012be;color:#fff}.sidebar-dark-fuchsia .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-fuchsia .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#f012be}.sidebar-dark-maroon .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-maroon .nav-sidebar>.nav-item>.nav-link.active{background-color:#d81b60;color:#fff}.sidebar-dark-maroon .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-maroon .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#d81b60}.sidebar-dark-blue .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-blue .nav-sidebar>.nav-item>.nav-link.active{background-color:#007bff;color:#fff}.sidebar-dark-blue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-blue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#007bff}.sidebar-dark-indigo .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-indigo .nav-sidebar>.nav-item>.nav-link.active{background-color:#6610f2;color:#fff}.sidebar-dark-indigo .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-indigo .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6610f2}.sidebar-dark-purple .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-purple .nav-sidebar>.nav-item>.nav-link.active{background-color:#6f42c1;color:#fff}.sidebar-dark-purple .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-purple .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6f42c1}.sidebar-dark-pink .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-pink .nav-sidebar>.nav-item>.nav-link.active{background-color:#e83e8c;color:#fff}.sidebar-dark-pink .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-pink .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#e83e8c}.sidebar-dark-red .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-red .nav-sidebar>.nav-item>.nav-link.active{background-color:#dc3545;color:#fff}.sidebar-dark-red .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-red .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#dc3545}.sidebar-dark-orange .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-orange .nav-sidebar>.nav-item>.nav-link.active{background-color:#fd7e14;color:#1f2d3d}.sidebar-dark-orange .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-orange .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#fd7e14}.sidebar-dark-yellow .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-yellow .nav-sidebar>.nav-item>.nav-link.active{background-color:#ffc107;color:#1f2d3d}.sidebar-dark-yellow .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-yellow .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#ffc107}.sidebar-dark-green .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-green .nav-sidebar>.nav-item>.nav-link.active{background-color:#28a745;color:#fff}.sidebar-dark-green .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-green .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#28a745}.sidebar-dark-teal .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-teal .nav-sidebar>.nav-item>.nav-link.active{background-color:#20c997;color:#fff}.sidebar-dark-teal .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-teal .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#20c997}.sidebar-dark-cyan .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-cyan .nav-sidebar>.nav-item>.nav-link.active{background-color:#17a2b8;color:#fff}.sidebar-dark-cyan .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-cyan .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#17a2b8}.sidebar-dark-white .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-white .nav-sidebar>.nav-item>.nav-link.active{background-color:#fff;color:#1f2d3d}.sidebar-dark-white .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-white .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#fff}.sidebar-dark-gray .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-gray .nav-sidebar>.nav-item>.nav-link.active{background-color:#6c757d;color:#fff}.sidebar-dark-gray .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-gray .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6c757d}.sidebar-dark-gray-dark .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-gray-dark .nav-sidebar>.nav-item>.nav-link.active{background-color:#343a40;color:#fff}.sidebar-dark-gray-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-gray-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#343a40}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand) .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini .main-sidebar.sidebar-focused .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini .main-sidebar:not(.sidebar-no-expand) .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview{padding-left:1rem;margin-left:-.5rem}.nav-flat{margin:-.25rem -.5rem 0}.nav-flat .nav-item>.nav-link{border-radius:0;margin-bottom:0}.nav-flat .nav-item>.nav-link>.nav-icon{margin-left:.55rem}.nav-flat:not(.nav-child-indent) .nav-treeview .nav-item>.nav-link>.nav-icon{margin-left:.4rem}.nav-flat.nav-child-indent .nav-treeview{padding-left:0}.nav-flat.nav-child-indent .nav-treeview .nav-icon{margin-left:.85rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview{border-left:.2rem solid}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-icon{margin-left:1.15rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.45rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.75rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:2.05rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-icon{margin-left:.55rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-link{padding-left:.8rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-icon{margin-left:.35rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:.15rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:-.15rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:-.35rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon{margin-left:.4rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon{margin-left:.85rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon{margin-left:1.15rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.45rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.75rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:2.05rem}.nav-flat .nav-icon{transition:margin-left .3s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-flat .nav-icon{transition:none}}.nav-flat .nav-treeview .nav-icon{margin-left:-.2rem}.nav-flat.nav-sidebar>.nav-item .nav-treeview,.nav-flat.nav-sidebar>.nav-item>.nav-treeview{background:hsla(0,0%,100%,.05)}.nav-flat.nav-sidebar>.nav-item .nav-treeview .nav-item>.nav-link,.nav-flat.nav-sidebar>.nav-item>.nav-treeview .nav-item>.nav-link{border-left:.2rem solid}.nav-legacy{margin:-.25rem -.5rem 0}.nav-legacy.nav-sidebar .nav-item>.nav-link{border-radius:0;margin-bottom:0}.nav-legacy.nav-sidebar .nav-item>.nav-link>.nav-icon{margin-left:.55rem}.text-sm .nav-legacy.nav-sidebar .nav-item>.nav-link>.nav-icon{margin-left:.75rem}.nav-legacy.nav-sidebar>.nav-item>.nav-link.active{background:inherit;border-left:3px solid transparent;box-shadow:none}.nav-legacy.nav-sidebar>.nav-item>.nav-link.active>.nav-icon{margin-left:calc(.55rem - 3px)}.text-sm .nav-legacy.nav-sidebar.nav-flat .nav-treeview .nav-item>.nav-link>.nav-icon,.text-sm .nav-legacy.nav-sidebar>.nav-item>.nav-link.active>.nav-icon{margin-left:calc(.75rem - 3px)}.sidebar-mini-md .nav-legacy>.nav-item .nav-link .nav-icon,.sidebar-mini .nav-legacy>.nav-item .nav-link .nav-icon{transition:margin-left .3s ease-in-out;margin-left:.75rem}@media (prefers-reduced-motion:reduce){.sidebar-mini-md .nav-legacy>.nav-item .nav-link .nav-icon,.sidebar-mini .nav-legacy>.nav-item .nav-link .nav-icon{transition:none}}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview{padding-left:1rem}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview{padding-left:2rem;margin-left:-1rem}.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview{padding-left:.5rem}.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview{padding-left:1rem;margin-left:-.5rem}.sidebar-mini-md.sidebar-collapse .nav-legacy>.nav-item>.nav-link .nav-icon,.sidebar-mini.sidebar-collapse .nav-legacy>.nav-item>.nav-link .nav-icon{margin-left:.55rem}.sidebar-mini-md.sidebar-collapse .nav-legacy>.nav-item>.nav-link.active>.nav-icon,.sidebar-mini.sidebar-collapse .nav-legacy>.nav-item>.nav-link.active>.nav-icon{margin-left:.36rem}.sidebar-mini-md.sidebar-collapse .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse .nav-legacy.nav-child-indent .nav-treeview .nav-treeview{padding-left:0;margin-left:0}.sidebar-mini-md.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link .nav-icon,.sidebar-mini.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link .nav-icon{margin-left:.75rem}.sidebar-mini-md.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link.active>.nav-icon,.sidebar-mini.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link.active>.nav-icon{margin-left:calc(.75rem - 3px)}[class*=sidebar-dark] .nav-legacy.nav-sidebar>.nav-item .nav-treeview,[class*=sidebar-dark] .nav-legacy.nav-sidebar>.nav-item>.nav-treeview{background:hsla(0,0%,100%,.05)}[class*=sidebar-dark] .nav-legacy.nav-sidebar>.nav-item>.nav-link.active{color:#fff}[class*=sidebar-dark] .nav-legacy .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-dark] .nav-legacy .nav-treeview>.nav-item>.nav-link:focus,[class*=sidebar-dark] .nav-legacy .nav-treeview>.nav-item>.nav-link:hover{background:none;color:#fff}[class*=sidebar-light] .nav-legacy.nav-sidebar>.nav-item .nav-treeview,[class*=sidebar-light] .nav-legacy.nav-sidebar>.nav-item>.nav-treeview{background:rgba(0,0,0,.05)}[class*=sidebar-light] .nav-legacy.nav-sidebar>.nav-item>.nav-link.active{color:#000}[class*=sidebar-light] .nav-legacy .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-light] .nav-legacy .nav-treeview>.nav-item>.nav-link:focus,[class*=sidebar-light] .nav-legacy .nav-treeview>.nav-item>.nav-link:hover{background:none;color:#000}.nav-collapse-hide-child .menu-open>.nav-treeview{max-height:-webkit-min-content;max-height:-moz-min-content;max-height:min-content;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sidebar-collapse .nav-collapse-hide-child .menu-open>.nav-treeview{max-height:0;-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-collapse-hide-child .menu-open>.nav-treeview,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-collapse-hide-child .menu-open>.nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-collapse-hide-child .menu-open>.nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-collapse-hide-child .menu-open>.nav-treeview{max-height:-webkit-min-content;max-height:-moz-min-content;max-height:min-content;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.nav-compact .nav-header,.nav-compact .nav-link{padding-top:.25rem;padding-bottom:.25rem}.nav-compact .nav-header:not(:first-of-type){padding-top:.75rem;padding-bottom:.25rem}.nav-compact .nav-link>.right,.nav-compact .nav-link>p>.right{top:.465rem}.text-sm .nav-compact .nav-link>.right,.text-sm .nav-compact .nav-link>p>.right{top:.7rem}[class*=sidebar-dark] .btn-sidebar,[class*=sidebar-dark] .form-control-sidebar{background:#3f474e;border:1px solid #56606a;color:#fff}[class*=sidebar-dark] .btn-sidebar:focus,[class*=sidebar-dark] .form-control-sidebar:focus{border:1px solid #7a8793}[class*=sidebar-dark] .btn-sidebar:hover{background:#454d55}[class*=sidebar-dark] .btn-sidebar:focus{background:#4b545c}[class*=sidebar-light] .btn-sidebar,[class*=sidebar-light] .form-control-sidebar{background:#f2f2f2;border:1px solid #d9d9d9;color:#1f2d3d}[class*=sidebar-light] .btn-sidebar:focus,[class*=sidebar-light] .form-control-sidebar:focus{border:1px solid #b3b3b3}[class*=sidebar-light] .btn-sidebar:hover{background:#ececec}[class*=sidebar-light] .btn-sidebar:focus{background:#e6e6e6}.sidebar .form-inline .input-group{width:100%}.sidebar nav .form-inline{margin-bottom:.2rem}.layout-boxed.sidebar-collapse .main-sidebar{margin-left:0}.layout-boxed .content-wrapper,.layout-boxed .main-footer,.layout-boxed .main-header{z-index:9999;position:relative}.logo-xl,.logo-xs{opacity:1;position:absolute;visibility:visible}.logo-xl.brand-image-xs,.logo-xs.brand-image-xs{left:18px;top:12px}.logo-xl.brand-image-xl,.logo-xs.brand-image-xl{left:12px;top:6px}.logo-xs{opacity:0;visibility:hidden}.logo-xs.brand-image-xl{left:16px;top:8px}.brand-link.logo-switch:before{content:"\A0"}@media (min-width:992px){.sidebar-mini .nav-sidebar,.sidebar-mini .nav-sidebar .nav-link,.sidebar-mini .nav-sidebar>.nav-header{white-space:nowrap;overflow:hidden}.sidebar-mini.sidebar-collapse .d-hidden-mini{display:none}.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .main-header{margin-left:4.6rem!important}.sidebar-mini.sidebar-collapse .nav-sidebar .nav-header{display:none}.sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p{width:0}.sidebar-mini.sidebar-collapse .brand-text,.sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .sidebar .user-panel>.info{margin-left:-10px}.sidebar-mini.sidebar-collapse .brand-text,.sidebar-mini.sidebar-collapse .logo-xl,.sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .sidebar .user-panel>.info{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini.sidebar-collapse .logo-xs{display:inline-block;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini.sidebar-collapse .main-sidebar{overflow-x:hidden}.sidebar-mini.sidebar-collapse .main-sidebar,.sidebar-mini.sidebar-collapse .main-sidebar:before{margin-left:0;width:4.6rem}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel .image{float:none}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .brand-link,.sidebar-mini.sidebar-collapse .main-sidebar:hover,.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-link{width:250px}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel{text-align:left}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel .image,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel .image{float:left}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .brand-text,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .logo-xl,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text,.sidebar-mini.sidebar-collapse .main-sidebar:hover .logo-xl,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:inline-block;margin-left:0;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .logo-xs,.sidebar-mini.sidebar-collapse .main-sidebar:hover .logo-xs{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .brand-image,.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-image{margin-right:.5rem}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .sidebar-form,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini.sidebar-collapse .main-sidebar:hover .sidebar-form,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:block!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar>.nav-item>.nav-link>span,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar>.nav-item>.nav-link>span{display:inline-block!important}.sidebar-mini.sidebar-collapse .visible-sidebar-mini{display:block!important}.sidebar-mini.sidebar-collapse.layout-fixed .main-sidebar:hover .brand-link{width:250px}.sidebar-mini.sidebar-collapse.layout-fixed .brand-link{width:4.6rem}}@media (max-width:991.98px){.sidebar-mini.sidebar-collapse .main-sidebar{box-shadow:none!important}}@media (min-width:768px){.sidebar-mini-md .nav-sidebar,.sidebar-mini-md .nav-sidebar .nav-link,.sidebar-mini-md .nav-sidebar>.nav-header{white-space:nowrap;overflow:hidden}.sidebar-mini-md.sidebar-collapse .d-hidden-mini{display:none}.sidebar-mini-md.sidebar-collapse .content-wrapper,.sidebar-mini-md.sidebar-collapse .main-footer,.sidebar-mini-md.sidebar-collapse .main-header{margin-left:4.6rem!important}.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-header{display:none}.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-link p{width:0}.sidebar-mini-md.sidebar-collapse .brand-text,.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .sidebar .user-panel>.info{margin-left:-10px}.sidebar-mini-md.sidebar-collapse .brand-text,.sidebar-mini-md.sidebar-collapse .logo-xl,.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .sidebar .user-panel>.info{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini-md.sidebar-collapse .logo-xs{display:inline-block;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini-md.sidebar-collapse .main-sidebar{overflow-x:hidden}.sidebar-mini-md.sidebar-collapse .main-sidebar,.sidebar-mini-md.sidebar-collapse .main-sidebar:before{margin-left:0;width:4.6rem}.sidebar-mini-md.sidebar-collapse .main-sidebar .user-panel .image{float:none}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .brand-link,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .brand-link{width:250px}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel{text-align:left}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel .image,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel .image{float:left}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .brand-text,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .logo-xl,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .brand-text,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .logo-xl,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:inline-block;margin-left:0;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .logo-xs,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .logo-xs{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .brand-image,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .brand-image{margin-right:.5rem}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .sidebar-form,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .sidebar-form,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:block!important;-webkit-transform:translateZ(0)}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar>.nav-item>.nav-link>span,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-sidebar>.nav-item>.nav-link>span{display:inline-block!important}.sidebar-mini-md.sidebar-collapse .visible-sidebar-mini{display:block!important}.sidebar-mini-md.sidebar-collapse.layout-fixed .main-sidebar:hover .brand-link{width:250px}.sidebar-mini-md.sidebar-collapse.layout-fixed .brand-link{width:4.6rem}}@media (max-width:767.98px){.sidebar-mini-md.sidebar-collapse .main-sidebar{box-shadow:none!important}}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.sidebar-collapse .main-sidebar.sidebar-focused .nav-header,.sidebar-collapse .main-sidebar:hover .nav-header{display:inline-block}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover{width:4.6rem}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-header,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-header{display:none}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .brand-link,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .brand-link{width:4.6rem!important}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .user-panel .image,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .user-panel .image{float:none!important}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .logo-xs,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .logo-xs{-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .logo-xl,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .logo-xl{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-sidebar.nav-child-indent .nav-treeview,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-sidebar.nav-child-indent .nav-treeview{padding-left:0}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .brand-text,.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-sidebar .nav-link p,.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .user-panel>.info,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .brand-text,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .user-panel>.info{margin-left:-10px;-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden;width:0}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-sidebar>.nav-item .nav-icon,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-sidebar>.nav-item .nav-icon{margin-right:0}.nav-sidebar{position:relative}.nav-sidebar:hover{overflow:visible}.nav-sidebar>.nav-header,.sidebar-form{overflow:hidden;text-overflow:clip}.nav-sidebar .nav-item>.nav-link{position:relative}.nav-sidebar .nav-item>.nav-link>.float-right{margin-top:-7px;position:absolute;right:10px;top:50%}.main-sidebar .brand-text,.main-sidebar .logo-xl,.main-sidebar .logo-xs,.sidebar .nav-link p,.sidebar .user-panel .info{transition:margin-left .3s linear,opacity .3s ease,visibility .3s ease}@media (prefers-reduced-motion:reduce){.main-sidebar .brand-text,.main-sidebar .logo-xl,.main-sidebar .logo-xs,.sidebar .nav-link p,.sidebar .user-panel .info{transition:none}}html.control-sidebar-animate{overflow-x:hidden}.control-sidebar{bottom:calc(3.5rem + 1px);position:absolute;top:calc(3.5rem + 1px);z-index:1031}.control-sidebar,.control-sidebar:before{bottom:calc(3.5rem + 1px);display:none;right:-250px;width:250px;transition:right .3s ease-in-out,display .3s ease-in-out}@media (prefers-reduced-motion:reduce){.control-sidebar,.control-sidebar:before{transition:none}}.control-sidebar:before{content:"";display:block;position:fixed;top:0;z-index:-1}body.text-sm .control-sidebar{bottom:calc(2.9365rem + 1px);top:calc(2.93725rem + 1px)}.main-header.text-sm~.control-sidebar{top:calc(2.93725rem + 1px)}.main-footer.text-sm~.control-sidebar{bottom:calc(2.9365rem + 1px)}.control-sidebar-push-slide .content-wrapper,.control-sidebar-push-slide .main-footer{transition:margin-right .3s ease-in-out}@media (prefers-reduced-motion:reduce){.control-sidebar-push-slide .content-wrapper,.control-sidebar-push-slide .main-footer{transition:none}}.control-sidebar-open .control-sidebar{display:block}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar:before{right:0}.control-sidebar-open.control-sidebar-push-slide .content-wrapper,.control-sidebar-open.control-sidebar-push-slide .main-footer,.control-sidebar-open.control-sidebar-push .content-wrapper,.control-sidebar-open.control-sidebar-push .main-footer{margin-right:250px}.control-sidebar-slide-open .control-sidebar{display:block}.control-sidebar-slide-open .control-sidebar,.control-sidebar-slide-open .control-sidebar:before{right:0;transition:right .3s ease-in-out,display .3s ease-in-out}@media (prefers-reduced-motion:reduce){.control-sidebar-slide-open .control-sidebar,.control-sidebar-slide-open .control-sidebar:before{transition:none}}.control-sidebar-slide-open.control-sidebar-push-slide .content-wrapper,.control-sidebar-slide-open.control-sidebar-push-slide .main-footer,.control-sidebar-slide-open.control-sidebar-push .content-wrapper,.control-sidebar-slide-open.control-sidebar-push .main-footer{margin-right:250px}.control-sidebar-dark,.control-sidebar-dark .nav-link,.control-sidebar-dark a{color:#c2c7d0}.control-sidebar-dark{background:#343a40}.control-sidebar-dark a:hover,.control-sidebar-dark h1,.control-sidebar-dark h2,.control-sidebar-dark h3,.control-sidebar-dark h4,.control-sidebar-dark h5,.control-sidebar-dark h6,.control-sidebar-dark label{color:#fff}.control-sidebar-dark .nav-tabs{background-color:hsla(0,0%,100%,.1);border-bottom:0;margin-bottom:5px}.control-sidebar-dark .nav-tabs .nav-item{margin:0}.control-sidebar-dark .nav-tabs .nav-link{border-radius:0;padding:10px 20px;position:relative;text-align:center}.control-sidebar-dark .nav-tabs .nav-link,.control-sidebar-dark .nav-tabs .nav-link.active,.control-sidebar-dark .nav-tabs .nav-link:active,.control-sidebar-dark .nav-tabs .nav-link:focus,.control-sidebar-dark .nav-tabs .nav-link:hover{border:0}.control-sidebar-dark .nav-tabs .nav-link.active,.control-sidebar-dark .nav-tabs .nav-link:active,.control-sidebar-dark .nav-tabs .nav-link:focus,.control-sidebar-dark .nav-tabs .nav-link:hover{border-bottom-color:transparent;border-left-color:transparent;border-top-color:transparent;color:#fff}.control-sidebar-dark .nav-tabs .nav-link.active{background-color:#343a40}.control-sidebar-dark .tab-pane{padding:10px 15px}.control-sidebar-light{color:#4b545c;background:#fff;border-left:1px solid #dee2e6}.text-sm .dropdown-menu{font-size:.875rem!important}.text-sm .dropdown-toggle:after{vertical-align:.2rem}.dropdown-item-title{font-size:1rem;margin:0}.dropdown-icon:after{margin-left:0}.dropdown-menu-lg{max-width:300px;min-width:280px;padding:0}.dropdown-menu-lg .dropdown-divider{margin:0}.dropdown-menu-lg .dropdown-item{padding:.5rem 1rem}.dropdown-menu-lg p{margin:0;white-space:normal}.dropdown-submenu{position:relative}.dropdown-submenu>a:after{border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid;float:right;margin-left:.5rem;margin-top:.5rem}.dropdown-submenu>.dropdown-menu{left:100%;margin-left:0;margin-top:0;top:0}.dropdown-hover.dropdown-submenu:hover>.dropdown-menu,.dropdown-hover .dropdown-submenu:hover>.dropdown-menu,.dropdown-hover.nav-item.dropdown:hover>.dropdown-menu,.dropdown-hover:hover>.dropdown-menu{display:block}.dropdown-menu-xl{max-width:420px;min-width:360px;padding:0}.dropdown-menu-xl .dropdown-divider{margin:0}.dropdown-menu-xl .dropdown-item{padding:.5rem 1rem}.dropdown-menu-xl p{margin:0;white-space:normal}.dropdown-footer,.dropdown-header{display:block;font-size:.875rem;padding:.5rem 1rem;text-align:center}.open:not(.dropup)>.animated-dropdown-menu{-webkit-animation:flipInX .7s both;animation:flipInX .7s both;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:767.98px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.navbar-nav>.user-menu>.nav-link:after{content:none}.navbar-nav>.user-menu>.dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;padding:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid hsla(0,0%,100%,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom:1px solid #495057;border-top:1px solid #dee2e6;padding:15px}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{display:block;clear:both;content:""}@media (min-width:576px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#495057!important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f8f9fa;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{display:block;clear:both;content:""}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#6c757d}@media (min-width:576px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f8f9fa}}.navbar-nav>.user-menu .user-image{border-radius:50%;float:left;height:2.1rem;margin-right:10px;margin-top:-2px;width:2.1rem}@media (min-width:576px){.navbar-nav>.user-menu .user-image{float:none;line-height:10px;margin-right:.4rem;margin-top:-8px}}.nav-pills .nav-link{color:#6c757d}.nav-pills .nav-link:not(.active):hover{color:#007bff}.nav-pills .nav-item.dropdown.show .nav-link:hover{color:#fff}.nav-tabs.flex-column{border-bottom:0;border-right:1px solid #dee2e6}.nav-tabs.flex-column .nav-link{border-bottom-left-radius:.25rem;border-top-right-radius:0;margin-right:-1px}.nav-tabs.flex-column .nav-link:focus,.nav-tabs.flex-column .nav-link:hover{border-color:#e9ecef transparent #e9ecef #e9ecef}.nav-tabs.flex-column .nav-item.show .nav-link,.nav-tabs.flex-column .nav-link.active{border-color:#dee2e6 transparent #dee2e6 #dee2e6}.nav-tabs.flex-column.nav-tabs-right{border-left:1px solid #dee2e6;border-right:0}.nav-tabs.flex-column.nav-tabs-right .nav-link{border-bottom-left-radius:0;border-bottom-right-radius:.25rem;border-top-left-radius:0;border-top-right-radius:.25rem;margin-left:-1px}.nav-tabs.flex-column.nav-tabs-right .nav-link:focus,.nav-tabs.flex-column.nav-tabs-right .nav-link:hover{border-color:#e9ecef #e9ecef #e9ecef transparent}.nav-tabs.flex-column.nav-tabs-right .nav-item.show .nav-link,.nav-tabs.flex-column.nav-tabs-right .nav-link.active{border-color:#dee2e6 #dee2e6 #dee2e6 transparent}.navbar-no-expand{flex-direction:row}.navbar-no-expand .nav-link{padding-left:1rem;padding-right:1rem}.navbar-no-expand .dropdown-menu{position:absolute}.navbar-light{background-color:#f8f9fa}.navbar-dark{background-color:#343a40}.navbar-primary{background-color:#007bff}.navbar-secondary{background-color:#6c757d}.navbar-success{background-color:#28a745}.navbar-info{background-color:#17a2b8}.navbar-warning{background-color:#ffc107}.navbar-danger{background-color:#dc3545}.navbar-lightblue{background-color:#3c8dbc}.navbar-navy{background-color:#001f3f}.navbar-olive{background-color:#3d9970}.navbar-lime{background-color:#01ff70}.navbar-fuchsia{background-color:#f012be}.navbar-maroon{background-color:#d81b60}.navbar-blue{background-color:#007bff}.navbar-indigo{background-color:#6610f2}.navbar-purple{background-color:#6f42c1}.navbar-pink{background-color:#e83e8c}.navbar-red{background-color:#dc3545}.navbar-orange{background-color:#fd7e14}.navbar-yellow{background-color:#ffc107}.navbar-green{background-color:#28a745}.navbar-teal{background-color:#20c997}.navbar-cyan{background-color:#17a2b8}.navbar-white{background-color:#fff}.navbar-gray{background-color:#6c757d}.navbar-gray-dark{background-color:#343a40}.form-group.has-icon{position:relative}.form-group.has-icon .form-control{padding-right:35px}.form-group.has-icon .form-icon{background-color:transparent;border:0;cursor:pointer;font-size:1rem;padding:.375rem .75rem;position:absolute;right:3px;top:0}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.form-control-feedback.fa,.form-control-feedback.fab,.form-control-feedback.far,.form-control-feedback.fas,.form-control-feedback.glyphicon,.form-control-feedback.ion{line-height:calc(2.25rem + 2px)}.form-group-lg .form-control+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fab,.form-group-lg .form-control+.form-control-feedback.far,.form-group-lg .form-control+.form-control-feedback.fas,.form-group-lg .form-control+.form-control-feedback.glyphicon,.form-group-lg .form-control+.form-control-feedback.ion,.input-group-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fab,.input-group-lg+.form-control-feedback.far,.input-group-lg+.form-control-feedback.fas,.input-group-lg+.form-control-feedback.glyphicon,.input-group-lg+.form-control-feedback.ion,.input-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fab,.input-lg+.form-control-feedback.far,.input-lg+.form-control-feedback.fas,.input-lg+.form-control-feedback.glyphicon,.input-lg+.form-control-feedback.ion{line-height:calc(2.875rem + 2px)}.form-group-sm .form-control+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fab,.form-group-sm .form-control+.form-control-feedback.far,.form-group-sm .form-control+.form-control-feedback.fas,.form-group-sm .form-control+.form-control-feedback.glyphicon,.form-group-sm .form-control+.form-control-feedback.ion,.input-group-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fab,.input-group-sm+.form-control-feedback.far,.input-group-sm+.form-control-feedback.fas,.input-group-sm+.form-control-feedback.glyphicon,.input-group-sm+.form-control-feedback.ion,.input-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fab,.input-sm+.form-control-feedback.far,.input-sm+.form-control-feedback.fas,.input-sm+.form-control-feedback.glyphicon,.input-sm+.form-control-feedback.ion{line-height:calc(1.8125rem + 2px)}label:not(.form-check-label):not(.custom-file-label){font-weight:700}.warning-feedback{font-size:80%;color:#ffc107;display:none;margin-top:.25rem;width:100%}.warning-tooltip{border-radius:.25rem;font-size:.875rem;background-color:rgba(255,193,7,.9);color:#1f2d3d;display:none;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-control.is-warning{border-color:#ffc107}.form-control.is-warning:focus{border-color:#ffc107;box-shadow:0 0 0 0 rgba(255,193,7,.25)}.form-control.is-warning~.warning-feedback,.form-control.is-warning~.warning-tooltip{display:block}textarea.form-control.is-warning{padding-right:2.25rem;background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-warning{border-color:#ffc107}.custom-select.is-warning:focus{border-color:#ffc107;box-shadow:0 0 0 0 rgba(255,193,7,.25)}.custom-select.is-warning~.warning-feedback,.custom-select.is-warning~.warning-tooltip,.form-control-file.is-warning~.warning-feedback,.form-control-file.is-warning~.warning-tooltip{display:block}.form-check-input.is-warning~.form-check-label{color:#ffc107}.form-check-input.is-warning~.warning-feedback,.form-check-input.is-warning~.warning-tooltip{display:block}.custom-control-input.is-warning~.custom-control-label{color:#ffc107}.custom-control-input.is-warning~.custom-control-label:before{border-color:#ffc107}.custom-control-input.is-warning~.warning-feedback,.custom-control-input.is-warning~.warning-tooltip{display:block}.custom-control-input.is-warning:checked~.custom-control-label:before{background-color:#ffce3a;border-color:#ffce3a}.custom-control-input.is-warning:focus~.custom-control-label:before{box-shadow:0 0 0 0 rgba(255,193,7,.25)}.custom-control-input.is-warning:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-warning~.custom-file-label{border-color:#ffc107}.custom-file-input.is-warning~.warning-feedback,.custom-file-input.is-warning~.warning-tooltip{display:block}.custom-file-input.is-warning:focus~.custom-file-label{border-color:#ffc107;box-shadow:0 0 0 0 rgba(255,193,7,.25)}.custom-switch.custom-switch-off-primary .custom-control-input~.custom-control-label:before{background:#007bff;border-color:#004a99}.custom-switch.custom-switch-off-primary .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-switch.custom-switch-off-primary .custom-control-input~.custom-control-label:after{background:#003e80}.custom-switch.custom-switch-on-primary .custom-control-input:checked~.custom-control-label:before{background:#007bff;border-color:#004a99}.custom-switch.custom-switch-on-primary .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-switch.custom-switch-on-primary .custom-control-input:checked~.custom-control-label:after{background:#99caff}.custom-switch.custom-switch-off-secondary .custom-control-input~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-off-secondary .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-off-secondary .custom-control-input~.custom-control-label:after{background:#313539}.custom-switch.custom-switch-on-secondary .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-on-secondary .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-on-secondary .custom-control-input:checked~.custom-control-label:after{background:#bcc1c6}.custom-switch.custom-switch-off-success .custom-control-input~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-off-success .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-off-success .custom-control-input~.custom-control-label:after{background:#0f401b}.custom-switch.custom-switch-on-success .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-on-success .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-on-success .custom-control-input:checked~.custom-control-label:after{background:#86e29b}.custom-switch.custom-switch-off-info .custom-control-input~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-off-info .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-off-info .custom-control-input~.custom-control-label:after{background:#093e47}.custom-switch.custom-switch-on-info .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-on-info .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-on-info .custom-control-input:checked~.custom-control-label:after{background:#7adeee}.custom-switch.custom-switch-off-warning .custom-control-input~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-off-warning .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-off-warning .custom-control-input~.custom-control-label:after{background:#876500}.custom-switch.custom-switch-on-warning .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-on-warning .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-on-warning .custom-control-input:checked~.custom-control-label:after{background:#ffe7a0}.custom-switch.custom-switch-off-danger .custom-control-input~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-off-danger .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-off-danger .custom-control-input~.custom-control-label:after{background:#7c151f}.custom-switch.custom-switch-on-danger .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-on-danger .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-on-danger .custom-control-input:checked~.custom-control-label:after{background:#f3b7bd}.custom-switch.custom-switch-off-light .custom-control-input~.custom-control-label:before{background:#f8f9fa;border-color:#bdc6d0}.custom-switch.custom-switch-off-light .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-switch.custom-switch-off-light .custom-control-input~.custom-control-label:after{background:#aeb9c5}.custom-switch.custom-switch-on-light .custom-control-input:checked~.custom-control-label:before{background:#f8f9fa;border-color:#bdc6d0}.custom-switch.custom-switch-on-light .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-switch.custom-switch-on-light .custom-control-input:checked~.custom-control-label:after{background:#fff}.custom-switch.custom-switch-off-dark .custom-control-input~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-off-dark .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-off-dark .custom-control-input~.custom-control-label:after{background:#000}.custom-switch.custom-switch-on-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-on-dark .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-on-dark .custom-control-input:checked~.custom-control-label:after{background:#7a8793}.custom-switch.custom-switch-off-lightblue .custom-control-input~.custom-control-label:before{background:#3c8dbc;border-color:#23536f}.custom-switch.custom-switch-off-lightblue .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-switch.custom-switch-off-lightblue .custom-control-input~.custom-control-label:after{background:#1d455b}.custom-switch.custom-switch-on-lightblue .custom-control-input:checked~.custom-control-label:before{background:#3c8dbc;border-color:#23536f}.custom-switch.custom-switch-on-lightblue .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-switch.custom-switch-on-lightblue .custom-control-input:checked~.custom-control-label:after{background:#acd0e5}.custom-switch.custom-switch-off-navy .custom-control-input~.custom-control-label:before{background:#001f3f;border-color:#000}.custom-switch.custom-switch-off-navy .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-switch.custom-switch-off-navy .custom-control-input~.custom-control-label:after{background:#000}.custom-switch.custom-switch-on-navy .custom-control-input:checked~.custom-control-label:before{background:#001f3f;border-color:#000}.custom-switch.custom-switch-on-navy .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-switch.custom-switch-on-navy .custom-control-input:checked~.custom-control-label:after{background:#006ad8}.custom-switch.custom-switch-off-olive .custom-control-input~.custom-control-label:before{background:#3d9970;border-color:#20503b}.custom-switch.custom-switch-off-olive .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-switch.custom-switch-off-olive .custom-control-input~.custom-control-label:after{background:#193e2d}.custom-switch.custom-switch-on-olive .custom-control-input:checked~.custom-control-label:before{background:#3d9970;border-color:#20503b}.custom-switch.custom-switch-on-olive .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-switch.custom-switch-on-olive .custom-control-input:checked~.custom-control-label:after{background:#99d6bb}.custom-switch.custom-switch-off-lime .custom-control-input~.custom-control-label:before{background:#01ff70;border-color:#009a43}.custom-switch.custom-switch-off-lime .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-switch.custom-switch-off-lime .custom-control-input~.custom-control-label:after{background:#008138}.custom-switch.custom-switch-on-lime .custom-control-input:checked~.custom-control-label:before{background:#01ff70;border-color:#009a43}.custom-switch.custom-switch-on-lime .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-switch.custom-switch-on-lime .custom-control-input:checked~.custom-control-label:after{background:#9affc6}.custom-switch.custom-switch-off-fuchsia .custom-control-input~.custom-control-label:before{background:#f012be;border-color:#930974}.custom-switch.custom-switch-off-fuchsia .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-switch.custom-switch-off-fuchsia .custom-control-input~.custom-control-label:after{background:#7b0861}.custom-switch.custom-switch-on-fuchsia .custom-control-input:checked~.custom-control-label:before{background:#f012be;border-color:#930974}.custom-switch.custom-switch-on-fuchsia .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-switch.custom-switch-on-fuchsia .custom-control-input:checked~.custom-control-label:after{background:#f9a2e5}.custom-switch.custom-switch-off-maroon .custom-control-input~.custom-control-label:before{background:#d81b60;border-color:#7d1038}.custom-switch.custom-switch-off-maroon .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-switch.custom-switch-off-maroon .custom-control-input~.custom-control-label:after{background:#670d2e}.custom-switch.custom-switch-on-maroon .custom-control-input:checked~.custom-control-label:before{background:#d81b60;border-color:#7d1038}.custom-switch.custom-switch-on-maroon .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-switch.custom-switch-on-maroon .custom-control-input:checked~.custom-control-label:after{background:#f29aba}.custom-switch.custom-switch-off-blue .custom-control-input~.custom-control-label:before{background:#007bff;border-color:#004a99}.custom-switch.custom-switch-off-blue .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-switch.custom-switch-off-blue .custom-control-input~.custom-control-label:after{background:#003e80}.custom-switch.custom-switch-on-blue .custom-control-input:checked~.custom-control-label:before{background:#007bff;border-color:#004a99}.custom-switch.custom-switch-on-blue .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-switch.custom-switch-on-blue .custom-control-input:checked~.custom-control-label:after{background:#99caff}.custom-switch.custom-switch-off-indigo .custom-control-input~.custom-control-label:before{background:#6610f2;border-color:#3d0894}.custom-switch.custom-switch-off-indigo .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-switch.custom-switch-off-indigo .custom-control-input~.custom-control-label:after{background:#33077c}.custom-switch.custom-switch-on-indigo .custom-control-input:checked~.custom-control-label:before{background:#6610f2;border-color:#3d0894}.custom-switch.custom-switch-on-indigo .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-switch.custom-switch-on-indigo .custom-control-input:checked~.custom-control-label:after{background:#c3a1fa}.custom-switch.custom-switch-off-purple .custom-control-input~.custom-control-label:before{background:#6f42c1;border-color:#432776}.custom-switch.custom-switch-off-purple .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-switch.custom-switch-off-purple .custom-control-input~.custom-control-label:after{background:#382063}.custom-switch.custom-switch-on-purple .custom-control-input:checked~.custom-control-label:before{background:#6f42c1;border-color:#432776}.custom-switch.custom-switch-on-purple .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-switch.custom-switch-on-purple .custom-control-input:checked~.custom-control-label:after{background:#c7b5e7}.custom-switch.custom-switch-off-pink .custom-control-input~.custom-control-label:before{background:#e83e8c;border-color:#ac145a}.custom-switch.custom-switch-off-pink .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-switch.custom-switch-off-pink .custom-control-input~.custom-control-label:after{background:#95124e}.custom-switch.custom-switch-on-pink .custom-control-input:checked~.custom-control-label:before{background:#e83e8c;border-color:#ac145a}.custom-switch.custom-switch-on-pink .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-switch.custom-switch-on-pink .custom-control-input:checked~.custom-control-label:after{background:#f8c7dd}.custom-switch.custom-switch-off-red .custom-control-input~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-off-red .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-off-red .custom-control-input~.custom-control-label:after{background:#7c151f}.custom-switch.custom-switch-on-red .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-on-red .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-on-red .custom-control-input:checked~.custom-control-label:after{background:#f3b7bd}.custom-switch.custom-switch-off-orange .custom-control-input~.custom-control-label:before{background:#fd7e14;border-color:#aa4e01}.custom-switch.custom-switch-off-orange .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-switch.custom-switch-off-orange .custom-control-input~.custom-control-label:after{background:#904201}.custom-switch.custom-switch-on-orange .custom-control-input:checked~.custom-control-label:before{background:#fd7e14;border-color:#aa4e01}.custom-switch.custom-switch-on-orange .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-switch.custom-switch-on-orange .custom-control-input:checked~.custom-control-label:after{background:#fed1ac}.custom-switch.custom-switch-off-yellow .custom-control-input~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-off-yellow .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-off-yellow .custom-control-input~.custom-control-label:after{background:#876500}.custom-switch.custom-switch-on-yellow .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-on-yellow .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-on-yellow .custom-control-input:checked~.custom-control-label:after{background:#ffe7a0}.custom-switch.custom-switch-off-green .custom-control-input~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-off-green .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-off-green .custom-control-input~.custom-control-label:after{background:#0f401b}.custom-switch.custom-switch-on-green .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-on-green .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-on-green .custom-control-input:checked~.custom-control-label:after{background:#86e29b}.custom-switch.custom-switch-off-teal .custom-control-input~.custom-control-label:before{background:#20c997;border-color:#127155}.custom-switch.custom-switch-off-teal .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-switch.custom-switch-off-teal .custom-control-input~.custom-control-label:after{background:#0e5b44}.custom-switch.custom-switch-on-teal .custom-control-input:checked~.custom-control-label:before{background:#20c997;border-color:#127155}.custom-switch.custom-switch-on-teal .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-switch.custom-switch-on-teal .custom-control-input:checked~.custom-control-label:after{background:#94eed3}.custom-switch.custom-switch-off-cyan .custom-control-input~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-off-cyan .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-off-cyan .custom-control-input~.custom-control-label:after{background:#093e47}.custom-switch.custom-switch-on-cyan .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-on-cyan .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-on-cyan .custom-control-input:checked~.custom-control-label:after{background:#7adeee}.custom-switch.custom-switch-off-white .custom-control-input~.custom-control-label:before{background:#fff;border-color:#ccc}.custom-switch.custom-switch-off-white .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-switch.custom-switch-off-white .custom-control-input~.custom-control-label:after{background:#bfbfbf}.custom-switch.custom-switch-on-white .custom-control-input:checked~.custom-control-label:before{background:#fff;border-color:#ccc}.custom-switch.custom-switch-on-white .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-switch.custom-switch-on-white .custom-control-input:checked~.custom-control-label:after{background:#fff}.custom-switch.custom-switch-off-gray .custom-control-input~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-off-gray .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-off-gray .custom-control-input~.custom-control-label:after{background:#313539}.custom-switch.custom-switch-on-gray .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-on-gray .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-on-gray .custom-control-input:checked~.custom-control-label:after{background:#bcc1c6}.custom-switch.custom-switch-off-gray-dark .custom-control-input~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-off-gray-dark .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-off-gray-dark .custom-control-input~.custom-control-label:after{background:#000}.custom-switch.custom-switch-on-gray-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-on-gray-dark .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-on-gray-dark .custom-control-input:checked~.custom-control-label:after{background:#7a8793}.custom-range.custom-range-primary:focus{outline:none}.custom-range.custom-range-primary:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-range.custom-range-primary:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-range.custom-range-primary:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-range.custom-range-primary::-webkit-slider-thumb{background-color:#007bff}.custom-range.custom-range-primary::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range.custom-range-primary::-moz-range-thumb{background-color:#007bff}.custom-range.custom-range-primary::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range.custom-range-primary::-ms-thumb{background-color:#007bff}.custom-range.custom-range-primary::-ms-thumb:active{background-color:#b3d7ff}.custom-range.custom-range-secondary:focus{outline:none}.custom-range.custom-range-secondary:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-secondary:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-secondary:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-secondary::-webkit-slider-thumb{background-color:#6c757d}.custom-range.custom-range-secondary::-webkit-slider-thumb:active{background-color:#caced1}.custom-range.custom-range-secondary::-moz-range-thumb{background-color:#6c757d}.custom-range.custom-range-secondary::-moz-range-thumb:active{background-color:#caced1}.custom-range.custom-range-secondary::-ms-thumb{background-color:#6c757d}.custom-range.custom-range-secondary::-ms-thumb:active{background-color:#caced1}.custom-range.custom-range-success:focus{outline:none}.custom-range.custom-range-success:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-success:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-success:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-success::-webkit-slider-thumb{background-color:#28a745}.custom-range.custom-range-success::-webkit-slider-thumb:active{background-color:#9be7ac}.custom-range.custom-range-success::-moz-range-thumb{background-color:#28a745}.custom-range.custom-range-success::-moz-range-thumb:active{background-color:#9be7ac}.custom-range.custom-range-success::-ms-thumb{background-color:#28a745}.custom-range.custom-range-success::-ms-thumb:active{background-color:#9be7ac}.custom-range.custom-range-info:focus{outline:none}.custom-range.custom-range-info:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-info:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-info:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-info::-webkit-slider-thumb{background-color:#17a2b8}.custom-range.custom-range-info::-webkit-slider-thumb:active{background-color:#90e4f1}.custom-range.custom-range-info::-moz-range-thumb{background-color:#17a2b8}.custom-range.custom-range-info::-moz-range-thumb:active{background-color:#90e4f1}.custom-range.custom-range-info::-ms-thumb{background-color:#17a2b8}.custom-range.custom-range-info::-ms-thumb:active{background-color:#90e4f1}.custom-range.custom-range-warning:focus{outline:none}.custom-range.custom-range-warning:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-warning:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-warning:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-warning::-webkit-slider-thumb{background-color:#ffc107}.custom-range.custom-range-warning::-webkit-slider-thumb:active{background-color:#ffeeba}.custom-range.custom-range-warning::-moz-range-thumb{background-color:#ffc107}.custom-range.custom-range-warning::-moz-range-thumb:active{background-color:#ffeeba}.custom-range.custom-range-warning::-ms-thumb{background-color:#ffc107}.custom-range.custom-range-warning::-ms-thumb:active{background-color:#ffeeba}.custom-range.custom-range-danger:focus{outline:none}.custom-range.custom-range-danger:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-danger:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-danger:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-danger::-webkit-slider-thumb{background-color:#dc3545}.custom-range.custom-range-danger::-webkit-slider-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-danger::-moz-range-thumb{background-color:#dc3545}.custom-range.custom-range-danger::-moz-range-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-danger::-ms-thumb{background-color:#dc3545}.custom-range.custom-range-danger::-ms-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-light:focus{outline:none}.custom-range.custom-range-light:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-range.custom-range-light:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-range.custom-range-light:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-range.custom-range-light::-webkit-slider-thumb{background-color:#f8f9fa}.custom-range.custom-range-light::-webkit-slider-thumb:active{background-color:#fff}.custom-range.custom-range-light::-moz-range-thumb{background-color:#f8f9fa}.custom-range.custom-range-light::-moz-range-thumb:active{background-color:#fff}.custom-range.custom-range-light::-ms-thumb{background-color:#f8f9fa}.custom-range.custom-range-light::-ms-thumb:active{background-color:#fff}.custom-range.custom-range-dark:focus{outline:none}.custom-range.custom-range-dark:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-dark:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-dark:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-dark::-webkit-slider-thumb{background-color:#343a40}.custom-range.custom-range-dark::-webkit-slider-thumb:active{background-color:#88939e}.custom-range.custom-range-dark::-moz-range-thumb{background-color:#343a40}.custom-range.custom-range-dark::-moz-range-thumb:active{background-color:#88939e}.custom-range.custom-range-dark::-ms-thumb{background-color:#343a40}.custom-range.custom-range-dark::-ms-thumb:active{background-color:#88939e}.custom-range.custom-range-lightblue:focus{outline:none}.custom-range.custom-range-lightblue:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-range.custom-range-lightblue:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-range.custom-range-lightblue:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-range.custom-range-lightblue::-webkit-slider-thumb{background-color:#3c8dbc}.custom-range.custom-range-lightblue::-webkit-slider-thumb:active{background-color:#c0dbeb}.custom-range.custom-range-lightblue::-moz-range-thumb{background-color:#3c8dbc}.custom-range.custom-range-lightblue::-moz-range-thumb:active{background-color:#c0dbeb}.custom-range.custom-range-lightblue::-ms-thumb{background-color:#3c8dbc}.custom-range.custom-range-lightblue::-ms-thumb:active{background-color:#c0dbeb}.custom-range.custom-range-navy:focus{outline:none}.custom-range.custom-range-navy:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-range.custom-range-navy:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-range.custom-range-navy:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-range.custom-range-navy::-webkit-slider-thumb{background-color:#001f3f}.custom-range.custom-range-navy::-webkit-slider-thumb:active{background-color:#0077f2}.custom-range.custom-range-navy::-moz-range-thumb{background-color:#001f3f}.custom-range.custom-range-navy::-moz-range-thumb:active{background-color:#0077f2}.custom-range.custom-range-navy::-ms-thumb{background-color:#001f3f}.custom-range.custom-range-navy::-ms-thumb:active{background-color:#0077f2}.custom-range.custom-range-olive:focus{outline:none}.custom-range.custom-range-olive:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-range.custom-range-olive:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-range.custom-range-olive:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-range.custom-range-olive::-webkit-slider-thumb{background-color:#3d9970}.custom-range.custom-range-olive::-webkit-slider-thumb:active{background-color:#abdec7}.custom-range.custom-range-olive::-moz-range-thumb{background-color:#3d9970}.custom-range.custom-range-olive::-moz-range-thumb:active{background-color:#abdec7}.custom-range.custom-range-olive::-ms-thumb{background-color:#3d9970}.custom-range.custom-range-olive::-ms-thumb:active{background-color:#abdec7}.custom-range.custom-range-lime:focus{outline:none}.custom-range.custom-range-lime:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-range.custom-range-lime:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-range.custom-range-lime:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-range.custom-range-lime::-webkit-slider-thumb{background-color:#01ff70}.custom-range.custom-range-lime::-webkit-slider-thumb:active{background-color:#b4ffd4}.custom-range.custom-range-lime::-moz-range-thumb{background-color:#01ff70}.custom-range.custom-range-lime::-moz-range-thumb:active{background-color:#b4ffd4}.custom-range.custom-range-lime::-ms-thumb{background-color:#01ff70}.custom-range.custom-range-lime::-ms-thumb:active{background-color:#b4ffd4}.custom-range.custom-range-fuchsia:focus{outline:none}.custom-range.custom-range-fuchsia:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-range.custom-range-fuchsia:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-range.custom-range-fuchsia:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-range.custom-range-fuchsia::-webkit-slider-thumb{background-color:#f012be}.custom-range.custom-range-fuchsia::-webkit-slider-thumb:active{background-color:#fbbaec}.custom-range.custom-range-fuchsia::-moz-range-thumb{background-color:#f012be}.custom-range.custom-range-fuchsia::-moz-range-thumb:active{background-color:#fbbaec}.custom-range.custom-range-fuchsia::-ms-thumb{background-color:#f012be}.custom-range.custom-range-fuchsia::-ms-thumb:active{background-color:#fbbaec}.custom-range.custom-range-maroon:focus{outline:none}.custom-range.custom-range-maroon:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-range.custom-range-maroon:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-range.custom-range-maroon:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-range.custom-range-maroon::-webkit-slider-thumb{background-color:#d81b60}.custom-range.custom-range-maroon::-webkit-slider-thumb:active{background-color:#f5b0c9}.custom-range.custom-range-maroon::-moz-range-thumb{background-color:#d81b60}.custom-range.custom-range-maroon::-moz-range-thumb:active{background-color:#f5b0c9}.custom-range.custom-range-maroon::-ms-thumb{background-color:#d81b60}.custom-range.custom-range-maroon::-ms-thumb:active{background-color:#f5b0c9}.custom-range.custom-range-blue:focus{outline:none}.custom-range.custom-range-blue:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-range.custom-range-blue:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-range.custom-range-blue:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,123,255,.25)}.custom-range.custom-range-blue::-webkit-slider-thumb{background-color:#007bff}.custom-range.custom-range-blue::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range.custom-range-blue::-moz-range-thumb{background-color:#007bff}.custom-range.custom-range-blue::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range.custom-range-blue::-ms-thumb{background-color:#007bff}.custom-range.custom-range-blue::-ms-thumb:active{background-color:#b3d7ff}.custom-range.custom-range-indigo:focus{outline:none}.custom-range.custom-range-indigo:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-range.custom-range-indigo:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-range.custom-range-indigo:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-range.custom-range-indigo::-webkit-slider-thumb{background-color:#6610f2}.custom-range.custom-range-indigo::-webkit-slider-thumb:active{background-color:#d2b9fb}.custom-range.custom-range-indigo::-moz-range-thumb{background-color:#6610f2}.custom-range.custom-range-indigo::-moz-range-thumb:active{background-color:#d2b9fb}.custom-range.custom-range-indigo::-ms-thumb{background-color:#6610f2}.custom-range.custom-range-indigo::-ms-thumb:active{background-color:#d2b9fb}.custom-range.custom-range-purple:focus{outline:none}.custom-range.custom-range-purple:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-range.custom-range-purple:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-range.custom-range-purple:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-range.custom-range-purple::-webkit-slider-thumb{background-color:#6f42c1}.custom-range.custom-range-purple::-webkit-slider-thumb:active{background-color:#d5c8ed}.custom-range.custom-range-purple::-moz-range-thumb{background-color:#6f42c1}.custom-range.custom-range-purple::-moz-range-thumb:active{background-color:#d5c8ed}.custom-range.custom-range-purple::-ms-thumb{background-color:#6f42c1}.custom-range.custom-range-purple::-ms-thumb:active{background-color:#d5c8ed}.custom-range.custom-range-pink:focus{outline:none}.custom-range.custom-range-pink:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-range.custom-range-pink:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-range.custom-range-pink:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-range.custom-range-pink::-webkit-slider-thumb{background-color:#e83e8c}.custom-range.custom-range-pink::-webkit-slider-thumb:active{background-color:#fbddeb}.custom-range.custom-range-pink::-moz-range-thumb{background-color:#e83e8c}.custom-range.custom-range-pink::-moz-range-thumb:active{background-color:#fbddeb}.custom-range.custom-range-pink::-ms-thumb{background-color:#e83e8c}.custom-range.custom-range-pink::-ms-thumb:active{background-color:#fbddeb}.custom-range.custom-range-red:focus{outline:none}.custom-range.custom-range-red:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-red:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-red:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-red::-webkit-slider-thumb{background-color:#dc3545}.custom-range.custom-range-red::-webkit-slider-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-red::-moz-range-thumb{background-color:#dc3545}.custom-range.custom-range-red::-moz-range-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-red::-ms-thumb{background-color:#dc3545}.custom-range.custom-range-red::-ms-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-orange:focus{outline:none}.custom-range.custom-range-orange:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-range.custom-range-orange:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-range.custom-range-orange:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-range.custom-range-orange::-webkit-slider-thumb{background-color:#fd7e14}.custom-range.custom-range-orange::-webkit-slider-thumb:active{background-color:#ffdfc5}.custom-range.custom-range-orange::-moz-range-thumb{background-color:#fd7e14}.custom-range.custom-range-orange::-moz-range-thumb:active{background-color:#ffdfc5}.custom-range.custom-range-orange::-ms-thumb{background-color:#fd7e14}.custom-range.custom-range-orange::-ms-thumb:active{background-color:#ffdfc5}.custom-range.custom-range-yellow:focus{outline:none}.custom-range.custom-range-yellow:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-yellow:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-yellow:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-yellow::-webkit-slider-thumb{background-color:#ffc107}.custom-range.custom-range-yellow::-webkit-slider-thumb:active{background-color:#ffeeba}.custom-range.custom-range-yellow::-moz-range-thumb{background-color:#ffc107}.custom-range.custom-range-yellow::-moz-range-thumb:active{background-color:#ffeeba}.custom-range.custom-range-yellow::-ms-thumb{background-color:#ffc107}.custom-range.custom-range-yellow::-ms-thumb:active{background-color:#ffeeba}.custom-range.custom-range-green:focus{outline:none}.custom-range.custom-range-green:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-green:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-green:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-green::-webkit-slider-thumb{background-color:#28a745}.custom-range.custom-range-green::-webkit-slider-thumb:active{background-color:#9be7ac}.custom-range.custom-range-green::-moz-range-thumb{background-color:#28a745}.custom-range.custom-range-green::-moz-range-thumb:active{background-color:#9be7ac}.custom-range.custom-range-green::-ms-thumb{background-color:#28a745}.custom-range.custom-range-green::-ms-thumb:active{background-color:#9be7ac}.custom-range.custom-range-teal:focus{outline:none}.custom-range.custom-range-teal:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-range.custom-range-teal:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-range.custom-range-teal:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-range.custom-range-teal::-webkit-slider-thumb{background-color:#20c997}.custom-range.custom-range-teal::-webkit-slider-thumb:active{background-color:#aaf1dc}.custom-range.custom-range-teal::-moz-range-thumb{background-color:#20c997}.custom-range.custom-range-teal::-moz-range-thumb:active{background-color:#aaf1dc}.custom-range.custom-range-teal::-ms-thumb{background-color:#20c997}.custom-range.custom-range-teal::-ms-thumb:active{background-color:#aaf1dc}.custom-range.custom-range-cyan:focus{outline:none}.custom-range.custom-range-cyan:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-cyan:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-cyan:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-cyan::-webkit-slider-thumb{background-color:#17a2b8}.custom-range.custom-range-cyan::-webkit-slider-thumb:active{background-color:#90e4f1}.custom-range.custom-range-cyan::-moz-range-thumb{background-color:#17a2b8}.custom-range.custom-range-cyan::-moz-range-thumb:active{background-color:#90e4f1}.custom-range.custom-range-cyan::-ms-thumb{background-color:#17a2b8}.custom-range.custom-range-cyan::-ms-thumb:active{background-color:#90e4f1}.custom-range.custom-range-white:focus{outline:none}.custom-range.custom-range-white:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-range.custom-range-white:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-range.custom-range-white:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-range.custom-range-white::-webkit-slider-thumb,.custom-range.custom-range-white::-webkit-slider-thumb:active{background-color:#fff}.custom-range.custom-range-white::-moz-range-thumb,.custom-range.custom-range-white::-moz-range-thumb:active{background-color:#fff}.custom-range.custom-range-white::-ms-thumb,.custom-range.custom-range-white::-ms-thumb:active{background-color:#fff}.custom-range.custom-range-gray:focus{outline:none}.custom-range.custom-range-gray:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-gray:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-gray:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-gray::-webkit-slider-thumb{background-color:#6c757d}.custom-range.custom-range-gray::-webkit-slider-thumb:active{background-color:#caced1}.custom-range.custom-range-gray::-moz-range-thumb{background-color:#6c757d}.custom-range.custom-range-gray::-moz-range-thumb:active{background-color:#caced1}.custom-range.custom-range-gray::-ms-thumb{background-color:#6c757d}.custom-range.custom-range-gray::-ms-thumb:active{background-color:#caced1}.custom-range.custom-range-gray-dark:focus{outline:none}.custom-range.custom-range-gray-dark:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-gray-dark:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-gray-dark:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-gray-dark::-webkit-slider-thumb{background-color:#343a40}.custom-range.custom-range-gray-dark::-webkit-slider-thumb:active{background-color:#88939e}.custom-range.custom-range-gray-dark::-moz-range-thumb{background-color:#343a40}.custom-range.custom-range-gray-dark::-moz-range-thumb:active{background-color:#88939e}.custom-range.custom-range-gray-dark::-ms-thumb{background-color:#343a40}.custom-range.custom-range-gray-dark::-ms-thumb:active{background-color:#88939e}.progress{box-shadow:none;border-radius:1px}.progress.vertical{display:inline-block;height:200px;margin-right:10px;position:relative;width:30px}.progress.vertical>.progress-bar{bottom:0;position:absolute;width:100%}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group{margin-bottom:.5rem}.progress-sm{height:10px}.progress-xs{height:7px}.progress-xxs{height:3px}.table tr>td .progress{margin:0}.card-primary:not(.card-outline)>.card-header{background-color:#007bff}.card-primary:not(.card-outline)>.card-header,.card-primary:not(.card-outline)>.card-header a{color:#fff}.card-primary:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-primary.card-outline{border-top:3px solid #007bff}.card-primary.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-primary.card-outline-tabs>.card-header a.active{border-top:3px solid #007bff}.bg-gradient-primary .btn-tool,.bg-primary .btn-tool,.card-primary:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-primary .btn-tool:hover,.bg-primary .btn-tool:hover,.card-primary:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-primary .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-primary .bootstrap-datetimepicker-widget .table th,.card.bg-primary .bootstrap-datetimepicker-widget .table td,.card.bg-primary .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-primary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#0067d6;color:#fff}.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.today:before,.card.bg-primary .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.active,.card.bg-primary .bootstrap-datetimepicker-widget table td.active:hover{background:#3395ff;color:#fff}.card-secondary:not(.card-outline)>.card-header{background-color:#6c757d}.card-secondary:not(.card-outline)>.card-header,.card-secondary:not(.card-outline)>.card-header a{color:#fff}.card-secondary:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-secondary.card-outline{border-top:3px solid #6c757d}.card-secondary.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-secondary.card-outline-tabs>.card-header a.active{border-top:3px solid #6c757d}.bg-gradient-secondary .btn-tool,.bg-secondary .btn-tool,.card-secondary:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-secondary .btn-tool:hover,.bg-secondary .btn-tool:hover,.card-secondary:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget .table th,.card.bg-secondary .bootstrap-datetimepicker-widget .table td,.card.bg-secondary .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#596167;color:#fff}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.today:before,.card.bg-secondary .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.active,.card.bg-secondary .bootstrap-datetimepicker-widget table td.active:hover{background:#868e96;color:#fff}.card-success:not(.card-outline)>.card-header{background-color:#28a745}.card-success:not(.card-outline)>.card-header,.card-success:not(.card-outline)>.card-header a{color:#fff}.card-success:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-success.card-outline{border-top:3px solid #28a745}.card-success.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-success.card-outline-tabs>.card-header a.active{border-top:3px solid #28a745}.bg-gradient-success .btn-tool,.bg-success .btn-tool,.card-success:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-success .btn-tool:hover,.bg-success .btn-tool:hover,.card-success:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-success .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-success .bootstrap-datetimepicker-widget .table th,.card.bg-success .bootstrap-datetimepicker-widget .table td,.card.bg-success .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-success .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#208637;color:#fff}.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.today:before,.card.bg-success .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.active,.card.bg-success .bootstrap-datetimepicker-widget table td.active:hover{background:#34ce57;color:#fff}.card-info:not(.card-outline)>.card-header{background-color:#17a2b8}.card-info:not(.card-outline)>.card-header,.card-info:not(.card-outline)>.card-header a{color:#fff}.card-info:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-info.card-outline{border-top:3px solid #17a2b8}.card-info.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-info.card-outline-tabs>.card-header a.active{border-top:3px solid #17a2b8}.bg-gradient-info .btn-tool,.bg-info .btn-tool,.card-info:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-info .btn-tool:hover,.bg-info .btn-tool:hover,.card-info:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-info .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-info .bootstrap-datetimepicker-widget .table th,.card.bg-info .bootstrap-datetimepicker-widget .table td,.card.bg-info .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-info .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#128294;color:#fff}.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.today:before,.card.bg-info .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.active,.card.bg-info .bootstrap-datetimepicker-widget table td.active:hover{background:#1fc8e3;color:#fff}.card-warning:not(.card-outline)>.card-header{background-color:#ffc107}.card-warning:not(.card-outline)>.card-header,.card-warning:not(.card-outline)>.card-header a,.card-warning:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-warning.card-outline{border-top:3px solid #ffc107}.card-warning.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-warning.card-outline-tabs>.card-header a.active{border-top:3px solid #ffc107}.bg-gradient-warning .btn-tool,.bg-warning .btn-tool,.card-warning:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-warning .btn-tool:hover,.bg-warning .btn-tool:hover,.card-warning:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-warning .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-warning .bootstrap-datetimepicker-widget .table th,.card.bg-warning .bootstrap-datetimepicker-widget .table td,.card.bg-warning .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-warning .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#dda600;color:#1f2d3d}.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.today:before,.card.bg-warning .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.active,.card.bg-warning .bootstrap-datetimepicker-widget table td.active:hover{background:#ffce3a;color:#1f2d3d}.card-danger:not(.card-outline)>.card-header{background-color:#dc3545}.card-danger:not(.card-outline)>.card-header,.card-danger:not(.card-outline)>.card-header a{color:#fff}.card-danger:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-danger.card-outline{border-top:3px solid #dc3545}.card-danger.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-danger.card-outline-tabs>.card-header a.active{border-top:3px solid #dc3545}.bg-danger .btn-tool,.bg-gradient-danger .btn-tool,.card-danger:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-danger .btn-tool:hover,.bg-gradient-danger .btn-tool:hover,.card-danger:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-danger .bootstrap-datetimepicker-widget .table td,.card.bg-danger .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-danger .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-danger .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-danger .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-danger .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-danger .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-danger .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-danger .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#c62232;color:#fff}.card.bg-danger .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-danger .bootstrap-datetimepicker-widget table td.active,.card.bg-danger .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.active:hover{background:#e4606d;color:#fff}.card-light:not(.card-outline)>.card-header{background-color:#f8f9fa}.card-light:not(.card-outline)>.card-header,.card-light:not(.card-outline)>.card-header a,.card-light:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-light.card-outline{border-top:3px solid #f8f9fa}.card-light.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-light.card-outline-tabs>.card-header a.active{border-top:3px solid #f8f9fa}.bg-gradient-light .btn-tool,.bg-light .btn-tool,.card-light:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-light .btn-tool:hover,.bg-light .btn-tool:hover,.card-light:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-light .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-light .bootstrap-datetimepicker-widget .table th,.card.bg-light .bootstrap-datetimepicker-widget .table td,.card.bg-light .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-light .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e0e5e9;color:#1f2d3d}.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.today:before,.card.bg-light .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.active,.card.bg-light .bootstrap-datetimepicker-widget table td.active:hover{background:#fff;color:#1f2d3d}.card-dark:not(.card-outline)>.card-header{background-color:#343a40}.card-dark:not(.card-outline)>.card-header,.card-dark:not(.card-outline)>.card-header a{color:#fff}.card-dark:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-dark.card-outline{border-top:3px solid #343a40}.card-dark.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-dark.card-outline-tabs>.card-header a.active{border-top:3px solid #343a40}.bg-dark .btn-tool,.bg-gradient-dark .btn-tool,.card-dark:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-dark .btn-tool:hover,.bg-gradient-dark .btn-tool:hover,.card-dark:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-dark .bootstrap-datetimepicker-widget .table td,.card.bg-dark .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-dark .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-dark .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#222629;color:#fff}.card.bg-dark .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-dark .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.active:hover{background:#4b545c;color:#fff}.card-lightblue:not(.card-outline)>.card-header{background-color:#3c8dbc}.card-lightblue:not(.card-outline)>.card-header,.card-lightblue:not(.card-outline)>.card-header a{color:#fff}.card-lightblue:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-lightblue.card-outline{border-top:3px solid #3c8dbc}.card-lightblue.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-lightblue.card-outline-tabs>.card-header a.active{border-top:3px solid #3c8dbc}.bg-gradient-lightblue .btn-tool,.bg-lightblue .btn-tool,.card-lightblue:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-lightblue .btn-tool:hover,.bg-lightblue .btn-tool:hover,.card-lightblue:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget .table th,.card.bg-lightblue .bootstrap-datetimepicker-widget .table td,.card.bg-lightblue .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#32769d;color:#fff}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.today:before,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.active,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.active:hover{background:#5fa4cc;color:#fff}.card-navy:not(.card-outline)>.card-header{background-color:#001f3f}.card-navy:not(.card-outline)>.card-header,.card-navy:not(.card-outline)>.card-header a{color:#fff}.card-navy:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-navy.card-outline{border-top:3px solid #001f3f}.card-navy.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-navy.card-outline-tabs>.card-header a.active{border-top:3px solid #001f3f}.bg-gradient-navy .btn-tool,.bg-navy .btn-tool,.card-navy:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-navy .btn-tool:hover,.bg-navy .btn-tool:hover,.card-navy:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-navy .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-navy .bootstrap-datetimepicker-widget .table th,.card.bg-navy .bootstrap-datetimepicker-widget .table td,.card.bg-navy .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-navy .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#000b16;color:#fff}.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.today:before,.card.bg-navy .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.active,.card.bg-navy .bootstrap-datetimepicker-widget table td.active:hover{background:#003872;color:#fff}.card-olive:not(.card-outline)>.card-header{background-color:#3d9970}.card-olive:not(.card-outline)>.card-header,.card-olive:not(.card-outline)>.card-header a{color:#fff}.card-olive:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-olive.card-outline{border-top:3px solid #3d9970}.card-olive.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-olive.card-outline-tabs>.card-header a.active{border-top:3px solid #3d9970}.bg-gradient-olive .btn-tool,.bg-olive .btn-tool,.card-olive:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-olive .btn-tool:hover,.bg-olive .btn-tool:hover,.card-olive:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-olive .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-olive .bootstrap-datetimepicker-widget .table th,.card.bg-olive .bootstrap-datetimepicker-widget .table td,.card.bg-olive .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-olive .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#317c5b;color:#fff}.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.today:before,.card.bg-olive .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.active,.card.bg-olive .bootstrap-datetimepicker-widget table td.active:hover{background:#50b98a;color:#fff}.card-lime:not(.card-outline)>.card-header{background-color:#01ff70}.card-lime:not(.card-outline)>.card-header,.card-lime:not(.card-outline)>.card-header a,.card-lime:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-lime.card-outline{border-top:3px solid #01ff70}.card-lime.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-lime.card-outline-tabs>.card-header a.active{border-top:3px solid #01ff70}.bg-gradient-lime .btn-tool,.bg-lime .btn-tool,.card-lime:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-lime .btn-tool:hover,.bg-lime .btn-tool:hover,.card-lime:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-lime .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-lime .bootstrap-datetimepicker-widget .table th,.card.bg-lime .bootstrap-datetimepicker-widget .table td,.card.bg-lime .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-lime .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#00d75e;color:#1f2d3d}.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.today:before,.card.bg-lime .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.active,.card.bg-lime .bootstrap-datetimepicker-widget table td.active:hover{background:#34ff8d;color:#1f2d3d}.card-fuchsia:not(.card-outline)>.card-header{background-color:#f012be}.card-fuchsia:not(.card-outline)>.card-header,.card-fuchsia:not(.card-outline)>.card-header a{color:#fff}.card-fuchsia:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-fuchsia.card-outline{border-top:3px solid #f012be}.card-fuchsia.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-fuchsia.card-outline-tabs>.card-header a.active{border-top:3px solid #f012be}.bg-fuchsia .btn-tool,.bg-gradient-fuchsia .btn-tool,.card-fuchsia:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-fuchsia .btn-tool:hover,.bg-gradient-fuchsia .btn-tool:hover,.card-fuchsia:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-fuchsia .bootstrap-datetimepicker-widget .table td,.card.bg-fuchsia .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#cc0da1;color:#fff}.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.active,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.active:hover{background:#f342cb;color:#fff}.card-maroon:not(.card-outline)>.card-header{background-color:#d81b60}.card-maroon:not(.card-outline)>.card-header,.card-maroon:not(.card-outline)>.card-header a{color:#fff}.card-maroon:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-maroon.card-outline{border-top:3px solid #d81b60}.card-maroon.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-maroon.card-outline-tabs>.card-header a.active{border-top:3px solid #d81b60}.bg-gradient-maroon .btn-tool,.bg-maroon .btn-tool,.card-maroon:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-maroon .btn-tool:hover,.bg-maroon .btn-tool:hover,.card-maroon:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget .table th,.card.bg-maroon .bootstrap-datetimepicker-widget .table td,.card.bg-maroon .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#b41650;color:#fff}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.today:before,.card.bg-maroon .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.active,.card.bg-maroon .bootstrap-datetimepicker-widget table td.active:hover{background:#e73f7c;color:#fff}.card-blue:not(.card-outline)>.card-header{background-color:#007bff}.card-blue:not(.card-outline)>.card-header,.card-blue:not(.card-outline)>.card-header a{color:#fff}.card-blue:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-blue.card-outline{border-top:3px solid #007bff}.card-blue.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-blue.card-outline-tabs>.card-header a.active{border-top:3px solid #007bff}.bg-blue .btn-tool,.bg-gradient-blue .btn-tool,.card-blue:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-blue .btn-tool:hover,.bg-gradient-blue .btn-tool:hover,.card-blue:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-blue .bootstrap-datetimepicker-widget .table td,.card.bg-blue .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-blue .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-blue .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-blue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-blue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-blue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-blue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-blue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#0067d6;color:#fff}.card.bg-blue .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-blue .bootstrap-datetimepicker-widget table td.active,.card.bg-blue .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.active:hover{background:#3395ff;color:#fff}.card-indigo:not(.card-outline)>.card-header{background-color:#6610f2}.card-indigo:not(.card-outline)>.card-header,.card-indigo:not(.card-outline)>.card-header a{color:#fff}.card-indigo:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-indigo.card-outline{border-top:3px solid #6610f2}.card-indigo.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-indigo.card-outline-tabs>.card-header a.active{border-top:3px solid #6610f2}.bg-gradient-indigo .btn-tool,.bg-indigo .btn-tool,.card-indigo:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-indigo .btn-tool:hover,.bg-indigo .btn-tool:hover,.card-indigo:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget .table th,.card.bg-indigo .bootstrap-datetimepicker-widget .table td,.card.bg-indigo .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#550bce;color:#fff}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.today:before,.card.bg-indigo .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.active,.card.bg-indigo .bootstrap-datetimepicker-widget table td.active:hover{background:#8540f5;color:#fff}.card-purple:not(.card-outline)>.card-header{background-color:#6f42c1}.card-purple:not(.card-outline)>.card-header,.card-purple:not(.card-outline)>.card-header a{color:#fff}.card-purple:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-purple.card-outline{border-top:3px solid #6f42c1}.card-purple.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-purple.card-outline-tabs>.card-header a.active{border-top:3px solid #6f42c1}.bg-gradient-purple .btn-tool,.bg-purple .btn-tool,.card-purple:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-purple .btn-tool:hover,.bg-purple .btn-tool:hover,.card-purple:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-purple .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-purple .bootstrap-datetimepicker-widget .table th,.card.bg-purple .bootstrap-datetimepicker-widget .table td,.card.bg-purple .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-purple .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#5d36a4;color:#fff}.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.today:before,.card.bg-purple .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.active,.card.bg-purple .bootstrap-datetimepicker-widget table td.active:hover{background:#8c68ce;color:#fff}.card-pink:not(.card-outline)>.card-header{background-color:#e83e8c}.card-pink:not(.card-outline)>.card-header,.card-pink:not(.card-outline)>.card-header a{color:#fff}.card-pink:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-pink.card-outline{border-top:3px solid #e83e8c}.card-pink.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-pink.card-outline-tabs>.card-header a.active{border-top:3px solid #e83e8c}.bg-gradient-pink .btn-tool,.bg-pink .btn-tool,.card-pink:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-pink .btn-tool:hover,.bg-pink .btn-tool:hover,.card-pink:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-pink .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-pink .bootstrap-datetimepicker-widget .table th,.card.bg-pink .bootstrap-datetimepicker-widget .table td,.card.bg-pink .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-pink .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e21b76;color:#fff}.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.today:before,.card.bg-pink .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.active,.card.bg-pink .bootstrap-datetimepicker-widget table td.active:hover{background:#ed6ca7;color:#fff}.card-red:not(.card-outline)>.card-header{background-color:#dc3545}.card-red:not(.card-outline)>.card-header,.card-red:not(.card-outline)>.card-header a{color:#fff}.card-red:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-red.card-outline{border-top:3px solid #dc3545}.card-red.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-red.card-outline-tabs>.card-header a.active{border-top:3px solid #dc3545}.bg-gradient-red .btn-tool,.bg-red .btn-tool,.card-red:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-red .btn-tool:hover,.bg-red .btn-tool:hover,.card-red:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-red .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-red .bootstrap-datetimepicker-widget .table th,.card.bg-red .bootstrap-datetimepicker-widget .table td,.card.bg-red .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-red .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#c62232;color:#fff}.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.today:before,.card.bg-red .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.active,.card.bg-red .bootstrap-datetimepicker-widget table td.active:hover{background:#e4606d;color:#fff}.card-orange:not(.card-outline)>.card-header{background-color:#fd7e14}.card-orange:not(.card-outline)>.card-header,.card-orange:not(.card-outline)>.card-header a,.card-orange:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-orange.card-outline{border-top:3px solid #fd7e14}.card-orange.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-orange.card-outline-tabs>.card-header a.active{border-top:3px solid #fd7e14}.bg-gradient-orange .btn-tool,.bg-orange .btn-tool,.card-orange:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-orange .btn-tool:hover,.bg-orange .btn-tool:hover,.card-orange:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-orange .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-orange .bootstrap-datetimepicker-widget .table th,.card.bg-orange .bootstrap-datetimepicker-widget .table td,.card.bg-orange .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-orange .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e66a02;color:#1f2d3d}.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.today:before,.card.bg-orange .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.active,.card.bg-orange .bootstrap-datetimepicker-widget table td.active:hover{background:#fd9a47;color:#1f2d3d}.card-yellow:not(.card-outline)>.card-header{background-color:#ffc107}.card-yellow:not(.card-outline)>.card-header,.card-yellow:not(.card-outline)>.card-header a,.card-yellow:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-yellow.card-outline{border-top:3px solid #ffc107}.card-yellow.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-yellow.card-outline-tabs>.card-header a.active{border-top:3px solid #ffc107}.bg-gradient-yellow .btn-tool,.bg-yellow .btn-tool,.card-yellow:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-yellow .btn-tool:hover,.bg-yellow .btn-tool:hover,.card-yellow:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget .table th,.card.bg-yellow .bootstrap-datetimepicker-widget .table td,.card.bg-yellow .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#dda600;color:#1f2d3d}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.today:before,.card.bg-yellow .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.active,.card.bg-yellow .bootstrap-datetimepicker-widget table td.active:hover{background:#ffce3a;color:#1f2d3d}.card-green:not(.card-outline)>.card-header{background-color:#28a745}.card-green:not(.card-outline)>.card-header,.card-green:not(.card-outline)>.card-header a{color:#fff}.card-green:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-green.card-outline{border-top:3px solid #28a745}.card-green.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-green.card-outline-tabs>.card-header a.active{border-top:3px solid #28a745}.bg-gradient-green .btn-tool,.bg-green .btn-tool,.card-green:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-green .btn-tool:hover,.bg-green .btn-tool:hover,.card-green:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-green .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-green .bootstrap-datetimepicker-widget .table th,.card.bg-green .bootstrap-datetimepicker-widget .table td,.card.bg-green .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-green .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#208637;color:#fff}.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.today:before,.card.bg-green .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.active,.card.bg-green .bootstrap-datetimepicker-widget table td.active:hover{background:#34ce57;color:#fff}.card-teal:not(.card-outline)>.card-header{background-color:#20c997}.card-teal:not(.card-outline)>.card-header,.card-teal:not(.card-outline)>.card-header a{color:#fff}.card-teal:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-teal.card-outline{border-top:3px solid #20c997}.card-teal.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-teal.card-outline-tabs>.card-header a.active{border-top:3px solid #20c997}.bg-gradient-teal .btn-tool,.bg-teal .btn-tool,.card-teal:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-teal .btn-tool:hover,.bg-teal .btn-tool:hover,.card-teal:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-teal .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-teal .bootstrap-datetimepicker-widget .table th,.card.bg-teal .bootstrap-datetimepicker-widget .table td,.card.bg-teal .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-teal .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#1aa67d;color:#fff}.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.today:before,.card.bg-teal .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.active,.card.bg-teal .bootstrap-datetimepicker-widget table td.active:hover{background:#3ce0af;color:#fff}.card-cyan:not(.card-outline)>.card-header{background-color:#17a2b8}.card-cyan:not(.card-outline)>.card-header,.card-cyan:not(.card-outline)>.card-header a{color:#fff}.card-cyan:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-cyan.card-outline{border-top:3px solid #17a2b8}.card-cyan.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-cyan.card-outline-tabs>.card-header a.active{border-top:3px solid #17a2b8}.bg-cyan .btn-tool,.bg-gradient-cyan .btn-tool,.card-cyan:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-cyan .btn-tool:hover,.bg-gradient-cyan .btn-tool:hover,.card-cyan:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-cyan .bootstrap-datetimepicker-widget .table td,.card.bg-cyan .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-cyan .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#128294;color:#fff}.card.bg-cyan .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-cyan .bootstrap-datetimepicker-widget table td.active,.card.bg-cyan .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.active:hover{background:#1fc8e3;color:#fff}.card-white:not(.card-outline)>.card-header{background-color:#fff}.card-white:not(.card-outline)>.card-header,.card-white:not(.card-outline)>.card-header a,.card-white:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-white.card-outline{border-top:3px solid #fff}.card-white.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-white.card-outline-tabs>.card-header a.active{border-top:3px solid #fff}.bg-gradient-white .btn-tool,.bg-white .btn-tool,.card-white:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-white .btn-tool:hover,.bg-white .btn-tool:hover,.card-white:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-white .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-white .bootstrap-datetimepicker-widget .table th,.card.bg-white .bootstrap-datetimepicker-widget .table td,.card.bg-white .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-white .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#ebebeb;color:#1f2d3d}.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.today:before,.card.bg-white .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.active,.card.bg-white .bootstrap-datetimepicker-widget table td.active:hover{background:#fff;color:#1f2d3d}.card-gray:not(.card-outline)>.card-header{background-color:#6c757d}.card-gray:not(.card-outline)>.card-header,.card-gray:not(.card-outline)>.card-header a{color:#fff}.card-gray:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-gray.card-outline{border-top:3px solid #6c757d}.card-gray.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-gray.card-outline-tabs>.card-header a.active{border-top:3px solid #6c757d}.bg-gradient-gray .btn-tool,.bg-gray .btn-tool,.card-gray:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-gray .btn-tool:hover,.bg-gray .btn-tool:hover,.card-gray:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-gray .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-gray .bootstrap-datetimepicker-widget .table th,.card.bg-gray .bootstrap-datetimepicker-widget .table td,.card.bg-gray .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gray .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#596167;color:#fff}.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gray .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.active,.card.bg-gray .bootstrap-datetimepicker-widget table td.active:hover{background:#868e96;color:#fff}.card-gray-dark:not(.card-outline)>.card-header{background-color:#343a40}.card-gray-dark:not(.card-outline)>.card-header,.card-gray-dark:not(.card-outline)>.card-header a{color:#fff}.card-gray-dark:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-gray-dark.card-outline{border-top:3px solid #343a40}.card-gray-dark.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-gray-dark.card-outline-tabs>.card-header a.active{border-top:3px solid #343a40}.bg-gradient-gray-dark .btn-tool,.bg-gray-dark .btn-tool,.card-gray-dark:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-gray-dark .btn-tool:hover,.bg-gray-dark .btn-tool:hover,.card-gray-dark:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget .table th,.card.bg-gray-dark .bootstrap-datetimepicker-widget .table td,.card.bg-gray-dark .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#222629;color:#fff}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.active:hover{background:#4b545c;color:#fff}.card{box-shadow:0 0 1px rgba(0,0,0,.125),0 1px 3px rgba(0,0,0,.2);margin-bottom:1rem}.card.bg-dark .card-header{border-color:#383f45}.card.bg-dark,.card.bg-dark .card-body{color:#fff}.card.maximized-card{height:100%!important;left:0;max-height:100%!important;max-width:100%!important;position:fixed;top:0;width:100%!important;z-index:9999}.card.maximized-card.was-collapsed .card-body{display:block!important}.card.maximized-card [data-widget=collapse]{display:none}.card.maximized-card .card-footer,.card.maximized-card .card-header{border-radius:0!important}.card.collapsed-card .card-body,.card.collapsed-card .card-footer{display:none}.card .nav.flex-column>li{border-bottom:1px solid rgba(0,0,0,.125);margin:0}.card .nav.flex-column>li:last-of-type{border-bottom:0}.card.height-control .card-body{max-height:300px;overflow:auto}.card .border-right{border-right:1px solid rgba(0,0,0,.125)}.card .border-left{border-left:1px solid rgba(0,0,0,.125)}.card.card-tabs:not(.card-outline)>.card-header{border-bottom:0}.card.card-tabs:not(.card-outline)>.card-header .nav-item:first-child .nav-link{margin-left:-1px}.card.card-tabs.card-outline .nav-item{border-bottom:0}.card.card-tabs.card-outline .nav-item:first-child .nav-link{border-left:0;margin-left:0}.card.card-tabs .card-tools{margin:.3rem .5rem}.card.card-tabs:not(.expanding-card).collapsed-card .card-header,.card.card-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs{border-bottom:0}.card.card-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs .nav-item{margin-bottom:0}.card.card-tabs.expanding-card .card-header .nav-tabs .nav-item{margin-bottom:-1px}.card.card-outline-tabs{border-top:0}.card.card-outline-tabs .card-header .nav-item:first-child .nav-link{border-left:0;margin-left:0}.card.card-outline-tabs .card-header a{border-top:3px solid transparent}.card.card-outline-tabs .card-header a:hover{border-top:3px solid #dee2e6}.card.card-outline-tabs .card-header a.active:hover{margin-top:0}.card.card-outline-tabs .card-tools{margin:.5rem .5rem .3rem}.card.card-outline-tabs:not(.expanding-card).collapsed-card .card-header,.card.card-outline-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs{border-bottom:0}.card.card-outline-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs .nav-item{margin-bottom:0}.card.card-outline-tabs.expanding-card .card-header .nav-tabs .nav-item{margin-bottom:-1px}html.maximized-card{overflow:hidden}.card-body:after,.card-footer:after,.card-header:after{display:block;clear:both;content:""}.card-header{background-color:transparent;border-bottom:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem;position:relative;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.collapsed-card .card-header{border-bottom:0}.card-header>.card-tools{float:right;margin-right:-.625rem}.card-header>.card-tools .input-group,.card-header>.card-tools .nav,.card-header>.card-tools .pagination{margin-bottom:-.3rem;margin-top:-.3rem}.card-header>.card-tools [data-toggle=tooltip]{position:relative}.card-title{float:left;font-size:1.1rem;font-weight:400;margin:0}.card-text{clear:both}.btn-tool{background:transparent;color:#adb5bd;font-size:.875rem;margin:-.75rem 0;padding:.25rem .5rem}.btn-group.show .btn-tool,.btn-tool:hover{color:#495057}.btn-tool:focus,.show .btn-tool{box-shadow:none!important}.text-sm .card-title{font-size:1rem}.text-sm .nav-link{padding:.4rem .8rem}.card-body>.table{margin-bottom:0}.card-body>.table>thead>tr>td,.card-body>.table>thead>tr>th{border-top-width:0}.card-body .fc{margin-top:5px}.card-body .full-width-chart{margin:-19px}.card-body.p-0 .full-width-chart{margin:-9px}.chart-legend{padding-left:0;list-style:none;margin:10px 0}@media (max-width:576px){.chart-legend>li{float:left;margin-right:10px}}.card-comments{background:#f8f9fa}.card-comments .card-comment{border-bottom:1px solid #e9ecef;padding:8px 0}.card-comments .card-comment:after{display:block;clear:both;content:""}.card-comments .card-comment:last-of-type{border-bottom:0}.card-comments .card-comment:first-of-type{padding-top:0}.card-comments .card-comment img{height:1.875rem;width:1.875rem;float:left}.card-comments .comment-text{color:#78838e;margin-left:40px}.card-comments .username{color:#495057;display:block;font-weight:600}.card-comments .text-muted{font-size:12px;font-weight:400}.todo-list{list-style:none;margin:0;overflow:auto;padding:0}.todo-list>li{border-radius:2px;background:#f8f9fa;border-left:2px solid #e9ecef;color:#495057;margin-bottom:2px;padding:10px}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;font-weight:600;margin-left:5px}.todo-list>li .badge{font-size:.7rem;margin-left:10px}.todo-list>li .tools{color:#dc3545;display:none;float:right}.todo-list>li .tools>.fa,.todo-list>li .tools>.fab,.todo-list>li .tools>.far,.todo-list>li .tools>.fas,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{cursor:pointer;margin-right:5px}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#697582}.todo-list>li.done .text{font-weight:500;text-decoration:line-through}.todo-list>li.done .badge{background:#adb5bd!important}.todo-list .primary{border-left-color:#007bff}.todo-list .secondary{border-left-color:#6c757d}.todo-list .success{border-left-color:#28a745}.todo-list .info{border-left-color:#17a2b8}.todo-list .warning{border-left-color:#ffc107}.todo-list .danger{border-left-color:#dc3545}.todo-list .light{border-left-color:#f8f9fa}.todo-list .dark{border-left-color:#343a40}.todo-list .lightblue{border-left-color:#3c8dbc}.todo-list .navy{border-left-color:#001f3f}.todo-list .olive{border-left-color:#3d9970}.todo-list .lime{border-left-color:#01ff70}.todo-list .fuchsia{border-left-color:#f012be}.todo-list .maroon{border-left-color:#d81b60}.todo-list .blue{border-left-color:#007bff}.todo-list .indigo{border-left-color:#6610f2}.todo-list .purple{border-left-color:#6f42c1}.todo-list .pink{border-left-color:#e83e8c}.todo-list .red{border-left-color:#dc3545}.todo-list .orange{border-left-color:#fd7e14}.todo-list .yellow{border-left-color:#ffc107}.todo-list .green{border-left-color:#28a745}.todo-list .teal{border-left-color:#20c997}.todo-list .cyan{border-left-color:#17a2b8}.todo-list .white{border-left-color:#fff}.todo-list .gray{border-left-color:#6c757d}.todo-list .gray-dark{border-left-color:#343a40}.todo-list .handle{cursor:move;display:inline-block;margin:0 5px}.card-input{max-width:200px}.card-default .nav-item:first-child .nav-link{border-left:0}.modal-dialog .overlay{background-color:#000;display:block;height:100%;left:0;opacity:.7;position:absolute;top:0;width:100%;z-index:1052}.modal-content.bg-warning .modal-footer,.modal-content.bg-warning .modal-header{border-color:#343a40}.modal-content.bg-danger .close,.modal-content.bg-info .close,.modal-content.bg-primary .close,.modal-content.bg-secondary .close,.modal-content.bg-success .close{color:#fff;text-shadow:0 1px 0 #000}.btn.disabled,.btn:disabled{cursor:not-allowed}.btn.btn-flat{border-radius:0;border-width:1px;box-shadow:none}.btn.btn-file{overflow:hidden;position:relative}.btn.btn-file>input[type=file]{background:#fff;cursor:inherit;display:block;font-size:100px;min-height:100%;min-width:100%;opacity:0;outline:none;position:absolute;right:0;text-align:right;top:0}.text-sm .btn{font-size:.875rem!important}.btn-default{background-color:#f8f9fa;border-color:#ddd;color:#444}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e9ecef;color:#2b2b2b}.btn-app{border-radius:3px;background-color:#f8f9fa;border:1px solid #ddd;color:#6c757d;font-size:12px;height:60px;margin:0 0 10px 10px;min-width:80px;padding:15px 5px;position:relative;text-align:center}.btn-app>.fa,.btn-app>.fab,.btn-app>.far,.btn-app>.fas,.btn-app>.glyphicon,.btn-app>.ion{display:block;font-size:20px}.btn-app:hover{background:#f8f9fa;border-color:#aaa;color:#444}.btn-app:active,.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{font-size:10px;font-weight:400;position:absolute;right:-10px;top:-3px}.btn-xs{padding:.125rem .25rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2}.alert .close:hover{opacity:.5}.alert a{color:#fff;text-decoration:underline}.alert-primary{color:#fff;background:#007bff;border-color:#006fe6}.alert-default-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-default-primary hr{border-top-color:#9fcdff}.alert-default-primary .alert-link{color:#002752}.alert-secondary{color:#fff;background:#6c757d;border-color:#60686f}.alert-default-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-default-secondary hr{border-top-color:#c8cbcf}.alert-default-secondary .alert-link{color:#202326}.alert-success{color:#fff;background:#28a745;border-color:#23923d}.alert-default-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-default-success hr{border-top-color:#b1dfbb}.alert-default-success .alert-link{color:#0b2e13}.alert-info{color:#fff;background:#17a2b8;border-color:#148ea1}.alert-default-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-default-info hr{border-top-color:#abdde5}.alert-default-info .alert-link{color:#062c33}.alert-warning{color:#1f2d3d;background:#ffc107;border-color:#edb100}.alert-default-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-default-warning hr{border-top-color:#ffe8a1}.alert-default-warning .alert-link{color:#533f03}.alert-danger{color:#fff;background:#dc3545;border-color:#d32535}.alert-default-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-default-danger hr{border-top-color:#f1b0b7}.alert-default-danger .alert-link{color:#491217}.alert-light{color:#1f2d3d;background:#f8f9fa;border-color:#e9ecef}.alert-default-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-default-light hr{border-top-color:#ececf6}.alert-default-light .alert-link{color:#686868}.alert-dark{color:#fff;background:#343a40;border-color:#292d32}.alert-default-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-default-dark hr{border-top-color:#b9bbbe}.alert-default-dark .alert-link{color:#040505}.table:not(.table-dark){color:inherit}.table.table-head-fixed thead tr:first-child th{background-color:#fff;border-bottom:0;box-shadow:inset 0 1px 0 #dee2e6,inset 0 -1px 0 #dee2e6;position:sticky;top:0;z-index:10}.table.table-head-fixed.table-dark thead tr:first-child th{background-color:#212529;box-shadow:inset 0 1px 0 #383f45,inset 0 -1px 0 #383f45}.table.no-border,.table.no-border td,.table.no-border th{border:0}.table.text-center,.table.text-center td,.table.text-center th{text-align:center}.table.table-valign-middle tbody>tr>td,.table.table-valign-middle tbody>tr>th,.table.table-valign-middle thead>tr>td,.table.table-valign-middle thead>tr>th{vertical-align:middle}.card-body.p-0 .table tbody>tr>td:first-of-type,.card-body.p-0 .table tbody>tr>th:first-of-type,.card-body.p-0 .table thead>tr>td:first-of-type,.card-body.p-0 .table thead>tr>th:first-of-type{padding-left:1.5rem}.card-body.p-0 .table tbody>tr>td:last-of-type,.card-body.p-0 .table tbody>tr>th:last-of-type,.card-body.p-0 .table thead>tr>td:last-of-type,.card-body.p-0 .table thead>tr>th:last-of-type{padding-right:1.5rem}.info-box{box-shadow:0 0 1px rgba(0,0,0,.125),0 1px 3px rgba(0,0,0,.2);border-radius:.25rem;background:#fff;display:flex;margin-bottom:1rem;min-height:80px;padding:.5rem;position:relative;width:100%}.info-box .progress{background-color:rgba(0,0,0,.125);height:2px;margin:5px 0}.info-box .progress .progress-bar{background-color:#fff}.info-box .info-box-icon{border-radius:.25rem;align-items:center;display:flex;font-size:1.875rem;justify-content:center;text-align:center;width:70px}.info-box .info-box-icon>img{max-width:100%}.info-box .info-box-content{display:flex;flex-direction:column;justify-content:center;line-height:120%;flex:1;padding:0 10px}.info-box .info-box-number{display:block;margin-top:.25rem;font-weight:700}.info-box .info-box-text,.info-box .progress-description{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-box .info-box .bg-gradient-primary,.info-box .info-box .bg-primary{color:#fff}.info-box .info-box .bg-gradient-primary .progress-bar,.info-box .info-box .bg-primary .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-secondary,.info-box .info-box .bg-secondary{color:#fff}.info-box .info-box .bg-gradient-secondary .progress-bar,.info-box .info-box .bg-secondary .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-success,.info-box .info-box .bg-success{color:#fff}.info-box .info-box .bg-gradient-success .progress-bar,.info-box .info-box .bg-success .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-info,.info-box .info-box .bg-info{color:#fff}.info-box .info-box .bg-gradient-info .progress-bar,.info-box .info-box .bg-info .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-warning,.info-box .info-box .bg-warning{color:#1f2d3d}.info-box .info-box .bg-gradient-warning .progress-bar,.info-box .info-box .bg-warning .progress-bar{background-color:#1f2d3d}.info-box .info-box .bg-danger,.info-box .info-box .bg-gradient-danger{color:#fff}.info-box .info-box .bg-danger .progress-bar,.info-box .info-box .bg-gradient-danger .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-light,.info-box .info-box .bg-light{color:#1f2d3d}.info-box .info-box .bg-gradient-light .progress-bar,.info-box .info-box .bg-light .progress-bar{background-color:#1f2d3d}.info-box .info-box .bg-dark,.info-box .info-box .bg-gradient-dark{color:#fff}.info-box .info-box .bg-dark .progress-bar,.info-box .info-box .bg-gradient-dark .progress-bar{background-color:#fff}.info-box .info-box-more{display:block}.info-box .progress-description{margin:0}@media (min-width:768px){.col-lg-2 .info-box .progress-description,.col-lg-3 .info-box .progress-description,.col-md-2 .info-box .progress-description,.col-md-3 .info-box .progress-description,.col-xl-2 .info-box .progress-description,.col-xl-3 .info-box .progress-description{display:none}}@media (min-width:992px){.col-lg-2 .info-box .progress-description,.col-lg-3 .info-box .progress-description,.col-md-2 .info-box .progress-description,.col-md-3 .info-box .progress-description,.col-xl-2 .info-box .progress-description,.col-xl-3 .info-box .progress-description{font-size:.75rem;display:block}}@media (min-width:1200px){.col-lg-2 .info-box .progress-description,.col-lg-3 .info-box .progress-description,.col-md-2 .info-box .progress-description,.col-md-3 .info-box .progress-description,.col-xl-2 .info-box .progress-description,.col-xl-3 .info-box .progress-description{font-size:1rem;display:block}}.border-transparent{border-color:transparent!important}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{font-size:16px;font-weight:600;margin:0;padding:0}.description-block>.description-text{text-transform:uppercase}.description-block .description-icon{font-size:16px}.list-group-unbordered>.list-group-item{border-left:0;border-radius:0;border-right:0;padding-left:0;padding-right:0}.list-header{color:#6c757d;font-size:15px;font-weight:700;padding:10px 4px}.list-seperator{background:rgba(0,0,0,.125);height:1px;margin:15px 0 9px}.list-link>a{color:#6c757d;padding:4px}.list-link>a:hover{color:#212529}.user-block{float:left}.user-block img{float:left;height:40px;width:40px}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600;margin-top:-1px}.user-block .description{color:#6c757d;font-size:13px;margin-top:-3px}.user-block.user-block-sm img{width:1.875rem;height:1.875rem}.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-lg,.img-md,.img-sm{float:left}.img-sm{height:1.875rem;width:1.875rem}.img-sm+.img-push{margin-left:2.5rem}.img-md{width:3.75rem;height:3.75rem}.img-md+.img-push{margin-left:4.375rem}.img-lg{width:6.25rem;height:6.25rem}.img-lg+.img-push{margin-left:6.875rem}.img-bordered{border:3px solid #adb5bd;padding:3px}.img-bordered-sm{border:2px solid #adb5bd;padding:2px}.img-rounded{border-radius:.25rem}.img-circle{border-radius:50%}.img-size-32,.img-size-50,.img-size-64{height:auto}.img-size-64{width:64px}.img-size-50{width:50px}.img-size-32{width:32px}.size-32,.size-40,.size-50{display:block;text-align:center}.size-32{height:32px;line-height:32px;width:32px}.size-40{height:40px;line-height:40px;width:40px}.size-50{height:50px;line-height:50px;width:50px}.attachment-block{background:#f8f9fa;border:1px solid rgba(0,0,0,.125);margin-bottom:10px;padding:5px}.attachment-block .attachment-img{float:left;height:auto;max-height:100px;max-width:100px}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#495057}.card>.loading-img,.card>.overlay,.info-box>.loading-img,.info-box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay,.small-box>.loading-img,.small-box>.overlay{height:100%;left:0;position:absolute;top:0;width:100%}.card .overlay,.info-box .overlay,.overlay-wrapper .overlay,.small-box .overlay{border-radius:.25rem;align-items:center;background:hsla(0,0%,100%,.7);display:flex;justify-content:center;z-index:50}.card .overlay>.fa,.card .overlay>.fab,.card .overlay>.far,.card .overlay>.fas,.card .overlay>.glyphicon,.card .overlay>.ion,.info-box .overlay>.fa,.info-box .overlay>.fab,.info-box .overlay>.far,.info-box .overlay>.fas,.info-box .overlay>.glyphicon,.info-box .overlay>.ion,.overlay-wrapper .overlay>.fa,.overlay-wrapper .overlay>.fab,.overlay-wrapper .overlay>.far,.overlay-wrapper .overlay>.fas,.overlay-wrapper .overlay>.glyphicon,.overlay-wrapper .overlay>.ion,.small-box .overlay>.fa,.small-box .overlay>.fab,.small-box .overlay>.far,.small-box .overlay>.fas,.small-box .overlay>.glyphicon,.small-box .overlay>.ion{color:#343a40}.card .overlay.dark,.info-box .overlay.dark,.overlay-wrapper .overlay.dark,.small-box .overlay.dark{background:rgba(0,0,0,.5)}.card .overlay.dark>.fa,.card .overlay.dark>.fab,.card .overlay.dark>.far,.card .overlay.dark>.fas,.card .overlay.dark>.glyphicon,.card .overlay.dark>.ion,.info-box .overlay.dark>.fa,.info-box .overlay.dark>.fab,.info-box .overlay.dark>.far,.info-box .overlay.dark>.fas,.info-box .overlay.dark>.glyphicon,.info-box .overlay.dark>.ion,.overlay-wrapper .overlay.dark>.fa,.overlay-wrapper .overlay.dark>.fab,.overlay-wrapper .overlay.dark>.far,.overlay-wrapper .overlay.dark>.fas,.overlay-wrapper .overlay.dark>.glyphicon,.overlay-wrapper .overlay.dark>.ion,.small-box .overlay.dark>.fa,.small-box .overlay.dark>.fab,.small-box .overlay.dark>.far,.small-box .overlay.dark>.fas,.small-box .overlay.dark>.glyphicon,.small-box .overlay.dark>.ion{color:#ced4da}.tab-pane>.overlay-wrapper{position:relative}.tab-pane>.overlay-wrapper>.overlay{border-top-left-radius:0;border-top-right-radius:0;flex-direction:column;margin-top:-1.25rem;margin-left:-1.25rem;height:calc(100% + 2.5rem);width:calc(100% + 2.5rem)}.tab-pane>.overlay-wrapper>.overlay.dark{color:#fff}.ribbon-wrapper{height:70px;overflow:hidden;position:absolute;right:-2px;top:-2px;width:70px;z-index:10}.ribbon-wrapper.ribbon-lg{height:120px;width:120px}.ribbon-wrapper.ribbon-lg .ribbon{right:0;top:26px;width:160px}.ribbon-wrapper.ribbon-xl{height:180px;width:180px}.ribbon-wrapper.ribbon-xl .ribbon{right:4px;top:47px;width:240px}.ribbon-wrapper .ribbon{box-shadow:0 0 3px rgba(0,0,0,.3);font-size:.8rem;line-height:100%;padding:.375rem 0;position:relative;right:-2px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.4);text-transform:uppercase;top:10px;transform:rotate(45deg);width:90px}.ribbon-wrapper .ribbon:after,.ribbon-wrapper .ribbon:before{border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #9e9e9e;bottom:-3px;content:"";position:absolute}.ribbon-wrapper .ribbon:before{left:0}.ribbon-wrapper .ribbon:after{right:0}.back-to-top{bottom:1.25rem;position:fixed;right:1.25rem;z-index:1032}.back-to-top:focus{box-shadow:none}pre{padding:.75rem}blockquote{background:#fff;border-left:.7rem solid #007bff;margin:1.5em .7rem;padding:.5em .7rem}.box blockquote{background:#e9ecef}blockquote p:last-child{margin-bottom:0}blockquote h1,blockquote h2,blockquote h3,blockquote h4,blockquote h5,blockquote h6{color:#007bff;font-size:1.25rem;font-weight:600}blockquote.quote-primary{border-color:#007bff}blockquote.quote-primary h1,blockquote.quote-primary h2,blockquote.quote-primary h3,blockquote.quote-primary h4,blockquote.quote-primary h5,blockquote.quote-primary h6{color:#007bff}blockquote.quote-secondary{border-color:#6c757d}blockquote.quote-secondary h1,blockquote.quote-secondary h2,blockquote.quote-secondary h3,blockquote.quote-secondary h4,blockquote.quote-secondary h5,blockquote.quote-secondary h6{color:#6c757d}blockquote.quote-success{border-color:#28a745}blockquote.quote-success h1,blockquote.quote-success h2,blockquote.quote-success h3,blockquote.quote-success h4,blockquote.quote-success h5,blockquote.quote-success h6{color:#28a745}blockquote.quote-info{border-color:#17a2b8}blockquote.quote-info h1,blockquote.quote-info h2,blockquote.quote-info h3,blockquote.quote-info h4,blockquote.quote-info h5,blockquote.quote-info h6{color:#17a2b8}blockquote.quote-warning{border-color:#ffc107}blockquote.quote-warning h1,blockquote.quote-warning h2,blockquote.quote-warning h3,blockquote.quote-warning h4,blockquote.quote-warning h5,blockquote.quote-warning h6{color:#ffc107}blockquote.quote-danger{border-color:#dc3545}blockquote.quote-danger h1,blockquote.quote-danger h2,blockquote.quote-danger h3,blockquote.quote-danger h4,blockquote.quote-danger h5,blockquote.quote-danger h6{color:#dc3545}blockquote.quote-light{border-color:#f8f9fa}blockquote.quote-light h1,blockquote.quote-light h2,blockquote.quote-light h3,blockquote.quote-light h4,blockquote.quote-light h5,blockquote.quote-light h6{color:#f8f9fa}blockquote.quote-dark{border-color:#343a40}blockquote.quote-dark h1,blockquote.quote-dark h2,blockquote.quote-dark h3,blockquote.quote-dark h4,blockquote.quote-dark h5,blockquote.quote-dark h6{color:#343a40}blockquote.quote-lightblue{border-color:#3c8dbc}blockquote.quote-lightblue h1,blockquote.quote-lightblue h2,blockquote.quote-lightblue h3,blockquote.quote-lightblue h4,blockquote.quote-lightblue h5,blockquote.quote-lightblue h6{color:#3c8dbc}blockquote.quote-navy{border-color:#001f3f}blockquote.quote-navy h1,blockquote.quote-navy h2,blockquote.quote-navy h3,blockquote.quote-navy h4,blockquote.quote-navy h5,blockquote.quote-navy h6{color:#001f3f}blockquote.quote-olive{border-color:#3d9970}blockquote.quote-olive h1,blockquote.quote-olive h2,blockquote.quote-olive h3,blockquote.quote-olive h4,blockquote.quote-olive h5,blockquote.quote-olive h6{color:#3d9970}blockquote.quote-lime{border-color:#01ff70}blockquote.quote-lime h1,blockquote.quote-lime h2,blockquote.quote-lime h3,blockquote.quote-lime h4,blockquote.quote-lime h5,blockquote.quote-lime h6{color:#01ff70}blockquote.quote-fuchsia{border-color:#f012be}blockquote.quote-fuchsia h1,blockquote.quote-fuchsia h2,blockquote.quote-fuchsia h3,blockquote.quote-fuchsia h4,blockquote.quote-fuchsia h5,blockquote.quote-fuchsia h6{color:#f012be}blockquote.quote-maroon{border-color:#d81b60}blockquote.quote-maroon h1,blockquote.quote-maroon h2,blockquote.quote-maroon h3,blockquote.quote-maroon h4,blockquote.quote-maroon h5,blockquote.quote-maroon h6{color:#d81b60}blockquote.quote-blue{border-color:#007bff}blockquote.quote-blue h1,blockquote.quote-blue h2,blockquote.quote-blue h3,blockquote.quote-blue h4,blockquote.quote-blue h5,blockquote.quote-blue h6{color:#007bff}blockquote.quote-indigo{border-color:#6610f2}blockquote.quote-indigo h1,blockquote.quote-indigo h2,blockquote.quote-indigo h3,blockquote.quote-indigo h4,blockquote.quote-indigo h5,blockquote.quote-indigo h6{color:#6610f2}blockquote.quote-purple{border-color:#6f42c1}blockquote.quote-purple h1,blockquote.quote-purple h2,blockquote.quote-purple h3,blockquote.quote-purple h4,blockquote.quote-purple h5,blockquote.quote-purple h6{color:#6f42c1}blockquote.quote-pink{border-color:#e83e8c}blockquote.quote-pink h1,blockquote.quote-pink h2,blockquote.quote-pink h3,blockquote.quote-pink h4,blockquote.quote-pink h5,blockquote.quote-pink h6{color:#e83e8c}blockquote.quote-red{border-color:#dc3545}blockquote.quote-red h1,blockquote.quote-red h2,blockquote.quote-red h3,blockquote.quote-red h4,blockquote.quote-red h5,blockquote.quote-red h6{color:#dc3545}blockquote.quote-orange{border-color:#fd7e14}blockquote.quote-orange h1,blockquote.quote-orange h2,blockquote.quote-orange h3,blockquote.quote-orange h4,blockquote.quote-orange h5,blockquote.quote-orange h6{color:#fd7e14}blockquote.quote-yellow{border-color:#ffc107}blockquote.quote-yellow h1,blockquote.quote-yellow h2,blockquote.quote-yellow h3,blockquote.quote-yellow h4,blockquote.quote-yellow h5,blockquote.quote-yellow h6{color:#ffc107}blockquote.quote-green{border-color:#28a745}blockquote.quote-green h1,blockquote.quote-green h2,blockquote.quote-green h3,blockquote.quote-green h4,blockquote.quote-green h5,blockquote.quote-green h6{color:#28a745}blockquote.quote-teal{border-color:#20c997}blockquote.quote-teal h1,blockquote.quote-teal h2,blockquote.quote-teal h3,blockquote.quote-teal h4,blockquote.quote-teal h5,blockquote.quote-teal h6{color:#20c997}blockquote.quote-cyan{border-color:#17a2b8}blockquote.quote-cyan h1,blockquote.quote-cyan h2,blockquote.quote-cyan h3,blockquote.quote-cyan h4,blockquote.quote-cyan h5,blockquote.quote-cyan h6{color:#17a2b8}blockquote.quote-white{border-color:#fff}blockquote.quote-white h1,blockquote.quote-white h2,blockquote.quote-white h3,blockquote.quote-white h4,blockquote.quote-white h5,blockquote.quote-white h6{color:#fff}blockquote.quote-gray{border-color:#6c757d}blockquote.quote-gray h1,blockquote.quote-gray h2,blockquote.quote-gray h3,blockquote.quote-gray h4,blockquote.quote-gray h5,blockquote.quote-gray h6{color:#6c757d}blockquote.quote-gray-dark{border-color:#343a40}blockquote.quote-gray-dark h1,blockquote.quote-gray-dark h2,blockquote.quote-gray-dark h3,blockquote.quote-gray-dark h4,blockquote.quote-gray-dark h5,blockquote.quote-gray-dark h6{color:#343a40}.tab-custom-content{border-top:1px solid #dee2e6;margin-top:.5rem;padding-top:.5rem}.nav+.tab-custom-content{border-top:none;border-bottom:1px solid #dee2e6;margin-top:0;margin-bottom:.5rem;padding-bottom:.5rem}.badge-btn{border-radius:.15rem;font-size:.75rem;font-weight:400;padding:.25rem .5rem}.badge-btn.badge-pill{padding:.375rem .6rem}@media print{.content-header,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer{transform:translate(0);margin-left:0!important;min-height:0!important}.layout-fixed .content-wrapper{padding-top:0!important}.invoice{border:0;margin:0;padding:0;width:100%}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-xs{font-size:.75rem!important}.text-sm{font-size:.875rem!important}.text-md{font-size:1rem!important}.text-lg{font-size:1.25rem!important}.text-xl{font-size:2rem!important}.text-lightblue{color:#3c8dbc!important}.text-navy{color:#001f3f!important}.text-olive{color:#3d9970!important}.text-lime{color:#01ff70!important}.text-fuchsia{color:#f012be!important}.text-maroon{color:#d81b60!important}.text-blue{color:#007bff!important}.text-indigo{color:#6610f2!important}.text-purple{color:#6f42c1!important}.text-pink{color:#e83e8c!important}.text-red{color:#dc3545!important}.text-orange{color:#fd7e14!important}.text-yellow{color:#ffc107!important}.text-green{color:#28a745!important}.text-teal{color:#20c997!important}.text-cyan{color:#17a2b8!important}.text-white{color:#fff!important}.text-gray{color:#6c757d!important}.text-gray-dark{color:#343a40!important}.elevation-0{box-shadow:none!important}.elevation-1{box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)!important}.elevation-2{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23)!important}.elevation-3{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)!important}.elevation-4{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)!important}.elevation-5{box-shadow:0 19px 38px rgba(0,0,0,.3),0 15px 12px rgba(0,0,0,.22)!important}.bg-primary{background-color:#007bff!important}.bg-primary,.bg-primary>a{color:#fff!important}.bg-primary.btn:hover{border-color:#0062cc;color:#ececec}.bg-primary.btn.active,.bg-primary.btn:active,.bg-primary.btn:not(:disabled):not(.disabled).active,.bg-primary.btn:not(:disabled):not(.disabled):active{background-color:#0062cc!important;border-color:#005cbf;color:#fff}.bg-secondary{background-color:#6c757d!important}.bg-secondary,.bg-secondary>a{color:#fff!important}.bg-secondary.btn:hover{border-color:#545b62;color:#ececec}.bg-secondary.btn.active,.bg-secondary.btn:active,.bg-secondary.btn:not(:disabled):not(.disabled).active,.bg-secondary.btn:not(:disabled):not(.disabled):active{background-color:#545b62!important;border-color:#4e555b;color:#fff}.bg-success{background-color:#28a745!important}.bg-success,.bg-success>a{color:#fff!important}.bg-success.btn:hover{border-color:#1e7e34;color:#ececec}.bg-success.btn.active,.bg-success.btn:active,.bg-success.btn:not(:disabled):not(.disabled).active,.bg-success.btn:not(:disabled):not(.disabled):active{background-color:#1e7e34!important;border-color:#1c7430;color:#fff}.bg-info{background-color:#17a2b8!important}.bg-info,.bg-info>a{color:#fff!important}.bg-info.btn:hover{border-color:#117a8b;color:#ececec}.bg-info.btn.active,.bg-info.btn:active,.bg-info.btn:not(:disabled):not(.disabled).active,.bg-info.btn:not(:disabled):not(.disabled):active{background-color:#117a8b!important;border-color:#10707f;color:#fff}.bg-warning{background-color:#ffc107!important}.bg-warning,.bg-warning>a{color:#1f2d3d!important}.bg-warning.btn:hover{border-color:#d39e00;color:#121a24}.bg-warning.btn.active,.bg-warning.btn:active,.bg-warning.btn:not(:disabled):not(.disabled).active,.bg-warning.btn:not(:disabled):not(.disabled):active{background-color:#d39e00!important;border-color:#c69500;color:#1f2d3d}.bg-danger{background-color:#dc3545!important}.bg-danger,.bg-danger>a{color:#fff!important}.bg-danger.btn:hover{border-color:#bd2130;color:#ececec}.bg-danger.btn.active,.bg-danger.btn:active,.bg-danger.btn:not(:disabled):not(.disabled).active,.bg-danger.btn:not(:disabled):not(.disabled):active{background-color:#bd2130!important;border-color:#b21f2d;color:#fff}.bg-light{background-color:#f8f9fa!important}.bg-light,.bg-light>a{color:#1f2d3d!important}.bg-light.btn:hover{border-color:#dae0e5;color:#121a24}.bg-light.btn.active,.bg-light.btn:active,.bg-light.btn:not(:disabled):not(.disabled).active,.bg-light.btn:not(:disabled):not(.disabled):active{background-color:#dae0e5!important;border-color:#d3d9df;color:#1f2d3d}.bg-dark{background-color:#343a40!important}.bg-dark,.bg-dark>a{color:#fff!important}.bg-dark.btn:hover{border-color:#1d2124;color:#ececec}.bg-dark.btn.active,.bg-dark.btn:active,.bg-dark.btn:not(:disabled):not(.disabled).active,.bg-dark.btn:not(:disabled):not(.disabled):active{background-color:#1d2124!important;border-color:#171a1d;color:#fff}.bg-lightblue{background-color:#3c8dbc!important}.bg-lightblue,.bg-lightblue>a{color:#fff!important}.bg-lightblue.btn:hover{border-color:#307095;color:#ececec}.bg-lightblue.btn.active,.bg-lightblue.btn:active,.bg-lightblue.btn:not(:disabled):not(.disabled).active,.bg-lightblue.btn:not(:disabled):not(.disabled):active{background-color:#307095!important;border-color:#2d698c;color:#fff}.bg-navy{background-color:#001f3f!important}.bg-navy,.bg-navy>a{color:#fff!important}.bg-navy.btn:hover{border-color:#00060c;color:#ececec}.bg-navy.btn.active,.bg-navy.btn:active,.bg-navy.btn:not(:disabled):not(.disabled).active,.bg-navy.btn:not(:disabled):not(.disabled):active{background-color:#00060c!important;border-color:#000;color:#fff}.bg-olive{background-color:#3d9970!important}.bg-olive,.bg-olive>a{color:#fff!important}.bg-olive.btn:hover{border-color:#2e7555;color:#ececec}.bg-olive.btn.active,.bg-olive.btn:active,.bg-olive.btn:not(:disabled):not(.disabled).active,.bg-olive.btn:not(:disabled):not(.disabled):active{background-color:#2e7555!important;border-color:#2b6b4f;color:#fff}.bg-lime{background-color:#01ff70!important}.bg-lime,.bg-lime>a{color:#1f2d3d!important}.bg-lime.btn:hover{border-color:#00cd5a;color:#121a24}.bg-lime.btn.active,.bg-lime.btn:active,.bg-lime.btn:not(:disabled):not(.disabled).active,.bg-lime.btn:not(:disabled):not(.disabled):active{background-color:#00cd5a!important;border-color:#00c054;color:#fff}.bg-fuchsia{background-color:#f012be!important}.bg-fuchsia,.bg-fuchsia>a{color:#fff!important}.bg-fuchsia.btn:hover{border-color:#c30c9a;color:#ececec}.bg-fuchsia.btn.active,.bg-fuchsia.btn:active,.bg-fuchsia.btn:not(:disabled):not(.disabled).active,.bg-fuchsia.btn:not(:disabled):not(.disabled):active{background-color:#c30c9a!important;border-color:#b70c90;color:#fff}.bg-maroon{background-color:#d81b60!important}.bg-maroon,.bg-maroon>a{color:#fff!important}.bg-maroon.btn:hover{border-color:#ab154c;color:#ececec}.bg-maroon.btn.active,.bg-maroon.btn:active,.bg-maroon.btn:not(:disabled):not(.disabled).active,.bg-maroon.btn:not(:disabled):not(.disabled):active{background-color:#ab154c!important;border-color:#9f1447;color:#fff}.bg-blue{background-color:#007bff!important}.bg-blue,.bg-blue>a{color:#fff!important}.bg-blue.btn:hover{border-color:#0062cc;color:#ececec}.bg-blue.btn.active,.bg-blue.btn:active,.bg-blue.btn:not(:disabled):not(.disabled).active,.bg-blue.btn:not(:disabled):not(.disabled):active{background-color:#0062cc!important;border-color:#005cbf;color:#fff}.bg-indigo{background-color:#6610f2!important}.bg-indigo,.bg-indigo>a{color:#fff!important}.bg-indigo.btn:hover{border-color:#510bc4;color:#ececec}.bg-indigo.btn.active,.bg-indigo.btn:active,.bg-indigo.btn:not(:disabled):not(.disabled).active,.bg-indigo.btn:not(:disabled):not(.disabled):active{background-color:#510bc4!important;border-color:#4c0ab8;color:#fff}.bg-purple{background-color:#6f42c1!important}.bg-purple,.bg-purple>a{color:#fff!important}.bg-purple.btn:hover{border-color:#59339d;color:#ececec}.bg-purple.btn.active,.bg-purple.btn:active,.bg-purple.btn:not(:disabled):not(.disabled).active,.bg-purple.btn:not(:disabled):not(.disabled):active{background-color:#59339d!important;border-color:#533093;color:#fff}.bg-pink{background-color:#e83e8c!important}.bg-pink,.bg-pink>a{color:#fff!important}.bg-pink.btn:hover{border-color:#d91a72;color:#ececec}.bg-pink.btn.active,.bg-pink.btn:active,.bg-pink.btn:not(:disabled):not(.disabled).active,.bg-pink.btn:not(:disabled):not(.disabled):active{background-color:#d91a72!important;border-color:#ce196c;color:#fff}.bg-red{background-color:#dc3545!important}.bg-red,.bg-red>a{color:#fff!important}.bg-red.btn:hover{border-color:#bd2130;color:#ececec}.bg-red.btn.active,.bg-red.btn:active,.bg-red.btn:not(:disabled):not(.disabled).active,.bg-red.btn:not(:disabled):not(.disabled):active{background-color:#bd2130!important;border-color:#b21f2d;color:#fff}.bg-orange{background-color:#fd7e14!important}.bg-orange,.bg-orange>a{color:#1f2d3d!important}.bg-orange.btn:hover{border-color:#dc6502;color:#121a24}.bg-orange.btn.active,.bg-orange.btn:active,.bg-orange.btn:not(:disabled):not(.disabled).active,.bg-orange.btn:not(:disabled):not(.disabled):active{background-color:#dc6502!important;border-color:#cf5f02;color:#fff}.bg-yellow{background-color:#ffc107!important}.bg-yellow,.bg-yellow>a{color:#1f2d3d!important}.bg-yellow.btn:hover{border-color:#d39e00;color:#121a24}.bg-yellow.btn.active,.bg-yellow.btn:active,.bg-yellow.btn:not(:disabled):not(.disabled).active,.bg-yellow.btn:not(:disabled):not(.disabled):active{background-color:#d39e00!important;border-color:#c69500;color:#1f2d3d}.bg-green{background-color:#28a745!important}.bg-green,.bg-green>a{color:#fff!important}.bg-green.btn:hover{border-color:#1e7e34;color:#ececec}.bg-green.btn.active,.bg-green.btn:active,.bg-green.btn:not(:disabled):not(.disabled).active,.bg-green.btn:not(:disabled):not(.disabled):active{background-color:#1e7e34!important;border-color:#1c7430;color:#fff}.bg-teal{background-color:#20c997!important}.bg-teal,.bg-teal>a{color:#fff!important}.bg-teal.btn:hover{border-color:#199d76;color:#ececec}.bg-teal.btn.active,.bg-teal.btn:active,.bg-teal.btn:not(:disabled):not(.disabled).active,.bg-teal.btn:not(:disabled):not(.disabled):active{background-color:#199d76!important;border-color:#17926e;color:#fff}.bg-cyan{background-color:#17a2b8!important}.bg-cyan,.bg-cyan>a{color:#fff!important}.bg-cyan.btn:hover{border-color:#117a8b;color:#ececec}.bg-cyan.btn.active,.bg-cyan.btn:active,.bg-cyan.btn:not(:disabled):not(.disabled).active,.bg-cyan.btn:not(:disabled):not(.disabled):active{background-color:#117a8b!important;border-color:#10707f;color:#fff}.bg-white{background-color:#fff!important}.bg-white,.bg-white>a{color:#1f2d3d!important}.bg-white.btn:hover{border-color:#e6e6e6;color:#121a24}.bg-white.btn.active,.bg-white.btn:active,.bg-white.btn:not(:disabled):not(.disabled).active,.bg-white.btn:not(:disabled):not(.disabled):active{background-color:#e6e6e6!important;border-color:#dfdfdf;color:#1f2d3d}.bg-gray{background-color:#6c757d!important}.bg-gray,.bg-gray>a{color:#fff!important}.bg-gray.btn:hover{border-color:#545b62;color:#ececec}.bg-gray.btn.active,.bg-gray.btn:active,.bg-gray.btn:not(:disabled):not(.disabled).active,.bg-gray.btn:not(:disabled):not(.disabled):active{background-color:#545b62!important;border-color:#4e555b;color:#fff}.bg-gray-dark{background-color:#343a40!important}.bg-gray-dark,.bg-gray-dark>a{color:#fff!important}.bg-gray-dark.btn:hover{border-color:#1d2124;color:#ececec}.bg-gray-dark.btn.active,.bg-gray-dark.btn:active,.bg-gray-dark.btn:not(:disabled):not(.disabled).active,.bg-gray-dark.btn:not(:disabled):not(.disabled):active{background-color:#1d2124!important;border-color:#171a1d;color:#fff}.bg-gray{background-color:#adb5bd;color:#1f2d3d}.bg-gray-light{background-color:#f2f4f5;color:#1f2d3d!important}.bg-black{background-color:#000;color:#fff!important}.bg-white{background-color:#fff;color:#1f2d3d!important}.bg-gradient-primary{color:#fff;background:#007bff linear-gradient(180deg,#268fff,#007bff) repeat-x!important}.bg-gradient-primary.btn.disabled,.bg-gradient-primary.btn:disabled,.bg-gradient-primary.btn:not(:disabled):not(.disabled).active,.bg-gradient-primary.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-primary.btn.dropdown-toggle{background-image:none!important}.bg-gradient-primary.btn:hover{border-color:#0062cc;color:#ececec;background:#0069d9 linear-gradient(180deg,#2680df,#0069d9) repeat-x!important}.bg-gradient-primary.btn.active,.bg-gradient-primary.btn:active,.bg-gradient-primary.btn:not(:disabled):not(.disabled).active,.bg-gradient-primary.btn:not(:disabled):not(.disabled):active{border-color:#005cbf;color:#fff;background:#0062cc linear-gradient(180deg,#267ad4,#0062cc) repeat-x!important}.bg-gradient-secondary{color:#fff;background:#6c757d linear-gradient(180deg,#828a91,#6c757d) repeat-x!important}.bg-gradient-secondary.btn.disabled,.bg-gradient-secondary.btn:disabled,.bg-gradient-secondary.btn:not(:disabled):not(.disabled).active,.bg-gradient-secondary.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-secondary.btn.dropdown-toggle{background-image:none!important}.bg-gradient-secondary.btn:hover{border-color:#545b62;color:#ececec;background:#5a6268 linear-gradient(180deg,#737a7f,#5a6268) repeat-x!important}.bg-gradient-secondary.btn.active,.bg-gradient-secondary.btn:active,.bg-gradient-secondary.btn:not(:disabled):not(.disabled).active,.bg-gradient-secondary.btn:not(:disabled):not(.disabled):active{border-color:#4e555b;color:#fff;background:#545b62 linear-gradient(180deg,#6e747a,#545b62) repeat-x!important}.bg-gradient-success{color:#fff;background:#28a745 linear-gradient(180deg,#48b461,#28a745) repeat-x!important}.bg-gradient-success.btn.disabled,.bg-gradient-success.btn:disabled,.bg-gradient-success.btn:not(:disabled):not(.disabled).active,.bg-gradient-success.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-success.btn.dropdown-toggle{background-image:none!important}.bg-gradient-success.btn:hover{border-color:#1e7e34;color:#ececec;background:#218838 linear-gradient(180deg,#429a56,#218838) repeat-x!important}.bg-gradient-success.btn.active,.bg-gradient-success.btn:active,.bg-gradient-success.btn:not(:disabled):not(.disabled).active,.bg-gradient-success.btn:not(:disabled):not(.disabled):active{border-color:#1c7430;color:#fff;background:#1e7e34 linear-gradient(180deg,#409152,#1e7e34) repeat-x!important}.bg-gradient-info{color:#fff;background:#17a2b8 linear-gradient(180deg,#3ab0c3,#17a2b8) repeat-x!important}.bg-gradient-info.btn.disabled,.bg-gradient-info.btn:disabled,.bg-gradient-info.btn:not(:disabled):not(.disabled).active,.bg-gradient-info.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-info.btn.dropdown-toggle{background-image:none!important}.bg-gradient-info.btn:hover{border-color:#117a8b;color:#ececec;background:#138496 linear-gradient(180deg,#3696a6,#138496) repeat-x!important}.bg-gradient-info.btn.active,.bg-gradient-info.btn:active,.bg-gradient-info.btn:not(:disabled):not(.disabled).active,.bg-gradient-info.btn:not(:disabled):not(.disabled):active{border-color:#10707f;color:#fff;background:#117a8b linear-gradient(180deg,#358e9c,#117a8b) repeat-x!important}.bg-gradient-warning{color:#1f2d3d;background:#ffc107 linear-gradient(180deg,#ffca2c,#ffc107) repeat-x!important}.bg-gradient-warning.btn.disabled,.bg-gradient-warning.btn:disabled,.bg-gradient-warning.btn:not(:disabled):not(.disabled).active,.bg-gradient-warning.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-warning.btn.dropdown-toggle{background-image:none!important}.bg-gradient-warning.btn:hover{border-color:#d39e00;color:#121a24;background:#e0a800 linear-gradient(180deg,#e5b526,#e0a800) repeat-x!important}.bg-gradient-warning.btn.active,.bg-gradient-warning.btn:active,.bg-gradient-warning.btn:not(:disabled):not(.disabled).active,.bg-gradient-warning.btn:not(:disabled):not(.disabled):active{border-color:#c69500;color:#1f2d3d;background:#d39e00 linear-gradient(180deg,#daad26,#d39e00) repeat-x!important}.bg-gradient-danger{color:#fff;background:#dc3545 linear-gradient(180deg,#e15361,#dc3545) repeat-x!important}.bg-gradient-danger.btn.disabled,.bg-gradient-danger.btn:disabled,.bg-gradient-danger.btn:not(:disabled):not(.disabled).active,.bg-gradient-danger.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-danger.btn.dropdown-toggle{background-image:none!important}.bg-gradient-danger.btn:hover{border-color:#bd2130;color:#ececec;background:#c82333 linear-gradient(180deg,#d04452,#c82333) repeat-x!important}.bg-gradient-danger.btn.active,.bg-gradient-danger.btn:active,.bg-gradient-danger.btn:not(:disabled):not(.disabled).active,.bg-gradient-danger.btn:not(:disabled):not(.disabled):active{border-color:#b21f2d;color:#fff;background:#bd2130 linear-gradient(180deg,#c7424f,#bd2130) repeat-x!important}.bg-gradient-light{color:#1f2d3d;background:#f8f9fa linear-gradient(180deg,#f9fafb,#f8f9fa) repeat-x!important}.bg-gradient-light.btn.disabled,.bg-gradient-light.btn:disabled,.bg-gradient-light.btn:not(:disabled):not(.disabled).active,.bg-gradient-light.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-light.btn.dropdown-toggle{background-image:none!important}.bg-gradient-light.btn:hover{border-color:#dae0e5;color:#121a24;background:#e2e6ea linear-gradient(180deg,#e6eaed,#e2e6ea) repeat-x!important}.bg-gradient-light.btn.active,.bg-gradient-light.btn:active,.bg-gradient-light.btn:not(:disabled):not(.disabled).active,.bg-gradient-light.btn:not(:disabled):not(.disabled):active{border-color:#d3d9df;color:#1f2d3d;background:#dae0e5 linear-gradient(180deg,#e0e5e9,#dae0e5) repeat-x!important}.bg-gradient-dark{color:#fff;background:#343a40 linear-gradient(180deg,#52585d,#343a40) repeat-x!important}.bg-gradient-dark.btn.disabled,.bg-gradient-dark.btn:disabled,.bg-gradient-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-dark.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-dark.btn.dropdown-toggle{background-image:none!important}.bg-gradient-dark.btn:hover{border-color:#1d2124;color:#ececec;background:#23272b linear-gradient(180deg,#44474b,#23272b) repeat-x!important}.bg-gradient-dark.btn.active,.bg-gradient-dark.btn:active,.bg-gradient-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-dark.btn:not(:disabled):not(.disabled):active{border-color:#171a1d;color:#fff;background:#1d2124 linear-gradient(180deg,#3f4245,#1d2124) repeat-x!important}.bg-gradient-lightblue{color:#fff;background:#3c8dbc linear-gradient(180deg,#599ec6,#3c8dbc) repeat-x!important}.bg-gradient-lightblue.btn.disabled,.bg-gradient-lightblue.btn:disabled,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled).active,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-lightblue.btn.dropdown-toggle{background-image:none!important}.bg-gradient-lightblue.btn:hover{border-color:#307095;color:#ececec;background:#33779f linear-gradient(180deg,#528bad,#33779f) repeat-x!important}.bg-gradient-lightblue.btn.active,.bg-gradient-lightblue.btn:active,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled).active,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled):active{border-color:#2d698c;color:#fff;background:#307095 linear-gradient(180deg,#4f85a5,#307095) repeat-x!important}.bg-gradient-navy{color:#fff;background:#001f3f linear-gradient(180deg,#26415c,#001f3f) repeat-x!important}.bg-gradient-navy.btn.disabled,.bg-gradient-navy.btn:disabled,.bg-gradient-navy.btn:not(:disabled):not(.disabled).active,.bg-gradient-navy.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-navy.btn.dropdown-toggle{background-image:none!important}.bg-gradient-navy.btn:hover{border-color:#00060c;color:#ececec;background:#000c19 linear-gradient(180deg,#26303c,#000c19) repeat-x!important}.bg-gradient-navy.btn.active,.bg-gradient-navy.btn:active,.bg-gradient-navy.btn:not(:disabled):not(.disabled).active,.bg-gradient-navy.btn:not(:disabled):not(.disabled):active{border-color:#000;color:#fff;background:#00060c linear-gradient(180deg,#262b30,#00060c) repeat-x!important}.bg-gradient-olive{color:#fff;background:#3d9970 linear-gradient(180deg,#5aa885,#3d9970) repeat-x!important}.bg-gradient-olive.btn.disabled,.bg-gradient-olive.btn:disabled,.bg-gradient-olive.btn:not(:disabled):not(.disabled).active,.bg-gradient-olive.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-olive.btn.dropdown-toggle{background-image:none!important}.bg-gradient-olive.btn:hover{border-color:#2e7555;color:#ececec;background:#327e5c linear-gradient(180deg,#519174,#327e5c) repeat-x!important}.bg-gradient-olive.btn.active,.bg-gradient-olive.btn:active,.bg-gradient-olive.btn:not(:disabled):not(.disabled).active,.bg-gradient-olive.btn:not(:disabled):not(.disabled):active{border-color:#2b6b4f;color:#fff;background:#2e7555 linear-gradient(180deg,#4d8a6f,#2e7555) repeat-x!important}.bg-gradient-lime{color:#1f2d3d;background:#01ff70 linear-gradient(180deg,#27ff85,#01ff70) repeat-x!important}.bg-gradient-lime.btn.disabled,.bg-gradient-lime.btn:disabled,.bg-gradient-lime.btn:not(:disabled):not(.disabled).active,.bg-gradient-lime.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-lime.btn.dropdown-toggle{background-image:none!important}.bg-gradient-lime.btn:hover{border-color:#00cd5a;color:#121a24;background:#00da5f linear-gradient(180deg,#26e077,#00da5f) repeat-x!important}.bg-gradient-lime.btn.active,.bg-gradient-lime.btn:active,.bg-gradient-lime.btn:not(:disabled):not(.disabled).active,.bg-gradient-lime.btn:not(:disabled):not(.disabled):active{border-color:#00c054;color:#fff;background:#00cd5a linear-gradient(180deg,#26d573,#00cd5a) repeat-x!important}.bg-gradient-fuchsia{color:#fff;background:#f012be linear-gradient(180deg,#f236c8,#f012be) repeat-x!important}.bg-gradient-fuchsia.btn.disabled,.bg-gradient-fuchsia.btn:disabled,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled).active,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-fuchsia.btn.dropdown-toggle{background-image:none!important}.bg-gradient-fuchsia.btn:hover{border-color:#c30c9a;color:#ececec;background:#cf0da3 linear-gradient(180deg,#d631b1,#cf0da3) repeat-x!important}.bg-gradient-fuchsia.btn.active,.bg-gradient-fuchsia.btn:active,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled).active,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled):active{border-color:#b70c90;color:#fff;background:#c30c9a linear-gradient(180deg,#cc30a9,#c30c9a) repeat-x!important}.bg-gradient-maroon{color:#fff;background:#d81b60 linear-gradient(180deg,#de3d78,#d81b60) repeat-x!important}.bg-gradient-maroon.btn.disabled,.bg-gradient-maroon.btn:disabled,.bg-gradient-maroon.btn:not(:disabled):not(.disabled).active,.bg-gradient-maroon.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-maroon.btn.dropdown-toggle{background-image:none!important}.bg-gradient-maroon.btn:hover{border-color:#ab154c;color:#ececec;background:#b61751 linear-gradient(180deg,#c13a6b,#b61751) repeat-x!important}.bg-gradient-maroon.btn.active,.bg-gradient-maroon.btn:active,.bg-gradient-maroon.btn:not(:disabled):not(.disabled).active,.bg-gradient-maroon.btn:not(:disabled):not(.disabled):active{border-color:#9f1447;color:#fff;background:#ab154c linear-gradient(180deg,#b83867,#ab154c) repeat-x!important}.bg-gradient-blue{color:#fff;background:#007bff linear-gradient(180deg,#268fff,#007bff) repeat-x!important}.bg-gradient-blue.btn.disabled,.bg-gradient-blue.btn:disabled,.bg-gradient-blue.btn:not(:disabled):not(.disabled).active,.bg-gradient-blue.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-blue.btn.dropdown-toggle{background-image:none!important}.bg-gradient-blue.btn:hover{border-color:#0062cc;color:#ececec;background:#0069d9 linear-gradient(180deg,#2680df,#0069d9) repeat-x!important}.bg-gradient-blue.btn.active,.bg-gradient-blue.btn:active,.bg-gradient-blue.btn:not(:disabled):not(.disabled).active,.bg-gradient-blue.btn:not(:disabled):not(.disabled):active{border-color:#005cbf;color:#fff;background:#0062cc linear-gradient(180deg,#267ad4,#0062cc) repeat-x!important}.bg-gradient-indigo{color:#fff;background:#6610f2 linear-gradient(180deg,#7d34f4,#6610f2) repeat-x!important}.bg-gradient-indigo.btn.disabled,.bg-gradient-indigo.btn:disabled,.bg-gradient-indigo.btn:not(:disabled):not(.disabled).active,.bg-gradient-indigo.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-indigo.btn.dropdown-toggle{background-image:none!important}.bg-gradient-indigo.btn:hover{border-color:#510bc4;color:#ececec;background:#560bd0 linear-gradient(180deg,#6f30d7,#560bd0) repeat-x!important}.bg-gradient-indigo.btn.active,.bg-gradient-indigo.btn:active,.bg-gradient-indigo.btn:not(:disabled):not(.disabled).active,.bg-gradient-indigo.btn:not(:disabled):not(.disabled):active{border-color:#4c0ab8;color:#fff;background:#510bc4 linear-gradient(180deg,#6b30cd,#510bc4) repeat-x!important}.bg-gradient-purple{color:#fff;background:#6f42c1 linear-gradient(180deg,#855eca,#6f42c1) repeat-x!important}.bg-gradient-purple.btn.disabled,.bg-gradient-purple.btn:disabled,.bg-gradient-purple.btn:not(:disabled):not(.disabled).active,.bg-gradient-purple.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-purple.btn.dropdown-toggle{background-image:none!important}.bg-gradient-purple.btn:hover{border-color:#59339d;color:#ececec;background:#5e37a6 linear-gradient(180deg,#7655b3,#5e37a6) repeat-x!important}.bg-gradient-purple.btn.active,.bg-gradient-purple.btn:active,.bg-gradient-purple.btn:not(:disabled):not(.disabled).active,.bg-gradient-purple.btn:not(:disabled):not(.disabled):active{border-color:#533093;color:#fff;background:#59339d linear-gradient(180deg,#7252ac,#59339d) repeat-x!important}.bg-gradient-pink{color:#fff;background:#e83e8c linear-gradient(180deg,#eb5b9d,#e83e8c) repeat-x!important}.bg-gradient-pink.btn.disabled,.bg-gradient-pink.btn:disabled,.bg-gradient-pink.btn:not(:disabled):not(.disabled).active,.bg-gradient-pink.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-pink.btn.dropdown-toggle{background-image:none!important}.bg-gradient-pink.btn:hover{border-color:#d91a72;color:#ececec;background:#e41c78 linear-gradient(180deg,#e83e8c,#e41c78) repeat-x!important}.bg-gradient-pink.btn.active,.bg-gradient-pink.btn:active,.bg-gradient-pink.btn:not(:disabled):not(.disabled).active,.bg-gradient-pink.btn:not(:disabled):not(.disabled):active{border-color:#ce196c;color:#fff;background:#d91a72 linear-gradient(180deg,#df3c87,#d91a72) repeat-x!important}.bg-gradient-red{color:#fff;background:#dc3545 linear-gradient(180deg,#e15361,#dc3545) repeat-x!important}.bg-gradient-red.btn.disabled,.bg-gradient-red.btn:disabled,.bg-gradient-red.btn:not(:disabled):not(.disabled).active,.bg-gradient-red.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-red.btn.dropdown-toggle{background-image:none!important}.bg-gradient-red.btn:hover{border-color:#bd2130;color:#ececec;background:#c82333 linear-gradient(180deg,#d04452,#c82333) repeat-x!important}.bg-gradient-red.btn.active,.bg-gradient-red.btn:active,.bg-gradient-red.btn:not(:disabled):not(.disabled).active,.bg-gradient-red.btn:not(:disabled):not(.disabled):active{border-color:#b21f2d;color:#fff;background:#bd2130 linear-gradient(180deg,#c7424f,#bd2130) repeat-x!important}.bg-gradient-orange{color:#1f2d3d;background:#fd7e14 linear-gradient(180deg,#fd9137,#fd7e14) repeat-x!important}.bg-gradient-orange.btn.disabled,.bg-gradient-orange.btn:disabled,.bg-gradient-orange.btn:not(:disabled):not(.disabled).active,.bg-gradient-orange.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-orange.btn.dropdown-toggle{background-image:none!important}.bg-gradient-orange.btn:hover{border-color:#dc6502;color:#121a24;background:#e96b02 linear-gradient(180deg,#ec8128,#e96b02) repeat-x!important}.bg-gradient-orange.btn.active,.bg-gradient-orange.btn:active,.bg-gradient-orange.btn:not(:disabled):not(.disabled).active,.bg-gradient-orange.btn:not(:disabled):not(.disabled):active{border-color:#cf5f02;color:#fff;background:#dc6502 linear-gradient(180deg,#e17c28,#dc6502) repeat-x!important}.bg-gradient-yellow{color:#1f2d3d;background:#ffc107 linear-gradient(180deg,#ffca2c,#ffc107) repeat-x!important}.bg-gradient-yellow.btn.disabled,.bg-gradient-yellow.btn:disabled,.bg-gradient-yellow.btn:not(:disabled):not(.disabled).active,.bg-gradient-yellow.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-yellow.btn.dropdown-toggle{background-image:none!important}.bg-gradient-yellow.btn:hover{border-color:#d39e00;color:#121a24;background:#e0a800 linear-gradient(180deg,#e5b526,#e0a800) repeat-x!important}.bg-gradient-yellow.btn.active,.bg-gradient-yellow.btn:active,.bg-gradient-yellow.btn:not(:disabled):not(.disabled).active,.bg-gradient-yellow.btn:not(:disabled):not(.disabled):active{border-color:#c69500;color:#1f2d3d;background:#d39e00 linear-gradient(180deg,#daad26,#d39e00) repeat-x!important}.bg-gradient-green{color:#fff;background:#28a745 linear-gradient(180deg,#48b461,#28a745) repeat-x!important}.bg-gradient-green.btn.disabled,.bg-gradient-green.btn:disabled,.bg-gradient-green.btn:not(:disabled):not(.disabled).active,.bg-gradient-green.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-green.btn.dropdown-toggle{background-image:none!important}.bg-gradient-green.btn:hover{border-color:#1e7e34;color:#ececec;background:#218838 linear-gradient(180deg,#429a56,#218838) repeat-x!important}.bg-gradient-green.btn.active,.bg-gradient-green.btn:active,.bg-gradient-green.btn:not(:disabled):not(.disabled).active,.bg-gradient-green.btn:not(:disabled):not(.disabled):active{border-color:#1c7430;color:#fff;background:#1e7e34 linear-gradient(180deg,#409152,#1e7e34) repeat-x!important}.bg-gradient-teal{color:#fff;background:#20c997 linear-gradient(180deg,#41d1a7,#20c997) repeat-x!important}.bg-gradient-teal.btn.disabled,.bg-gradient-teal.btn:disabled,.bg-gradient-teal.btn:not(:disabled):not(.disabled).active,.bg-gradient-teal.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-teal.btn.dropdown-toggle{background-image:none!important}.bg-gradient-teal.btn:hover{border-color:#199d76;color:#ececec;background:#1ba87e linear-gradient(180deg,#3db591,#1ba87e) repeat-x!important}.bg-gradient-teal.btn.active,.bg-gradient-teal.btn:active,.bg-gradient-teal.btn:not(:disabled):not(.disabled).active,.bg-gradient-teal.btn:not(:disabled):not(.disabled):active{border-color:#17926e;color:#fff;background:#199d76 linear-gradient(180deg,#3cac8b,#199d76) repeat-x!important}.bg-gradient-cyan{color:#fff;background:#17a2b8 linear-gradient(180deg,#3ab0c3,#17a2b8) repeat-x!important}.bg-gradient-cyan.btn.disabled,.bg-gradient-cyan.btn:disabled,.bg-gradient-cyan.btn:not(:disabled):not(.disabled).active,.bg-gradient-cyan.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-cyan.btn.dropdown-toggle{background-image:none!important}.bg-gradient-cyan.btn:hover{border-color:#117a8b;color:#ececec;background:#138496 linear-gradient(180deg,#3696a6,#138496) repeat-x!important}.bg-gradient-cyan.btn.active,.bg-gradient-cyan.btn:active,.bg-gradient-cyan.btn:not(:disabled):not(.disabled).active,.bg-gradient-cyan.btn:not(:disabled):not(.disabled):active{border-color:#10707f;color:#fff;background:#117a8b linear-gradient(180deg,#358e9c,#117a8b) repeat-x!important}.bg-gradient-white{color:#1f2d3d;background:#fff linear-gradient(180deg,#fff,#fff) repeat-x!important}.bg-gradient-white.btn.disabled,.bg-gradient-white.btn:disabled,.bg-gradient-white.btn:not(:disabled):not(.disabled).active,.bg-gradient-white.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-white.btn.dropdown-toggle{background-image:none!important}.bg-gradient-white.btn:hover{border-color:#e6e6e6;color:#121a24;background:#ececec linear-gradient(180deg,#efefef,#ececec) repeat-x!important}.bg-gradient-white.btn.active,.bg-gradient-white.btn:active,.bg-gradient-white.btn:not(:disabled):not(.disabled).active,.bg-gradient-white.btn:not(:disabled):not(.disabled):active{border-color:#dfdfdf;color:#1f2d3d;background:#e6e6e6 linear-gradient(180deg,#eaeaea,#e6e6e6) repeat-x!important}.bg-gradient-gray{color:#fff;background:#6c757d linear-gradient(180deg,#828a91,#6c757d) repeat-x!important}.bg-gradient-gray.btn.disabled,.bg-gradient-gray.btn:disabled,.bg-gradient-gray.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-gray.btn.dropdown-toggle{background-image:none!important}.bg-gradient-gray.btn:hover{border-color:#545b62;color:#ececec;background:#5a6268 linear-gradient(180deg,#737a7f,#5a6268) repeat-x!important}.bg-gradient-gray.btn.active,.bg-gradient-gray.btn:active,.bg-gradient-gray.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray.btn:not(:disabled):not(.disabled):active{border-color:#4e555b;color:#fff;background:#545b62 linear-gradient(180deg,#6e747a,#545b62) repeat-x!important}.bg-gradient-gray-dark{color:#fff;background:#343a40 linear-gradient(180deg,#52585d,#343a40) repeat-x!important}.bg-gradient-gray-dark.btn.disabled,.bg-gradient-gray-dark.btn:disabled,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-gray-dark.btn.dropdown-toggle{background-image:none!important}.bg-gradient-gray-dark.btn:hover{border-color:#1d2124;color:#ececec;background:#23272b linear-gradient(180deg,#44474b,#23272b) repeat-x!important}.bg-gradient-gray-dark.btn.active,.bg-gradient-gray-dark.btn:active,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled):active{border-color:#171a1d;color:#fff;background:#1d2124 linear-gradient(180deg,#3f4245,#1d2124) repeat-x!important}[class^=bg-].disabled{opacity:.65}a.text-muted:hover{color:#007bff!important}.link-muted{color:#5d6974}.link-muted:focus,.link-muted:hover{color:#464f58}.link-black{color:#6c757d}.link-black:focus,.link-black:hover{color:#e6e8ea}.accent-primary .btn-link,.accent-primary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#007bff}.accent-primary .btn-link:hover,.accent-primary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0056b3}.accent-primary .dropdown-item.active,.accent-primary .dropdown-item:active{background:#007bff;color:#fff}.accent-primary .custom-control-input:checked~.custom-control-label:before{background:#007bff;border-color:#004a99}.accent-primary .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-primary .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-primary .custom-file-input:focus~.custom-file-label,.accent-primary .custom-select:focus,.accent-primary .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#80bdff}.accent-primary .page-item .page-link{color:#007bff}.accent-primary .page-item.active .page-link,.accent-primary .page-item.active a{background-color:#007bff;border-color:#007bff;color:#fff}.accent-primary .page-item.disabled .page-link,.accent-primary .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-primary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-primary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-primary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-primary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-secondary .btn-link,.accent-secondary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6c757d}.accent-secondary .btn-link:hover,.accent-secondary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#494f54}.accent-secondary .dropdown-item.active,.accent-secondary .dropdown-item:active{background:#6c757d;color:#fff}.accent-secondary .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.accent-secondary .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-secondary .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-secondary .custom-file-input:focus~.custom-file-label,.accent-secondary .custom-select:focus,.accent-secondary .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#afb5ba}.accent-secondary .page-item .page-link{color:#6c757d}.accent-secondary .page-item.active .page-link,.accent-secondary .page-item.active a{background-color:#6c757d;border-color:#6c757d;color:#fff}.accent-secondary .page-item.disabled .page-link,.accent-secondary .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-secondary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-secondary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-secondary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-secondary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-success .btn-link,.accent-success a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#28a745}.accent-success .btn-link:hover,.accent-success a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#19692c}.accent-success .dropdown-item.active,.accent-success .dropdown-item:active{background:#28a745;color:#fff}.accent-success .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.accent-success .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-success .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-success .custom-file-input:focus~.custom-file-label,.accent-success .custom-select:focus,.accent-success .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#71dd8a}.accent-success .page-item .page-link{color:#28a745}.accent-success .page-item.active .page-link,.accent-success .page-item.active a{background-color:#28a745;border-color:#28a745;color:#fff}.accent-success .page-item.disabled .page-link,.accent-success .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-success [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-success [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-success [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-success [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-info .btn-link,.accent-info a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#17a2b8}.accent-info .btn-link:hover,.accent-info a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0f6674}.accent-info .dropdown-item.active,.accent-info .dropdown-item:active{background:#17a2b8;color:#fff}.accent-info .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.accent-info .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-info .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-info .custom-file-input:focus~.custom-file-label,.accent-info .custom-select:focus,.accent-info .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#63d9ec}.accent-info .page-item .page-link{color:#17a2b8}.accent-info .page-item.active .page-link,.accent-info .page-item.active a{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.accent-info .page-item.disabled .page-link,.accent-info .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-info [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-info [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-info [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-info [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-warning .btn-link,.accent-warning a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#ffc107}.accent-warning .btn-link:hover,.accent-warning a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#ba8b00}.accent-warning .dropdown-item.active,.accent-warning .dropdown-item:active{background:#ffc107;color:#1f2d3d}.accent-warning .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.accent-warning .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-warning .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-warning .custom-file-input:focus~.custom-file-label,.accent-warning .custom-select:focus,.accent-warning .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#ffe187}.accent-warning .page-item .page-link{color:#ffc107}.accent-warning .page-item.active .page-link,.accent-warning .page-item.active a{background-color:#ffc107;border-color:#ffc107;color:#fff}.accent-warning .page-item.disabled .page-link,.accent-warning .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-warning [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-warning [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-warning [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-warning [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-danger .btn-link,.accent-danger a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#dc3545}.accent-danger .btn-link:hover,.accent-danger a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#a71d2a}.accent-danger .dropdown-item.active,.accent-danger .dropdown-item:active{background:#dc3545;color:#fff}.accent-danger .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.accent-danger .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-danger .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-danger .custom-file-input:focus~.custom-file-label,.accent-danger .custom-select:focus,.accent-danger .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#efa2a9}.accent-danger .page-item .page-link{color:#dc3545}.accent-danger .page-item.active .page-link,.accent-danger .page-item.active a{background-color:#dc3545;border-color:#dc3545;color:#fff}.accent-danger .page-item.disabled .page-link,.accent-danger .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-danger [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-danger [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-danger [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-danger [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-light .btn-link,.accent-light a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#f8f9fa}.accent-light .btn-link:hover,.accent-light a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#cbd3da}.accent-light .dropdown-item.active,.accent-light .dropdown-item:active{background:#f8f9fa;color:#1f2d3d}.accent-light .custom-control-input:checked~.custom-control-label:before{background:#f8f9fa;border-color:#bdc6d0}.accent-light .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-light .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-light .custom-file-input:focus~.custom-file-label,.accent-light .custom-select:focus,.accent-light .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#fff}.accent-light .page-item .page-link{color:#f8f9fa}.accent-light .page-item.active .page-link,.accent-light .page-item.active a{background-color:#f8f9fa;border-color:#f8f9fa;color:#fff}.accent-light .page-item.disabled .page-link,.accent-light .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-light [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-light [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-light [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-light [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-dark .btn-link,.accent-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#343a40}.accent-dark .btn-link:hover,.accent-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#121416}.accent-dark .dropdown-item.active,.accent-dark .dropdown-item:active{background:#343a40;color:#fff}.accent-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.accent-dark .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-dark .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-dark .custom-file-input:focus~.custom-file-label,.accent-dark .custom-select:focus,.accent-dark .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#6d7a86}.accent-dark .page-item .page-link{color:#343a40}.accent-dark .page-item.active .page-link,.accent-dark .page-item.active a{background-color:#343a40;border-color:#343a40;color:#fff}.accent-dark .page-item.disabled .page-link,.accent-dark .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-lightblue .btn-link,.accent-lightblue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#3c8dbc}.accent-lightblue .btn-link:hover,.accent-lightblue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#296282}.accent-lightblue .dropdown-item.active,.accent-lightblue .dropdown-item:active{background:#3c8dbc;color:#fff}.accent-lightblue .custom-control-input:checked~.custom-control-label:before{background:#3c8dbc;border-color:#23536f}.accent-lightblue .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-lightblue .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-lightblue .custom-file-input:focus~.custom-file-label,.accent-lightblue .custom-select:focus,.accent-lightblue .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#99c5de}.accent-lightblue .page-item .page-link{color:#3c8dbc}.accent-lightblue .page-item.active .page-link,.accent-lightblue .page-item.active a{background-color:#3c8dbc;border-color:#3c8dbc;color:#fff}.accent-lightblue .page-item.disabled .page-link,.accent-lightblue .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-lightblue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-lightblue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-lightblue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-lightblue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-navy .btn-link,.accent-navy a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#001f3f}.accent-navy .btn-link:hover,.accent-navy a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#000}.accent-navy .dropdown-item.active,.accent-navy .dropdown-item:active{background:#001f3f;color:#fff}.accent-navy .custom-control-input:checked~.custom-control-label:before{background:#001f3f;border-color:#000}.accent-navy .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-navy .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-navy .custom-file-input:focus~.custom-file-label,.accent-navy .custom-select:focus,.accent-navy .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#005ebf}.accent-navy .page-item .page-link{color:#001f3f}.accent-navy .page-item.active .page-link,.accent-navy .page-item.active a{background-color:#001f3f;border-color:#001f3f;color:#fff}.accent-navy .page-item.disabled .page-link,.accent-navy .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-navy [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-navy [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-navy [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-navy [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-olive .btn-link,.accent-olive a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#3d9970}.accent-olive .btn-link:hover,.accent-olive a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#276248}.accent-olive .dropdown-item.active,.accent-olive .dropdown-item:active{background:#3d9970;color:#fff}.accent-olive .custom-control-input:checked~.custom-control-label:before{background:#3d9970;border-color:#20503b}.accent-olive .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-olive .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-olive .custom-file-input:focus~.custom-file-label,.accent-olive .custom-select:focus,.accent-olive .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#87cfaf}.accent-olive .page-item .page-link{color:#3d9970}.accent-olive .page-item.active .page-link,.accent-olive .page-item.active a{background-color:#3d9970;border-color:#3d9970;color:#fff}.accent-olive .page-item.disabled .page-link,.accent-olive .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-olive [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-olive [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-olive [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-olive [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-lime .btn-link,.accent-lime a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#01ff70}.accent-lime .btn-link:hover,.accent-lime a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#00b44e}.accent-lime .dropdown-item.active,.accent-lime .dropdown-item:active{background:#01ff70;color:#1f2d3d}.accent-lime .custom-control-input:checked~.custom-control-label:before{background:#01ff70;border-color:#009a43}.accent-lime .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-lime .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-lime .custom-file-input:focus~.custom-file-label,.accent-lime .custom-select:focus,.accent-lime .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#81ffb8}.accent-lime .page-item .page-link{color:#01ff70}.accent-lime .page-item.active .page-link,.accent-lime .page-item.active a{background-color:#01ff70;border-color:#01ff70;color:#fff}.accent-lime .page-item.disabled .page-link,.accent-lime .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-lime [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-lime [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-lime [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-lime [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-fuchsia .btn-link,.accent-fuchsia a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#f012be}.accent-fuchsia .btn-link:hover,.accent-fuchsia a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#ab0b87}.accent-fuchsia .dropdown-item.active,.accent-fuchsia .dropdown-item:active{background:#f012be;color:#fff}.accent-fuchsia .custom-control-input:checked~.custom-control-label:before{background:#f012be;border-color:#930974}.accent-fuchsia .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-fuchsia .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-fuchsia .custom-file-input:focus~.custom-file-label,.accent-fuchsia .custom-select:focus,.accent-fuchsia .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#f88adf}.accent-fuchsia .page-item .page-link{color:#f012be}.accent-fuchsia .page-item.active .page-link,.accent-fuchsia .page-item.active a{background-color:#f012be;border-color:#f012be;color:#fff}.accent-fuchsia .page-item.disabled .page-link,.accent-fuchsia .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-fuchsia [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-fuchsia [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-fuchsia [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-fuchsia [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-maroon .btn-link,.accent-maroon a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#d81b60}.accent-maroon .btn-link:hover,.accent-maroon a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#941342}.accent-maroon .dropdown-item.active,.accent-maroon .dropdown-item:active{background:#d81b60;color:#fff}.accent-maroon .custom-control-input:checked~.custom-control-label:before{background:#d81b60;border-color:#7d1038}.accent-maroon .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-maroon .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-maroon .custom-file-input:focus~.custom-file-label,.accent-maroon .custom-select:focus,.accent-maroon .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#f083ab}.accent-maroon .page-item .page-link{color:#d81b60}.accent-maroon .page-item.active .page-link,.accent-maroon .page-item.active a{background-color:#d81b60;border-color:#d81b60;color:#fff}.accent-maroon .page-item.disabled .page-link,.accent-maroon .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-maroon [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-maroon [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-maroon [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-maroon [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-blue .btn-link,.accent-blue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#007bff}.accent-blue .btn-link:hover,.accent-blue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0056b3}.accent-blue .dropdown-item.active,.accent-blue .dropdown-item:active{background:#007bff;color:#fff}.accent-blue .custom-control-input:checked~.custom-control-label:before{background:#007bff;border-color:#004a99}.accent-blue .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-blue .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-blue .custom-file-input:focus~.custom-file-label,.accent-blue .custom-select:focus,.accent-blue .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#80bdff}.accent-blue .page-item .page-link{color:#007bff}.accent-blue .page-item.active .page-link,.accent-blue .page-item.active a{background-color:#007bff;border-color:#007bff;color:#fff}.accent-blue .page-item.disabled .page-link,.accent-blue .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-blue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-blue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-blue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-blue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-indigo .btn-link,.accent-indigo a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6610f2}.accent-indigo .btn-link:hover,.accent-indigo a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#4709ac}.accent-indigo .dropdown-item.active,.accent-indigo .dropdown-item:active{background:#6610f2;color:#fff}.accent-indigo .custom-control-input:checked~.custom-control-label:before{background:#6610f2;border-color:#3d0894}.accent-indigo .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-indigo .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-indigo .custom-file-input:focus~.custom-file-label,.accent-indigo .custom-select:focus,.accent-indigo .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#b389f9}.accent-indigo .page-item .page-link{color:#6610f2}.accent-indigo .page-item.active .page-link,.accent-indigo .page-item.active a{background-color:#6610f2;border-color:#6610f2;color:#fff}.accent-indigo .page-item.disabled .page-link,.accent-indigo .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-indigo [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-indigo [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-indigo [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-indigo [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-purple .btn-link,.accent-purple a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6f42c1}.accent-purple .btn-link:hover,.accent-purple a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#4e2d89}.accent-purple .dropdown-item.active,.accent-purple .dropdown-item:active{background:#6f42c1;color:#fff}.accent-purple .custom-control-input:checked~.custom-control-label:before{background:#6f42c1;border-color:#432776}.accent-purple .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-purple .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-purple .custom-file-input:focus~.custom-file-label,.accent-purple .custom-select:focus,.accent-purple .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#b8a2e0}.accent-purple .page-item .page-link{color:#6f42c1}.accent-purple .page-item.active .page-link,.accent-purple .page-item.active a{background-color:#6f42c1;border-color:#6f42c1;color:#fff}.accent-purple .page-item.disabled .page-link,.accent-purple .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-purple [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-purple [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-purple [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-purple [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-pink .btn-link,.accent-pink a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#e83e8c}.accent-pink .btn-link:hover,.accent-pink a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#c21766}.accent-pink .dropdown-item.active,.accent-pink .dropdown-item:active{background:#e83e8c;color:#fff}.accent-pink .custom-control-input:checked~.custom-control-label:before{background:#e83e8c;border-color:#ac145a}.accent-pink .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-pink .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-pink .custom-file-input:focus~.custom-file-label,.accent-pink .custom-select:focus,.accent-pink .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#f6b0d0}.accent-pink .page-item .page-link{color:#e83e8c}.accent-pink .page-item.active .page-link,.accent-pink .page-item.active a{background-color:#e83e8c;border-color:#e83e8c;color:#fff}.accent-pink .page-item.disabled .page-link,.accent-pink .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-pink [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-pink [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-pink [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-pink [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-red .btn-link,.accent-red a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#dc3545}.accent-red .btn-link:hover,.accent-red a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#a71d2a}.accent-red .dropdown-item.active,.accent-red .dropdown-item:active{background:#dc3545;color:#fff}.accent-red .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.accent-red .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-red .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-red .custom-file-input:focus~.custom-file-label,.accent-red .custom-select:focus,.accent-red .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#efa2a9}.accent-red .page-item .page-link{color:#dc3545}.accent-red .page-item.active .page-link,.accent-red .page-item.active a{background-color:#dc3545;border-color:#dc3545;color:#fff}.accent-red .page-item.disabled .page-link,.accent-red .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-red [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-red [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-red [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-red [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-orange .btn-link,.accent-orange a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#fd7e14}.accent-orange .btn-link:hover,.accent-orange a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#c35a02}.accent-orange .dropdown-item.active,.accent-orange .dropdown-item:active{background:#fd7e14;color:#1f2d3d}.accent-orange .custom-control-input:checked~.custom-control-label:before{background:#fd7e14;border-color:#aa4e01}.accent-orange .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-orange .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-orange .custom-file-input:focus~.custom-file-label,.accent-orange .custom-select:focus,.accent-orange .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#fec392}.accent-orange .page-item .page-link{color:#fd7e14}.accent-orange .page-item.active .page-link,.accent-orange .page-item.active a{background-color:#fd7e14;border-color:#fd7e14;color:#fff}.accent-orange .page-item.disabled .page-link,.accent-orange .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-orange [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-orange [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-orange [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-orange [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-yellow .btn-link,.accent-yellow a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#ffc107}.accent-yellow .btn-link:hover,.accent-yellow a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#ba8b00}.accent-yellow .dropdown-item.active,.accent-yellow .dropdown-item:active{background:#ffc107;color:#1f2d3d}.accent-yellow .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.accent-yellow .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-yellow .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-yellow .custom-file-input:focus~.custom-file-label,.accent-yellow .custom-select:focus,.accent-yellow .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#ffe187}.accent-yellow .page-item .page-link{color:#ffc107}.accent-yellow .page-item.active .page-link,.accent-yellow .page-item.active a{background-color:#ffc107;border-color:#ffc107;color:#fff}.accent-yellow .page-item.disabled .page-link,.accent-yellow .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-yellow [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-yellow [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-yellow [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-yellow [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-green .btn-link,.accent-green a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#28a745}.accent-green .btn-link:hover,.accent-green a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#19692c}.accent-green .dropdown-item.active,.accent-green .dropdown-item:active{background:#28a745;color:#fff}.accent-green .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.accent-green .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-green .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-green .custom-file-input:focus~.custom-file-label,.accent-green .custom-select:focus,.accent-green .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#71dd8a}.accent-green .page-item .page-link{color:#28a745}.accent-green .page-item.active .page-link,.accent-green .page-item.active a{background-color:#28a745;border-color:#28a745;color:#fff}.accent-green .page-item.disabled .page-link,.accent-green .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-green [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-green [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-green [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-green [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-teal .btn-link,.accent-teal a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#20c997}.accent-teal .btn-link:hover,.accent-teal a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#158765}.accent-teal .dropdown-item.active,.accent-teal .dropdown-item:active{background:#20c997;color:#fff}.accent-teal .custom-control-input:checked~.custom-control-label:before{background:#20c997;border-color:#127155}.accent-teal .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-teal .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-teal .custom-file-input:focus~.custom-file-label,.accent-teal .custom-select:focus,.accent-teal .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#7eeaca}.accent-teal .page-item .page-link{color:#20c997}.accent-teal .page-item.active .page-link,.accent-teal .page-item.active a{background-color:#20c997;border-color:#20c997;color:#fff}.accent-teal .page-item.disabled .page-link,.accent-teal .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-teal [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-teal [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-teal [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-teal [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-cyan .btn-link,.accent-cyan a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#17a2b8}.accent-cyan .btn-link:hover,.accent-cyan a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0f6674}.accent-cyan .dropdown-item.active,.accent-cyan .dropdown-item:active{background:#17a2b8;color:#fff}.accent-cyan .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.accent-cyan .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-cyan .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-cyan .custom-file-input:focus~.custom-file-label,.accent-cyan .custom-select:focus,.accent-cyan .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#63d9ec}.accent-cyan .page-item .page-link{color:#17a2b8}.accent-cyan .page-item.active .page-link,.accent-cyan .page-item.active a{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.accent-cyan .page-item.disabled .page-link,.accent-cyan .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-cyan [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-cyan [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-cyan [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-cyan [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-white .btn-link,.accent-white a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#fff}.accent-white .btn-link:hover,.accent-white a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#d9d9d9}.accent-white .dropdown-item.active,.accent-white .dropdown-item:active{background:#fff;color:#1f2d3d}.accent-white .custom-control-input:checked~.custom-control-label:before{background:#fff;border-color:#ccc}.accent-white .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-white .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-white .custom-file-input:focus~.custom-file-label,.accent-white .custom-select:focus,.accent-white .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#fff}.accent-white .page-item .page-link{color:#fff}.accent-white .page-item.active .page-link,.accent-white .page-item.active a{background-color:#fff;border-color:#fff;color:#fff}.accent-white .page-item.disabled .page-link,.accent-white .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-white [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-white [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-white [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-white [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-gray .btn-link,.accent-gray a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6c757d}.accent-gray .btn-link:hover,.accent-gray a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#494f54}.accent-gray .dropdown-item.active,.accent-gray .dropdown-item:active{background:#6c757d;color:#fff}.accent-gray .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.accent-gray .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-gray .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-gray .custom-file-input:focus~.custom-file-label,.accent-gray .custom-select:focus,.accent-gray .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#afb5ba}.accent-gray .page-item .page-link{color:#6c757d}.accent-gray .page-item.active .page-link,.accent-gray .page-item.active a{background-color:#6c757d;border-color:#6c757d;color:#fff}.accent-gray .page-item.disabled .page-link,.accent-gray .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-gray [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-gray [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-gray [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-gray [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-gray-dark .btn-link,.accent-gray-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#343a40}.accent-gray-dark .btn-link:hover,.accent-gray-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#121416}.accent-gray-dark .dropdown-item.active,.accent-gray-dark .dropdown-item:active{background:#343a40;color:#fff}.accent-gray-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.accent-gray-dark .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-gray-dark .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-gray-dark .custom-file-input:focus~.custom-file-label,.accent-gray-dark .custom-select:focus,.accent-gray-dark .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#6d7a86}.accent-gray-dark .page-item .page-link{color:#343a40}.accent-gray-dark .page-item.active .page-link,.accent-gray-dark .page-item.active a{background-color:#343a40;border-color:#343a40;color:#fff}.accent-gray-dark .page-item.disabled .page-link,.accent-gray-dark .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-gray-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-gray-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-gray-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-gray-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}[class*=accent-] a.btn-info,[class*=accent-] a.btn-primary,[class*=accent-] a.btn-secondary,[class*=accent-] a.btn-success{color:#fff}[class*=accent-] a.btn-warning{color:#1f2d3d}[class*=accent-] a.btn-danger{color:#fff}[class*=accent-] a.btn-light{color:#1f2d3d}[class*=accent-] a.btn-dark{color:#fff} + */ + +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#1e6581;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#1e6581;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#1e6581;background-color:transparent}a,a:hover{text-decoration:none}a:hover{color:#103443}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;box-shadow:0 1px 2px rgba(0,0,0,.075)}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem;box-shadow:inset 0 -.1rem 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:7.5px;padding-left:7.5px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-7.5px;margin-left:-7.5px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.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-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:7.5px;padding-left:7.5px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;color:#212529;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#c0d4dc}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#8aafbd}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0c9d3}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#383f45}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#383f45}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;box-shadow:inset 0 0 0 transparent;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#4aadd5;outline:0;box-shadow:inset 0 0 0 transparent}.form-control::-moz-placeholder{color:#939ba2;opacity:1}.form-control:-ms-input-placeholder{color:#939ba2;opacity:1}.form-control::placeholder{color:#939ba2;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:2.25rem;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 0 rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 0 rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 0 rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 0 rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:2.25rem;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 0 rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 0 rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 0 rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 0 rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{box-shadow:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#1e6581;border-color:#1e6581;box-shadow:none}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#174d62;border-color:#144558}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 0 rgba(64,124,148,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#1e6581;border-color:#1e6581}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#144558;border-color:#123d4d}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(64,124,148,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d;box-shadow:none}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 0 rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745;box-shadow:none}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 0 rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8;box-shadow:none}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 0 rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(58,176,195,.5)}.btn-warning{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107;box-shadow:none}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#1f2d3d;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 0 rgba(221,171,15,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#1f2d3d;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(221,171,15,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545;box-shadow:none}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 0 rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(225,83,97,.5)}.btn-light{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa;box-shadow:none}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#1f2d3d;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 0 rgba(215,218,222,.5)}.btn-light.disabled,.btn-light:disabled{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#1f2d3d;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(215,218,222,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40;box-shadow:none}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 0 rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(82,88,93,.5)}.btn-outline-primary{color:#1e6581;border-color:#1e6581}.btn-outline-primary:hover{color:#fff;background-color:#1e6581;border-color:#1e6581}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 0 rgba(30,101,129,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#1e6581;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#1e6581;border-color:#1e6581}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(30,101,129,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 0 rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 0 rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 0 rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 0 rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#1f2d3d;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 0 rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 0 rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#1f2d3d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 0 rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#1e6581;text-decoration:none}.btn-link:hover{color:#103443}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.175)}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#1e6581}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle,.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.875rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.8125rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#1e6581;background-color:#1e6581;box-shadow:none}.custom-control-input:focus~.custom-control-label:before{box-shadow:inset 0 0 0 transparent,0 0 0 1px #fff,0 0 0 .2rem rgba(30,101,129,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#4aadd5}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#73c0de;border-color:#73c0de;box-shadow:none}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#dee2e6;border:1px solid #adb5bd;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#1e6581;background-color:#1e6581;box-shadow:none}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23ffffff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(30,101,129,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(30,101,129,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23ffffff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(30,101,129,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#dee2e6;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(30,101,129,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select,.custom-select:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.custom-select:focus{border-color:#4aadd5;outline:0}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.25rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#4aadd5;box-shadow:none}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(2.25rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;box-shadow:none}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.25rem;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,101,129,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,101,129,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(30,101,129,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#1e6581;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#73c0de}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#1e6581;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#73c0de}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0;margin-left:0;background-color:#1e6581;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#73c0de}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#1e6581}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:.5rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#fff}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.75);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:0 solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:0 solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:.25rem .25rem 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:0 solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 .25rem .25rem}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:.25rem}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-img,.card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-deck .card{margin-bottom:7.5px}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-7.5px;margin-left:-7.5px}.card-deck .card{flex:1 0 0%;margin-right:7.5px;margin-bottom:0;margin-left:7.5px}}.card-group>.card{margin-bottom:7.5px}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#1e6581;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#103443;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(30,101,129,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#1e6581;border-color:#1e6581}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#1e6581}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#144558}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(30,101,129,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#1f2d3d;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#1f2d3d;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#1f2d3d;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#1f2d3d;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close,.alert-dismissible .mailbox-attachment-close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#103543;background-color:#d2e0e6;border-color:#c0d4dc}.alert-primary hr{border-top-color:#b0c9d3}.alert-primary .alert-link{color:#06141a}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem;box-shadow:inset 0 .1rem .1rem rgba(0,0,0,.1)}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#1e6581;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#1e6581;border-color:#1e6581}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#103543;background-color:#c0d4dc}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#103543;background-color:#b0c9d3}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#103543;border-color:#103543}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close,.mailbox-attachment-close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover,.mailbox-attachment-close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover,.mailbox-attachment-close:not(:disabled):not(.disabled):focus,.mailbox-attachment-close:not(:disabled):not(.disabled):hover{opacity:.75}button.close,button.mailbox-attachment-close{padding:0;background-color:transparent;border:0}a.close.disabled,a.disabled.mailbox-attachment-close{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .25rem .5rem rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close,.modal-header .mailbox-attachment-close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #e9ecef;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-content{box-shadow:0 .5rem 1rem rgba(0,0,0,.5)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .25rem .5rem rgba(0,0,0,.2)}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#144558!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#1e6581!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.8571428571%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-primary{color:#1e6581!important}a.text-primary:focus,a.text-primary:hover{color:#103443!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html.scroll-smooth{scroll-behavior:smooth}.wrapper,body,html{min-height:100%}.wrapper{position:relative}.wrapper .content-wrapper{min-height:calc(100vh - 7rem - 2px)}.layout-boxed .wrapper{box-shadow:0 0 10 rgba(0,0,0,.3)}.layout-boxed .wrapper,.layout-boxed .wrapper:before{margin:0 auto;max-width:1250px}.layout-boxed .wrapper .main-sidebar{left:inherit}@supports not (-webkit-touch-callout:none){.layout-fixed .wrapper .sidebar{height:calc(100vh - 3.5rem - 1px)}.layout-fixed.text-sm .wrapper .sidebar{height:calc(100vh - 2.93725rem - 1px)}}.layout-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse .wrapper .brand-link,.layout-navbar-fixed.sidebar-mini.sidebar-collapse .wrapper .brand-link{height:calc(3.5rem + 1px);width:4.6rem}.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse.text-sm .wrapper .brand-link,.layout-navbar-fixed.sidebar-mini-md.sidebar-collapse .wrapper .brand-link.text-sm,.layout-navbar-fixed.sidebar-mini.sidebar-collapse.text-sm .wrapper .brand-link,.layout-navbar-fixed.sidebar-mini.sidebar-collapse .wrapper .brand-link.text-sm{height:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .main-header{z-index:1033}.layout-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .control-sidebar{top:0}.layout-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .brand-link,.layout-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;z-index:1035}.layout-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-navbar-not-fixed .wrapper .brand-link{position:static}.layout-navbar-not-fixed .wrapper .content-wrapper,.layout-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-navbar-not-fixed .wrapper .main-header{position:static}.layout-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}@media (min-width:576px){.layout-sm-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-sm-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-sm-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-sm-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-sm-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed .wrapper .control-sidebar{top:0}.layout-sm-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-sm-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-sm-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-sm-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-sm-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-sm-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-sm-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-sm-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-sm-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-sm-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-sm-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-sm-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-sm-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-sm-navbar-not-fixed .wrapper .brand-link{position:static}.layout-sm-navbar-not-fixed .wrapper .content-wrapper,.layout-sm-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-sm-navbar-not-fixed .wrapper .main-header{position:static}.layout-sm-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}@media (min-width:768px){.layout-md-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-md-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-md-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-md-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-md-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed .wrapper .control-sidebar{top:0}.layout-md-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-md-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-md-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-md-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-md-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-md-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-md-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-md-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-md-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-md-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-md-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-md-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-md-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-md-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-md-navbar-not-fixed .wrapper .brand-link{position:static}.layout-md-navbar-not-fixed .wrapper .content-wrapper,.layout-md-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-md-navbar-not-fixed .wrapper .main-header{position:static}.layout-md-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}@media (min-width:992px){.layout-lg-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-lg-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-lg-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-lg-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-lg-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed .wrapper .control-sidebar{top:0}.layout-lg-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-lg-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-lg-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-lg-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-lg-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-lg-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-lg-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-lg-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-lg-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-lg-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-lg-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-lg-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-lg-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-lg-navbar-not-fixed .wrapper .brand-link{position:static}.layout-lg-navbar-not-fixed .wrapper .content-wrapper,.layout-lg-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-lg-navbar-not-fixed .wrapper .main-header{position:static}.layout-lg-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}@media (min-width:1200px){.layout-xl-navbar-fixed.layout-fixed .wrapper .control-sidebar{top:calc(3.5rem + 1px)}.layout-xl-navbar-fixed.layout-fixed .wrapper .main-header.text-sm~.control-sidebar,.text-sm .layout-xl-navbar-fixed.layout-fixed .wrapper .main-header~.control-sidebar{top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed.layout-fixed .wrapper .sidebar{margin-top:calc(3.5rem + 1px)}.layout-xl-navbar-fixed.layout-fixed .wrapper .brand-link.text-sm~.sidebar,.text-sm .layout-xl-navbar-fixed.layout-fixed .wrapper .brand-link~.sidebar{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed.layout-fixed.text-sm .wrapper .control-sidebar{top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed.layout-fixed.text-sm .wrapper .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed .wrapper .control-sidebar{top:0}.layout-xl-navbar-fixed .wrapper a.anchor{display:block;position:relative;top:calc(-4.5rem + -1px)}.layout-xl-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(3.5rem + 1px);transition:width .3s ease-in-out;width:4.6rem}.layout-xl-navbar-fixed .wrapper.sidebar-collapse .brand-link.text-sm,.text-sm .layout-xl-navbar-fixed .wrapper.sidebar-collapse .brand-link{height:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed .wrapper.sidebar-collapse .main-sidebar:hover .brand-link{transition:width .3s ease-in-out;width:250px}.layout-xl-navbar-fixed .wrapper .brand-link{overflow:hidden;position:fixed;top:0;transition:width .3s ease-in-out;width:250px;z-index:1035}.layout-xl-navbar-fixed .wrapper .sidebar-dark-primary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-primary .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-secondary .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-secondary .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-success .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-success .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-info .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-info .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-warning .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-warning .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-danger .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-danger .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-light .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-light .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .sidebar-dark-dark .brand-link:not([class*=navbar]){background-color:#343a40}.layout-xl-navbar-fixed .wrapper .sidebar-light-dark .brand-link:not([class*=navbar]){background-color:#fff}.layout-xl-navbar-fixed .wrapper .content-wrapper{margin-top:calc(3.5rem + 1px)}.layout-xl-navbar-fixed .wrapper .main-header.text-sm~.content-wrapper,.text-sm .layout-xl-navbar-fixed .wrapper .main-header~.content-wrapper{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-fixed .wrapper .main-header{left:0;position:fixed;right:0;top:0;z-index:1037}.layout-xl-navbar-fixed.text-sm .wrapper .content-wrapper{margin-top:calc(2.93725rem + 1px)}body:not(.layout-fixed).layout-xl-navbar-fixed.text-sm .wrapper .main-sidebar{margin-top:calc(-2.93725rem + -1px)}body:not(.layout-fixed).layout-xl-navbar-fixed.text-sm .wrapper .main-sidebar .sidebar{margin-top:calc(2.93725rem + 1px)}.layout-xl-navbar-not-fixed .wrapper .brand-link{position:static}.layout-xl-navbar-not-fixed .wrapper .content-wrapper,.layout-xl-navbar-not-fixed .wrapper .sidebar{margin-top:0}.layout-xl-navbar-not-fixed .wrapper .main-header{position:static}.layout-xl-navbar-not-fixed.layout-fixed .wrapper .sidebar{margin-top:0}}.layout-footer-not-fixed .wrapper .content-wrapper{margin-bottom:0}.layout-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-footer-not-fixed .wrapper .main-footer{position:static}@media (min-width:576px){.layout-sm-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-sm-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-sm-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-sm-footer-not-fixed .wrapper .main-footer{position:static}}@media (min-width:768px){.layout-md-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-md-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-md-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-md-footer-not-fixed .wrapper .main-footer{position:static}}@media (min-width:992px){.layout-lg-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-lg-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-lg-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-lg-footer-not-fixed .wrapper .main-footer{position:static}}@media (min-width:1200px){.layout-xl-footer-fixed .wrapper .control-sidebar{bottom:0}.layout-xl-footer-fixed .wrapper .main-footer{bottom:0;left:0;position:fixed;right:0;z-index:1032}.layout-xl-footer-fixed .wrapper .content-wrapper{padding-bottom:calc(3.5rem + 1px)}.layout-xl-footer-not-fixed .wrapper .main-footer{position:static}}.layout-top-nav .wrapper{margin-left:0}.layout-top-nav .wrapper .main-header .brand-image{margin-top:-.5rem;margin-right:.2rem;height:33px}.layout-top-nav .wrapper .main-sidebar{bottom:inherit;height:inherit}.layout-top-nav .wrapper .content-wrapper,.layout-top-nav .wrapper .main-footer,.layout-top-nav .wrapper .main-header,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .content-wrapper,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .content-wrapper:before,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-footer,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-footer:before,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-header,body.sidebar-collapse:not(.sidebar-mini-md):not(.sidebar-mini) .main-header:before{margin-left:0}@media (min-width:768px){body:not(.sidebar-mini-md) .content-wrapper,body:not(.sidebar-mini-md) .main-footer,body:not(.sidebar-mini-md) .main-header{transition:margin-left .3s ease-in-out;margin-left:250px}}@media (min-width:768px) and (prefers-reduced-motion:reduce){body:not(.sidebar-mini-md) .content-wrapper,body:not(.sidebar-mini-md) .main-footer,body:not(.sidebar-mini-md) .main-header{transition:none}}@media (min-width:768px){.sidebar-collapse body:not(.sidebar-mini-md) .content-wrapper,.sidebar-collapse body:not(.sidebar-mini-md) .main-footer,.sidebar-collapse body:not(.sidebar-mini-md) .main-header{margin-left:0}}@media (max-width:991.98px){body:not(.sidebar-mini-md) .content-wrapper,body:not(.sidebar-mini-md) .content-wrapper:before,body:not(.sidebar-mini-md) .main-footer,body:not(.sidebar-mini-md) .main-footer:before,body:not(.sidebar-mini-md) .main-header,body:not(.sidebar-mini-md) .main-header:before{margin-left:0}}@media (min-width:768px){.sidebar-mini-md .content-wrapper,.sidebar-mini-md .main-footer,.sidebar-mini-md .main-header{transition:margin-left .3s ease-in-out;margin-left:250px}}@media (min-width:768px) and (prefers-reduced-motion:reduce){.sidebar-mini-md .content-wrapper,.sidebar-mini-md .main-footer,.sidebar-mini-md .main-header{transition:none}}@media (min-width:768px){.sidebar-collapse .sidebar-mini-md .content-wrapper,.sidebar-collapse .sidebar-mini-md .main-footer,.sidebar-collapse .sidebar-mini-md .main-header{margin-left:4.6rem}}@media (max-width:991.98px){.sidebar-mini-md .content-wrapper,.sidebar-mini-md .content-wrapper:before,.sidebar-mini-md .main-footer,.sidebar-mini-md .main-footer:before,.sidebar-mini-md .main-header,.sidebar-mini-md .main-header:before{margin-left:4.6rem}}.content-wrapper{background:#f4f6f9}.content-wrapper>.content{padding:0 .5rem}.main-sidebar,.main-sidebar:before{transition:margin-left .3s ease-in-out,width .3s ease-in-out;width:250px}@media (prefers-reduced-motion:reduce){.main-sidebar,.main-sidebar:before{transition:none}}.sidebar-collapse:not(.sidebar-mini):not(.sidebar-mini-md) .main-sidebar,.sidebar-collapse:not(.sidebar-mini):not(.sidebar-mini-md) .main-sidebar:before{box-shadow:none!important}.sidebar-collapse .main-sidebar,.sidebar-collapse .main-sidebar:before{margin-left:-250px}.sidebar-collapse .main-sidebar .nav-sidebar.nav-child-indent .nav-treeview{padding:0}@media (max-width:767.98px){.main-sidebar,.main-sidebar:before{box-shadow:none!important;margin-left:-250px}.sidebar-open .main-sidebar,.sidebar-open .main-sidebar:before{margin-left:0}}:not(.layout-fixed) .main-sidebar{height:inherit;min-height:100%;position:absolute;top:0}.layout-fixed .brand-link{width:250px}.layout-fixed .main-sidebar{left:0}.layout-fixed .control-sidebar,.layout-fixed .main-sidebar{bottom:0;float:none;height:100vh;position:fixed;top:0}.layout-fixed .control-sidebar .control-sidebar-content{height:calc(100vh - 3.5rem - 1px)}@supports (-webkit-touch-callout:none){.layout-fixed .main-sidebar{height:inherit}}.main-footer{background:#fff;border-top:1px solid #dee2e6;color:#869099;padding:1rem}.main-footer.text-sm,.text-sm .main-footer{padding:.812rem}.content-header{padding:15px .5rem}.text-sm .content-header{padding:10px .5rem}.content-header h1{font-size:1.8rem;margin:0}.text-sm .content-header h1{font-size:1.5rem}.content-header .breadcrumb{background:transparent;line-height:1.8rem;margin-bottom:0;padding:0}.text-sm .content-header .breadcrumb{line-height:1.5rem}.hold-transition .content-wrapper,.hold-transition .control-sidebar,.hold-transition .control-sidebar *,.hold-transition .main-footer,.hold-transition .main-header,.hold-transition .main-sidebar,.hold-transition .main-sidebar *{transition:none!important;-webkit-animation-duration:0s!important;animation-duration:0s!important}.main-header{border-bottom:1px solid #dee2e6;z-index:1034}.main-header .nav-link{height:2.5rem;position:relative}.main-header.text-sm .nav-link,.text-sm .main-header .nav-link{height:1.93725rem;padding:.35rem 1rem}.main-header.text-sm .nav-link>.fa,.main-header.text-sm .nav-link>.fab,.main-header.text-sm .nav-link>.far,.main-header.text-sm .nav-link>.fas,.main-header.text-sm .nav-link>.glyphicon,.main-header.text-sm .nav-link>.ion,.text-sm .main-header .nav-link>.fa,.text-sm .main-header .nav-link>.fab,.text-sm .main-header .nav-link>.far,.text-sm .main-header .nav-link>.fas,.text-sm .main-header .nav-link>.glyphicon,.text-sm .main-header .nav-link>.ion{font-size:.875rem}.main-header .navbar-nav .nav-item{margin:0}.main-header .navbar-nav[class*=-right] .dropdown-menu{left:auto;margin-top:-3px;right:0}@media (max-width:575.98px){.main-header .navbar-nav[class*=-right] .dropdown-menu{left:0;right:auto}}.navbar-img{height:calc(3.5rem + 1px)/2;width:auto}.navbar-badge{font-size:.6rem;font-weight:300;padding:2px 4px;position:absolute;right:5px;top:9px}.btn-navbar{background-color:transparent;border-left-width:0}.form-control-navbar{border-right-width:0}.form-control-navbar+.input-group-append{margin-left:0}.btn-navbar,.form-control-navbar{transition:none}.navbar-dark .btn-navbar,.navbar-dark .form-control-navbar{background-color:hsla(0,0%,100%,.2);border:0}.navbar-dark .form-control-navbar::-moz-placeholder{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar:-ms-input-placeholder{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar::placeholder{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar+.input-group-append>.btn-navbar{color:hsla(0,0%,100%,.6)}.navbar-dark .form-control-navbar:focus,.navbar-dark .form-control-navbar:focus+.input-group-append .btn-navbar{background-color:hsla(0,0%,100%,.6);border:0!important;color:#343a40}.navbar-light .btn-navbar,.navbar-light .form-control-navbar{background-color:#f2f4f6;border:0}.navbar-light .form-control-navbar::-moz-placeholder{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar:-ms-input-placeholder{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar::placeholder{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar+.input-group-append>.btn-navbar{color:rgba(0,0,0,.6)}.navbar-light .form-control-navbar:focus,.navbar-light .form-control-navbar:focus+.input-group-append .btn-navbar{background-color:#e9ecef;border:0!important;color:#343a40}.brand-link{display:block;font-size:1.25rem;line-height:1.5;padding:.8125rem .5rem;transition:width .3s ease-in-out;white-space:nowrap}.brand-link:hover{color:#fff;text-decoration:none}.text-sm .brand-link{font-size:inherit}[class*=sidebar-dark] .brand-link{border-bottom:1px solid #4b545c;color:hsla(0,0%,100%,.8)}[class*=sidebar-light] .brand-link{border-bottom:1px solid #dee2e6;color:rgba(0,0,0,.8)}.brand-link .brand-image{float:left;line-height:.8;margin-left:.8rem;margin-right:.5rem;margin-top:-3px;max-height:33px;width:auto}.brand-link .brand-image-xs{float:left;line-height:.8;margin-top:-.1rem;max-height:33px;width:auto}.brand-link .brand-image-xl{line-height:.8;max-height:40px;width:auto}.brand-link .brand-image-xl.single{margin-top:-.3rem}.brand-link.text-sm .brand-image,.text-sm .brand-link .brand-image{height:29px;margin-bottom:-.25rem;margin-left:.95rem;margin-top:-.25rem}.brand-link.text-sm .brand-image-xs,.text-sm .brand-link .brand-image-xs{margin-top:-.2rem;max-height:29px}.brand-link.text-sm .brand-image-xl,.text-sm .brand-link .brand-image-xl{margin-top:-.225rem;max-height:38px}.main-sidebar{height:100vh;overflow-y:hidden;z-index:1038}.main-sidebar a:-moz-focusring{border:0;outline:none}.sidebar{height:calc(100% - 3.5rem - 1px);overflow-y:auto;padding:0 .5rem}.user-panel{position:relative}[class*=sidebar-dark] .user-panel{border-bottom:1px solid #4f5962}[class*=sidebar-light] .user-panel{border-bottom:1px solid #dee2e6}.user-panel,.user-panel .info{overflow:hidden;white-space:nowrap}.user-panel .image{display:inline-block;padding-left:.8rem}.user-panel img{height:auto;width:2.1rem}.user-panel .info{display:inline-block;padding:5px 5px 5px 10px}.user-panel .dropdown-menu,.user-panel .status{font-size:.875rem}.nav-sidebar .nav-item>.nav-link{margin-bottom:.2rem}.nav-sidebar .nav-item>.nav-link .right{transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-sidebar .nav-item>.nav-link .right{transition:none}}.nav-sidebar .nav-link>.right,.nav-sidebar .nav-link>p>.right{position:absolute;right:1rem;top:.7rem}.nav-sidebar .nav-link>.right i,.nav-sidebar .nav-link>.right span,.nav-sidebar .nav-link>p>.right i,.nav-sidebar .nav-link>p>.right span{margin-left:.5rem}.nav-sidebar .nav-link>.right:nth-child(2),.nav-sidebar .nav-link>p>.right:nth-child(2){right:2.2rem}.nav-sidebar .menu-open>.nav-treeview{display:block}.nav-sidebar .menu-open>.nav-link i.right{transform:rotate(-90deg)}.nav-sidebar>.nav-item{margin-bottom:0}.nav-sidebar>.nav-item .nav-icon{margin-left:.05rem;font-size:1.2rem;margin-right:.2rem;text-align:center;width:1.6rem}.nav-sidebar>.nav-item .nav-icon.fa,.nav-sidebar>.nav-item .nav-icon.fab,.nav-sidebar>.nav-item .nav-icon.far,.nav-sidebar>.nav-item .nav-icon.fas,.nav-sidebar>.nav-item .nav-icon.glyphicon,.nav-sidebar>.nav-item .nav-icon.ion{font-size:1.1rem}.nav-sidebar>.nav-item .float-right{margin-top:3px}.nav-sidebar .nav-treeview{display:none;list-style:none;padding:0}.nav-sidebar .nav-treeview>.nav-item>.nav-link>.nav-icon{width:1.6rem}.nav-sidebar.nav-child-indent .nav-treeview{transition:padding .3s ease-in-out;padding-left:1rem}.text-sm .nav-sidebar.nav-child-indent .nav-treeview{padding-left:.5rem}.nav-sidebar.nav-child-indent.nav-legacy .nav-treeview .nav-treeview{padding-left:2rem;margin-left:-1rem}.text-sm .nav-sidebar.nav-child-indent.nav-legacy .nav-treeview .nav-treeview{padding-left:1rem;margin-left:-.5rem}.nav-sidebar .nav-header{font-size:.9rem;padding:.5rem}.nav-sidebar .nav-header:not(:first-of-type){padding:1.7rem 1rem .5rem}.nav-sidebar .nav-link p{display:inline-block;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;margin:0}#sidebar-overlay{background-color:rgba(0,0,0,.1);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1037}@media (max-width:991.98px){.sidebar-open #sidebar-overlay{display:block}}[class*=sidebar-light-]{background-color:#fff}[class*=sidebar-light-] .user-panel a:hover{color:#212529}[class*=sidebar-light-] .user-panel .status{background:rgba(0,0,0,.1);color:#343a40}[class*=sidebar-light-] .user-panel .status:active,[class*=sidebar-light-] .user-panel .status:focus,[class*=sidebar-light-] .user-panel .status:hover{background:rgba(0,0,0,.1);color:#212529}[class*=sidebar-light-] .user-panel .dropdown-menu{box-shadow:0 2px 4px rgba(0,0,0,.4);border-color:rgba(0,0,0,.1)}[class*=sidebar-light-] .user-panel .dropdown-item{color:#212529}[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-link:active,[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-link:focus{color:#343a40}[class*=sidebar-light-] .nav-sidebar>.nav-item.menu-open>.nav-link,[class*=sidebar-light-] .nav-sidebar>.nav-item:hover>.nav-link{background-color:rgba(0,0,0,.1);color:#212529}[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-link.active{color:#000;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}[class*=sidebar-light-] .nav-sidebar>.nav-item>.nav-treeview{background:transparent}[class*=sidebar-light-] .nav-header{background:inherit;color:#292d32}[class*=sidebar-light-] .sidebar a{color:#343a40}[class*=sidebar-light-] .sidebar a:hover{text-decoration:none}[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link{color:#777}[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link.active:hover{background-color:rgba(0,0,0,.1);color:#212529}[class*=sidebar-light-] .nav-treeview>.nav-item>.nav-link:hover{background-color:rgba(0,0,0,.1)}[class*=sidebar-light-] .nav-flat .nav-item .nav-treeview .nav-treeview,[class*=sidebar-light-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link,[class*=sidebar-light-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link.active{border-color:rgba(0,0,0,.1)}[class*=sidebar-dark-]{background-color:#343a40}[class*=sidebar-dark-] .user-panel a:hover{color:#fff}[class*=sidebar-dark-] .user-panel .status{background:hsla(0,0%,100%,.1);color:#c2c7d0}[class*=sidebar-dark-] .user-panel .status:active,[class*=sidebar-dark-] .user-panel .status:focus,[class*=sidebar-dark-] .user-panel .status:hover{background:rgba(245,255,240,.1);color:#fff}[class*=sidebar-dark-] .user-panel .dropdown-menu{box-shadow:0 2px 4px rgba(0,0,0,.4);border-color:rgba(238,255,230,.1)}[class*=sidebar-dark-] .user-panel .dropdown-item{color:#212529}[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-link:active{color:#c2c7d0}[class*=sidebar-dark-] .nav-sidebar>.nav-item.menu-open>.nav-link,[class*=sidebar-dark-] .nav-sidebar>.nav-item:hover>.nav-link,[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-link:focus{background-color:hsla(0,0%,100%,.1);color:#fff}[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-link.active{color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}[class*=sidebar-dark-] .nav-sidebar>.nav-item>.nav-treeview{background:transparent}[class*=sidebar-dark-] .nav-header{background:inherit;color:#d0d4db}[class*=sidebar-dark-] .sidebar a{color:#c2c7d0}[class*=sidebar-dark-] .sidebar a:focus,[class*=sidebar-dark-] .sidebar a:hover{text-decoration:none}[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link{color:#c2c7d0}[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link:focus,[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link:hover{background-color:hsla(0,0%,100%,.1);color:#fff}[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link.active:focus,[class*=sidebar-dark-] .nav-treeview>.nav-item>.nav-link.active:hover{background-color:hsla(0,0%,100%,.9);color:#343a40}[class*=sidebar-dark-] .nav-flat .nav-item .nav-treeview .nav-treeview,[class*=sidebar-dark-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link,[class*=sidebar-dark-] .nav-flat .nav-item .nav-treeview>.nav-item>.nav-link.active{border-color:hsla(0,0%,100%,.9)}.sidebar-dark-primary .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-primary .nav-sidebar>.nav-item>.nav-link.active{background-color:#1e6581;color:#fff}.sidebar-dark-primary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-primary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#1e6581}.sidebar-dark-secondary .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-secondary .nav-sidebar>.nav-item>.nav-link.active{background-color:#6c757d;color:#fff}.sidebar-dark-secondary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-secondary .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6c757d}.sidebar-dark-success .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-success .nav-sidebar>.nav-item>.nav-link.active{background-color:#28a745;color:#fff}.sidebar-dark-success .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-success .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#28a745}.sidebar-dark-info .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-info .nav-sidebar>.nav-item>.nav-link.active{background-color:#17a2b8;color:#fff}.sidebar-dark-info .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-info .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#17a2b8}.sidebar-dark-warning .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-warning .nav-sidebar>.nav-item>.nav-link.active{background-color:#ffc107;color:#1f2d3d}.sidebar-dark-warning .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-warning .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#ffc107}.sidebar-dark-danger .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-danger .nav-sidebar>.nav-item>.nav-link.active{background-color:#dc3545;color:#fff}.sidebar-dark-danger .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-danger .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#dc3545}.sidebar-dark-light .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-light .nav-sidebar>.nav-item>.nav-link.active{background-color:#f8f9fa;color:#1f2d3d}.sidebar-dark-light .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-light .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#f8f9fa}.sidebar-dark-dark .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-dark .nav-sidebar>.nav-item>.nav-link.active{background-color:#343a40;color:#fff}.sidebar-dark-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#343a40}.sidebar-dark-lightblue .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-lightblue .nav-sidebar>.nav-item>.nav-link.active{background-color:#3c8dbc;color:#fff}.sidebar-dark-lightblue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-lightblue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#3c8dbc}.sidebar-dark-navy .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-navy .nav-sidebar>.nav-item>.nav-link.active{background-color:#001f3f;color:#fff}.sidebar-dark-navy .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-navy .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#001f3f}.sidebar-dark-olive .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-olive .nav-sidebar>.nav-item>.nav-link.active{background-color:#3d9970;color:#fff}.sidebar-dark-olive .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-olive .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#3d9970}.sidebar-dark-lime .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-lime .nav-sidebar>.nav-item>.nav-link.active{background-color:#01ff70;color:#1f2d3d}.sidebar-dark-lime .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-lime .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#01ff70}.sidebar-dark-fuchsia .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-fuchsia .nav-sidebar>.nav-item>.nav-link.active{background-color:#f012be;color:#fff}.sidebar-dark-fuchsia .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-fuchsia .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#f012be}.sidebar-dark-maroon .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-maroon .nav-sidebar>.nav-item>.nav-link.active{background-color:#d81b60;color:#fff}.sidebar-dark-maroon .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-maroon .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#d81b60}.sidebar-dark-blue .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-blue .nav-sidebar>.nav-item>.nav-link.active{background-color:#1e6581;color:#fff}.sidebar-dark-blue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-blue .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#1e6581}.sidebar-dark-indigo .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-indigo .nav-sidebar>.nav-item>.nav-link.active{background-color:#6610f2;color:#fff}.sidebar-dark-indigo .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-indigo .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6610f2}.sidebar-dark-purple .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-purple .nav-sidebar>.nav-item>.nav-link.active{background-color:#6f42c1;color:#fff}.sidebar-dark-purple .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-purple .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6f42c1}.sidebar-dark-pink .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-pink .nav-sidebar>.nav-item>.nav-link.active{background-color:#e83e8c;color:#fff}.sidebar-dark-pink .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-pink .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#e83e8c}.sidebar-dark-red .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-red .nav-sidebar>.nav-item>.nav-link.active{background-color:#dc3545;color:#fff}.sidebar-dark-red .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-red .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#dc3545}.sidebar-dark-orange .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-orange .nav-sidebar>.nav-item>.nav-link.active{background-color:#fd7e14;color:#1f2d3d}.sidebar-dark-orange .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-orange .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#fd7e14}.sidebar-dark-yellow .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-yellow .nav-sidebar>.nav-item>.nav-link.active{background-color:#ffc107;color:#1f2d3d}.sidebar-dark-yellow .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-yellow .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#ffc107}.sidebar-dark-green .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-green .nav-sidebar>.nav-item>.nav-link.active{background-color:#28a745;color:#fff}.sidebar-dark-green .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-green .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#28a745}.sidebar-dark-teal .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-teal .nav-sidebar>.nav-item>.nav-link.active{background-color:#20c997;color:#fff}.sidebar-dark-teal .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-teal .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#20c997}.sidebar-dark-cyan .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-cyan .nav-sidebar>.nav-item>.nav-link.active{background-color:#17a2b8;color:#fff}.sidebar-dark-cyan .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-cyan .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#17a2b8}.sidebar-dark-white .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-white .nav-sidebar>.nav-item>.nav-link.active{background-color:#fff;color:#1f2d3d}.sidebar-dark-white .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-white .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#fff}.sidebar-dark-gray .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-gray .nav-sidebar>.nav-item>.nav-link.active{background-color:#6c757d;color:#fff}.sidebar-dark-gray .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-gray .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#6c757d}.sidebar-dark-gray-dark .nav-sidebar>.nav-item>.nav-link.active,.sidebar-light-gray-dark .nav-sidebar>.nav-item>.nav-link.active{background-color:#343a40;color:#fff}.sidebar-dark-gray-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active,.sidebar-light-gray-dark .nav-sidebar.nav-legacy>.nav-item>.nav-link.active{border-color:#343a40}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand) .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini .main-sidebar.sidebar-focused .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini .main-sidebar:not(.sidebar-no-expand) .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-compact.nav-sidebar.nav-child-indent:not(.nav-flat) .nav-treeview{padding-left:1rem;margin-left:-.5rem}.nav-flat{margin:-.25rem -.5rem 0}.nav-flat .nav-item>.nav-link{border-radius:0;margin-bottom:0}.nav-flat .nav-item>.nav-link>.nav-icon{margin-left:.55rem}.nav-flat:not(.nav-child-indent) .nav-treeview .nav-item>.nav-link>.nav-icon{margin-left:.4rem}.nav-flat.nav-child-indent .nav-treeview{padding-left:0}.nav-flat.nav-child-indent .nav-treeview .nav-icon{margin-left:.85rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview{border-left:.2rem solid}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-icon{margin-left:1.15rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.45rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.75rem}.nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:2.05rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-icon{margin-left:.55rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-link{padding-left:.8rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-icon{margin-left:.35rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:.15rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:-.15rem}.sidebar-collapse .nav-flat.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:-.35rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-compact.nav-sidebar .nav-treeview .nav-icon{margin-left:.4rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-icon{margin-left:.85rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-icon{margin-left:1.15rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.45rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:1.75rem}.sidebar-mini-md .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini-md .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar.sidebar-focused .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon,.sidebar-mini .main-sidebar:not(.sidebar-no-expand):hover .nav-flat.nav-sidebar.nav-child-indent .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-treeview .nav-icon{margin-left:2.05rem}.nav-flat .nav-icon{transition:margin-left .3s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-flat .nav-icon{transition:none}}.nav-flat .nav-treeview .nav-icon{margin-left:-.2rem}.nav-flat.nav-sidebar>.nav-item .nav-treeview,.nav-flat.nav-sidebar>.nav-item>.nav-treeview{background:hsla(0,0%,100%,.05)}.nav-flat.nav-sidebar>.nav-item .nav-treeview .nav-item>.nav-link,.nav-flat.nav-sidebar>.nav-item>.nav-treeview .nav-item>.nav-link{border-left:.2rem solid}.nav-legacy{margin:-.25rem -.5rem 0}.nav-legacy.nav-sidebar .nav-item>.nav-link{border-radius:0;margin-bottom:0}.nav-legacy.nav-sidebar .nav-item>.nav-link>.nav-icon{margin-left:.55rem}.text-sm .nav-legacy.nav-sidebar .nav-item>.nav-link>.nav-icon{margin-left:.75rem}.nav-legacy.nav-sidebar>.nav-item>.nav-link.active{background:inherit;border-left:3px solid transparent;box-shadow:none}.nav-legacy.nav-sidebar>.nav-item>.nav-link.active>.nav-icon{margin-left:calc(.55rem - 3px)}.text-sm .nav-legacy.nav-sidebar.nav-flat .nav-treeview .nav-item>.nav-link>.nav-icon,.text-sm .nav-legacy.nav-sidebar>.nav-item>.nav-link.active>.nav-icon{margin-left:calc(.75rem - 3px)}.sidebar-mini-md .nav-legacy>.nav-item .nav-link .nav-icon,.sidebar-mini .nav-legacy>.nav-item .nav-link .nav-icon{transition:margin-left .3s ease-in-out;margin-left:.75rem}@media (prefers-reduced-motion:reduce){.sidebar-mini-md .nav-legacy>.nav-item .nav-link .nav-icon,.sidebar-mini .nav-legacy>.nav-item .nav-link .nav-icon{transition:none}}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview{padding-left:1rem}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview{padding-left:2rem;margin-left:-1rem}.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview{padding-left:.5rem}.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini-md.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar.sidebar-focused .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse.text-sm .main-sidebar:hover .nav-legacy.nav-child-indent .nav-treeview .nav-treeview{padding-left:1rem;margin-left:-.5rem}.sidebar-mini-md.sidebar-collapse .nav-legacy>.nav-item>.nav-link .nav-icon,.sidebar-mini.sidebar-collapse .nav-legacy>.nav-item>.nav-link .nav-icon{margin-left:.55rem}.sidebar-mini-md.sidebar-collapse .nav-legacy>.nav-item>.nav-link.active>.nav-icon,.sidebar-mini.sidebar-collapse .nav-legacy>.nav-item>.nav-link.active>.nav-icon{margin-left:.36rem}.sidebar-mini-md.sidebar-collapse .nav-legacy.nav-child-indent .nav-treeview .nav-treeview,.sidebar-mini.sidebar-collapse .nav-legacy.nav-child-indent .nav-treeview .nav-treeview{padding-left:0;margin-left:0}.sidebar-mini-md.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link .nav-icon,.sidebar-mini.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link .nav-icon{margin-left:.75rem}.sidebar-mini-md.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link.active>.nav-icon,.sidebar-mini.sidebar-collapse.text-sm .nav-legacy>.nav-item>.nav-link.active>.nav-icon{margin-left:calc(.75rem - 3px)}[class*=sidebar-dark] .nav-legacy.nav-sidebar>.nav-item .nav-treeview,[class*=sidebar-dark] .nav-legacy.nav-sidebar>.nav-item>.nav-treeview{background:hsla(0,0%,100%,.05)}[class*=sidebar-dark] .nav-legacy.nav-sidebar>.nav-item>.nav-link.active{color:#fff}[class*=sidebar-dark] .nav-legacy .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-dark] .nav-legacy .nav-treeview>.nav-item>.nav-link:focus,[class*=sidebar-dark] .nav-legacy .nav-treeview>.nav-item>.nav-link:hover{background:none;color:#fff}[class*=sidebar-light] .nav-legacy.nav-sidebar>.nav-item .nav-treeview,[class*=sidebar-light] .nav-legacy.nav-sidebar>.nav-item>.nav-treeview{background:rgba(0,0,0,.05)}[class*=sidebar-light] .nav-legacy.nav-sidebar>.nav-item>.nav-link.active{color:#000}[class*=sidebar-light] .nav-legacy .nav-treeview>.nav-item>.nav-link.active,[class*=sidebar-light] .nav-legacy .nav-treeview>.nav-item>.nav-link:focus,[class*=sidebar-light] .nav-legacy .nav-treeview>.nav-item>.nav-link:hover{background:none;color:#000}.nav-collapse-hide-child .menu-open>.nav-treeview{max-height:-webkit-min-content;max-height:-moz-min-content;max-height:min-content;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sidebar-collapse .nav-collapse-hide-child .menu-open>.nav-treeview{max-height:0;-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-collapse-hide-child .menu-open>.nav-treeview,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-collapse-hide-child .menu-open>.nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-collapse-hide-child .menu-open>.nav-treeview,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-collapse-hide-child .menu-open>.nav-treeview{max-height:-webkit-min-content;max-height:-moz-min-content;max-height:min-content;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.nav-compact .nav-header,.nav-compact .nav-link{padding-top:.25rem;padding-bottom:.25rem}.nav-compact .nav-header:not(:first-of-type){padding-top:.75rem;padding-bottom:.25rem}.nav-compact .nav-link>.right,.nav-compact .nav-link>p>.right{top:.465rem}.text-sm .nav-compact .nav-link>.right,.text-sm .nav-compact .nav-link>p>.right{top:.7rem}[class*=sidebar-dark] .btn-sidebar,[class*=sidebar-dark] .form-control-sidebar{background:#3f474e;border:1px solid #56606a;color:#fff}[class*=sidebar-dark] .btn-sidebar:focus,[class*=sidebar-dark] .form-control-sidebar:focus{border:1px solid #7a8793}[class*=sidebar-dark] .btn-sidebar:hover{background:#454d55}[class*=sidebar-dark] .btn-sidebar:focus{background:#4b545c}[class*=sidebar-light] .btn-sidebar,[class*=sidebar-light] .form-control-sidebar{background:#f2f2f2;border:1px solid #d9d9d9;color:#1f2d3d}[class*=sidebar-light] .btn-sidebar:focus,[class*=sidebar-light] .form-control-sidebar:focus{border:1px solid #b3b3b3}[class*=sidebar-light] .btn-sidebar:hover{background:#ececec}[class*=sidebar-light] .btn-sidebar:focus{background:#e6e6e6}.sidebar .form-inline .input-group{width:100%}.sidebar nav .form-inline{margin-bottom:.2rem}.layout-boxed.sidebar-collapse .main-sidebar{margin-left:0}.layout-boxed .content-wrapper,.layout-boxed .main-footer,.layout-boxed .main-header{z-index:9999;position:relative}.logo-xl,.logo-xs{opacity:1;position:absolute;visibility:visible}.logo-xl.brand-image-xs,.logo-xs.brand-image-xs{left:18px;top:12px}.logo-xl.brand-image-xl,.logo-xs.brand-image-xl{left:12px;top:6px}.logo-xs{opacity:0;visibility:hidden}.logo-xs.brand-image-xl{left:16px;top:8px}.brand-link.logo-switch:before{content:"\A0"}@media (min-width:992px){.sidebar-mini .nav-sidebar,.sidebar-mini .nav-sidebar .nav-link,.sidebar-mini .nav-sidebar>.nav-header{white-space:nowrap;overflow:hidden}.sidebar-mini.sidebar-collapse .d-hidden-mini{display:none}.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .main-header{margin-left:4.6rem!important}.sidebar-mini.sidebar-collapse .nav-sidebar .nav-header{display:none}.sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p{width:0}.sidebar-mini.sidebar-collapse .brand-text,.sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .sidebar .user-panel>.info{margin-left:-10px}.sidebar-mini.sidebar-collapse .brand-text,.sidebar-mini.sidebar-collapse .logo-xl,.sidebar-mini.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .sidebar .user-panel>.info{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini.sidebar-collapse .logo-xs{display:inline-block;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini.sidebar-collapse .main-sidebar{overflow-x:hidden}.sidebar-mini.sidebar-collapse .main-sidebar,.sidebar-mini.sidebar-collapse .main-sidebar:before{margin-left:0;width:4.6rem}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel .image{float:none}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .brand-link,.sidebar-mini.sidebar-collapse .main-sidebar:hover,.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-link{width:250px}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel{text-align:left}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel .image,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel .image{float:left}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .brand-text,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .logo-xl,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-text,.sidebar-mini.sidebar-collapse .main-sidebar:hover .logo-xl,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:inline-block;margin-left:0;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .logo-xs,.sidebar-mini.sidebar-collapse .main-sidebar:hover .logo-xs{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .brand-image,.sidebar-mini.sidebar-collapse .main-sidebar:hover .brand-image{margin-right:.5rem}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .sidebar-form,.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini.sidebar-collapse .main-sidebar:hover .sidebar-form,.sidebar-mini.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:block!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar>.nav-item>.nav-link>span,.sidebar-mini.sidebar-collapse .main-sidebar:hover .nav-sidebar>.nav-item>.nav-link>span{display:inline-block!important}.sidebar-mini.sidebar-collapse .visible-sidebar-mini{display:block!important}.sidebar-mini.sidebar-collapse.layout-fixed .main-sidebar:hover .brand-link{width:250px}.sidebar-mini.sidebar-collapse.layout-fixed .brand-link{width:4.6rem}}@media (max-width:991.98px){.sidebar-mini.sidebar-collapse .main-sidebar{box-shadow:none!important}}@media (min-width:768px){.sidebar-mini-md .nav-sidebar,.sidebar-mini-md .nav-sidebar .nav-link,.sidebar-mini-md .nav-sidebar>.nav-header{white-space:nowrap;overflow:hidden}.sidebar-mini-md.sidebar-collapse .d-hidden-mini{display:none}.sidebar-mini-md.sidebar-collapse .content-wrapper,.sidebar-mini-md.sidebar-collapse .main-footer,.sidebar-mini-md.sidebar-collapse .main-header{margin-left:4.6rem!important}.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-header{display:none}.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-link p{width:0}.sidebar-mini-md.sidebar-collapse .brand-text,.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .sidebar .user-panel>.info{margin-left:-10px}.sidebar-mini-md.sidebar-collapse .brand-text,.sidebar-mini-md.sidebar-collapse .logo-xl,.sidebar-mini-md.sidebar-collapse .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .sidebar .user-panel>.info{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini-md.sidebar-collapse .logo-xs{display:inline-block;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini-md.sidebar-collapse .main-sidebar{overflow-x:hidden}.sidebar-mini-md.sidebar-collapse .main-sidebar,.sidebar-mini-md.sidebar-collapse .main-sidebar:before{margin-left:0;width:4.6rem}.sidebar-mini-md.sidebar-collapse .main-sidebar .user-panel .image{float:none}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .brand-link,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .brand-link{width:250px}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel{text-align:left}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel .image,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel .image{float:left}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .brand-text,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .logo-xl,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .brand-text,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .logo-xl,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:inline-block;margin-left:0;-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .logo-xs,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .logo-xs{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .brand-image,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .brand-image{margin-right:.5rem}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .sidebar-form,.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .user-panel>.info,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .sidebar-form,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .user-panel>.info{display:block!important;-webkit-transform:translateZ(0)}.sidebar-mini-md.sidebar-collapse .main-sidebar.sidebar-focused .nav-sidebar>.nav-item>.nav-link>span,.sidebar-mini-md.sidebar-collapse .main-sidebar:hover .nav-sidebar>.nav-item>.nav-link>span{display:inline-block!important}.sidebar-mini-md.sidebar-collapse .visible-sidebar-mini{display:block!important}.sidebar-mini-md.sidebar-collapse.layout-fixed .main-sidebar:hover .brand-link{width:250px}.sidebar-mini-md.sidebar-collapse.layout-fixed .brand-link{width:4.6rem}}@media (max-width:767.98px){.sidebar-mini-md.sidebar-collapse .main-sidebar{box-shadow:none!important}}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.sidebar-collapse .main-sidebar.sidebar-focused .nav-header,.sidebar-collapse .main-sidebar:hover .nav-header{display:inline-block}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover{width:4.6rem}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-header,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-header{display:none}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .brand-link,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .brand-link{width:4.6rem!important}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .user-panel .image,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .user-panel .image{float:none!important}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .logo-xs,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .logo-xs{-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:visible}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .logo-xl,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .logo-xl{-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-sidebar.nav-child-indent .nav-treeview,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-sidebar.nav-child-indent .nav-treeview{padding-left:0}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .brand-text,.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-sidebar .nav-link p,.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .user-panel>.info,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .brand-text,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-sidebar .nav-link p,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .user-panel>.info{margin-left:-10px;-webkit-animation-name:fadeOut;animation-name:fadeOut;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden;width:0}.sidebar-collapse .sidebar-no-expand.main-sidebar.sidebar-focused .nav-sidebar>.nav-item .nav-icon,.sidebar-collapse .sidebar-no-expand.main-sidebar:hover .nav-sidebar>.nav-item .nav-icon{margin-right:0}.nav-sidebar{position:relative}.nav-sidebar:hover{overflow:visible}.nav-sidebar>.nav-header,.sidebar-form{overflow:hidden;text-overflow:clip}.nav-sidebar .nav-item>.nav-link{position:relative}.nav-sidebar .nav-item>.nav-link>.float-right{margin-top:-7px;position:absolute;right:10px;top:50%}.main-sidebar .brand-text,.main-sidebar .logo-xl,.main-sidebar .logo-xs,.sidebar .nav-link p,.sidebar .user-panel .info{transition:margin-left .3s linear,opacity .3s ease,visibility .3s ease}@media (prefers-reduced-motion:reduce){.main-sidebar .brand-text,.main-sidebar .logo-xl,.main-sidebar .logo-xs,.sidebar .nav-link p,.sidebar .user-panel .info{transition:none}}html.control-sidebar-animate{overflow-x:hidden}.control-sidebar{bottom:calc(3.5rem + 1px);position:absolute;top:calc(3.5rem + 1px);z-index:1031}.control-sidebar,.control-sidebar:before{bottom:calc(3.5rem + 1px);display:none;right:-250px;width:250px;transition:right .3s ease-in-out,display .3s ease-in-out}@media (prefers-reduced-motion:reduce){.control-sidebar,.control-sidebar:before{transition:none}}.control-sidebar:before{content:"";display:block;position:fixed;top:0;z-index:-1}body.text-sm .control-sidebar{bottom:calc(2.9365rem + 1px);top:calc(2.93725rem + 1px)}.main-header.text-sm~.control-sidebar{top:calc(2.93725rem + 1px)}.main-footer.text-sm~.control-sidebar{bottom:calc(2.9365rem + 1px)}.control-sidebar-push-slide .content-wrapper,.control-sidebar-push-slide .main-footer{transition:margin-right .3s ease-in-out}@media (prefers-reduced-motion:reduce){.control-sidebar-push-slide .content-wrapper,.control-sidebar-push-slide .main-footer{transition:none}}.control-sidebar-open .control-sidebar{display:block}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar:before{right:0}.control-sidebar-open.control-sidebar-push-slide .content-wrapper,.control-sidebar-open.control-sidebar-push-slide .main-footer,.control-sidebar-open.control-sidebar-push .content-wrapper,.control-sidebar-open.control-sidebar-push .main-footer{margin-right:250px}.control-sidebar-slide-open .control-sidebar{display:block}.control-sidebar-slide-open .control-sidebar,.control-sidebar-slide-open .control-sidebar:before{right:0;transition:right .3s ease-in-out,display .3s ease-in-out}@media (prefers-reduced-motion:reduce){.control-sidebar-slide-open .control-sidebar,.control-sidebar-slide-open .control-sidebar:before{transition:none}}.control-sidebar-slide-open.control-sidebar-push-slide .content-wrapper,.control-sidebar-slide-open.control-sidebar-push-slide .main-footer,.control-sidebar-slide-open.control-sidebar-push .content-wrapper,.control-sidebar-slide-open.control-sidebar-push .main-footer{margin-right:250px}.control-sidebar-dark,.control-sidebar-dark .nav-link,.control-sidebar-dark a{color:#c2c7d0}.control-sidebar-dark{background:#343a40}.control-sidebar-dark a:hover,.control-sidebar-dark h1,.control-sidebar-dark h2,.control-sidebar-dark h3,.control-sidebar-dark h4,.control-sidebar-dark h5,.control-sidebar-dark h6,.control-sidebar-dark label{color:#fff}.control-sidebar-dark .nav-tabs{background-color:hsla(0,0%,100%,.1);border-bottom:0;margin-bottom:5px}.control-sidebar-dark .nav-tabs .nav-item{margin:0}.control-sidebar-dark .nav-tabs .nav-link{border-radius:0;padding:10px 20px;position:relative;text-align:center}.control-sidebar-dark .nav-tabs .nav-link,.control-sidebar-dark .nav-tabs .nav-link.active,.control-sidebar-dark .nav-tabs .nav-link:active,.control-sidebar-dark .nav-tabs .nav-link:focus,.control-sidebar-dark .nav-tabs .nav-link:hover{border:0}.control-sidebar-dark .nav-tabs .nav-link.active,.control-sidebar-dark .nav-tabs .nav-link:active,.control-sidebar-dark .nav-tabs .nav-link:focus,.control-sidebar-dark .nav-tabs .nav-link:hover{border-bottom-color:transparent;border-left-color:transparent;border-top-color:transparent;color:#fff}.control-sidebar-dark .nav-tabs .nav-link.active{background-color:#343a40}.control-sidebar-dark .tab-pane{padding:10px 15px}.control-sidebar-light{color:#4b545c;background:#fff;border-left:1px solid #dee2e6}.text-sm .dropdown-menu{font-size:.875rem!important}.text-sm .dropdown-toggle:after{vertical-align:.2rem}.dropdown-item-title{font-size:1rem;margin:0}.dropdown-icon:after{margin-left:0}.dropdown-menu-lg{max-width:300px;min-width:280px;padding:0}.dropdown-menu-lg .dropdown-divider{margin:0}.dropdown-menu-lg .dropdown-item{padding:.5rem 1rem}.dropdown-menu-lg p{margin:0;white-space:normal}.dropdown-submenu{position:relative}.dropdown-submenu>a:after{border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid;float:right;margin-left:.5rem;margin-top:.5rem}.dropdown-submenu>.dropdown-menu{left:100%;margin-left:0;margin-top:0;top:0}.dropdown-hover.dropdown-submenu:hover>.dropdown-menu,.dropdown-hover .dropdown-submenu:hover>.dropdown-menu,.dropdown-hover.nav-item.dropdown:hover>.dropdown-menu,.dropdown-hover:hover>.dropdown-menu{display:block}.dropdown-menu-xl{max-width:420px;min-width:360px;padding:0}.dropdown-menu-xl .dropdown-divider{margin:0}.dropdown-menu-xl .dropdown-item{padding:.5rem 1rem}.dropdown-menu-xl p{margin:0;white-space:normal}.dropdown-footer,.dropdown-header{display:block;font-size:.875rem;padding:.5rem 1rem;text-align:center}.open:not(.dropup)>.animated-dropdown-menu{-webkit-animation:flipInX .7s both;animation:flipInX .7s both;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:767.98px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.navbar-nav>.user-menu>.nav-link:after{content:none}.navbar-nav>.user-menu>.dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;padding:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid hsla(0,0%,100%,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom:1px solid #495057;border-top:1px solid #dee2e6;padding:15px}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{display:block;clear:both;content:""}@media (min-width:576px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#495057!important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f8f9fa;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{display:block;clear:both;content:""}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#6c757d}@media (min-width:576px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f8f9fa}}.navbar-nav>.user-menu .user-image{border-radius:50%;float:left;height:2.1rem;margin-right:10px;margin-top:-2px;width:2.1rem}@media (min-width:576px){.navbar-nav>.user-menu .user-image{float:none;line-height:10px;margin-right:.4rem;margin-top:-8px}}.nav-pills .nav-link{color:#6c757d}.nav-pills .nav-link:not(.active):hover{color:#1e6581}.nav-pills .nav-item.dropdown.show .nav-link:hover{color:#fff}.nav-tabs.flex-column{border-bottom:0;border-right:1px solid #dee2e6}.nav-tabs.flex-column .nav-link{border-bottom-left-radius:.25rem;border-top-right-radius:0;margin-right:-1px}.nav-tabs.flex-column .nav-link:focus,.nav-tabs.flex-column .nav-link:hover{border-color:#e9ecef transparent #e9ecef #e9ecef}.nav-tabs.flex-column .nav-item.show .nav-link,.nav-tabs.flex-column .nav-link.active{border-color:#dee2e6 transparent #dee2e6 #dee2e6}.nav-tabs.flex-column.nav-tabs-right{border-left:1px solid #dee2e6;border-right:0}.nav-tabs.flex-column.nav-tabs-right .nav-link{border-bottom-left-radius:0;border-bottom-right-radius:.25rem;border-top-left-radius:0;border-top-right-radius:.25rem;margin-left:-1px}.nav-tabs.flex-column.nav-tabs-right .nav-link:focus,.nav-tabs.flex-column.nav-tabs-right .nav-link:hover{border-color:#e9ecef #e9ecef #e9ecef transparent}.nav-tabs.flex-column.nav-tabs-right .nav-item.show .nav-link,.nav-tabs.flex-column.nav-tabs-right .nav-link.active{border-color:#dee2e6 #dee2e6 #dee2e6 transparent}.navbar-no-expand{flex-direction:row}.navbar-no-expand .nav-link{padding-left:1rem;padding-right:1rem}.navbar-no-expand .dropdown-menu{position:absolute}.navbar-light{background-color:#f8f9fa}.navbar-dark{background-color:#343a40}.navbar-primary{background-color:#1e6581}.navbar-secondary{background-color:#6c757d}.navbar-success{background-color:#28a745}.navbar-info{background-color:#17a2b8}.navbar-warning{background-color:#ffc107}.navbar-danger{background-color:#dc3545}.navbar-lightblue{background-color:#3c8dbc}.navbar-navy{background-color:#001f3f}.navbar-olive{background-color:#3d9970}.navbar-lime{background-color:#01ff70}.navbar-fuchsia{background-color:#f012be}.navbar-maroon{background-color:#d81b60}.navbar-blue{background-color:#1e6581}.navbar-indigo{background-color:#6610f2}.navbar-purple{background-color:#6f42c1}.navbar-pink{background-color:#e83e8c}.navbar-red{background-color:#dc3545}.navbar-orange{background-color:#fd7e14}.navbar-yellow{background-color:#ffc107}.navbar-green{background-color:#28a745}.navbar-teal{background-color:#20c997}.navbar-cyan{background-color:#17a2b8}.navbar-white{background-color:#fff}.navbar-gray{background-color:#6c757d}.navbar-gray-dark{background-color:#343a40}.form-group.has-icon{position:relative}.form-group.has-icon .form-control{padding-right:35px}.form-group.has-icon .form-icon{background-color:transparent;border:0;cursor:pointer;font-size:1rem;padding:.375rem .75rem;position:absolute;right:3px;top:0}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.form-control-feedback.fa,.form-control-feedback.fab,.form-control-feedback.far,.form-control-feedback.fas,.form-control-feedback.glyphicon,.form-control-feedback.ion{line-height:calc(2.25rem + 2px)}.form-group-lg .form-control+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fab,.form-group-lg .form-control+.form-control-feedback.far,.form-group-lg .form-control+.form-control-feedback.fas,.form-group-lg .form-control+.form-control-feedback.glyphicon,.form-group-lg .form-control+.form-control-feedback.ion,.input-group-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fab,.input-group-lg+.form-control-feedback.far,.input-group-lg+.form-control-feedback.fas,.input-group-lg+.form-control-feedback.glyphicon,.input-group-lg+.form-control-feedback.ion,.input-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fab,.input-lg+.form-control-feedback.far,.input-lg+.form-control-feedback.fas,.input-lg+.form-control-feedback.glyphicon,.input-lg+.form-control-feedback.ion{line-height:calc(2.875rem + 2px)}.form-group-sm .form-control+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fab,.form-group-sm .form-control+.form-control-feedback.far,.form-group-sm .form-control+.form-control-feedback.fas,.form-group-sm .form-control+.form-control-feedback.glyphicon,.form-group-sm .form-control+.form-control-feedback.ion,.input-group-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fab,.input-group-sm+.form-control-feedback.far,.input-group-sm+.form-control-feedback.fas,.input-group-sm+.form-control-feedback.glyphicon,.input-group-sm+.form-control-feedback.ion,.input-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fab,.input-sm+.form-control-feedback.far,.input-sm+.form-control-feedback.fas,.input-sm+.form-control-feedback.glyphicon,.input-sm+.form-control-feedback.ion{line-height:calc(1.8125rem + 2px)}label:not(.form-check-label):not(.custom-file-label){font-weight:700}.warning-feedback{font-size:80%;color:#ffc107;display:none;margin-top:.25rem;width:100%}.warning-tooltip{border-radius:.25rem;font-size:.875rem;background-color:rgba(255,193,7,.9);color:#1f2d3d;display:none;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-control.is-warning{border-color:#ffc107}.form-control.is-warning:focus{border-color:#ffc107;box-shadow:0 0 0 0 rgba(255,193,7,.25)}.form-control.is-warning~.warning-feedback,.form-control.is-warning~.warning-tooltip{display:block}textarea.form-control.is-warning{padding-right:2.25rem;background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-warning{border-color:#ffc107}.custom-select.is-warning:focus{border-color:#ffc107;box-shadow:0 0 0 0 rgba(255,193,7,.25)}.custom-select.is-warning~.warning-feedback,.custom-select.is-warning~.warning-tooltip,.form-control-file.is-warning~.warning-feedback,.form-control-file.is-warning~.warning-tooltip{display:block}.form-check-input.is-warning~.form-check-label{color:#ffc107}.form-check-input.is-warning~.warning-feedback,.form-check-input.is-warning~.warning-tooltip{display:block}.custom-control-input.is-warning~.custom-control-label{color:#ffc107}.custom-control-input.is-warning~.custom-control-label:before{border-color:#ffc107}.custom-control-input.is-warning~.warning-feedback,.custom-control-input.is-warning~.warning-tooltip{display:block}.custom-control-input.is-warning:checked~.custom-control-label:before{background-color:#ffce3a;border-color:#ffce3a}.custom-control-input.is-warning:focus~.custom-control-label:before{box-shadow:0 0 0 0 rgba(255,193,7,.25)}.custom-control-input.is-warning:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-warning~.custom-file-label{border-color:#ffc107}.custom-file-input.is-warning~.warning-feedback,.custom-file-input.is-warning~.warning-tooltip{display:block}.custom-file-input.is-warning:focus~.custom-file-label{border-color:#ffc107;box-shadow:0 0 0 0 rgba(255,193,7,.25)}.custom-switch.custom-switch-off-primary .custom-control-input~.custom-control-label:before{background:#1e6581;border-color:#0b242e}.custom-switch.custom-switch-off-primary .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-switch.custom-switch-off-primary .custom-control-input~.custom-control-label:after{background:#06141a}.custom-switch.custom-switch-on-primary .custom-control-input:checked~.custom-control-label:before{background:#1e6581;border-color:#0b242e}.custom-switch.custom-switch-on-primary .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-switch.custom-switch-on-primary .custom-control-input:checked~.custom-control-label:after{background:#5eb7da}.custom-switch.custom-switch-off-secondary .custom-control-input~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-off-secondary .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-off-secondary .custom-control-input~.custom-control-label:after{background:#313539}.custom-switch.custom-switch-on-secondary .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-on-secondary .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-on-secondary .custom-control-input:checked~.custom-control-label:after{background:#bcc1c6}.custom-switch.custom-switch-off-success .custom-control-input~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-off-success .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-off-success .custom-control-input~.custom-control-label:after{background:#0f401b}.custom-switch.custom-switch-on-success .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-on-success .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-on-success .custom-control-input:checked~.custom-control-label:after{background:#86e29b}.custom-switch.custom-switch-off-info .custom-control-input~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-off-info .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-off-info .custom-control-input~.custom-control-label:after{background:#093e47}.custom-switch.custom-switch-on-info .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-on-info .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-on-info .custom-control-input:checked~.custom-control-label:after{background:#7adeee}.custom-switch.custom-switch-off-warning .custom-control-input~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-off-warning .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-off-warning .custom-control-input~.custom-control-label:after{background:#876500}.custom-switch.custom-switch-on-warning .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-on-warning .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-on-warning .custom-control-input:checked~.custom-control-label:after{background:#ffe7a0}.custom-switch.custom-switch-off-danger .custom-control-input~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-off-danger .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-off-danger .custom-control-input~.custom-control-label:after{background:#7c151f}.custom-switch.custom-switch-on-danger .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-on-danger .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-on-danger .custom-control-input:checked~.custom-control-label:after{background:#f3b7bd}.custom-switch.custom-switch-off-light .custom-control-input~.custom-control-label:before{background:#f8f9fa;border-color:#bdc6d0}.custom-switch.custom-switch-off-light .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-switch.custom-switch-off-light .custom-control-input~.custom-control-label:after{background:#aeb9c5}.custom-switch.custom-switch-on-light .custom-control-input:checked~.custom-control-label:before{background:#f8f9fa;border-color:#bdc6d0}.custom-switch.custom-switch-on-light .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-switch.custom-switch-on-light .custom-control-input:checked~.custom-control-label:after{background:#fff}.custom-switch.custom-switch-off-dark .custom-control-input~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-off-dark .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-off-dark .custom-control-input~.custom-control-label:after{background:#000}.custom-switch.custom-switch-on-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-on-dark .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-on-dark .custom-control-input:checked~.custom-control-label:after{background:#7a8793}.custom-switch.custom-switch-off-lightblue .custom-control-input~.custom-control-label:before{background:#3c8dbc;border-color:#23536f}.custom-switch.custom-switch-off-lightblue .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-switch.custom-switch-off-lightblue .custom-control-input~.custom-control-label:after{background:#1d455b}.custom-switch.custom-switch-on-lightblue .custom-control-input:checked~.custom-control-label:before{background:#3c8dbc;border-color:#23536f}.custom-switch.custom-switch-on-lightblue .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-switch.custom-switch-on-lightblue .custom-control-input:checked~.custom-control-label:after{background:#acd0e5}.custom-switch.custom-switch-off-navy .custom-control-input~.custom-control-label:before{background:#001f3f;border-color:#000}.custom-switch.custom-switch-off-navy .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-switch.custom-switch-off-navy .custom-control-input~.custom-control-label:after{background:#000}.custom-switch.custom-switch-on-navy .custom-control-input:checked~.custom-control-label:before{background:#001f3f;border-color:#000}.custom-switch.custom-switch-on-navy .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-switch.custom-switch-on-navy .custom-control-input:checked~.custom-control-label:after{background:#006ad8}.custom-switch.custom-switch-off-olive .custom-control-input~.custom-control-label:before{background:#3d9970;border-color:#20503b}.custom-switch.custom-switch-off-olive .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-switch.custom-switch-off-olive .custom-control-input~.custom-control-label:after{background:#193e2d}.custom-switch.custom-switch-on-olive .custom-control-input:checked~.custom-control-label:before{background:#3d9970;border-color:#20503b}.custom-switch.custom-switch-on-olive .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-switch.custom-switch-on-olive .custom-control-input:checked~.custom-control-label:after{background:#99d6bb}.custom-switch.custom-switch-off-lime .custom-control-input~.custom-control-label:before{background:#01ff70;border-color:#009a43}.custom-switch.custom-switch-off-lime .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-switch.custom-switch-off-lime .custom-control-input~.custom-control-label:after{background:#008138}.custom-switch.custom-switch-on-lime .custom-control-input:checked~.custom-control-label:before{background:#01ff70;border-color:#009a43}.custom-switch.custom-switch-on-lime .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-switch.custom-switch-on-lime .custom-control-input:checked~.custom-control-label:after{background:#9affc6}.custom-switch.custom-switch-off-fuchsia .custom-control-input~.custom-control-label:before{background:#f012be;border-color:#930974}.custom-switch.custom-switch-off-fuchsia .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-switch.custom-switch-off-fuchsia .custom-control-input~.custom-control-label:after{background:#7b0861}.custom-switch.custom-switch-on-fuchsia .custom-control-input:checked~.custom-control-label:before{background:#f012be;border-color:#930974}.custom-switch.custom-switch-on-fuchsia .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-switch.custom-switch-on-fuchsia .custom-control-input:checked~.custom-control-label:after{background:#f9a2e5}.custom-switch.custom-switch-off-maroon .custom-control-input~.custom-control-label:before{background:#d81b60;border-color:#7d1038}.custom-switch.custom-switch-off-maroon .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-switch.custom-switch-off-maroon .custom-control-input~.custom-control-label:after{background:#670d2e}.custom-switch.custom-switch-on-maroon .custom-control-input:checked~.custom-control-label:before{background:#d81b60;border-color:#7d1038}.custom-switch.custom-switch-on-maroon .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-switch.custom-switch-on-maroon .custom-control-input:checked~.custom-control-label:after{background:#f29aba}.custom-switch.custom-switch-off-blue .custom-control-input~.custom-control-label:before{background:#1e6581;border-color:#0b242e}.custom-switch.custom-switch-off-blue .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-switch.custom-switch-off-blue .custom-control-input~.custom-control-label:after{background:#06141a}.custom-switch.custom-switch-on-blue .custom-control-input:checked~.custom-control-label:before{background:#1e6581;border-color:#0b242e}.custom-switch.custom-switch-on-blue .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-switch.custom-switch-on-blue .custom-control-input:checked~.custom-control-label:after{background:#5eb7da}.custom-switch.custom-switch-off-indigo .custom-control-input~.custom-control-label:before{background:#6610f2;border-color:#3d0894}.custom-switch.custom-switch-off-indigo .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-switch.custom-switch-off-indigo .custom-control-input~.custom-control-label:after{background:#33077c}.custom-switch.custom-switch-on-indigo .custom-control-input:checked~.custom-control-label:before{background:#6610f2;border-color:#3d0894}.custom-switch.custom-switch-on-indigo .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-switch.custom-switch-on-indigo .custom-control-input:checked~.custom-control-label:after{background:#c3a1fa}.custom-switch.custom-switch-off-purple .custom-control-input~.custom-control-label:before{background:#6f42c1;border-color:#432776}.custom-switch.custom-switch-off-purple .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-switch.custom-switch-off-purple .custom-control-input~.custom-control-label:after{background:#382063}.custom-switch.custom-switch-on-purple .custom-control-input:checked~.custom-control-label:before{background:#6f42c1;border-color:#432776}.custom-switch.custom-switch-on-purple .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-switch.custom-switch-on-purple .custom-control-input:checked~.custom-control-label:after{background:#c7b5e7}.custom-switch.custom-switch-off-pink .custom-control-input~.custom-control-label:before{background:#e83e8c;border-color:#ac145a}.custom-switch.custom-switch-off-pink .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-switch.custom-switch-off-pink .custom-control-input~.custom-control-label:after{background:#95124e}.custom-switch.custom-switch-on-pink .custom-control-input:checked~.custom-control-label:before{background:#e83e8c;border-color:#ac145a}.custom-switch.custom-switch-on-pink .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-switch.custom-switch-on-pink .custom-control-input:checked~.custom-control-label:after{background:#f8c7dd}.custom-switch.custom-switch-off-red .custom-control-input~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-off-red .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-off-red .custom-control-input~.custom-control-label:after{background:#7c151f}.custom-switch.custom-switch-on-red .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.custom-switch.custom-switch-on-red .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-switch.custom-switch-on-red .custom-control-input:checked~.custom-control-label:after{background:#f3b7bd}.custom-switch.custom-switch-off-orange .custom-control-input~.custom-control-label:before{background:#fd7e14;border-color:#aa4e01}.custom-switch.custom-switch-off-orange .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-switch.custom-switch-off-orange .custom-control-input~.custom-control-label:after{background:#904201}.custom-switch.custom-switch-on-orange .custom-control-input:checked~.custom-control-label:before{background:#fd7e14;border-color:#aa4e01}.custom-switch.custom-switch-on-orange .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-switch.custom-switch-on-orange .custom-control-input:checked~.custom-control-label:after{background:#fed1ac}.custom-switch.custom-switch-off-yellow .custom-control-input~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-off-yellow .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-off-yellow .custom-control-input~.custom-control-label:after{background:#876500}.custom-switch.custom-switch-on-yellow .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.custom-switch.custom-switch-on-yellow .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-switch.custom-switch-on-yellow .custom-control-input:checked~.custom-control-label:after{background:#ffe7a0}.custom-switch.custom-switch-off-green .custom-control-input~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-off-green .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-off-green .custom-control-input~.custom-control-label:after{background:#0f401b}.custom-switch.custom-switch-on-green .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.custom-switch.custom-switch-on-green .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-switch.custom-switch-on-green .custom-control-input:checked~.custom-control-label:after{background:#86e29b}.custom-switch.custom-switch-off-teal .custom-control-input~.custom-control-label:before{background:#20c997;border-color:#127155}.custom-switch.custom-switch-off-teal .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-switch.custom-switch-off-teal .custom-control-input~.custom-control-label:after{background:#0e5b44}.custom-switch.custom-switch-on-teal .custom-control-input:checked~.custom-control-label:before{background:#20c997;border-color:#127155}.custom-switch.custom-switch-on-teal .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-switch.custom-switch-on-teal .custom-control-input:checked~.custom-control-label:after{background:#94eed3}.custom-switch.custom-switch-off-cyan .custom-control-input~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-off-cyan .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-off-cyan .custom-control-input~.custom-control-label:after{background:#093e47}.custom-switch.custom-switch-on-cyan .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.custom-switch.custom-switch-on-cyan .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-switch.custom-switch-on-cyan .custom-control-input:checked~.custom-control-label:after{background:#7adeee}.custom-switch.custom-switch-off-white .custom-control-input~.custom-control-label:before{background:#fff;border-color:#ccc}.custom-switch.custom-switch-off-white .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-switch.custom-switch-off-white .custom-control-input~.custom-control-label:after{background:#bfbfbf}.custom-switch.custom-switch-on-white .custom-control-input:checked~.custom-control-label:before{background:#fff;border-color:#ccc}.custom-switch.custom-switch-on-white .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-switch.custom-switch-on-white .custom-control-input:checked~.custom-control-label:after{background:#fff}.custom-switch.custom-switch-off-gray .custom-control-input~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-off-gray .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-off-gray .custom-control-input~.custom-control-label:after{background:#313539}.custom-switch.custom-switch-on-gray .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.custom-switch.custom-switch-on-gray .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-switch.custom-switch-on-gray .custom-control-input:checked~.custom-control-label:after{background:#bcc1c6}.custom-switch.custom-switch-off-gray-dark .custom-control-input~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-off-gray-dark .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-off-gray-dark .custom-control-input~.custom-control-label:after{background:#000}.custom-switch.custom-switch-on-gray-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.custom-switch.custom-switch-on-gray-dark .custom-control-input:checked:focus~.custom-control-label:before{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-switch.custom-switch-on-gray-dark .custom-control-input:checked~.custom-control-label:after{background:#7a8793}.custom-range.custom-range-primary:focus{outline:none}.custom-range.custom-range-primary:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-range.custom-range-primary:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-range.custom-range-primary:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-range.custom-range-primary::-webkit-slider-thumb{background-color:#1e6581}.custom-range.custom-range-primary::-webkit-slider-thumb:active{background-color:#73c0de}.custom-range.custom-range-primary::-moz-range-thumb{background-color:#1e6581}.custom-range.custom-range-primary::-moz-range-thumb:active{background-color:#73c0de}.custom-range.custom-range-primary::-ms-thumb{background-color:#1e6581}.custom-range.custom-range-primary::-ms-thumb:active{background-color:#73c0de}.custom-range.custom-range-secondary:focus{outline:none}.custom-range.custom-range-secondary:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-secondary:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-secondary:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-secondary::-webkit-slider-thumb{background-color:#6c757d}.custom-range.custom-range-secondary::-webkit-slider-thumb:active{background-color:#caced1}.custom-range.custom-range-secondary::-moz-range-thumb{background-color:#6c757d}.custom-range.custom-range-secondary::-moz-range-thumb:active{background-color:#caced1}.custom-range.custom-range-secondary::-ms-thumb{background-color:#6c757d}.custom-range.custom-range-secondary::-ms-thumb:active{background-color:#caced1}.custom-range.custom-range-success:focus{outline:none}.custom-range.custom-range-success:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-success:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-success:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-success::-webkit-slider-thumb{background-color:#28a745}.custom-range.custom-range-success::-webkit-slider-thumb:active{background-color:#9be7ac}.custom-range.custom-range-success::-moz-range-thumb{background-color:#28a745}.custom-range.custom-range-success::-moz-range-thumb:active{background-color:#9be7ac}.custom-range.custom-range-success::-ms-thumb{background-color:#28a745}.custom-range.custom-range-success::-ms-thumb:active{background-color:#9be7ac}.custom-range.custom-range-info:focus{outline:none}.custom-range.custom-range-info:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-info:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-info:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-info::-webkit-slider-thumb{background-color:#17a2b8}.custom-range.custom-range-info::-webkit-slider-thumb:active{background-color:#90e4f1}.custom-range.custom-range-info::-moz-range-thumb{background-color:#17a2b8}.custom-range.custom-range-info::-moz-range-thumb:active{background-color:#90e4f1}.custom-range.custom-range-info::-ms-thumb{background-color:#17a2b8}.custom-range.custom-range-info::-ms-thumb:active{background-color:#90e4f1}.custom-range.custom-range-warning:focus{outline:none}.custom-range.custom-range-warning:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-warning:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-warning:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-warning::-webkit-slider-thumb{background-color:#ffc107}.custom-range.custom-range-warning::-webkit-slider-thumb:active{background-color:#ffeeba}.custom-range.custom-range-warning::-moz-range-thumb{background-color:#ffc107}.custom-range.custom-range-warning::-moz-range-thumb:active{background-color:#ffeeba}.custom-range.custom-range-warning::-ms-thumb{background-color:#ffc107}.custom-range.custom-range-warning::-ms-thumb:active{background-color:#ffeeba}.custom-range.custom-range-danger:focus{outline:none}.custom-range.custom-range-danger:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-danger:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-danger:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-danger::-webkit-slider-thumb{background-color:#dc3545}.custom-range.custom-range-danger::-webkit-slider-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-danger::-moz-range-thumb{background-color:#dc3545}.custom-range.custom-range-danger::-moz-range-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-danger::-ms-thumb{background-color:#dc3545}.custom-range.custom-range-danger::-ms-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-light:focus{outline:none}.custom-range.custom-range-light:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-range.custom-range-light:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-range.custom-range-light:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(248,249,250,.25)}.custom-range.custom-range-light::-webkit-slider-thumb{background-color:#f8f9fa}.custom-range.custom-range-light::-webkit-slider-thumb:active{background-color:#fff}.custom-range.custom-range-light::-moz-range-thumb{background-color:#f8f9fa}.custom-range.custom-range-light::-moz-range-thumb:active{background-color:#fff}.custom-range.custom-range-light::-ms-thumb{background-color:#f8f9fa}.custom-range.custom-range-light::-ms-thumb:active{background-color:#fff}.custom-range.custom-range-dark:focus{outline:none}.custom-range.custom-range-dark:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-dark:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-dark:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-dark::-webkit-slider-thumb{background-color:#343a40}.custom-range.custom-range-dark::-webkit-slider-thumb:active{background-color:#88939e}.custom-range.custom-range-dark::-moz-range-thumb{background-color:#343a40}.custom-range.custom-range-dark::-moz-range-thumb:active{background-color:#88939e}.custom-range.custom-range-dark::-ms-thumb{background-color:#343a40}.custom-range.custom-range-dark::-ms-thumb:active{background-color:#88939e}.custom-range.custom-range-lightblue:focus{outline:none}.custom-range.custom-range-lightblue:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-range.custom-range-lightblue:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-range.custom-range-lightblue:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(60,141,188,.25)}.custom-range.custom-range-lightblue::-webkit-slider-thumb{background-color:#3c8dbc}.custom-range.custom-range-lightblue::-webkit-slider-thumb:active{background-color:#c0dbeb}.custom-range.custom-range-lightblue::-moz-range-thumb{background-color:#3c8dbc}.custom-range.custom-range-lightblue::-moz-range-thumb:active{background-color:#c0dbeb}.custom-range.custom-range-lightblue::-ms-thumb{background-color:#3c8dbc}.custom-range.custom-range-lightblue::-ms-thumb:active{background-color:#c0dbeb}.custom-range.custom-range-navy:focus{outline:none}.custom-range.custom-range-navy:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-range.custom-range-navy:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-range.custom-range-navy:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,31,63,.25)}.custom-range.custom-range-navy::-webkit-slider-thumb{background-color:#001f3f}.custom-range.custom-range-navy::-webkit-slider-thumb:active{background-color:#0077f2}.custom-range.custom-range-navy::-moz-range-thumb{background-color:#001f3f}.custom-range.custom-range-navy::-moz-range-thumb:active{background-color:#0077f2}.custom-range.custom-range-navy::-ms-thumb{background-color:#001f3f}.custom-range.custom-range-navy::-ms-thumb:active{background-color:#0077f2}.custom-range.custom-range-olive:focus{outline:none}.custom-range.custom-range-olive:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-range.custom-range-olive:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-range.custom-range-olive:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(61,153,112,.25)}.custom-range.custom-range-olive::-webkit-slider-thumb{background-color:#3d9970}.custom-range.custom-range-olive::-webkit-slider-thumb:active{background-color:#abdec7}.custom-range.custom-range-olive::-moz-range-thumb{background-color:#3d9970}.custom-range.custom-range-olive::-moz-range-thumb:active{background-color:#abdec7}.custom-range.custom-range-olive::-ms-thumb{background-color:#3d9970}.custom-range.custom-range-olive::-ms-thumb:active{background-color:#abdec7}.custom-range.custom-range-lime:focus{outline:none}.custom-range.custom-range-lime:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-range.custom-range-lime:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-range.custom-range-lime:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(1,255,112,.25)}.custom-range.custom-range-lime::-webkit-slider-thumb{background-color:#01ff70}.custom-range.custom-range-lime::-webkit-slider-thumb:active{background-color:#b4ffd4}.custom-range.custom-range-lime::-moz-range-thumb{background-color:#01ff70}.custom-range.custom-range-lime::-moz-range-thumb:active{background-color:#b4ffd4}.custom-range.custom-range-lime::-ms-thumb{background-color:#01ff70}.custom-range.custom-range-lime::-ms-thumb:active{background-color:#b4ffd4}.custom-range.custom-range-fuchsia:focus{outline:none}.custom-range.custom-range-fuchsia:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-range.custom-range-fuchsia:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-range.custom-range-fuchsia:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(240,18,190,.25)}.custom-range.custom-range-fuchsia::-webkit-slider-thumb{background-color:#f012be}.custom-range.custom-range-fuchsia::-webkit-slider-thumb:active{background-color:#fbbaec}.custom-range.custom-range-fuchsia::-moz-range-thumb{background-color:#f012be}.custom-range.custom-range-fuchsia::-moz-range-thumb:active{background-color:#fbbaec}.custom-range.custom-range-fuchsia::-ms-thumb{background-color:#f012be}.custom-range.custom-range-fuchsia::-ms-thumb:active{background-color:#fbbaec}.custom-range.custom-range-maroon:focus{outline:none}.custom-range.custom-range-maroon:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-range.custom-range-maroon:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-range.custom-range-maroon:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(216,27,96,.25)}.custom-range.custom-range-maroon::-webkit-slider-thumb{background-color:#d81b60}.custom-range.custom-range-maroon::-webkit-slider-thumb:active{background-color:#f5b0c9}.custom-range.custom-range-maroon::-moz-range-thumb{background-color:#d81b60}.custom-range.custom-range-maroon::-moz-range-thumb:active{background-color:#f5b0c9}.custom-range.custom-range-maroon::-ms-thumb{background-color:#d81b60}.custom-range.custom-range-maroon::-ms-thumb:active{background-color:#f5b0c9}.custom-range.custom-range-blue:focus{outline:none}.custom-range.custom-range-blue:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-range.custom-range-blue:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-range.custom-range-blue:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(30,101,129,.25)}.custom-range.custom-range-blue::-webkit-slider-thumb{background-color:#1e6581}.custom-range.custom-range-blue::-webkit-slider-thumb:active{background-color:#73c0de}.custom-range.custom-range-blue::-moz-range-thumb{background-color:#1e6581}.custom-range.custom-range-blue::-moz-range-thumb:active{background-color:#73c0de}.custom-range.custom-range-blue::-ms-thumb{background-color:#1e6581}.custom-range.custom-range-blue::-ms-thumb:active{background-color:#73c0de}.custom-range.custom-range-indigo:focus{outline:none}.custom-range.custom-range-indigo:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-range.custom-range-indigo:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-range.custom-range-indigo:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(102,16,242,.25)}.custom-range.custom-range-indigo::-webkit-slider-thumb{background-color:#6610f2}.custom-range.custom-range-indigo::-webkit-slider-thumb:active{background-color:#d2b9fb}.custom-range.custom-range-indigo::-moz-range-thumb{background-color:#6610f2}.custom-range.custom-range-indigo::-moz-range-thumb:active{background-color:#d2b9fb}.custom-range.custom-range-indigo::-ms-thumb{background-color:#6610f2}.custom-range.custom-range-indigo::-ms-thumb:active{background-color:#d2b9fb}.custom-range.custom-range-purple:focus{outline:none}.custom-range.custom-range-purple:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-range.custom-range-purple:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-range.custom-range-purple:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(111,66,193,.25)}.custom-range.custom-range-purple::-webkit-slider-thumb{background-color:#6f42c1}.custom-range.custom-range-purple::-webkit-slider-thumb:active{background-color:#d5c8ed}.custom-range.custom-range-purple::-moz-range-thumb{background-color:#6f42c1}.custom-range.custom-range-purple::-moz-range-thumb:active{background-color:#d5c8ed}.custom-range.custom-range-purple::-ms-thumb{background-color:#6f42c1}.custom-range.custom-range-purple::-ms-thumb:active{background-color:#d5c8ed}.custom-range.custom-range-pink:focus{outline:none}.custom-range.custom-range-pink:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-range.custom-range-pink:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-range.custom-range-pink:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(232,62,140,.25)}.custom-range.custom-range-pink::-webkit-slider-thumb{background-color:#e83e8c}.custom-range.custom-range-pink::-webkit-slider-thumb:active{background-color:#fbddeb}.custom-range.custom-range-pink::-moz-range-thumb{background-color:#e83e8c}.custom-range.custom-range-pink::-moz-range-thumb:active{background-color:#fbddeb}.custom-range.custom-range-pink::-ms-thumb{background-color:#e83e8c}.custom-range.custom-range-pink::-ms-thumb:active{background-color:#fbddeb}.custom-range.custom-range-red:focus{outline:none}.custom-range.custom-range-red:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-red:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-red:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(220,53,69,.25)}.custom-range.custom-range-red::-webkit-slider-thumb{background-color:#dc3545}.custom-range.custom-range-red::-webkit-slider-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-red::-moz-range-thumb{background-color:#dc3545}.custom-range.custom-range-red::-moz-range-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-red::-ms-thumb{background-color:#dc3545}.custom-range.custom-range-red::-ms-thumb:active{background-color:#f6cdd1}.custom-range.custom-range-orange:focus{outline:none}.custom-range.custom-range-orange:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-range.custom-range-orange:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-range.custom-range-orange:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(253,126,20,.25)}.custom-range.custom-range-orange::-webkit-slider-thumb{background-color:#fd7e14}.custom-range.custom-range-orange::-webkit-slider-thumb:active{background-color:#ffdfc5}.custom-range.custom-range-orange::-moz-range-thumb{background-color:#fd7e14}.custom-range.custom-range-orange::-moz-range-thumb:active{background-color:#ffdfc5}.custom-range.custom-range-orange::-ms-thumb{background-color:#fd7e14}.custom-range.custom-range-orange::-ms-thumb:active{background-color:#ffdfc5}.custom-range.custom-range-yellow:focus{outline:none}.custom-range.custom-range-yellow:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-yellow:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-yellow:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(255,193,7,.25)}.custom-range.custom-range-yellow::-webkit-slider-thumb{background-color:#ffc107}.custom-range.custom-range-yellow::-webkit-slider-thumb:active{background-color:#ffeeba}.custom-range.custom-range-yellow::-moz-range-thumb{background-color:#ffc107}.custom-range.custom-range-yellow::-moz-range-thumb:active{background-color:#ffeeba}.custom-range.custom-range-yellow::-ms-thumb{background-color:#ffc107}.custom-range.custom-range-yellow::-ms-thumb:active{background-color:#ffeeba}.custom-range.custom-range-green:focus{outline:none}.custom-range.custom-range-green:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-green:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-green:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(40,167,69,.25)}.custom-range.custom-range-green::-webkit-slider-thumb{background-color:#28a745}.custom-range.custom-range-green::-webkit-slider-thumb:active{background-color:#9be7ac}.custom-range.custom-range-green::-moz-range-thumb{background-color:#28a745}.custom-range.custom-range-green::-moz-range-thumb:active{background-color:#9be7ac}.custom-range.custom-range-green::-ms-thumb{background-color:#28a745}.custom-range.custom-range-green::-ms-thumb:active{background-color:#9be7ac}.custom-range.custom-range-teal:focus{outline:none}.custom-range.custom-range-teal:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-range.custom-range-teal:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-range.custom-range-teal:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(32,201,151,.25)}.custom-range.custom-range-teal::-webkit-slider-thumb{background-color:#20c997}.custom-range.custom-range-teal::-webkit-slider-thumb:active{background-color:#aaf1dc}.custom-range.custom-range-teal::-moz-range-thumb{background-color:#20c997}.custom-range.custom-range-teal::-moz-range-thumb:active{background-color:#aaf1dc}.custom-range.custom-range-teal::-ms-thumb{background-color:#20c997}.custom-range.custom-range-teal::-ms-thumb:active{background-color:#aaf1dc}.custom-range.custom-range-cyan:focus{outline:none}.custom-range.custom-range-cyan:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-cyan:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-cyan:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(23,162,184,.25)}.custom-range.custom-range-cyan::-webkit-slider-thumb{background-color:#17a2b8}.custom-range.custom-range-cyan::-webkit-slider-thumb:active{background-color:#90e4f1}.custom-range.custom-range-cyan::-moz-range-thumb{background-color:#17a2b8}.custom-range.custom-range-cyan::-moz-range-thumb:active{background-color:#90e4f1}.custom-range.custom-range-cyan::-ms-thumb{background-color:#17a2b8}.custom-range.custom-range-cyan::-ms-thumb:active{background-color:#90e4f1}.custom-range.custom-range-white:focus{outline:none}.custom-range.custom-range-white:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-range.custom-range-white:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-range.custom-range-white:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px hsla(0,0%,100%,.25)}.custom-range.custom-range-white::-webkit-slider-thumb,.custom-range.custom-range-white::-webkit-slider-thumb:active{background-color:#fff}.custom-range.custom-range-white::-moz-range-thumb,.custom-range.custom-range-white::-moz-range-thumb:active{background-color:#fff}.custom-range.custom-range-white::-ms-thumb,.custom-range.custom-range-white::-ms-thumb:active{background-color:#fff}.custom-range.custom-range-gray:focus{outline:none}.custom-range.custom-range-gray:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-gray:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-gray:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(108,117,125,.25)}.custom-range.custom-range-gray::-webkit-slider-thumb{background-color:#6c757d}.custom-range.custom-range-gray::-webkit-slider-thumb:active{background-color:#caced1}.custom-range.custom-range-gray::-moz-range-thumb{background-color:#6c757d}.custom-range.custom-range-gray::-moz-range-thumb:active{background-color:#caced1}.custom-range.custom-range-gray::-ms-thumb{background-color:#6c757d}.custom-range.custom-range-gray::-ms-thumb:active{background-color:#caced1}.custom-range.custom-range-gray-dark:focus{outline:none}.custom-range.custom-range-gray-dark:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-gray-dark:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-gray-dark:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(52,58,64,.25)}.custom-range.custom-range-gray-dark::-webkit-slider-thumb{background-color:#343a40}.custom-range.custom-range-gray-dark::-webkit-slider-thumb:active{background-color:#88939e}.custom-range.custom-range-gray-dark::-moz-range-thumb{background-color:#343a40}.custom-range.custom-range-gray-dark::-moz-range-thumb:active{background-color:#88939e}.custom-range.custom-range-gray-dark::-ms-thumb{background-color:#343a40}.custom-range.custom-range-gray-dark::-ms-thumb:active{background-color:#88939e}.progress{box-shadow:none;border-radius:1px}.progress.vertical{display:inline-block;height:200px;margin-right:10px;position:relative;width:30px}.progress.vertical>.progress-bar{bottom:0;position:absolute;width:100%}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group{margin-bottom:.5rem}.progress-sm{height:10px}.progress-xs{height:7px}.progress-xxs{height:3px}.table tr>td .progress{margin:0}.card-primary:not(.card-outline)>.card-header{background-color:#1e6581}.card-primary:not(.card-outline)>.card-header,.card-primary:not(.card-outline)>.card-header a{color:#fff}.card-primary:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-primary.card-outline{border-top:3px solid #1e6581}.card-primary.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-primary.card-outline-tabs>.card-header a.active{border-top:3px solid #1e6581}.bg-gradient-primary .btn-tool,.bg-primary .btn-tool,.card-primary:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-primary .btn-tool:hover,.bg-primary .btn-tool:hover,.card-primary:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-primary .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-primary .bootstrap-datetimepicker-widget .table th,.card.bg-primary .bootstrap-datetimepicker-widget .table td,.card.bg-primary .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-primary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#164b60;color:#fff}.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.today:before,.card.bg-primary .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-primary .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-primary .bootstrap-datetimepicker-widget table td.active,.card.bg-primary .bootstrap-datetimepicker-widget table td.active:hover{background:#2885aa;color:#fff}.card-secondary:not(.card-outline)>.card-header{background-color:#6c757d}.card-secondary:not(.card-outline)>.card-header,.card-secondary:not(.card-outline)>.card-header a{color:#fff}.card-secondary:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-secondary.card-outline{border-top:3px solid #6c757d}.card-secondary.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-secondary.card-outline-tabs>.card-header a.active{border-top:3px solid #6c757d}.bg-gradient-secondary .btn-tool,.bg-secondary .btn-tool,.card-secondary:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-secondary .btn-tool:hover,.bg-secondary .btn-tool:hover,.card-secondary:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget .table th,.card.bg-secondary .bootstrap-datetimepicker-widget .table td,.card.bg-secondary .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#596167;color:#fff}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.today:before,.card.bg-secondary .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-secondary .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-secondary .bootstrap-datetimepicker-widget table td.active,.card.bg-secondary .bootstrap-datetimepicker-widget table td.active:hover{background:#868e96;color:#fff}.card-success:not(.card-outline)>.card-header{background-color:#28a745}.card-success:not(.card-outline)>.card-header,.card-success:not(.card-outline)>.card-header a{color:#fff}.card-success:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-success.card-outline{border-top:3px solid #28a745}.card-success.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-success.card-outline-tabs>.card-header a.active{border-top:3px solid #28a745}.bg-gradient-success .btn-tool,.bg-success .btn-tool,.card-success:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-success .btn-tool:hover,.bg-success .btn-tool:hover,.card-success:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-success .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-success .bootstrap-datetimepicker-widget .table th,.card.bg-success .bootstrap-datetimepicker-widget .table td,.card.bg-success .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-success .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-success .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#208637;color:#fff}.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.today:before,.card.bg-success .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-success .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-success .bootstrap-datetimepicker-widget table td.active,.card.bg-success .bootstrap-datetimepicker-widget table td.active:hover{background:#34ce57;color:#fff}.card-info:not(.card-outline)>.card-header{background-color:#17a2b8}.card-info:not(.card-outline)>.card-header,.card-info:not(.card-outline)>.card-header a{color:#fff}.card-info:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-info.card-outline{border-top:3px solid #17a2b8}.card-info.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-info.card-outline-tabs>.card-header a.active{border-top:3px solid #17a2b8}.bg-gradient-info .btn-tool,.bg-info .btn-tool,.card-info:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-info .btn-tool:hover,.bg-info .btn-tool:hover,.card-info:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-info .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-info .bootstrap-datetimepicker-widget .table th,.card.bg-info .bootstrap-datetimepicker-widget .table td,.card.bg-info .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-info .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-info .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#128294;color:#fff}.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.today:before,.card.bg-info .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-info .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-info .bootstrap-datetimepicker-widget table td.active,.card.bg-info .bootstrap-datetimepicker-widget table td.active:hover{background:#1fc8e3;color:#fff}.card-warning:not(.card-outline)>.card-header{background-color:#ffc107}.card-warning:not(.card-outline)>.card-header,.card-warning:not(.card-outline)>.card-header a,.card-warning:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-warning.card-outline{border-top:3px solid #ffc107}.card-warning.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-warning.card-outline-tabs>.card-header a.active{border-top:3px solid #ffc107}.bg-gradient-warning .btn-tool,.bg-warning .btn-tool,.card-warning:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-warning .btn-tool:hover,.bg-warning .btn-tool:hover,.card-warning:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-warning .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-warning .bootstrap-datetimepicker-widget .table th,.card.bg-warning .bootstrap-datetimepicker-widget .table td,.card.bg-warning .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-warning .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#dda600;color:#1f2d3d}.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.today:before,.card.bg-warning .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-warning .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-warning .bootstrap-datetimepicker-widget table td.active,.card.bg-warning .bootstrap-datetimepicker-widget table td.active:hover{background:#ffce3a;color:#1f2d3d}.card-danger:not(.card-outline)>.card-header{background-color:#dc3545}.card-danger:not(.card-outline)>.card-header,.card-danger:not(.card-outline)>.card-header a{color:#fff}.card-danger:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-danger.card-outline{border-top:3px solid #dc3545}.card-danger.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-danger.card-outline-tabs>.card-header a.active{border-top:3px solid #dc3545}.bg-danger .btn-tool,.bg-gradient-danger .btn-tool,.card-danger:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-danger .btn-tool:hover,.bg-gradient-danger .btn-tool:hover,.card-danger:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-danger .bootstrap-datetimepicker-widget .table td,.card.bg-danger .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-danger .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-danger .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-danger .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-danger .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-danger .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-danger .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-danger .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#c62232;color:#fff}.card.bg-danger .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-danger .bootstrap-datetimepicker-widget table td.active,.card.bg-danger .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-danger .bootstrap-datetimepicker-widget table td.active:hover{background:#e4606d;color:#fff}.card-light:not(.card-outline)>.card-header{background-color:#f8f9fa}.card-light:not(.card-outline)>.card-header,.card-light:not(.card-outline)>.card-header a,.card-light:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-light.card-outline{border-top:3px solid #f8f9fa}.card-light.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-light.card-outline-tabs>.card-header a.active{border-top:3px solid #f8f9fa}.bg-gradient-light .btn-tool,.bg-light .btn-tool,.card-light:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-light .btn-tool:hover,.bg-light .btn-tool:hover,.card-light:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-light .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-light .bootstrap-datetimepicker-widget .table th,.card.bg-light .bootstrap-datetimepicker-widget .table td,.card.bg-light .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-light .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-light .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e0e5e9;color:#1f2d3d}.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.today:before,.card.bg-light .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-light .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-light .bootstrap-datetimepicker-widget table td.active,.card.bg-light .bootstrap-datetimepicker-widget table td.active:hover{background:#fff;color:#1f2d3d}.card-dark:not(.card-outline)>.card-header{background-color:#343a40}.card-dark:not(.card-outline)>.card-header,.card-dark:not(.card-outline)>.card-header a{color:#fff}.card-dark:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-dark.card-outline{border-top:3px solid #343a40}.card-dark.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-dark.card-outline-tabs>.card-header a.active{border-top:3px solid #343a40}.bg-dark .btn-tool,.bg-gradient-dark .btn-tool,.card-dark:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-dark .btn-tool:hover,.bg-gradient-dark .btn-tool:hover,.card-dark:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-dark .bootstrap-datetimepicker-widget .table td,.card.bg-dark .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-dark .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-dark .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#222629;color:#fff}.card.bg-dark .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-dark .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-dark .bootstrap-datetimepicker-widget table td.active:hover{background:#4b545c;color:#fff}.card-lightblue:not(.card-outline)>.card-header{background-color:#3c8dbc}.card-lightblue:not(.card-outline)>.card-header,.card-lightblue:not(.card-outline)>.card-header a{color:#fff}.card-lightblue:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-lightblue.card-outline{border-top:3px solid #3c8dbc}.card-lightblue.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-lightblue.card-outline-tabs>.card-header a.active{border-top:3px solid #3c8dbc}.bg-gradient-lightblue .btn-tool,.bg-lightblue .btn-tool,.card-lightblue:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-lightblue .btn-tool:hover,.bg-lightblue .btn-tool:hover,.card-lightblue:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget .table th,.card.bg-lightblue .bootstrap-datetimepicker-widget .table td,.card.bg-lightblue .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#32769d;color:#fff}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.today:before,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-lightblue .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.active,.card.bg-lightblue .bootstrap-datetimepicker-widget table td.active:hover{background:#5fa4cc;color:#fff}.card-navy:not(.card-outline)>.card-header{background-color:#001f3f}.card-navy:not(.card-outline)>.card-header,.card-navy:not(.card-outline)>.card-header a{color:#fff}.card-navy:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-navy.card-outline{border-top:3px solid #001f3f}.card-navy.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-navy.card-outline-tabs>.card-header a.active{border-top:3px solid #001f3f}.bg-gradient-navy .btn-tool,.bg-navy .btn-tool,.card-navy:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-navy .btn-tool:hover,.bg-navy .btn-tool:hover,.card-navy:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-navy .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-navy .bootstrap-datetimepicker-widget .table th,.card.bg-navy .bootstrap-datetimepicker-widget .table td,.card.bg-navy .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-navy .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#000b16;color:#fff}.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.today:before,.card.bg-navy .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-navy .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-navy .bootstrap-datetimepicker-widget table td.active,.card.bg-navy .bootstrap-datetimepicker-widget table td.active:hover{background:#003872;color:#fff}.card-olive:not(.card-outline)>.card-header{background-color:#3d9970}.card-olive:not(.card-outline)>.card-header,.card-olive:not(.card-outline)>.card-header a{color:#fff}.card-olive:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-olive.card-outline{border-top:3px solid #3d9970}.card-olive.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-olive.card-outline-tabs>.card-header a.active{border-top:3px solid #3d9970}.bg-gradient-olive .btn-tool,.bg-olive .btn-tool,.card-olive:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-olive .btn-tool:hover,.bg-olive .btn-tool:hover,.card-olive:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-olive .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-olive .bootstrap-datetimepicker-widget .table th,.card.bg-olive .bootstrap-datetimepicker-widget .table td,.card.bg-olive .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-olive .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#317c5b;color:#fff}.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.today:before,.card.bg-olive .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-olive .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-olive .bootstrap-datetimepicker-widget table td.active,.card.bg-olive .bootstrap-datetimepicker-widget table td.active:hover{background:#50b98a;color:#fff}.card-lime:not(.card-outline)>.card-header{background-color:#01ff70}.card-lime:not(.card-outline)>.card-header,.card-lime:not(.card-outline)>.card-header a,.card-lime:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-lime.card-outline{border-top:3px solid #01ff70}.card-lime.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-lime.card-outline-tabs>.card-header a.active{border-top:3px solid #01ff70}.bg-gradient-lime .btn-tool,.bg-lime .btn-tool,.card-lime:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-lime .btn-tool:hover,.bg-lime .btn-tool:hover,.card-lime:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-lime .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-lime .bootstrap-datetimepicker-widget .table th,.card.bg-lime .bootstrap-datetimepicker-widget .table td,.card.bg-lime .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-lime .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#00d75e;color:#1f2d3d}.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.today:before,.card.bg-lime .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-lime .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-lime .bootstrap-datetimepicker-widget table td.active,.card.bg-lime .bootstrap-datetimepicker-widget table td.active:hover{background:#34ff8d;color:#1f2d3d}.card-fuchsia:not(.card-outline)>.card-header{background-color:#f012be}.card-fuchsia:not(.card-outline)>.card-header,.card-fuchsia:not(.card-outline)>.card-header a{color:#fff}.card-fuchsia:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-fuchsia.card-outline{border-top:3px solid #f012be}.card-fuchsia.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-fuchsia.card-outline-tabs>.card-header a.active{border-top:3px solid #f012be}.bg-fuchsia .btn-tool,.bg-gradient-fuchsia .btn-tool,.card-fuchsia:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-fuchsia .btn-tool:hover,.bg-gradient-fuchsia .btn-tool:hover,.card-fuchsia:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-fuchsia .bootstrap-datetimepicker-widget .table td,.card.bg-fuchsia .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-fuchsia .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#cc0da1;color:#fff}.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.active,.card.bg-fuchsia .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-fuchsia .bootstrap-datetimepicker-widget table td.active:hover{background:#f342cb;color:#fff}.card-maroon:not(.card-outline)>.card-header{background-color:#d81b60}.card-maroon:not(.card-outline)>.card-header,.card-maroon:not(.card-outline)>.card-header a{color:#fff}.card-maroon:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-maroon.card-outline{border-top:3px solid #d81b60}.card-maroon.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-maroon.card-outline-tabs>.card-header a.active{border-top:3px solid #d81b60}.bg-gradient-maroon .btn-tool,.bg-maroon .btn-tool,.card-maroon:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-maroon .btn-tool:hover,.bg-maroon .btn-tool:hover,.card-maroon:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget .table th,.card.bg-maroon .bootstrap-datetimepicker-widget .table td,.card.bg-maroon .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#b41650;color:#fff}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.today:before,.card.bg-maroon .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-maroon .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-maroon .bootstrap-datetimepicker-widget table td.active,.card.bg-maroon .bootstrap-datetimepicker-widget table td.active:hover{background:#e73f7c;color:#fff}.card-blue:not(.card-outline)>.card-header{background-color:#1e6581}.card-blue:not(.card-outline)>.card-header,.card-blue:not(.card-outline)>.card-header a{color:#fff}.card-blue:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-blue.card-outline{border-top:3px solid #1e6581}.card-blue.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-blue.card-outline-tabs>.card-header a.active{border-top:3px solid #1e6581}.bg-blue .btn-tool,.bg-gradient-blue .btn-tool,.card-blue:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-blue .btn-tool:hover,.bg-gradient-blue .btn-tool:hover,.card-blue:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-blue .bootstrap-datetimepicker-widget .table td,.card.bg-blue .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-blue .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-blue .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-blue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-blue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-blue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-blue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-blue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#164b60;color:#fff}.card.bg-blue .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-blue .bootstrap-datetimepicker-widget table td.active,.card.bg-blue .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-blue .bootstrap-datetimepicker-widget table td.active:hover{background:#2885aa;color:#fff}.card-indigo:not(.card-outline)>.card-header{background-color:#6610f2}.card-indigo:not(.card-outline)>.card-header,.card-indigo:not(.card-outline)>.card-header a{color:#fff}.card-indigo:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-indigo.card-outline{border-top:3px solid #6610f2}.card-indigo.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-indigo.card-outline-tabs>.card-header a.active{border-top:3px solid #6610f2}.bg-gradient-indigo .btn-tool,.bg-indigo .btn-tool,.card-indigo:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-indigo .btn-tool:hover,.bg-indigo .btn-tool:hover,.card-indigo:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget .table th,.card.bg-indigo .bootstrap-datetimepicker-widget .table td,.card.bg-indigo .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#550bce;color:#fff}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.today:before,.card.bg-indigo .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-indigo .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-indigo .bootstrap-datetimepicker-widget table td.active,.card.bg-indigo .bootstrap-datetimepicker-widget table td.active:hover{background:#8540f5;color:#fff}.card-purple:not(.card-outline)>.card-header{background-color:#6f42c1}.card-purple:not(.card-outline)>.card-header,.card-purple:not(.card-outline)>.card-header a{color:#fff}.card-purple:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-purple.card-outline{border-top:3px solid #6f42c1}.card-purple.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-purple.card-outline-tabs>.card-header a.active{border-top:3px solid #6f42c1}.bg-gradient-purple .btn-tool,.bg-purple .btn-tool,.card-purple:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-purple .btn-tool:hover,.bg-purple .btn-tool:hover,.card-purple:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-purple .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-purple .bootstrap-datetimepicker-widget .table th,.card.bg-purple .bootstrap-datetimepicker-widget .table td,.card.bg-purple .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-purple .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#5d36a4;color:#fff}.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.today:before,.card.bg-purple .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-purple .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-purple .bootstrap-datetimepicker-widget table td.active,.card.bg-purple .bootstrap-datetimepicker-widget table td.active:hover{background:#8c68ce;color:#fff}.card-pink:not(.card-outline)>.card-header{background-color:#e83e8c}.card-pink:not(.card-outline)>.card-header,.card-pink:not(.card-outline)>.card-header a{color:#fff}.card-pink:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-pink.card-outline{border-top:3px solid #e83e8c}.card-pink.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-pink.card-outline-tabs>.card-header a.active{border-top:3px solid #e83e8c}.bg-gradient-pink .btn-tool,.bg-pink .btn-tool,.card-pink:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-pink .btn-tool:hover,.bg-pink .btn-tool:hover,.card-pink:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-pink .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-pink .bootstrap-datetimepicker-widget .table th,.card.bg-pink .bootstrap-datetimepicker-widget .table td,.card.bg-pink .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-pink .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e21b76;color:#fff}.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.today:before,.card.bg-pink .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-pink .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-pink .bootstrap-datetimepicker-widget table td.active,.card.bg-pink .bootstrap-datetimepicker-widget table td.active:hover{background:#ed6ca7;color:#fff}.card-red:not(.card-outline)>.card-header{background-color:#dc3545}.card-red:not(.card-outline)>.card-header,.card-red:not(.card-outline)>.card-header a{color:#fff}.card-red:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-red.card-outline{border-top:3px solid #dc3545}.card-red.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-red.card-outline-tabs>.card-header a.active{border-top:3px solid #dc3545}.bg-gradient-red .btn-tool,.bg-red .btn-tool,.card-red:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-red .btn-tool:hover,.bg-red .btn-tool:hover,.card-red:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-red .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-red .bootstrap-datetimepicker-widget .table th,.card.bg-red .bootstrap-datetimepicker-widget .table td,.card.bg-red .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-red .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-red .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#c62232;color:#fff}.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.today:before,.card.bg-red .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-red .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-red .bootstrap-datetimepicker-widget table td.active,.card.bg-red .bootstrap-datetimepicker-widget table td.active:hover{background:#e4606d;color:#fff}.card-orange:not(.card-outline)>.card-header{background-color:#fd7e14}.card-orange:not(.card-outline)>.card-header,.card-orange:not(.card-outline)>.card-header a,.card-orange:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-orange.card-outline{border-top:3px solid #fd7e14}.card-orange.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-orange.card-outline-tabs>.card-header a.active{border-top:3px solid #fd7e14}.bg-gradient-orange .btn-tool,.bg-orange .btn-tool,.card-orange:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-orange .btn-tool:hover,.bg-orange .btn-tool:hover,.card-orange:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-orange .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-orange .bootstrap-datetimepicker-widget .table th,.card.bg-orange .bootstrap-datetimepicker-widget .table td,.card.bg-orange .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-orange .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e66a02;color:#1f2d3d}.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.today:before,.card.bg-orange .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-orange .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-orange .bootstrap-datetimepicker-widget table td.active,.card.bg-orange .bootstrap-datetimepicker-widget table td.active:hover{background:#fd9a47;color:#1f2d3d}.card-yellow:not(.card-outline)>.card-header{background-color:#ffc107}.card-yellow:not(.card-outline)>.card-header,.card-yellow:not(.card-outline)>.card-header a,.card-yellow:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-yellow.card-outline{border-top:3px solid #ffc107}.card-yellow.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-yellow.card-outline-tabs>.card-header a.active{border-top:3px solid #ffc107}.bg-gradient-yellow .btn-tool,.bg-yellow .btn-tool,.card-yellow:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-yellow .btn-tool:hover,.bg-yellow .btn-tool:hover,.card-yellow:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget .table th,.card.bg-yellow .bootstrap-datetimepicker-widget .table td,.card.bg-yellow .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#dda600;color:#1f2d3d}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.today:before,.card.bg-yellow .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-yellow .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-yellow .bootstrap-datetimepicker-widget table td.active,.card.bg-yellow .bootstrap-datetimepicker-widget table td.active:hover{background:#ffce3a;color:#1f2d3d}.card-green:not(.card-outline)>.card-header{background-color:#28a745}.card-green:not(.card-outline)>.card-header,.card-green:not(.card-outline)>.card-header a{color:#fff}.card-green:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-green.card-outline{border-top:3px solid #28a745}.card-green.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-green.card-outline-tabs>.card-header a.active{border-top:3px solid #28a745}.bg-gradient-green .btn-tool,.bg-green .btn-tool,.card-green:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-green .btn-tool:hover,.bg-green .btn-tool:hover,.card-green:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-green .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-green .bootstrap-datetimepicker-widget .table th,.card.bg-green .bootstrap-datetimepicker-widget .table td,.card.bg-green .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-green .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-green .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#208637;color:#fff}.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.today:before,.card.bg-green .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-green .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-green .bootstrap-datetimepicker-widget table td.active,.card.bg-green .bootstrap-datetimepicker-widget table td.active:hover{background:#34ce57;color:#fff}.card-teal:not(.card-outline)>.card-header{background-color:#20c997}.card-teal:not(.card-outline)>.card-header,.card-teal:not(.card-outline)>.card-header a{color:#fff}.card-teal:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-teal.card-outline{border-top:3px solid #20c997}.card-teal.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-teal.card-outline-tabs>.card-header a.active{border-top:3px solid #20c997}.bg-gradient-teal .btn-tool,.bg-teal .btn-tool,.card-teal:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-teal .btn-tool:hover,.bg-teal .btn-tool:hover,.card-teal:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-teal .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-teal .bootstrap-datetimepicker-widget .table th,.card.bg-teal .bootstrap-datetimepicker-widget .table td,.card.bg-teal .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-teal .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#1aa67d;color:#fff}.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.today:before,.card.bg-teal .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-teal .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-teal .bootstrap-datetimepicker-widget table td.active,.card.bg-teal .bootstrap-datetimepicker-widget table td.active:hover{background:#3ce0af;color:#fff}.card-cyan:not(.card-outline)>.card-header{background-color:#17a2b8}.card-cyan:not(.card-outline)>.card-header,.card-cyan:not(.card-outline)>.card-header a{color:#fff}.card-cyan:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-cyan.card-outline{border-top:3px solid #17a2b8}.card-cyan.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-cyan.card-outline-tabs>.card-header a.active{border-top:3px solid #17a2b8}.bg-cyan .btn-tool,.bg-gradient-cyan .btn-tool,.card-cyan:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-cyan .btn-tool:hover,.bg-gradient-cyan .btn-tool:hover,.card-cyan:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-cyan .bootstrap-datetimepicker-widget .table td,.card.bg-cyan .bootstrap-datetimepicker-widget .table th,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-cyan .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-cyan .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#128294;color:#fff}.card.bg-cyan .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-cyan .bootstrap-datetimepicker-widget table td.active,.card.bg-cyan .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-cyan .bootstrap-datetimepicker-widget table td.active:hover{background:#1fc8e3;color:#fff}.card-white:not(.card-outline)>.card-header{background-color:#fff}.card-white:not(.card-outline)>.card-header,.card-white:not(.card-outline)>.card-header a,.card-white:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-white.card-outline{border-top:3px solid #fff}.card-white.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-white.card-outline-tabs>.card-header a.active{border-top:3px solid #fff}.bg-gradient-white .btn-tool,.bg-white .btn-tool,.card-white:not(.card-outline) .btn-tool{color:rgba(31,45,61,.8)}.bg-gradient-white .btn-tool:hover,.bg-white .btn-tool:hover,.card-white:not(.card-outline) .btn-tool:hover{color:#1f2d3d}.card.bg-gradient-white .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-white .bootstrap-datetimepicker-widget .table th,.card.bg-white .bootstrap-datetimepicker-widget .table td,.card.bg-white .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-white .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-white .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#ebebeb;color:#1f2d3d}.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.today:before,.card.bg-white .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#1f2d3d}.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-white .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-white .bootstrap-datetimepicker-widget table td.active,.card.bg-white .bootstrap-datetimepicker-widget table td.active:hover{background:#fff;color:#1f2d3d}.card-gray:not(.card-outline)>.card-header{background-color:#6c757d}.card-gray:not(.card-outline)>.card-header,.card-gray:not(.card-outline)>.card-header a{color:#fff}.card-gray:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-gray.card-outline{border-top:3px solid #6c757d}.card-gray.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-gray.card-outline-tabs>.card-header a.active{border-top:3px solid #6c757d}.bg-gradient-gray .btn-tool,.bg-gray .btn-tool,.card-gray:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-gray .btn-tool:hover,.bg-gray .btn-tool:hover,.card-gray:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-gray .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-gray .bootstrap-datetimepicker-widget .table th,.card.bg-gray .bootstrap-datetimepicker-widget .table td,.card.bg-gray .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gray .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#596167;color:#fff}.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gray .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-gray .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gray .bootstrap-datetimepicker-widget table td.active,.card.bg-gray .bootstrap-datetimepicker-widget table td.active:hover{background:#868e96;color:#fff}.card-gray-dark:not(.card-outline)>.card-header{background-color:#343a40}.card-gray-dark:not(.card-outline)>.card-header,.card-gray-dark:not(.card-outline)>.card-header a{color:#fff}.card-gray-dark:not(.card-outline)>.card-header a.active{color:#1f2d3d}.card-gray-dark.card-outline{border-top:3px solid #343a40}.card-gray-dark.card-outline-tabs>.card-header a:hover{border-top:3px solid #dee2e6}.card-gray-dark.card-outline-tabs>.card-header a.active{border-top:3px solid #343a40}.bg-gradient-gray-dark .btn-tool,.bg-gray-dark .btn-tool,.card-gray-dark:not(.card-outline) .btn-tool{color:hsla(0,0%,100%,.8)}.bg-gradient-gray-dark .btn-tool:hover,.bg-gray-dark .btn-tool:hover,.card-gray-dark:not(.card-outline) .btn-tool:hover{color:#fff}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget .table td,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget .table th,.card.bg-gray-dark .bootstrap-datetimepicker-widget .table td,.card.bg-gray-dark .bootstrap-datetimepicker-widget .table th{border:none}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.day:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.hour:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.minute:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.second:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#222629;color:#fff}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.today:before,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.today:before{border-bottom-color:#fff}.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-gradient-gray-dark .bootstrap-datetimepicker-widget table td.active:hover,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.active,.card.bg-gray-dark .bootstrap-datetimepicker-widget table td.active:hover{background:#4b545c;color:#fff}.card{box-shadow:0 0 1px rgba(0,0,0,.125),0 1px 3px rgba(0,0,0,.2);margin-bottom:1rem}.card.bg-dark .card-header{border-color:#383f45}.card.bg-dark,.card.bg-dark .card-body{color:#fff}.card.maximized-card{height:100%!important;left:0;max-height:100%!important;max-width:100%!important;position:fixed;top:0;width:100%!important;z-index:9999}.card.maximized-card.was-collapsed .card-body{display:block!important}.card.maximized-card [data-widget=collapse]{display:none}.card.maximized-card .card-footer,.card.maximized-card .card-header{border-radius:0!important}.card.collapsed-card .card-body,.card.collapsed-card .card-footer{display:none}.card .nav.flex-column>li{border-bottom:1px solid rgba(0,0,0,.125);margin:0}.card .nav.flex-column>li:last-of-type{border-bottom:0}.card.height-control .card-body{max-height:300px;overflow:auto}.card .border-right{border-right:1px solid rgba(0,0,0,.125)}.card .border-left{border-left:1px solid rgba(0,0,0,.125)}.card.card-tabs:not(.card-outline)>.card-header{border-bottom:0}.card.card-tabs:not(.card-outline)>.card-header .nav-item:first-child .nav-link{margin-left:-1px}.card.card-tabs.card-outline .nav-item{border-bottom:0}.card.card-tabs.card-outline .nav-item:first-child .nav-link{border-left:0;margin-left:0}.card.card-tabs .card-tools{margin:.3rem .5rem}.card.card-tabs:not(.expanding-card).collapsed-card .card-header,.card.card-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs{border-bottom:0}.card.card-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs .nav-item{margin-bottom:0}.card.card-tabs.expanding-card .card-header .nav-tabs .nav-item{margin-bottom:-1px}.card.card-outline-tabs{border-top:0}.card.card-outline-tabs .card-header .nav-item:first-child .nav-link{border-left:0;margin-left:0}.card.card-outline-tabs .card-header a{border-top:3px solid transparent}.card.card-outline-tabs .card-header a:hover{border-top:3px solid #dee2e6}.card.card-outline-tabs .card-header a.active:hover{margin-top:0}.card.card-outline-tabs .card-tools{margin:.5rem .5rem .3rem}.card.card-outline-tabs:not(.expanding-card).collapsed-card .card-header,.card.card-outline-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs{border-bottom:0}.card.card-outline-tabs:not(.expanding-card).collapsed-card .card-header .nav-tabs .nav-item{margin-bottom:0}.card.card-outline-tabs.expanding-card .card-header .nav-tabs .nav-item{margin-bottom:-1px}html.maximized-card{overflow:hidden}.card-body:after,.card-footer:after,.card-header:after{display:block;clear:both;content:""}.card-header{background-color:transparent;border-bottom:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem;position:relative;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.collapsed-card .card-header{border-bottom:0}.card-header>.card-tools{float:right;margin-right:-.625rem}.card-header>.card-tools .input-group,.card-header>.card-tools .nav,.card-header>.card-tools .pagination{margin-bottom:-.3rem;margin-top:-.3rem}.card-header>.card-tools [data-toggle=tooltip]{position:relative}.card-title{float:left;font-size:1.1rem;font-weight:400;margin:0}.card-text{clear:both}.btn-tool{background:transparent;color:#adb5bd;font-size:.875rem;margin:-.75rem 0;padding:.25rem .5rem}.btn-group.show .btn-tool,.btn-tool:hover{color:#495057}.btn-tool:focus,.show .btn-tool{box-shadow:none!important}.text-sm .card-title{font-size:1rem}.text-sm .nav-link{padding:.4rem .8rem}.card-body>.table{margin-bottom:0}.card-body>.table>thead>tr>td,.card-body>.table>thead>tr>th{border-top-width:0}.card-body .fc{margin-top:5px}.card-body .full-width-chart{margin:-19px}.card-body.p-0 .full-width-chart{margin:-9px}.chart-legend{padding-left:0;list-style:none;margin:10px 0}@media (max-width:576px){.chart-legend>li{float:left;margin-right:10px}}.card-comments{background:#f8f9fa}.card-comments .card-comment{border-bottom:1px solid #e9ecef;padding:8px 0}.card-comments .card-comment:after{display:block;clear:both;content:""}.card-comments .card-comment:last-of-type{border-bottom:0}.card-comments .card-comment:first-of-type{padding-top:0}.card-comments .card-comment img{height:1.875rem;width:1.875rem;float:left}.card-comments .comment-text{color:#78838e;margin-left:40px}.card-comments .username{color:#495057;display:block;font-weight:600}.card-comments .text-muted{font-size:12px;font-weight:400}.todo-list{list-style:none;margin:0;overflow:auto;padding:0}.todo-list>li{border-radius:2px;background:#f8f9fa;border-left:2px solid #e9ecef;color:#495057;margin-bottom:2px;padding:10px}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;font-weight:600;margin-left:5px}.todo-list>li .badge{font-size:.7rem;margin-left:10px}.todo-list>li .tools{color:#dc3545;display:none;float:right}.todo-list>li .tools>.fa,.todo-list>li .tools>.fab,.todo-list>li .tools>.far,.todo-list>li .tools>.fas,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{cursor:pointer;margin-right:5px}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#697582}.todo-list>li.done .text{font-weight:500;text-decoration:line-through}.todo-list>li.done .badge{background:#adb5bd!important}.todo-list .primary{border-left-color:#1e6581}.todo-list .secondary{border-left-color:#6c757d}.todo-list .success{border-left-color:#28a745}.todo-list .info{border-left-color:#17a2b8}.todo-list .warning{border-left-color:#ffc107}.todo-list .danger{border-left-color:#dc3545}.todo-list .light{border-left-color:#f8f9fa}.todo-list .dark{border-left-color:#343a40}.todo-list .lightblue{border-left-color:#3c8dbc}.todo-list .navy{border-left-color:#001f3f}.todo-list .olive{border-left-color:#3d9970}.todo-list .lime{border-left-color:#01ff70}.todo-list .fuchsia{border-left-color:#f012be}.todo-list .maroon{border-left-color:#d81b60}.todo-list .blue{border-left-color:#1e6581}.todo-list .indigo{border-left-color:#6610f2}.todo-list .purple{border-left-color:#6f42c1}.todo-list .pink{border-left-color:#e83e8c}.todo-list .red{border-left-color:#dc3545}.todo-list .orange{border-left-color:#fd7e14}.todo-list .yellow{border-left-color:#ffc107}.todo-list .green{border-left-color:#28a745}.todo-list .teal{border-left-color:#20c997}.todo-list .cyan{border-left-color:#17a2b8}.todo-list .white{border-left-color:#fff}.todo-list .gray{border-left-color:#6c757d}.todo-list .gray-dark{border-left-color:#343a40}.todo-list .handle{cursor:move;display:inline-block;margin:0 5px}.card-input{max-width:200px}.card-default .nav-item:first-child .nav-link{border-left:0}.modal-dialog .overlay{background-color:#000;display:block;height:100%;left:0;opacity:.7;position:absolute;top:0;width:100%;z-index:1052}.modal-content.bg-warning .modal-footer,.modal-content.bg-warning .modal-header{border-color:#343a40}.modal-content.bg-danger .close,.modal-content.bg-danger .mailbox-attachment-close,.modal-content.bg-info .close,.modal-content.bg-info .mailbox-attachment-close,.modal-content.bg-primary .close,.modal-content.bg-primary .mailbox-attachment-close,.modal-content.bg-secondary .close,.modal-content.bg-secondary .mailbox-attachment-close,.modal-content.bg-success .close,.modal-content.bg-success .mailbox-attachment-close{color:#fff;text-shadow:0 1px 0 #000}.btn.disabled,.btn:disabled{cursor:not-allowed}.btn.btn-flat{border-radius:0;border-width:1px;box-shadow:none}.btn.btn-file{overflow:hidden;position:relative}.btn.btn-file>input[type=file]{background:#fff;cursor:inherit;display:block;font-size:100px;min-height:100%;min-width:100%;opacity:0;outline:none;position:absolute;right:0;text-align:right;top:0}.text-sm .btn{font-size:.875rem!important}.btn-default{background-color:#f8f9fa;border-color:#ddd;color:#444}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e9ecef;color:#2b2b2b}.btn-app{border-radius:3px;background-color:#f8f9fa;border:1px solid #ddd;color:#6c757d;font-size:12px;height:60px;margin:0 0 10px 10px;min-width:80px;padding:15px 5px;position:relative;text-align:center}.btn-app>.fa,.btn-app>.fab,.btn-app>.far,.btn-app>.fas,.btn-app>.glyphicon,.btn-app>.ion{display:block;font-size:20px}.btn-app:hover{background:#f8f9fa;border-color:#aaa;color:#444}.btn-app:active,.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{font-size:10px;font-weight:400;position:absolute;right:-10px;top:-3px}.btn-xs{padding:.125rem .25rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.alert .icon{margin-right:10px}.alert .close,.alert .mailbox-attachment-close{color:#000;opacity:.2}.alert .close:hover,.alert .mailbox-attachment-close:hover{opacity:.5}.alert a{color:#fff;text-decoration:underline}.alert-primary{color:#fff;background:#1e6581;border-color:#19556c}.alert-default-primary{color:#103543;background-color:#d2e0e6;border-color:#c0d4dc}.alert-default-primary hr{border-top-color:#b0c9d3}.alert-default-primary .alert-link{color:#06141a}.alert-secondary{color:#fff;background:#6c757d;border-color:#60686f}.alert-default-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-default-secondary hr{border-top-color:#c8cbcf}.alert-default-secondary .alert-link{color:#202326}.alert-success{color:#fff;background:#28a745;border-color:#23923d}.alert-default-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-default-success hr{border-top-color:#b1dfbb}.alert-default-success .alert-link{color:#0b2e13}.alert-info{color:#fff;background:#17a2b8;border-color:#148ea1}.alert-default-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-default-info hr{border-top-color:#abdde5}.alert-default-info .alert-link{color:#062c33}.alert-warning{color:#1f2d3d;background:#ffc107;border-color:#edb100}.alert-default-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-default-warning hr{border-top-color:#ffe8a1}.alert-default-warning .alert-link{color:#533f03}.alert-danger{color:#fff;background:#dc3545;border-color:#d32535}.alert-default-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-default-danger hr{border-top-color:#f1b0b7}.alert-default-danger .alert-link{color:#491217}.alert-light{color:#1f2d3d;background:#f8f9fa;border-color:#e9ecef}.alert-default-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-default-light hr{border-top-color:#ececf6}.alert-default-light .alert-link{color:#686868}.alert-dark{color:#fff;background:#343a40;border-color:#292d32}.alert-default-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-default-dark hr{border-top-color:#b9bbbe}.alert-default-dark .alert-link{color:#040505}.table:not(.table-dark){color:inherit}.table.table-head-fixed thead tr:first-child th{background-color:#fff;border-bottom:0;box-shadow:inset 0 1px 0 #dee2e6,inset 0 -1px 0 #dee2e6;position:sticky;top:0;z-index:10}.table.table-head-fixed.table-dark thead tr:first-child th{background-color:#212529;box-shadow:inset 0 1px 0 #383f45,inset 0 -1px 0 #383f45}.table.no-border,.table.no-border td,.table.no-border th{border:0}.table.text-center,.table.text-center td,.table.text-center th{text-align:center}.table.table-valign-middle tbody>tr>td,.table.table-valign-middle tbody>tr>th,.table.table-valign-middle thead>tr>td,.table.table-valign-middle thead>tr>th{vertical-align:middle}.card-body.p-0 .table tbody>tr>td:first-of-type,.card-body.p-0 .table tbody>tr>th:first-of-type,.card-body.p-0 .table thead>tr>td:first-of-type,.card-body.p-0 .table thead>tr>th:first-of-type{padding-left:1.5rem}.card-body.p-0 .table tbody>tr>td:last-of-type,.card-body.p-0 .table tbody>tr>th:last-of-type,.card-body.p-0 .table thead>tr>td:last-of-type,.card-body.p-0 .table thead>tr>th:last-of-type{padding-right:1.5rem}.info-box{box-shadow:0 0 1px rgba(0,0,0,.125),0 1px 3px rgba(0,0,0,.2);border-radius:.25rem;background:#fff;display:flex;margin-bottom:1rem;min-height:80px;padding:.5rem;position:relative;width:100%}.info-box .progress{background-color:rgba(0,0,0,.125);height:2px;margin:5px 0}.info-box .progress .progress-bar{background-color:#fff}.info-box .info-box-icon{border-radius:.25rem;align-items:center;display:flex;font-size:1.875rem;justify-content:center;text-align:center;width:70px}.info-box .info-box-icon>img{max-width:100%}.info-box .info-box-content{display:flex;flex-direction:column;justify-content:center;line-height:120%;flex:1;padding:0 10px}.info-box .info-box-number{display:block;margin-top:.25rem;font-weight:700}.info-box .info-box-text,.info-box .progress-description{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-box .info-box .bg-gradient-primary,.info-box .info-box .bg-primary{color:#fff}.info-box .info-box .bg-gradient-primary .progress-bar,.info-box .info-box .bg-primary .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-secondary,.info-box .info-box .bg-secondary{color:#fff}.info-box .info-box .bg-gradient-secondary .progress-bar,.info-box .info-box .bg-secondary .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-success,.info-box .info-box .bg-success{color:#fff}.info-box .info-box .bg-gradient-success .progress-bar,.info-box .info-box .bg-success .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-info,.info-box .info-box .bg-info{color:#fff}.info-box .info-box .bg-gradient-info .progress-bar,.info-box .info-box .bg-info .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-warning,.info-box .info-box .bg-warning{color:#1f2d3d}.info-box .info-box .bg-gradient-warning .progress-bar,.info-box .info-box .bg-warning .progress-bar{background-color:#1f2d3d}.info-box .info-box .bg-danger,.info-box .info-box .bg-gradient-danger{color:#fff}.info-box .info-box .bg-danger .progress-bar,.info-box .info-box .bg-gradient-danger .progress-bar{background-color:#fff}.info-box .info-box .bg-gradient-light,.info-box .info-box .bg-light{color:#1f2d3d}.info-box .info-box .bg-gradient-light .progress-bar,.info-box .info-box .bg-light .progress-bar{background-color:#1f2d3d}.info-box .info-box .bg-dark,.info-box .info-box .bg-gradient-dark{color:#fff}.info-box .info-box .bg-dark .progress-bar,.info-box .info-box .bg-gradient-dark .progress-bar{background-color:#fff}.info-box .info-box-more{display:block}.info-box .progress-description{margin:0}@media (min-width:768px){.col-lg-2 .info-box .progress-description,.col-lg-3 .info-box .progress-description,.col-md-2 .info-box .progress-description,.col-md-3 .info-box .progress-description,.col-xl-2 .info-box .progress-description,.col-xl-3 .info-box .progress-description{display:none}}@media (min-width:992px){.col-lg-2 .info-box .progress-description,.col-lg-3 .info-box .progress-description,.col-md-2 .info-box .progress-description,.col-md-3 .info-box .progress-description,.col-xl-2 .info-box .progress-description,.col-xl-3 .info-box .progress-description{font-size:.75rem;display:block}}@media (min-width:1200px){.col-lg-2 .info-box .progress-description,.col-lg-3 .info-box .progress-description,.col-md-2 .info-box .progress-description,.col-md-3 .info-box .progress-description,.col-xl-2 .info-box .progress-description,.col-xl-3 .info-box .progress-description{font-size:1rem;display:block}}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border,.mailbox-read-info{border-bottom:1px solid rgba(0,0,0,.125)}.mailbox-read-info{padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments{padding-left:0;list-style:none}.mailbox-attachments li{border:1px solid #eee;float:left;margin-bottom:10px;margin-right:10px;width:200px}.mailbox-attachment-name{color:#666;font-weight:700}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{background:#f8f9fa;padding:10px}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-size>span{display:inline-block;padding-top:.75rem}.mailbox-attachment-icon{color:#666;font-size:65px;max-height:132.5px;padding:20px 10px;text-align:center}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{height:auto;max-width:100%}.lockscreen{background:#e9ecef}.lockscreen .lockscreen-name{font-weight:600;text-align:center}.lockscreen-logo{font-size:35px;font-weight:300;margin-bottom:25px;text-align:center}.lockscreen-logo a{color:#495057}.lockscreen-wrapper{margin:10% auto 0;max-width:400px}.lockscreen-item{border-radius:4px;background:#fff;margin:10px auto 30px;padding:0;position:relative;width:290px}.lockscreen-image{border-radius:50%;background:#fff;left:-10px;padding:5px;position:absolute;top:-25px;z-index:10}.lockscreen-image>img{border-radius:50%;height:70px;width:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:2.1rem;font-weight:300;margin-bottom:.9rem;text-align:center}.login-logo a,.register-logo a{color:#495057}.login-page,.register-page{align-items:center;background:#e9ecef;display:flex;flex-direction:column;height:100vh;justify-content:center}.login-box,.register-box{width:360px}@media (max-width:576px){.login-box,.register-box{margin-top:.5rem;width:90%}}.login-card-body,.register-card-body{background:#fff;border-top:0;color:#666;padding:20px}.login-card-body .input-group .form-control,.register-card-body .input-group .form-control{border-right:0}.login-card-body .input-group .form-control:focus,.register-card-body .input-group .form-control:focus{box-shadow:none}.login-card-body .input-group .form-control:focus~.input-group-append .input-group-text,.register-card-body .input-group .form-control:focus~.input-group-append .input-group-text{border-color:#4aadd5}.login-card-body .input-group .form-control.is-valid:focus,.register-card-body .input-group .form-control.is-valid:focus{box-shadow:none}.login-card-body .input-group .form-control.is-valid~.input-group-append .input-group-text,.register-card-body .input-group .form-control.is-valid~.input-group-append .input-group-text{border-color:#28a745}.login-card-body .input-group .form-control.is-invalid:focus,.register-card-body .input-group .form-control.is-invalid:focus{box-shadow:none}.login-card-body .input-group .form-control.is-invalid~.input-group-append .input-group-text,.register-card-body .input-group .form-control.is-invalid~.input-group-append .input-group-text{border-color:#dc3545}.login-card-body .input-group .input-group-text,.register-card-body .input-group .input-group-text{background-color:transparent;border-bottom-right-radius:.25rem;border-left:0;border-top-right-radius:.25rem;color:#777;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.login-box-msg,.register-box-msg{margin:0;padding:0 20px 20px;text-align:center}.social-auth-links{margin:10px 0}.error-page{margin:20px auto 0;width:600px}@media (max-width:767.98px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:767.98px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{display:block;margin-left:190px}@media (max-width:767.98px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-size:25px;font-weight:300}@media (max-width:767.98px){.error-page>.error-content>h3{text-align:center}}.invoice{background:#fff;border:1px solid rgba(0,0,0,.125);position:relative}.invoice-title{margin-top:0}.profile-user-img{border:3px solid #adb5bd;margin:0 auto;padding:3px;width:100px}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #adb5bd;color:#666;margin-bottom:15px;padding-bottom:15px}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px;width:100%}.post .row{width:100%}.product-image{max-width:100%;height:auto;width:100%}.product-image-thumbs{align-items:stretch;display:flex;margin-top:2rem}.product-image-thumb{box-shadow:0 1px 2px rgba(0,0,0,.075);border-radius:.25rem;background-color:#fff;border:1px solid #dee2e6;display:flex;margin-right:1rem;max-width:7rem;padding:.5rem}.product-image-thumb img{max-width:100%;height:auto;align-self:center}.product-image-thumb:hover{opacity:.5}.product-share a{margin-right:.5rem}.projects td{vertical-align:middle}.projects .list-inline{margin-bottom:0}.projects .table-avatar img,.projects img.table-avatar{border-radius:50%;display:inline;width:2.5rem}.projects .project-state{text-align:center}.border-transparent{border-color:transparent!important}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{font-size:16px;font-weight:600;margin:0;padding:0}.description-block>.description-text{text-transform:uppercase}.description-block .description-icon{font-size:16px}.list-group-unbordered>.list-group-item{border-left:0;border-radius:0;border-right:0;padding-left:0;padding-right:0}.list-header{color:#6c757d;font-size:15px;font-weight:700;padding:10px 4px}.list-seperator{background:rgba(0,0,0,.125);height:1px;margin:15px 0 9px}.list-link>a{color:#6c757d;padding:4px}.list-link>a:hover{color:#212529}.user-block{float:left}.user-block img{float:left;height:40px;width:40px}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600;margin-top:-1px}.user-block .description{color:#6c757d;font-size:13px;margin-top:-3px}.user-block.user-block-sm img{width:1.875rem;height:1.875rem}.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-lg,.img-md,.img-sm{float:left}.img-sm{height:1.875rem;width:1.875rem}.img-sm+.img-push{margin-left:2.5rem}.img-md{width:3.75rem;height:3.75rem}.img-md+.img-push{margin-left:4.375rem}.img-lg{width:6.25rem;height:6.25rem}.img-lg+.img-push{margin-left:6.875rem}.img-bordered{border:3px solid #adb5bd;padding:3px}.img-bordered-sm{border:2px solid #adb5bd;padding:2px}.img-rounded{border-radius:.25rem}.img-circle{border-radius:50%}.img-size-32,.img-size-50,.img-size-64{height:auto}.img-size-64{width:64px}.img-size-50{width:50px}.img-size-32{width:32px}.size-32,.size-40,.size-50{display:block;text-align:center}.size-32{height:32px;line-height:32px;width:32px}.size-40{height:40px;line-height:40px;width:40px}.size-50{height:50px;line-height:50px;width:50px}.attachment-block{background:#f8f9fa;border:1px solid rgba(0,0,0,.125);margin-bottom:10px;padding:5px}.attachment-block .attachment-img{float:left;height:auto;max-height:100px;max-width:100px}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#495057}.card>.loading-img,.card>.overlay,.info-box>.loading-img,.info-box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay,.small-box>.loading-img,.small-box>.overlay{height:100%;left:0;position:absolute;top:0;width:100%}.card .overlay,.info-box .overlay,.overlay-wrapper .overlay,.small-box .overlay{border-radius:.25rem;align-items:center;background:hsla(0,0%,100%,.7);display:flex;justify-content:center;z-index:50}.card .overlay>.fa,.card .overlay>.fab,.card .overlay>.far,.card .overlay>.fas,.card .overlay>.glyphicon,.card .overlay>.ion,.info-box .overlay>.fa,.info-box .overlay>.fab,.info-box .overlay>.far,.info-box .overlay>.fas,.info-box .overlay>.glyphicon,.info-box .overlay>.ion,.overlay-wrapper .overlay>.fa,.overlay-wrapper .overlay>.fab,.overlay-wrapper .overlay>.far,.overlay-wrapper .overlay>.fas,.overlay-wrapper .overlay>.glyphicon,.overlay-wrapper .overlay>.ion,.small-box .overlay>.fa,.small-box .overlay>.fab,.small-box .overlay>.far,.small-box .overlay>.fas,.small-box .overlay>.glyphicon,.small-box .overlay>.ion{color:#343a40}.card .overlay.dark,.info-box .overlay.dark,.overlay-wrapper .overlay.dark,.small-box .overlay.dark{background:rgba(0,0,0,.5)}.card .overlay.dark>.fa,.card .overlay.dark>.fab,.card .overlay.dark>.far,.card .overlay.dark>.fas,.card .overlay.dark>.glyphicon,.card .overlay.dark>.ion,.info-box .overlay.dark>.fa,.info-box .overlay.dark>.fab,.info-box .overlay.dark>.far,.info-box .overlay.dark>.fas,.info-box .overlay.dark>.glyphicon,.info-box .overlay.dark>.ion,.overlay-wrapper .overlay.dark>.fa,.overlay-wrapper .overlay.dark>.fab,.overlay-wrapper .overlay.dark>.far,.overlay-wrapper .overlay.dark>.fas,.overlay-wrapper .overlay.dark>.glyphicon,.overlay-wrapper .overlay.dark>.ion,.small-box .overlay.dark>.fa,.small-box .overlay.dark>.fab,.small-box .overlay.dark>.far,.small-box .overlay.dark>.fas,.small-box .overlay.dark>.glyphicon,.small-box .overlay.dark>.ion{color:#ced4da}.tab-pane>.overlay-wrapper{position:relative}.tab-pane>.overlay-wrapper>.overlay{border-top-left-radius:0;border-top-right-radius:0;flex-direction:column;margin-top:-1.25rem;margin-left:-1.25rem;height:calc(100% + 2.5rem);width:calc(100% + 2.5rem)}.tab-pane>.overlay-wrapper>.overlay.dark{color:#fff}.ribbon-wrapper{height:70px;overflow:hidden;position:absolute;right:-2px;top:-2px;width:70px;z-index:10}.ribbon-wrapper.ribbon-lg{height:120px;width:120px}.ribbon-wrapper.ribbon-lg .ribbon{right:0;top:26px;width:160px}.ribbon-wrapper.ribbon-xl{height:180px;width:180px}.ribbon-wrapper.ribbon-xl .ribbon{right:4px;top:47px;width:240px}.ribbon-wrapper .ribbon{box-shadow:0 0 3px rgba(0,0,0,.3);font-size:.8rem;line-height:100%;padding:.375rem 0;position:relative;right:-2px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.4);text-transform:uppercase;top:10px;transform:rotate(45deg);width:90px}.ribbon-wrapper .ribbon:after,.ribbon-wrapper .ribbon:before{border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #9e9e9e;bottom:-3px;content:"";position:absolute}.ribbon-wrapper .ribbon:before{left:0}.ribbon-wrapper .ribbon:after{right:0}.back-to-top{bottom:1.25rem;position:fixed;right:1.25rem;z-index:1032}.back-to-top:focus{box-shadow:none}pre{padding:.75rem}blockquote{background:#fff;border-left:.7rem solid #1e6581;margin:1.5em .7rem;padding:.5em .7rem}.box blockquote{background:#e9ecef}blockquote p:last-child{margin-bottom:0}blockquote h1,blockquote h2,blockquote h3,blockquote h4,blockquote h5,blockquote h6{color:#1e6581;font-size:1.25rem;font-weight:600}blockquote.quote-primary{border-color:#1e6581}blockquote.quote-primary h1,blockquote.quote-primary h2,blockquote.quote-primary h3,blockquote.quote-primary h4,blockquote.quote-primary h5,blockquote.quote-primary h6{color:#1e6581}blockquote.quote-secondary{border-color:#6c757d}blockquote.quote-secondary h1,blockquote.quote-secondary h2,blockquote.quote-secondary h3,blockquote.quote-secondary h4,blockquote.quote-secondary h5,blockquote.quote-secondary h6{color:#6c757d}blockquote.quote-success{border-color:#28a745}blockquote.quote-success h1,blockquote.quote-success h2,blockquote.quote-success h3,blockquote.quote-success h4,blockquote.quote-success h5,blockquote.quote-success h6{color:#28a745}blockquote.quote-info{border-color:#17a2b8}blockquote.quote-info h1,blockquote.quote-info h2,blockquote.quote-info h3,blockquote.quote-info h4,blockquote.quote-info h5,blockquote.quote-info h6{color:#17a2b8}blockquote.quote-warning{border-color:#ffc107}blockquote.quote-warning h1,blockquote.quote-warning h2,blockquote.quote-warning h3,blockquote.quote-warning h4,blockquote.quote-warning h5,blockquote.quote-warning h6{color:#ffc107}blockquote.quote-danger{border-color:#dc3545}blockquote.quote-danger h1,blockquote.quote-danger h2,blockquote.quote-danger h3,blockquote.quote-danger h4,blockquote.quote-danger h5,blockquote.quote-danger h6{color:#dc3545}blockquote.quote-light{border-color:#f8f9fa}blockquote.quote-light h1,blockquote.quote-light h2,blockquote.quote-light h3,blockquote.quote-light h4,blockquote.quote-light h5,blockquote.quote-light h6{color:#f8f9fa}blockquote.quote-dark{border-color:#343a40}blockquote.quote-dark h1,blockquote.quote-dark h2,blockquote.quote-dark h3,blockquote.quote-dark h4,blockquote.quote-dark h5,blockquote.quote-dark h6{color:#343a40}blockquote.quote-lightblue{border-color:#3c8dbc}blockquote.quote-lightblue h1,blockquote.quote-lightblue h2,blockquote.quote-lightblue h3,blockquote.quote-lightblue h4,blockquote.quote-lightblue h5,blockquote.quote-lightblue h6{color:#3c8dbc}blockquote.quote-navy{border-color:#001f3f}blockquote.quote-navy h1,blockquote.quote-navy h2,blockquote.quote-navy h3,blockquote.quote-navy h4,blockquote.quote-navy h5,blockquote.quote-navy h6{color:#001f3f}blockquote.quote-olive{border-color:#3d9970}blockquote.quote-olive h1,blockquote.quote-olive h2,blockquote.quote-olive h3,blockquote.quote-olive h4,blockquote.quote-olive h5,blockquote.quote-olive h6{color:#3d9970}blockquote.quote-lime{border-color:#01ff70}blockquote.quote-lime h1,blockquote.quote-lime h2,blockquote.quote-lime h3,blockquote.quote-lime h4,blockquote.quote-lime h5,blockquote.quote-lime h6{color:#01ff70}blockquote.quote-fuchsia{border-color:#f012be}blockquote.quote-fuchsia h1,blockquote.quote-fuchsia h2,blockquote.quote-fuchsia h3,blockquote.quote-fuchsia h4,blockquote.quote-fuchsia h5,blockquote.quote-fuchsia h6{color:#f012be}blockquote.quote-maroon{border-color:#d81b60}blockquote.quote-maroon h1,blockquote.quote-maroon h2,blockquote.quote-maroon h3,blockquote.quote-maroon h4,blockquote.quote-maroon h5,blockquote.quote-maroon h6{color:#d81b60}blockquote.quote-blue{border-color:#1e6581}blockquote.quote-blue h1,blockquote.quote-blue h2,blockquote.quote-blue h3,blockquote.quote-blue h4,blockquote.quote-blue h5,blockquote.quote-blue h6{color:#1e6581}blockquote.quote-indigo{border-color:#6610f2}blockquote.quote-indigo h1,blockquote.quote-indigo h2,blockquote.quote-indigo h3,blockquote.quote-indigo h4,blockquote.quote-indigo h5,blockquote.quote-indigo h6{color:#6610f2}blockquote.quote-purple{border-color:#6f42c1}blockquote.quote-purple h1,blockquote.quote-purple h2,blockquote.quote-purple h3,blockquote.quote-purple h4,blockquote.quote-purple h5,blockquote.quote-purple h6{color:#6f42c1}blockquote.quote-pink{border-color:#e83e8c}blockquote.quote-pink h1,blockquote.quote-pink h2,blockquote.quote-pink h3,blockquote.quote-pink h4,blockquote.quote-pink h5,blockquote.quote-pink h6{color:#e83e8c}blockquote.quote-red{border-color:#dc3545}blockquote.quote-red h1,blockquote.quote-red h2,blockquote.quote-red h3,blockquote.quote-red h4,blockquote.quote-red h5,blockquote.quote-red h6{color:#dc3545}blockquote.quote-orange{border-color:#fd7e14}blockquote.quote-orange h1,blockquote.quote-orange h2,blockquote.quote-orange h3,blockquote.quote-orange h4,blockquote.quote-orange h5,blockquote.quote-orange h6{color:#fd7e14}blockquote.quote-yellow{border-color:#ffc107}blockquote.quote-yellow h1,blockquote.quote-yellow h2,blockquote.quote-yellow h3,blockquote.quote-yellow h4,blockquote.quote-yellow h5,blockquote.quote-yellow h6{color:#ffc107}blockquote.quote-green{border-color:#28a745}blockquote.quote-green h1,blockquote.quote-green h2,blockquote.quote-green h3,blockquote.quote-green h4,blockquote.quote-green h5,blockquote.quote-green h6{color:#28a745}blockquote.quote-teal{border-color:#20c997}blockquote.quote-teal h1,blockquote.quote-teal h2,blockquote.quote-teal h3,blockquote.quote-teal h4,blockquote.quote-teal h5,blockquote.quote-teal h6{color:#20c997}blockquote.quote-cyan{border-color:#17a2b8}blockquote.quote-cyan h1,blockquote.quote-cyan h2,blockquote.quote-cyan h3,blockquote.quote-cyan h4,blockquote.quote-cyan h5,blockquote.quote-cyan h6{color:#17a2b8}blockquote.quote-white{border-color:#fff}blockquote.quote-white h1,blockquote.quote-white h2,blockquote.quote-white h3,blockquote.quote-white h4,blockquote.quote-white h5,blockquote.quote-white h6{color:#fff}blockquote.quote-gray{border-color:#6c757d}blockquote.quote-gray h1,blockquote.quote-gray h2,blockquote.quote-gray h3,blockquote.quote-gray h4,blockquote.quote-gray h5,blockquote.quote-gray h6{color:#6c757d}blockquote.quote-gray-dark{border-color:#343a40}blockquote.quote-gray-dark h1,blockquote.quote-gray-dark h2,blockquote.quote-gray-dark h3,blockquote.quote-gray-dark h4,blockquote.quote-gray-dark h5,blockquote.quote-gray-dark h6{color:#343a40}.tab-custom-content{border-top:1px solid #dee2e6;margin-top:.5rem;padding-top:.5rem}.nav+.tab-custom-content{border-top:none;border-bottom:1px solid #dee2e6;margin-top:0;margin-bottom:.5rem;padding-bottom:.5rem}.badge-btn{border-radius:.15rem;font-size:.75rem;font-weight:400;padding:.25rem .5rem}.badge-btn.badge-pill{padding:.375rem .6rem}@media print{.content-header,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer{transform:translate(0);margin-left:0!important;min-height:0!important}.layout-fixed .content-wrapper{padding-top:0!important}.invoice{border:0;margin:0;padding:0;width:100%}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-xs{font-size:.75rem!important}.text-sm{font-size:.875rem!important}.text-md{font-size:1rem!important}.text-lg{font-size:1.25rem!important}.text-xl{font-size:2rem!important}.text-lightblue{color:#3c8dbc!important}.text-navy{color:#001f3f!important}.text-olive{color:#3d9970!important}.text-lime{color:#01ff70!important}.text-fuchsia{color:#f012be!important}.text-maroon{color:#d81b60!important}.text-blue{color:#1e6581!important}.text-indigo{color:#6610f2!important}.text-purple{color:#6f42c1!important}.text-pink{color:#e83e8c!important}.text-red{color:#dc3545!important}.text-orange{color:#fd7e14!important}.text-yellow{color:#ffc107!important}.text-green{color:#28a745!important}.text-teal{color:#20c997!important}.text-cyan{color:#17a2b8!important}.text-white{color:#fff!important}.text-gray{color:#6c757d!important}.text-gray-dark{color:#343a40!important}.elevation-0{box-shadow:none!important}.elevation-1{box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)!important}.elevation-2{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23)!important}.elevation-3{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)!important}.elevation-4{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)!important}.elevation-5{box-shadow:0 19px 38px rgba(0,0,0,.3),0 15px 12px rgba(0,0,0,.22)!important}.bg-primary{background-color:#1e6581!important}.bg-primary,.bg-primary>a{color:#fff!important}.bg-primary.btn:hover{border-color:#144558;color:#ececec}.bg-primary.btn.active,.bg-primary.btn:active,.bg-primary.btn:not(:disabled):not(.disabled).active,.bg-primary.btn:not(:disabled):not(.disabled):active{background-color:#144558!important;border-color:#123d4d;color:#fff}.bg-secondary{background-color:#6c757d!important}.bg-secondary,.bg-secondary>a{color:#fff!important}.bg-secondary.btn:hover{border-color:#545b62;color:#ececec}.bg-secondary.btn.active,.bg-secondary.btn:active,.bg-secondary.btn:not(:disabled):not(.disabled).active,.bg-secondary.btn:not(:disabled):not(.disabled):active{background-color:#545b62!important;border-color:#4e555b;color:#fff}.bg-success{background-color:#28a745!important}.bg-success,.bg-success>a{color:#fff!important}.bg-success.btn:hover{border-color:#1e7e34;color:#ececec}.bg-success.btn.active,.bg-success.btn:active,.bg-success.btn:not(:disabled):not(.disabled).active,.bg-success.btn:not(:disabled):not(.disabled):active{background-color:#1e7e34!important;border-color:#1c7430;color:#fff}.bg-info{background-color:#17a2b8!important}.bg-info,.bg-info>a{color:#fff!important}.bg-info.btn:hover{border-color:#117a8b;color:#ececec}.bg-info.btn.active,.bg-info.btn:active,.bg-info.btn:not(:disabled):not(.disabled).active,.bg-info.btn:not(:disabled):not(.disabled):active{background-color:#117a8b!important;border-color:#10707f;color:#fff}.bg-warning{background-color:#ffc107!important}.bg-warning,.bg-warning>a{color:#1f2d3d!important}.bg-warning.btn:hover{border-color:#d39e00;color:#121a24}.bg-warning.btn.active,.bg-warning.btn:active,.bg-warning.btn:not(:disabled):not(.disabled).active,.bg-warning.btn:not(:disabled):not(.disabled):active{background-color:#d39e00!important;border-color:#c69500;color:#1f2d3d}.bg-danger{background-color:#dc3545!important}.bg-danger,.bg-danger>a{color:#fff!important}.bg-danger.btn:hover{border-color:#bd2130;color:#ececec}.bg-danger.btn.active,.bg-danger.btn:active,.bg-danger.btn:not(:disabled):not(.disabled).active,.bg-danger.btn:not(:disabled):not(.disabled):active{background-color:#bd2130!important;border-color:#b21f2d;color:#fff}.bg-light{background-color:#f8f9fa!important}.bg-light,.bg-light>a{color:#1f2d3d!important}.bg-light.btn:hover{border-color:#dae0e5;color:#121a24}.bg-light.btn.active,.bg-light.btn:active,.bg-light.btn:not(:disabled):not(.disabled).active,.bg-light.btn:not(:disabled):not(.disabled):active{background-color:#dae0e5!important;border-color:#d3d9df;color:#1f2d3d}.bg-dark{background-color:#343a40!important}.bg-dark,.bg-dark>a{color:#fff!important}.bg-dark.btn:hover{border-color:#1d2124;color:#ececec}.bg-dark.btn.active,.bg-dark.btn:active,.bg-dark.btn:not(:disabled):not(.disabled).active,.bg-dark.btn:not(:disabled):not(.disabled):active{background-color:#1d2124!important;border-color:#171a1d;color:#fff}.bg-lightblue{background-color:#3c8dbc!important}.bg-lightblue,.bg-lightblue>a{color:#fff!important}.bg-lightblue.btn:hover{border-color:#307095;color:#ececec}.bg-lightblue.btn.active,.bg-lightblue.btn:active,.bg-lightblue.btn:not(:disabled):not(.disabled).active,.bg-lightblue.btn:not(:disabled):not(.disabled):active{background-color:#307095!important;border-color:#2d698c;color:#fff}.bg-navy{background-color:#001f3f!important}.bg-navy,.bg-navy>a{color:#fff!important}.bg-navy.btn:hover{border-color:#00060c;color:#ececec}.bg-navy.btn.active,.bg-navy.btn:active,.bg-navy.btn:not(:disabled):not(.disabled).active,.bg-navy.btn:not(:disabled):not(.disabled):active{background-color:#00060c!important;border-color:#000;color:#fff}.bg-olive{background-color:#3d9970!important}.bg-olive,.bg-olive>a{color:#fff!important}.bg-olive.btn:hover{border-color:#2e7555;color:#ececec}.bg-olive.btn.active,.bg-olive.btn:active,.bg-olive.btn:not(:disabled):not(.disabled).active,.bg-olive.btn:not(:disabled):not(.disabled):active{background-color:#2e7555!important;border-color:#2b6b4f;color:#fff}.bg-lime{background-color:#01ff70!important}.bg-lime,.bg-lime>a{color:#1f2d3d!important}.bg-lime.btn:hover{border-color:#00cd5a;color:#121a24}.bg-lime.btn.active,.bg-lime.btn:active,.bg-lime.btn:not(:disabled):not(.disabled).active,.bg-lime.btn:not(:disabled):not(.disabled):active{background-color:#00cd5a!important;border-color:#00c054;color:#fff}.bg-fuchsia{background-color:#f012be!important}.bg-fuchsia,.bg-fuchsia>a{color:#fff!important}.bg-fuchsia.btn:hover{border-color:#c30c9a;color:#ececec}.bg-fuchsia.btn.active,.bg-fuchsia.btn:active,.bg-fuchsia.btn:not(:disabled):not(.disabled).active,.bg-fuchsia.btn:not(:disabled):not(.disabled):active{background-color:#c30c9a!important;border-color:#b70c90;color:#fff}.bg-maroon{background-color:#d81b60!important}.bg-maroon,.bg-maroon>a{color:#fff!important}.bg-maroon.btn:hover{border-color:#ab154c;color:#ececec}.bg-maroon.btn.active,.bg-maroon.btn:active,.bg-maroon.btn:not(:disabled):not(.disabled).active,.bg-maroon.btn:not(:disabled):not(.disabled):active{background-color:#ab154c!important;border-color:#9f1447;color:#fff}.bg-blue{background-color:#1e6581!important}.bg-blue,.bg-blue>a{color:#fff!important}.bg-blue.btn:hover{border-color:#144558;color:#ececec}.bg-blue.btn.active,.bg-blue.btn:active,.bg-blue.btn:not(:disabled):not(.disabled).active,.bg-blue.btn:not(:disabled):not(.disabled):active{background-color:#144558!important;border-color:#123d4d;color:#fff}.bg-indigo{background-color:#6610f2!important}.bg-indigo,.bg-indigo>a{color:#fff!important}.bg-indigo.btn:hover{border-color:#510bc4;color:#ececec}.bg-indigo.btn.active,.bg-indigo.btn:active,.bg-indigo.btn:not(:disabled):not(.disabled).active,.bg-indigo.btn:not(:disabled):not(.disabled):active{background-color:#510bc4!important;border-color:#4c0ab8;color:#fff}.bg-purple{background-color:#6f42c1!important}.bg-purple,.bg-purple>a{color:#fff!important}.bg-purple.btn:hover{border-color:#59339d;color:#ececec}.bg-purple.btn.active,.bg-purple.btn:active,.bg-purple.btn:not(:disabled):not(.disabled).active,.bg-purple.btn:not(:disabled):not(.disabled):active{background-color:#59339d!important;border-color:#533093;color:#fff}.bg-pink{background-color:#e83e8c!important}.bg-pink,.bg-pink>a{color:#fff!important}.bg-pink.btn:hover{border-color:#d91a72;color:#ececec}.bg-pink.btn.active,.bg-pink.btn:active,.bg-pink.btn:not(:disabled):not(.disabled).active,.bg-pink.btn:not(:disabled):not(.disabled):active{background-color:#d91a72!important;border-color:#ce196c;color:#fff}.bg-red{background-color:#dc3545!important}.bg-red,.bg-red>a{color:#fff!important}.bg-red.btn:hover{border-color:#bd2130;color:#ececec}.bg-red.btn.active,.bg-red.btn:active,.bg-red.btn:not(:disabled):not(.disabled).active,.bg-red.btn:not(:disabled):not(.disabled):active{background-color:#bd2130!important;border-color:#b21f2d;color:#fff}.bg-orange{background-color:#fd7e14!important}.bg-orange,.bg-orange>a{color:#1f2d3d!important}.bg-orange.btn:hover{border-color:#dc6502;color:#121a24}.bg-orange.btn.active,.bg-orange.btn:active,.bg-orange.btn:not(:disabled):not(.disabled).active,.bg-orange.btn:not(:disabled):not(.disabled):active{background-color:#dc6502!important;border-color:#cf5f02;color:#fff}.bg-yellow{background-color:#ffc107!important}.bg-yellow,.bg-yellow>a{color:#1f2d3d!important}.bg-yellow.btn:hover{border-color:#d39e00;color:#121a24}.bg-yellow.btn.active,.bg-yellow.btn:active,.bg-yellow.btn:not(:disabled):not(.disabled).active,.bg-yellow.btn:not(:disabled):not(.disabled):active{background-color:#d39e00!important;border-color:#c69500;color:#1f2d3d}.bg-green{background-color:#28a745!important}.bg-green,.bg-green>a{color:#fff!important}.bg-green.btn:hover{border-color:#1e7e34;color:#ececec}.bg-green.btn.active,.bg-green.btn:active,.bg-green.btn:not(:disabled):not(.disabled).active,.bg-green.btn:not(:disabled):not(.disabled):active{background-color:#1e7e34!important;border-color:#1c7430;color:#fff}.bg-teal{background-color:#20c997!important}.bg-teal,.bg-teal>a{color:#fff!important}.bg-teal.btn:hover{border-color:#199d76;color:#ececec}.bg-teal.btn.active,.bg-teal.btn:active,.bg-teal.btn:not(:disabled):not(.disabled).active,.bg-teal.btn:not(:disabled):not(.disabled):active{background-color:#199d76!important;border-color:#17926e;color:#fff}.bg-cyan{background-color:#17a2b8!important}.bg-cyan,.bg-cyan>a{color:#fff!important}.bg-cyan.btn:hover{border-color:#117a8b;color:#ececec}.bg-cyan.btn.active,.bg-cyan.btn:active,.bg-cyan.btn:not(:disabled):not(.disabled).active,.bg-cyan.btn:not(:disabled):not(.disabled):active{background-color:#117a8b!important;border-color:#10707f;color:#fff}.bg-white{background-color:#fff!important}.bg-white,.bg-white>a{color:#1f2d3d!important}.bg-white.btn:hover{border-color:#e6e6e6;color:#121a24}.bg-white.btn.active,.bg-white.btn:active,.bg-white.btn:not(:disabled):not(.disabled).active,.bg-white.btn:not(:disabled):not(.disabled):active{background-color:#e6e6e6!important;border-color:#dfdfdf;color:#1f2d3d}.bg-gray{background-color:#6c757d!important}.bg-gray,.bg-gray>a{color:#fff!important}.bg-gray.btn:hover{border-color:#545b62;color:#ececec}.bg-gray.btn.active,.bg-gray.btn:active,.bg-gray.btn:not(:disabled):not(.disabled).active,.bg-gray.btn:not(:disabled):not(.disabled):active{background-color:#545b62!important;border-color:#4e555b;color:#fff}.bg-gray-dark{background-color:#343a40!important}.bg-gray-dark,.bg-gray-dark>a{color:#fff!important}.bg-gray-dark.btn:hover{border-color:#1d2124;color:#ececec}.bg-gray-dark.btn.active,.bg-gray-dark.btn:active,.bg-gray-dark.btn:not(:disabled):not(.disabled).active,.bg-gray-dark.btn:not(:disabled):not(.disabled):active{background-color:#1d2124!important;border-color:#171a1d;color:#fff}.bg-gray{background-color:#adb5bd;color:#1f2d3d}.bg-gray-light{background-color:#f2f4f5;color:#1f2d3d!important}.bg-black{background-color:#000;color:#fff!important}.bg-white{background-color:#fff;color:#1f2d3d!important}.bg-gradient-primary{color:#fff;background:#1e6581 linear-gradient(180deg,#407c94,#1e6581) repeat-x!important}.bg-gradient-primary.btn.disabled,.bg-gradient-primary.btn:disabled,.bg-gradient-primary.btn:not(:disabled):not(.disabled).active,.bg-gradient-primary.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-primary.btn.dropdown-toggle{background-image:none!important}.bg-gradient-primary.btn:hover{border-color:#144558;color:#ececec;background:#174d62 linear-gradient(180deg,#3a687a,#174d62) repeat-x!important}.bg-gradient-primary.btn.active,.bg-gradient-primary.btn:active,.bg-gradient-primary.btn:not(:disabled):not(.disabled).active,.bg-gradient-primary.btn:not(:disabled):not(.disabled):active{border-color:#123d4d;color:#fff;background:#144558 linear-gradient(180deg,#376171,#144558) repeat-x!important}.bg-gradient-secondary{color:#fff;background:#6c757d linear-gradient(180deg,#828a91,#6c757d) repeat-x!important}.bg-gradient-secondary.btn.disabled,.bg-gradient-secondary.btn:disabled,.bg-gradient-secondary.btn:not(:disabled):not(.disabled).active,.bg-gradient-secondary.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-secondary.btn.dropdown-toggle{background-image:none!important}.bg-gradient-secondary.btn:hover{border-color:#545b62;color:#ececec;background:#5a6268 linear-gradient(180deg,#737a7f,#5a6268) repeat-x!important}.bg-gradient-secondary.btn.active,.bg-gradient-secondary.btn:active,.bg-gradient-secondary.btn:not(:disabled):not(.disabled).active,.bg-gradient-secondary.btn:not(:disabled):not(.disabled):active{border-color:#4e555b;color:#fff;background:#545b62 linear-gradient(180deg,#6e747a,#545b62) repeat-x!important}.bg-gradient-success{color:#fff;background:#28a745 linear-gradient(180deg,#48b461,#28a745) repeat-x!important}.bg-gradient-success.btn.disabled,.bg-gradient-success.btn:disabled,.bg-gradient-success.btn:not(:disabled):not(.disabled).active,.bg-gradient-success.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-success.btn.dropdown-toggle{background-image:none!important}.bg-gradient-success.btn:hover{border-color:#1e7e34;color:#ececec;background:#218838 linear-gradient(180deg,#429a56,#218838) repeat-x!important}.bg-gradient-success.btn.active,.bg-gradient-success.btn:active,.bg-gradient-success.btn:not(:disabled):not(.disabled).active,.bg-gradient-success.btn:not(:disabled):not(.disabled):active{border-color:#1c7430;color:#fff;background:#1e7e34 linear-gradient(180deg,#409152,#1e7e34) repeat-x!important}.bg-gradient-info{color:#fff;background:#17a2b8 linear-gradient(180deg,#3ab0c3,#17a2b8) repeat-x!important}.bg-gradient-info.btn.disabled,.bg-gradient-info.btn:disabled,.bg-gradient-info.btn:not(:disabled):not(.disabled).active,.bg-gradient-info.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-info.btn.dropdown-toggle{background-image:none!important}.bg-gradient-info.btn:hover{border-color:#117a8b;color:#ececec;background:#138496 linear-gradient(180deg,#3696a6,#138496) repeat-x!important}.bg-gradient-info.btn.active,.bg-gradient-info.btn:active,.bg-gradient-info.btn:not(:disabled):not(.disabled).active,.bg-gradient-info.btn:not(:disabled):not(.disabled):active{border-color:#10707f;color:#fff;background:#117a8b linear-gradient(180deg,#358e9c,#117a8b) repeat-x!important}.bg-gradient-warning{color:#1f2d3d;background:#ffc107 linear-gradient(180deg,#ffca2c,#ffc107) repeat-x!important}.bg-gradient-warning.btn.disabled,.bg-gradient-warning.btn:disabled,.bg-gradient-warning.btn:not(:disabled):not(.disabled).active,.bg-gradient-warning.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-warning.btn.dropdown-toggle{background-image:none!important}.bg-gradient-warning.btn:hover{border-color:#d39e00;color:#121a24;background:#e0a800 linear-gradient(180deg,#e5b526,#e0a800) repeat-x!important}.bg-gradient-warning.btn.active,.bg-gradient-warning.btn:active,.bg-gradient-warning.btn:not(:disabled):not(.disabled).active,.bg-gradient-warning.btn:not(:disabled):not(.disabled):active{border-color:#c69500;color:#1f2d3d;background:#d39e00 linear-gradient(180deg,#daad26,#d39e00) repeat-x!important}.bg-gradient-danger{color:#fff;background:#dc3545 linear-gradient(180deg,#e15361,#dc3545) repeat-x!important}.bg-gradient-danger.btn.disabled,.bg-gradient-danger.btn:disabled,.bg-gradient-danger.btn:not(:disabled):not(.disabled).active,.bg-gradient-danger.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-danger.btn.dropdown-toggle{background-image:none!important}.bg-gradient-danger.btn:hover{border-color:#bd2130;color:#ececec;background:#c82333 linear-gradient(180deg,#d04452,#c82333) repeat-x!important}.bg-gradient-danger.btn.active,.bg-gradient-danger.btn:active,.bg-gradient-danger.btn:not(:disabled):not(.disabled).active,.bg-gradient-danger.btn:not(:disabled):not(.disabled):active{border-color:#b21f2d;color:#fff;background:#bd2130 linear-gradient(180deg,#c7424f,#bd2130) repeat-x!important}.bg-gradient-light{color:#1f2d3d;background:#f8f9fa linear-gradient(180deg,#f9fafb,#f8f9fa) repeat-x!important}.bg-gradient-light.btn.disabled,.bg-gradient-light.btn:disabled,.bg-gradient-light.btn:not(:disabled):not(.disabled).active,.bg-gradient-light.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-light.btn.dropdown-toggle{background-image:none!important}.bg-gradient-light.btn:hover{border-color:#dae0e5;color:#121a24;background:#e2e6ea linear-gradient(180deg,#e6eaed,#e2e6ea) repeat-x!important}.bg-gradient-light.btn.active,.bg-gradient-light.btn:active,.bg-gradient-light.btn:not(:disabled):not(.disabled).active,.bg-gradient-light.btn:not(:disabled):not(.disabled):active{border-color:#d3d9df;color:#1f2d3d;background:#dae0e5 linear-gradient(180deg,#e0e5e9,#dae0e5) repeat-x!important}.bg-gradient-dark{color:#fff;background:#343a40 linear-gradient(180deg,#52585d,#343a40) repeat-x!important}.bg-gradient-dark.btn.disabled,.bg-gradient-dark.btn:disabled,.bg-gradient-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-dark.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-dark.btn.dropdown-toggle{background-image:none!important}.bg-gradient-dark.btn:hover{border-color:#1d2124;color:#ececec;background:#23272b linear-gradient(180deg,#44474b,#23272b) repeat-x!important}.bg-gradient-dark.btn.active,.bg-gradient-dark.btn:active,.bg-gradient-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-dark.btn:not(:disabled):not(.disabled):active{border-color:#171a1d;color:#fff;background:#1d2124 linear-gradient(180deg,#3f4245,#1d2124) repeat-x!important}.bg-gradient-lightblue{color:#fff;background:#3c8dbc linear-gradient(180deg,#599ec6,#3c8dbc) repeat-x!important}.bg-gradient-lightblue.btn.disabled,.bg-gradient-lightblue.btn:disabled,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled).active,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-lightblue.btn.dropdown-toggle{background-image:none!important}.bg-gradient-lightblue.btn:hover{border-color:#307095;color:#ececec;background:#33779f linear-gradient(180deg,#528bad,#33779f) repeat-x!important}.bg-gradient-lightblue.btn.active,.bg-gradient-lightblue.btn:active,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled).active,.bg-gradient-lightblue.btn:not(:disabled):not(.disabled):active{border-color:#2d698c;color:#fff;background:#307095 linear-gradient(180deg,#4f85a5,#307095) repeat-x!important}.bg-gradient-navy{color:#fff;background:#001f3f linear-gradient(180deg,#26415c,#001f3f) repeat-x!important}.bg-gradient-navy.btn.disabled,.bg-gradient-navy.btn:disabled,.bg-gradient-navy.btn:not(:disabled):not(.disabled).active,.bg-gradient-navy.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-navy.btn.dropdown-toggle{background-image:none!important}.bg-gradient-navy.btn:hover{border-color:#00060c;color:#ececec;background:#000c19 linear-gradient(180deg,#26303c,#000c19) repeat-x!important}.bg-gradient-navy.btn.active,.bg-gradient-navy.btn:active,.bg-gradient-navy.btn:not(:disabled):not(.disabled).active,.bg-gradient-navy.btn:not(:disabled):not(.disabled):active{border-color:#000;color:#fff;background:#00060c linear-gradient(180deg,#262b30,#00060c) repeat-x!important}.bg-gradient-olive{color:#fff;background:#3d9970 linear-gradient(180deg,#5aa885,#3d9970) repeat-x!important}.bg-gradient-olive.btn.disabled,.bg-gradient-olive.btn:disabled,.bg-gradient-olive.btn:not(:disabled):not(.disabled).active,.bg-gradient-olive.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-olive.btn.dropdown-toggle{background-image:none!important}.bg-gradient-olive.btn:hover{border-color:#2e7555;color:#ececec;background:#327e5c linear-gradient(180deg,#519174,#327e5c) repeat-x!important}.bg-gradient-olive.btn.active,.bg-gradient-olive.btn:active,.bg-gradient-olive.btn:not(:disabled):not(.disabled).active,.bg-gradient-olive.btn:not(:disabled):not(.disabled):active{border-color:#2b6b4f;color:#fff;background:#2e7555 linear-gradient(180deg,#4d8a6f,#2e7555) repeat-x!important}.bg-gradient-lime{color:#1f2d3d;background:#01ff70 linear-gradient(180deg,#27ff85,#01ff70) repeat-x!important}.bg-gradient-lime.btn.disabled,.bg-gradient-lime.btn:disabled,.bg-gradient-lime.btn:not(:disabled):not(.disabled).active,.bg-gradient-lime.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-lime.btn.dropdown-toggle{background-image:none!important}.bg-gradient-lime.btn:hover{border-color:#00cd5a;color:#121a24;background:#00da5f linear-gradient(180deg,#26e077,#00da5f) repeat-x!important}.bg-gradient-lime.btn.active,.bg-gradient-lime.btn:active,.bg-gradient-lime.btn:not(:disabled):not(.disabled).active,.bg-gradient-lime.btn:not(:disabled):not(.disabled):active{border-color:#00c054;color:#fff;background:#00cd5a linear-gradient(180deg,#26d573,#00cd5a) repeat-x!important}.bg-gradient-fuchsia{color:#fff;background:#f012be linear-gradient(180deg,#f236c8,#f012be) repeat-x!important}.bg-gradient-fuchsia.btn.disabled,.bg-gradient-fuchsia.btn:disabled,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled).active,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-fuchsia.btn.dropdown-toggle{background-image:none!important}.bg-gradient-fuchsia.btn:hover{border-color:#c30c9a;color:#ececec;background:#cf0da3 linear-gradient(180deg,#d631b1,#cf0da3) repeat-x!important}.bg-gradient-fuchsia.btn.active,.bg-gradient-fuchsia.btn:active,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled).active,.bg-gradient-fuchsia.btn:not(:disabled):not(.disabled):active{border-color:#b70c90;color:#fff;background:#c30c9a linear-gradient(180deg,#cc30a9,#c30c9a) repeat-x!important}.bg-gradient-maroon{color:#fff;background:#d81b60 linear-gradient(180deg,#de3d78,#d81b60) repeat-x!important}.bg-gradient-maroon.btn.disabled,.bg-gradient-maroon.btn:disabled,.bg-gradient-maroon.btn:not(:disabled):not(.disabled).active,.bg-gradient-maroon.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-maroon.btn.dropdown-toggle{background-image:none!important}.bg-gradient-maroon.btn:hover{border-color:#ab154c;color:#ececec;background:#b61751 linear-gradient(180deg,#c13a6b,#b61751) repeat-x!important}.bg-gradient-maroon.btn.active,.bg-gradient-maroon.btn:active,.bg-gradient-maroon.btn:not(:disabled):not(.disabled).active,.bg-gradient-maroon.btn:not(:disabled):not(.disabled):active{border-color:#9f1447;color:#fff;background:#ab154c linear-gradient(180deg,#b83867,#ab154c) repeat-x!important}.bg-gradient-blue{color:#fff;background:#1e6581 linear-gradient(180deg,#407c94,#1e6581) repeat-x!important}.bg-gradient-blue.btn.disabled,.bg-gradient-blue.btn:disabled,.bg-gradient-blue.btn:not(:disabled):not(.disabled).active,.bg-gradient-blue.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-blue.btn.dropdown-toggle{background-image:none!important}.bg-gradient-blue.btn:hover{border-color:#144558;color:#ececec;background:#174d62 linear-gradient(180deg,#3a687a,#174d62) repeat-x!important}.bg-gradient-blue.btn.active,.bg-gradient-blue.btn:active,.bg-gradient-blue.btn:not(:disabled):not(.disabled).active,.bg-gradient-blue.btn:not(:disabled):not(.disabled):active{border-color:#123d4d;color:#fff;background:#144558 linear-gradient(180deg,#376171,#144558) repeat-x!important}.bg-gradient-indigo{color:#fff;background:#6610f2 linear-gradient(180deg,#7d34f4,#6610f2) repeat-x!important}.bg-gradient-indigo.btn.disabled,.bg-gradient-indigo.btn:disabled,.bg-gradient-indigo.btn:not(:disabled):not(.disabled).active,.bg-gradient-indigo.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-indigo.btn.dropdown-toggle{background-image:none!important}.bg-gradient-indigo.btn:hover{border-color:#510bc4;color:#ececec;background:#560bd0 linear-gradient(180deg,#6f30d7,#560bd0) repeat-x!important}.bg-gradient-indigo.btn.active,.bg-gradient-indigo.btn:active,.bg-gradient-indigo.btn:not(:disabled):not(.disabled).active,.bg-gradient-indigo.btn:not(:disabled):not(.disabled):active{border-color:#4c0ab8;color:#fff;background:#510bc4 linear-gradient(180deg,#6b30cd,#510bc4) repeat-x!important}.bg-gradient-purple{color:#fff;background:#6f42c1 linear-gradient(180deg,#855eca,#6f42c1) repeat-x!important}.bg-gradient-purple.btn.disabled,.bg-gradient-purple.btn:disabled,.bg-gradient-purple.btn:not(:disabled):not(.disabled).active,.bg-gradient-purple.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-purple.btn.dropdown-toggle{background-image:none!important}.bg-gradient-purple.btn:hover{border-color:#59339d;color:#ececec;background:#5e37a6 linear-gradient(180deg,#7655b3,#5e37a6) repeat-x!important}.bg-gradient-purple.btn.active,.bg-gradient-purple.btn:active,.bg-gradient-purple.btn:not(:disabled):not(.disabled).active,.bg-gradient-purple.btn:not(:disabled):not(.disabled):active{border-color:#533093;color:#fff;background:#59339d linear-gradient(180deg,#7252ac,#59339d) repeat-x!important}.bg-gradient-pink{color:#fff;background:#e83e8c linear-gradient(180deg,#eb5b9d,#e83e8c) repeat-x!important}.bg-gradient-pink.btn.disabled,.bg-gradient-pink.btn:disabled,.bg-gradient-pink.btn:not(:disabled):not(.disabled).active,.bg-gradient-pink.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-pink.btn.dropdown-toggle{background-image:none!important}.bg-gradient-pink.btn:hover{border-color:#d91a72;color:#ececec;background:#e41c78 linear-gradient(180deg,#e83e8c,#e41c78) repeat-x!important}.bg-gradient-pink.btn.active,.bg-gradient-pink.btn:active,.bg-gradient-pink.btn:not(:disabled):not(.disabled).active,.bg-gradient-pink.btn:not(:disabled):not(.disabled):active{border-color:#ce196c;color:#fff;background:#d91a72 linear-gradient(180deg,#df3c87,#d91a72) repeat-x!important}.bg-gradient-red{color:#fff;background:#dc3545 linear-gradient(180deg,#e15361,#dc3545) repeat-x!important}.bg-gradient-red.btn.disabled,.bg-gradient-red.btn:disabled,.bg-gradient-red.btn:not(:disabled):not(.disabled).active,.bg-gradient-red.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-red.btn.dropdown-toggle{background-image:none!important}.bg-gradient-red.btn:hover{border-color:#bd2130;color:#ececec;background:#c82333 linear-gradient(180deg,#d04452,#c82333) repeat-x!important}.bg-gradient-red.btn.active,.bg-gradient-red.btn:active,.bg-gradient-red.btn:not(:disabled):not(.disabled).active,.bg-gradient-red.btn:not(:disabled):not(.disabled):active{border-color:#b21f2d;color:#fff;background:#bd2130 linear-gradient(180deg,#c7424f,#bd2130) repeat-x!important}.bg-gradient-orange{color:#1f2d3d;background:#fd7e14 linear-gradient(180deg,#fd9137,#fd7e14) repeat-x!important}.bg-gradient-orange.btn.disabled,.bg-gradient-orange.btn:disabled,.bg-gradient-orange.btn:not(:disabled):not(.disabled).active,.bg-gradient-orange.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-orange.btn.dropdown-toggle{background-image:none!important}.bg-gradient-orange.btn:hover{border-color:#dc6502;color:#121a24;background:#e96b02 linear-gradient(180deg,#ec8128,#e96b02) repeat-x!important}.bg-gradient-orange.btn.active,.bg-gradient-orange.btn:active,.bg-gradient-orange.btn:not(:disabled):not(.disabled).active,.bg-gradient-orange.btn:not(:disabled):not(.disabled):active{border-color:#cf5f02;color:#fff;background:#dc6502 linear-gradient(180deg,#e17c28,#dc6502) repeat-x!important}.bg-gradient-yellow{color:#1f2d3d;background:#ffc107 linear-gradient(180deg,#ffca2c,#ffc107) repeat-x!important}.bg-gradient-yellow.btn.disabled,.bg-gradient-yellow.btn:disabled,.bg-gradient-yellow.btn:not(:disabled):not(.disabled).active,.bg-gradient-yellow.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-yellow.btn.dropdown-toggle{background-image:none!important}.bg-gradient-yellow.btn:hover{border-color:#d39e00;color:#121a24;background:#e0a800 linear-gradient(180deg,#e5b526,#e0a800) repeat-x!important}.bg-gradient-yellow.btn.active,.bg-gradient-yellow.btn:active,.bg-gradient-yellow.btn:not(:disabled):not(.disabled).active,.bg-gradient-yellow.btn:not(:disabled):not(.disabled):active{border-color:#c69500;color:#1f2d3d;background:#d39e00 linear-gradient(180deg,#daad26,#d39e00) repeat-x!important}.bg-gradient-green{color:#fff;background:#28a745 linear-gradient(180deg,#48b461,#28a745) repeat-x!important}.bg-gradient-green.btn.disabled,.bg-gradient-green.btn:disabled,.bg-gradient-green.btn:not(:disabled):not(.disabled).active,.bg-gradient-green.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-green.btn.dropdown-toggle{background-image:none!important}.bg-gradient-green.btn:hover{border-color:#1e7e34;color:#ececec;background:#218838 linear-gradient(180deg,#429a56,#218838) repeat-x!important}.bg-gradient-green.btn.active,.bg-gradient-green.btn:active,.bg-gradient-green.btn:not(:disabled):not(.disabled).active,.bg-gradient-green.btn:not(:disabled):not(.disabled):active{border-color:#1c7430;color:#fff;background:#1e7e34 linear-gradient(180deg,#409152,#1e7e34) repeat-x!important}.bg-gradient-teal{color:#fff;background:#20c997 linear-gradient(180deg,#41d1a7,#20c997) repeat-x!important}.bg-gradient-teal.btn.disabled,.bg-gradient-teal.btn:disabled,.bg-gradient-teal.btn:not(:disabled):not(.disabled).active,.bg-gradient-teal.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-teal.btn.dropdown-toggle{background-image:none!important}.bg-gradient-teal.btn:hover{border-color:#199d76;color:#ececec;background:#1ba87e linear-gradient(180deg,#3db591,#1ba87e) repeat-x!important}.bg-gradient-teal.btn.active,.bg-gradient-teal.btn:active,.bg-gradient-teal.btn:not(:disabled):not(.disabled).active,.bg-gradient-teal.btn:not(:disabled):not(.disabled):active{border-color:#17926e;color:#fff;background:#199d76 linear-gradient(180deg,#3cac8b,#199d76) repeat-x!important}.bg-gradient-cyan{color:#fff;background:#17a2b8 linear-gradient(180deg,#3ab0c3,#17a2b8) repeat-x!important}.bg-gradient-cyan.btn.disabled,.bg-gradient-cyan.btn:disabled,.bg-gradient-cyan.btn:not(:disabled):not(.disabled).active,.bg-gradient-cyan.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-cyan.btn.dropdown-toggle{background-image:none!important}.bg-gradient-cyan.btn:hover{border-color:#117a8b;color:#ececec;background:#138496 linear-gradient(180deg,#3696a6,#138496) repeat-x!important}.bg-gradient-cyan.btn.active,.bg-gradient-cyan.btn:active,.bg-gradient-cyan.btn:not(:disabled):not(.disabled).active,.bg-gradient-cyan.btn:not(:disabled):not(.disabled):active{border-color:#10707f;color:#fff;background:#117a8b linear-gradient(180deg,#358e9c,#117a8b) repeat-x!important}.bg-gradient-white{color:#1f2d3d;background:#fff linear-gradient(180deg,#fff,#fff) repeat-x!important}.bg-gradient-white.btn.disabled,.bg-gradient-white.btn:disabled,.bg-gradient-white.btn:not(:disabled):not(.disabled).active,.bg-gradient-white.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-white.btn.dropdown-toggle{background-image:none!important}.bg-gradient-white.btn:hover{border-color:#e6e6e6;color:#121a24;background:#ececec linear-gradient(180deg,#efefef,#ececec) repeat-x!important}.bg-gradient-white.btn.active,.bg-gradient-white.btn:active,.bg-gradient-white.btn:not(:disabled):not(.disabled).active,.bg-gradient-white.btn:not(:disabled):not(.disabled):active{border-color:#dfdfdf;color:#1f2d3d;background:#e6e6e6 linear-gradient(180deg,#eaeaea,#e6e6e6) repeat-x!important}.bg-gradient-gray{color:#fff;background:#6c757d linear-gradient(180deg,#828a91,#6c757d) repeat-x!important}.bg-gradient-gray.btn.disabled,.bg-gradient-gray.btn:disabled,.bg-gradient-gray.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-gray.btn.dropdown-toggle{background-image:none!important}.bg-gradient-gray.btn:hover{border-color:#545b62;color:#ececec;background:#5a6268 linear-gradient(180deg,#737a7f,#5a6268) repeat-x!important}.bg-gradient-gray.btn.active,.bg-gradient-gray.btn:active,.bg-gradient-gray.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray.btn:not(:disabled):not(.disabled):active{border-color:#4e555b;color:#fff;background:#545b62 linear-gradient(180deg,#6e747a,#545b62) repeat-x!important}.bg-gradient-gray-dark{color:#fff;background:#343a40 linear-gradient(180deg,#52585d,#343a40) repeat-x!important}.bg-gradient-gray-dark.btn.disabled,.bg-gradient-gray-dark.btn:disabled,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled):active,.show>.bg-gradient-gray-dark.btn.dropdown-toggle{background-image:none!important}.bg-gradient-gray-dark.btn:hover{border-color:#1d2124;color:#ececec;background:#23272b linear-gradient(180deg,#44474b,#23272b) repeat-x!important}.bg-gradient-gray-dark.btn.active,.bg-gradient-gray-dark.btn:active,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled).active,.bg-gradient-gray-dark.btn:not(:disabled):not(.disabled):active{border-color:#171a1d;color:#fff;background:#1d2124 linear-gradient(180deg,#3f4245,#1d2124) repeat-x!important}[class^=bg-].disabled{opacity:.65}a.text-muted:hover{color:#1e6581!important}.link-muted{color:#5d6974}.link-muted:focus,.link-muted:hover{color:#464f58}.link-black{color:#6c757d}.link-black:focus,.link-black:hover{color:#e6e8ea}.accent-primary .btn-link,.accent-primary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#1e6581}.accent-primary .btn-link:hover,.accent-primary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#103443}.accent-primary .dropdown-item.active,.accent-primary .dropdown-item:active{background:#1e6581;color:#fff}.accent-primary .custom-control-input:checked~.custom-control-label:before{background:#1e6581;border-color:#0b242e}.accent-primary .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-primary .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-primary .custom-file-input:focus~.custom-file-label,.accent-primary .custom-select:focus,.accent-primary .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#4aadd5}.accent-primary .page-item .page-link{color:#1e6581}.accent-primary .page-item.active .page-link,.accent-primary .page-item.active a{background-color:#1e6581;border-color:#1e6581;color:#fff}.accent-primary .page-item.disabled .page-link,.accent-primary .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-primary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-primary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-primary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-primary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-secondary .btn-link,.accent-secondary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6c757d}.accent-secondary .btn-link:hover,.accent-secondary a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#494f54}.accent-secondary .dropdown-item.active,.accent-secondary .dropdown-item:active{background:#6c757d;color:#fff}.accent-secondary .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.accent-secondary .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-secondary .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-secondary .custom-file-input:focus~.custom-file-label,.accent-secondary .custom-select:focus,.accent-secondary .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#afb5ba}.accent-secondary .page-item .page-link{color:#6c757d}.accent-secondary .page-item.active .page-link,.accent-secondary .page-item.active a{background-color:#6c757d;border-color:#6c757d;color:#fff}.accent-secondary .page-item.disabled .page-link,.accent-secondary .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-secondary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-secondary [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-secondary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-secondary [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-success .btn-link,.accent-success a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#28a745}.accent-success .btn-link:hover,.accent-success a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#19692c}.accent-success .dropdown-item.active,.accent-success .dropdown-item:active{background:#28a745;color:#fff}.accent-success .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.accent-success .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-success .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-success .custom-file-input:focus~.custom-file-label,.accent-success .custom-select:focus,.accent-success .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#71dd8a}.accent-success .page-item .page-link{color:#28a745}.accent-success .page-item.active .page-link,.accent-success .page-item.active a{background-color:#28a745;border-color:#28a745;color:#fff}.accent-success .page-item.disabled .page-link,.accent-success .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-success [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-success [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-success [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-success [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-info .btn-link,.accent-info a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#17a2b8}.accent-info .btn-link:hover,.accent-info a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0f6674}.accent-info .dropdown-item.active,.accent-info .dropdown-item:active{background:#17a2b8;color:#fff}.accent-info .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.accent-info .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-info .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-info .custom-file-input:focus~.custom-file-label,.accent-info .custom-select:focus,.accent-info .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#63d9ec}.accent-info .page-item .page-link{color:#17a2b8}.accent-info .page-item.active .page-link,.accent-info .page-item.active a{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.accent-info .page-item.disabled .page-link,.accent-info .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-info [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-info [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-info [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-info [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-warning .btn-link,.accent-warning a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#ffc107}.accent-warning .btn-link:hover,.accent-warning a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#ba8b00}.accent-warning .dropdown-item.active,.accent-warning .dropdown-item:active{background:#ffc107;color:#1f2d3d}.accent-warning .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.accent-warning .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-warning .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-warning .custom-file-input:focus~.custom-file-label,.accent-warning .custom-select:focus,.accent-warning .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#ffe187}.accent-warning .page-item .page-link{color:#ffc107}.accent-warning .page-item.active .page-link,.accent-warning .page-item.active a{background-color:#ffc107;border-color:#ffc107;color:#fff}.accent-warning .page-item.disabled .page-link,.accent-warning .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-warning [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-warning [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-warning [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-warning [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-danger .btn-link,.accent-danger a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#dc3545}.accent-danger .btn-link:hover,.accent-danger a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#a71d2a}.accent-danger .dropdown-item.active,.accent-danger .dropdown-item:active{background:#dc3545;color:#fff}.accent-danger .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.accent-danger .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-danger .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-danger .custom-file-input:focus~.custom-file-label,.accent-danger .custom-select:focus,.accent-danger .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#efa2a9}.accent-danger .page-item .page-link{color:#dc3545}.accent-danger .page-item.active .page-link,.accent-danger .page-item.active a{background-color:#dc3545;border-color:#dc3545;color:#fff}.accent-danger .page-item.disabled .page-link,.accent-danger .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-danger [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-danger [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-danger [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-danger [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-light .btn-link,.accent-light a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#f8f9fa}.accent-light .btn-link:hover,.accent-light a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#cbd3da}.accent-light .dropdown-item.active,.accent-light .dropdown-item:active{background:#f8f9fa;color:#1f2d3d}.accent-light .custom-control-input:checked~.custom-control-label:before{background:#f8f9fa;border-color:#bdc6d0}.accent-light .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-light .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-light .custom-file-input:focus~.custom-file-label,.accent-light .custom-select:focus,.accent-light .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#fff}.accent-light .page-item .page-link{color:#f8f9fa}.accent-light .page-item.active .page-link,.accent-light .page-item.active a{background-color:#f8f9fa;border-color:#f8f9fa;color:#fff}.accent-light .page-item.disabled .page-link,.accent-light .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-light [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-light [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-light [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-light [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-dark .btn-link,.accent-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#343a40}.accent-dark .btn-link:hover,.accent-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#121416}.accent-dark .dropdown-item.active,.accent-dark .dropdown-item:active{background:#343a40;color:#fff}.accent-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.accent-dark .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-dark .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-dark .custom-file-input:focus~.custom-file-label,.accent-dark .custom-select:focus,.accent-dark .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#6d7a86}.accent-dark .page-item .page-link{color:#343a40}.accent-dark .page-item.active .page-link,.accent-dark .page-item.active a{background-color:#343a40;border-color:#343a40;color:#fff}.accent-dark .page-item.disabled .page-link,.accent-dark .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-lightblue .btn-link,.accent-lightblue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#3c8dbc}.accent-lightblue .btn-link:hover,.accent-lightblue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#296282}.accent-lightblue .dropdown-item.active,.accent-lightblue .dropdown-item:active{background:#3c8dbc;color:#fff}.accent-lightblue .custom-control-input:checked~.custom-control-label:before{background:#3c8dbc;border-color:#23536f}.accent-lightblue .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-lightblue .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-lightblue .custom-file-input:focus~.custom-file-label,.accent-lightblue .custom-select:focus,.accent-lightblue .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#99c5de}.accent-lightblue .page-item .page-link{color:#3c8dbc}.accent-lightblue .page-item.active .page-link,.accent-lightblue .page-item.active a{background-color:#3c8dbc;border-color:#3c8dbc;color:#fff}.accent-lightblue .page-item.disabled .page-link,.accent-lightblue .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-lightblue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-lightblue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-lightblue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-lightblue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-navy .btn-link,.accent-navy a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#001f3f}.accent-navy .btn-link:hover,.accent-navy a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#000}.accent-navy .dropdown-item.active,.accent-navy .dropdown-item:active{background:#001f3f;color:#fff}.accent-navy .custom-control-input:checked~.custom-control-label:before{background:#001f3f;border-color:#000}.accent-navy .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-navy .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-navy .custom-file-input:focus~.custom-file-label,.accent-navy .custom-select:focus,.accent-navy .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#005ebf}.accent-navy .page-item .page-link{color:#001f3f}.accent-navy .page-item.active .page-link,.accent-navy .page-item.active a{background-color:#001f3f;border-color:#001f3f;color:#fff}.accent-navy .page-item.disabled .page-link,.accent-navy .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-navy [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-navy [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-navy [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-navy [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-olive .btn-link,.accent-olive a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#3d9970}.accent-olive .btn-link:hover,.accent-olive a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#276248}.accent-olive .dropdown-item.active,.accent-olive .dropdown-item:active{background:#3d9970;color:#fff}.accent-olive .custom-control-input:checked~.custom-control-label:before{background:#3d9970;border-color:#20503b}.accent-olive .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-olive .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-olive .custom-file-input:focus~.custom-file-label,.accent-olive .custom-select:focus,.accent-olive .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#87cfaf}.accent-olive .page-item .page-link{color:#3d9970}.accent-olive .page-item.active .page-link,.accent-olive .page-item.active a{background-color:#3d9970;border-color:#3d9970;color:#fff}.accent-olive .page-item.disabled .page-link,.accent-olive .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-olive [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-olive [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-olive [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-olive [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-lime .btn-link,.accent-lime a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#01ff70}.accent-lime .btn-link:hover,.accent-lime a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#00b44e}.accent-lime .dropdown-item.active,.accent-lime .dropdown-item:active{background:#01ff70;color:#1f2d3d}.accent-lime .custom-control-input:checked~.custom-control-label:before{background:#01ff70;border-color:#009a43}.accent-lime .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-lime .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-lime .custom-file-input:focus~.custom-file-label,.accent-lime .custom-select:focus,.accent-lime .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#81ffb8}.accent-lime .page-item .page-link{color:#01ff70}.accent-lime .page-item.active .page-link,.accent-lime .page-item.active a{background-color:#01ff70;border-color:#01ff70;color:#fff}.accent-lime .page-item.disabled .page-link,.accent-lime .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-lime [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-lime [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-lime [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-lime [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-fuchsia .btn-link,.accent-fuchsia a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#f012be}.accent-fuchsia .btn-link:hover,.accent-fuchsia a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#ab0b87}.accent-fuchsia .dropdown-item.active,.accent-fuchsia .dropdown-item:active{background:#f012be;color:#fff}.accent-fuchsia .custom-control-input:checked~.custom-control-label:before{background:#f012be;border-color:#930974}.accent-fuchsia .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-fuchsia .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-fuchsia .custom-file-input:focus~.custom-file-label,.accent-fuchsia .custom-select:focus,.accent-fuchsia .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#f88adf}.accent-fuchsia .page-item .page-link{color:#f012be}.accent-fuchsia .page-item.active .page-link,.accent-fuchsia .page-item.active a{background-color:#f012be;border-color:#f012be;color:#fff}.accent-fuchsia .page-item.disabled .page-link,.accent-fuchsia .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-fuchsia [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-fuchsia [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-fuchsia [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-fuchsia [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-maroon .btn-link,.accent-maroon a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#d81b60}.accent-maroon .btn-link:hover,.accent-maroon a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#941342}.accent-maroon .dropdown-item.active,.accent-maroon .dropdown-item:active{background:#d81b60;color:#fff}.accent-maroon .custom-control-input:checked~.custom-control-label:before{background:#d81b60;border-color:#7d1038}.accent-maroon .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-maroon .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-maroon .custom-file-input:focus~.custom-file-label,.accent-maroon .custom-select:focus,.accent-maroon .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#f083ab}.accent-maroon .page-item .page-link{color:#d81b60}.accent-maroon .page-item.active .page-link,.accent-maroon .page-item.active a{background-color:#d81b60;border-color:#d81b60;color:#fff}.accent-maroon .page-item.disabled .page-link,.accent-maroon .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-maroon [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-maroon [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-maroon [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-maroon [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-blue .btn-link,.accent-blue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#1e6581}.accent-blue .btn-link:hover,.accent-blue a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#103443}.accent-blue .dropdown-item.active,.accent-blue .dropdown-item:active{background:#1e6581;color:#fff}.accent-blue .custom-control-input:checked~.custom-control-label:before{background:#1e6581;border-color:#0b242e}.accent-blue .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-blue .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-blue .custom-file-input:focus~.custom-file-label,.accent-blue .custom-select:focus,.accent-blue .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#4aadd5}.accent-blue .page-item .page-link{color:#1e6581}.accent-blue .page-item.active .page-link,.accent-blue .page-item.active a{background-color:#1e6581;border-color:#1e6581;color:#fff}.accent-blue .page-item.disabled .page-link,.accent-blue .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-blue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-blue [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-blue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-blue [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-indigo .btn-link,.accent-indigo a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6610f2}.accent-indigo .btn-link:hover,.accent-indigo a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#4709ac}.accent-indigo .dropdown-item.active,.accent-indigo .dropdown-item:active{background:#6610f2;color:#fff}.accent-indigo .custom-control-input:checked~.custom-control-label:before{background:#6610f2;border-color:#3d0894}.accent-indigo .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-indigo .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-indigo .custom-file-input:focus~.custom-file-label,.accent-indigo .custom-select:focus,.accent-indigo .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#b389f9}.accent-indigo .page-item .page-link{color:#6610f2}.accent-indigo .page-item.active .page-link,.accent-indigo .page-item.active a{background-color:#6610f2;border-color:#6610f2;color:#fff}.accent-indigo .page-item.disabled .page-link,.accent-indigo .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-indigo [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-indigo [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-indigo [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-indigo [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-purple .btn-link,.accent-purple a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6f42c1}.accent-purple .btn-link:hover,.accent-purple a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#4e2d89}.accent-purple .dropdown-item.active,.accent-purple .dropdown-item:active{background:#6f42c1;color:#fff}.accent-purple .custom-control-input:checked~.custom-control-label:before{background:#6f42c1;border-color:#432776}.accent-purple .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-purple .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-purple .custom-file-input:focus~.custom-file-label,.accent-purple .custom-select:focus,.accent-purple .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#b8a2e0}.accent-purple .page-item .page-link{color:#6f42c1}.accent-purple .page-item.active .page-link,.accent-purple .page-item.active a{background-color:#6f42c1;border-color:#6f42c1;color:#fff}.accent-purple .page-item.disabled .page-link,.accent-purple .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-purple [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-purple [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-purple [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-purple [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-pink .btn-link,.accent-pink a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#e83e8c}.accent-pink .btn-link:hover,.accent-pink a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#c21766}.accent-pink .dropdown-item.active,.accent-pink .dropdown-item:active{background:#e83e8c;color:#fff}.accent-pink .custom-control-input:checked~.custom-control-label:before{background:#e83e8c;border-color:#ac145a}.accent-pink .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-pink .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-pink .custom-file-input:focus~.custom-file-label,.accent-pink .custom-select:focus,.accent-pink .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#f6b0d0}.accent-pink .page-item .page-link{color:#e83e8c}.accent-pink .page-item.active .page-link,.accent-pink .page-item.active a{background-color:#e83e8c;border-color:#e83e8c;color:#fff}.accent-pink .page-item.disabled .page-link,.accent-pink .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-pink [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-pink [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-pink [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-pink [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-red .btn-link,.accent-red a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#dc3545}.accent-red .btn-link:hover,.accent-red a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#a71d2a}.accent-red .dropdown-item.active,.accent-red .dropdown-item:active{background:#dc3545;color:#fff}.accent-red .custom-control-input:checked~.custom-control-label:before{background:#dc3545;border-color:#921925}.accent-red .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-red .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-red .custom-file-input:focus~.custom-file-label,.accent-red .custom-select:focus,.accent-red .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#efa2a9}.accent-red .page-item .page-link{color:#dc3545}.accent-red .page-item.active .page-link,.accent-red .page-item.active a{background-color:#dc3545;border-color:#dc3545;color:#fff}.accent-red .page-item.disabled .page-link,.accent-red .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-red [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-red [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-red [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-red [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-orange .btn-link,.accent-orange a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#fd7e14}.accent-orange .btn-link:hover,.accent-orange a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#c35a02}.accent-orange .dropdown-item.active,.accent-orange .dropdown-item:active{background:#fd7e14;color:#1f2d3d}.accent-orange .custom-control-input:checked~.custom-control-label:before{background:#fd7e14;border-color:#aa4e01}.accent-orange .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-orange .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-orange .custom-file-input:focus~.custom-file-label,.accent-orange .custom-select:focus,.accent-orange .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#fec392}.accent-orange .page-item .page-link{color:#fd7e14}.accent-orange .page-item.active .page-link,.accent-orange .page-item.active a{background-color:#fd7e14;border-color:#fd7e14;color:#fff}.accent-orange .page-item.disabled .page-link,.accent-orange .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-orange [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-orange [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-orange [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-orange [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-yellow .btn-link,.accent-yellow a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#ffc107}.accent-yellow .btn-link:hover,.accent-yellow a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#ba8b00}.accent-yellow .dropdown-item.active,.accent-yellow .dropdown-item:active{background:#ffc107;color:#1f2d3d}.accent-yellow .custom-control-input:checked~.custom-control-label:before{background:#ffc107;border-color:#a07800}.accent-yellow .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-yellow .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-yellow .custom-file-input:focus~.custom-file-label,.accent-yellow .custom-select:focus,.accent-yellow .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#ffe187}.accent-yellow .page-item .page-link{color:#ffc107}.accent-yellow .page-item.active .page-link,.accent-yellow .page-item.active a{background-color:#ffc107;border-color:#ffc107;color:#fff}.accent-yellow .page-item.disabled .page-link,.accent-yellow .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-yellow [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-yellow [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-yellow [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-yellow [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-green .btn-link,.accent-green a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#28a745}.accent-green .btn-link:hover,.accent-green a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#19692c}.accent-green .dropdown-item.active,.accent-green .dropdown-item:active{background:#28a745;color:#fff}.accent-green .custom-control-input:checked~.custom-control-label:before{background:#28a745;border-color:#145523}.accent-green .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-green .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-green .custom-file-input:focus~.custom-file-label,.accent-green .custom-select:focus,.accent-green .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#71dd8a}.accent-green .page-item .page-link{color:#28a745}.accent-green .page-item.active .page-link,.accent-green .page-item.active a{background-color:#28a745;border-color:#28a745;color:#fff}.accent-green .page-item.disabled .page-link,.accent-green .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-green [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-green [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-green [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-green [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-teal .btn-link,.accent-teal a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#20c997}.accent-teal .btn-link:hover,.accent-teal a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#158765}.accent-teal .dropdown-item.active,.accent-teal .dropdown-item:active{background:#20c997;color:#fff}.accent-teal .custom-control-input:checked~.custom-control-label:before{background:#20c997;border-color:#127155}.accent-teal .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-teal .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-teal .custom-file-input:focus~.custom-file-label,.accent-teal .custom-select:focus,.accent-teal .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#7eeaca}.accent-teal .page-item .page-link{color:#20c997}.accent-teal .page-item.active .page-link,.accent-teal .page-item.active a{background-color:#20c997;border-color:#20c997;color:#fff}.accent-teal .page-item.disabled .page-link,.accent-teal .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-teal [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-teal [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-teal [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-teal [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-cyan .btn-link,.accent-cyan a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#17a2b8}.accent-cyan .btn-link:hover,.accent-cyan a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#0f6674}.accent-cyan .dropdown-item.active,.accent-cyan .dropdown-item:active{background:#17a2b8;color:#fff}.accent-cyan .custom-control-input:checked~.custom-control-label:before{background:#17a2b8;border-color:#0c525d}.accent-cyan .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-cyan .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-cyan .custom-file-input:focus~.custom-file-label,.accent-cyan .custom-select:focus,.accent-cyan .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#63d9ec}.accent-cyan .page-item .page-link{color:#17a2b8}.accent-cyan .page-item.active .page-link,.accent-cyan .page-item.active a{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.accent-cyan .page-item.disabled .page-link,.accent-cyan .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-cyan [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-cyan [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-cyan [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-cyan [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-white .btn-link,.accent-white a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#fff}.accent-white .btn-link:hover,.accent-white a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#d9d9d9}.accent-white .dropdown-item.active,.accent-white .dropdown-item:active{background:#fff;color:#1f2d3d}.accent-white .custom-control-input:checked~.custom-control-label:before{background:#fff;border-color:#ccc}.accent-white .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%231F2D3D' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-white .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-white .custom-file-input:focus~.custom-file-label,.accent-white .custom-select:focus,.accent-white .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#fff}.accent-white .page-item .page-link{color:#fff}.accent-white .page-item.active .page-link,.accent-white .page-item.active a{background-color:#fff;border-color:#fff;color:#fff}.accent-white .page-item.disabled .page-link,.accent-white .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-white [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-white [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-white [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-white [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-gray .btn-link,.accent-gray a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#6c757d}.accent-gray .btn-link:hover,.accent-gray a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#494f54}.accent-gray .dropdown-item.active,.accent-gray .dropdown-item:active{background:#6c757d;color:#fff}.accent-gray .custom-control-input:checked~.custom-control-label:before{background:#6c757d;border-color:#3d4246}.accent-gray .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-gray .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-gray .custom-file-input:focus~.custom-file-label,.accent-gray .custom-select:focus,.accent-gray .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#afb5ba}.accent-gray .page-item .page-link{color:#6c757d}.accent-gray .page-item.active .page-link,.accent-gray .page-item.active a{background-color:#6c757d;border-color:#6c757d;color:#fff}.accent-gray .page-item.disabled .page-link,.accent-gray .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-gray [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-gray [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-gray [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-gray [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}.accent-gray-dark .btn-link,.accent-gray-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn){color:#343a40}.accent-gray-dark .btn-link:hover,.accent-gray-dark a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn):hover{color:#121416}.accent-gray-dark .dropdown-item.active,.accent-gray-dark .dropdown-item:active{background:#343a40;color:#fff}.accent-gray-dark .custom-control-input:checked~.custom-control-label:before{background:#343a40;border-color:#060708}.accent-gray-dark .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23ffffff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.accent-gray-dark .custom-control-input:focus:not(:checked)~.custom-control-label:before,.accent-gray-dark .custom-file-input:focus~.custom-file-label,.accent-gray-dark .custom-select:focus,.accent-gray-dark .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid){border-color:#6d7a86}.accent-gray-dark .page-item .page-link{color:#343a40}.accent-gray-dark .page-item.active .page-link,.accent-gray-dark .page-item.active a{background-color:#343a40;border-color:#343a40;color:#fff}.accent-gray-dark .page-item.disabled .page-link,.accent-gray-dark .page-item.disabled a{background-color:#fff;border-color:#dee2e6;color:#6c757d}.accent-gray-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#c2c7d0}.accent-gray-dark [class*=sidebar-dark-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#fff}.accent-gray-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link){color:#343a40}.accent-gray-dark [class*=sidebar-light-] .sidebar a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):hover{color:#212529}[class*=accent-] a.btn-info,[class*=accent-] a.btn-primary,[class*=accent-] a.btn-secondary,[class*=accent-] a.btn-success{color:#fff}[class*=accent-] a.btn-warning{color:#1f2d3d}[class*=accent-] a.btn-danger{color:#fff}[class*=accent-] a.btn-light{color:#1f2d3d}[class*=accent-] a.btn-dark{color:#fff} /*# sourceMappingURL=app.css.map*/ \ No newline at end of file diff --git a/public/v2/css/app.css.map b/public/v2/css/app.css.map index f4a4f5089d..602bd23082 100755 --- a/public/v2/css/app.css.map +++ b/public/v2/css/app.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/@fortawesome/fontawesome-free/css/all.css","webpack:///./node_modules/overlayscrollbars/css/OverlayScrollbars.css","webpack:///./node_modules/icheck-bootstrap/icheck-bootstrap.css","webpack:///./node_modules/bootstrap/scss/_type.scss","webpack:///./src/app.scss","webpack:///./node_modules/bootstrap/scss/bootstrap.scss","webpack:///./node_modules/bootstrap/scss/_root.scss","webpack:///./node_modules/bootstrap/scss/_reboot.scss","webpack:///./node_modules/bootstrap/scss/vendor/_rfs.scss","webpack:///./node_modules/bootstrap/scss/mixins/_hover.scss","webpack:///./node_modules/bootstrap/scss/mixins/_lists.scss","webpack:///./node_modules/bootstrap/scss/_images.scss","webpack:///./node_modules/bootstrap/scss/mixins/_image.scss","webpack:///./node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack:///./node_modules/bootstrap/scss/mixins/_box-shadow.scss","webpack:///./node_modules/bootstrap/scss/_code.scss","webpack:///./node_modules/bootstrap/scss/_grid.scss","webpack:///./node_modules/bootstrap/scss/mixins/_grid.scss","webpack:///./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack:///./node_modules/bootstrap/scss/mixins/_grid-framework.scss","webpack:///./node_modules/bootstrap/scss/_tables.scss","webpack:///./node_modules/bootstrap/scss/mixins/_table-row.scss","webpack:///./node_modules/bootstrap/scss/_forms.scss","webpack:///./node_modules/bootstrap/scss/mixins/_transition.scss","webpack:///./node_modules/bootstrap/scss/mixins/_forms.scss","webpack:///./node_modules/bootstrap/scss/mixins/_gradients.scss","webpack:///./node_modules/bootstrap/scss/_buttons.scss","webpack:///./node_modules/bootstrap/scss/mixins/_buttons.scss","webpack:///./node_modules/bootstrap/scss/_transitions.scss","webpack:///./node_modules/bootstrap/scss/_dropdown.scss","webpack:///./node_modules/bootstrap/scss/mixins/_caret.scss","webpack:///./node_modules/bootstrap/scss/mixins/_nav-divider.scss","webpack:///./node_modules/bootstrap/scss/_button-group.scss","webpack:///./node_modules/bootstrap/scss/_input-group.scss","webpack:///./node_modules/bootstrap/scss/_custom-forms.scss","webpack:///./node_modules/bootstrap/scss/_nav.scss","webpack:///./node_modules/bootstrap/scss/_navbar.scss","webpack:///./node_modules/bootstrap/scss/_card.scss","webpack:///./node_modules/bootstrap/scss/_breadcrumb.scss","webpack:///./node_modules/bootstrap/scss/_pagination.scss","webpack:///./node_modules/bootstrap/scss/mixins/_pagination.scss","webpack:///./node_modules/bootstrap/scss/_badge.scss","webpack:///./node_modules/bootstrap/scss/mixins/_badge.scss","webpack:///./node_modules/bootstrap/scss/_jumbotron.scss","webpack:///./node_modules/bootstrap/scss/_alert.scss","webpack:///./node_modules/bootstrap/scss/mixins/_alert.scss","webpack:///./node_modules/bootstrap/scss/_progress.scss","webpack:///./node_modules/bootstrap/scss/_media.scss","webpack:///./node_modules/bootstrap/scss/_list-group.scss","webpack:///./node_modules/bootstrap/scss/mixins/_list-group.scss","webpack:///./node_modules/bootstrap/scss/_close.scss","webpack:///./node_modules/bootstrap/scss/_toasts.scss","webpack:///./node_modules/bootstrap/scss/_modal.scss","webpack:///./node_modules/bootstrap/scss/_tooltip.scss","webpack:///./node_modules/bootstrap/scss/mixins/_reset-text.scss","webpack:///./node_modules/bootstrap/scss/_popover.scss","webpack:///./node_modules/bootstrap/scss/_carousel.scss","webpack:///./node_modules/bootstrap/scss/mixins/_clearfix.scss","webpack:///./node_modules/bootstrap/scss/_spinners.scss","webpack:///./node_modules/bootstrap/scss/utilities/_align.scss","webpack:///./node_modules/bootstrap/scss/mixins/_background-variant.scss","webpack:///./node_modules/bootstrap/scss/utilities/_background.scss","webpack:///./node_modules/bootstrap/scss/utilities/_borders.scss","webpack:///./node_modules/bootstrap/scss/utilities/_display.scss","webpack:///./node_modules/bootstrap/scss/utilities/_embed.scss","webpack:///./node_modules/bootstrap/scss/utilities/_flex.scss","webpack:///./node_modules/bootstrap/scss/utilities/_float.scss","webpack:///./node_modules/bootstrap/scss/utilities/_interactions.scss","webpack:///./node_modules/bootstrap/scss/utilities/_overflow.scss","webpack:///./node_modules/bootstrap/scss/utilities/_position.scss","webpack:///./node_modules/bootstrap/scss/utilities/_screenreaders.scss","webpack:///./node_modules/bootstrap/scss/mixins/_screen-reader.scss","webpack:///./node_modules/bootstrap/scss/utilities/_shadows.scss","webpack:///./node_modules/bootstrap/scss/utilities/_sizing.scss","webpack:///./node_modules/bootstrap/scss/utilities/_spacing.scss","webpack:///./node_modules/bootstrap/scss/utilities/_stretched-link.scss","webpack:///./node_modules/bootstrap/scss/utilities/_text.scss","webpack:///./node_modules/bootstrap/scss/mixins/_text-truncate.scss","webpack:///./node_modules/bootstrap/scss/mixins/_text-emphasis.scss","webpack:///./node_modules/bootstrap/scss/mixins/_text-hide.scss","webpack:///./node_modules/bootstrap/scss/utilities/_visibility.scss","webpack:///./node_modules/bootstrap/scss/_print.scss","webpack:///./src/scss/_variables.scss","webpack:///./node_modules/admin-lte/build/scss/_layout.scss","webpack:///./node_modules/admin-lte/build/scss/_main-header.scss","webpack:///./node_modules/admin-lte/build/scss/_brand.scss","webpack:///./node_modules/admin-lte/build/scss/_main-sidebar.scss","webpack:///./node_modules/admin-lte/build/scss/mixins/_miscellaneous.scss","webpack:///./node_modules/admin-lte/build/scss/mixins/_sidebar.scss","webpack:///./node_modules/admin-lte/build/scss/_sidebar-mini.scss","webpack:///./node_modules/admin-lte/build/scss/_control-sidebar.scss","webpack:///./node_modules/admin-lte/build/scss/_dropdown.scss","webpack:///./node_modules/admin-lte/build/scss/_navs.scss","webpack:///./node_modules/admin-lte/build/scss/_forms.scss","webpack:///./node_modules/admin-lte/build/scss/mixins/_custom-forms.scss","webpack:///./node_modules/admin-lte/build/scss/_progress-bars.scss","webpack:///./node_modules/admin-lte/build/scss/mixins/_cards.scss","webpack:///./node_modules/admin-lte/build/scss/_cards.scss","webpack:///./node_modules/admin-lte/build/scss/_modals.scss","webpack:///./node_modules/admin-lte/build/scss/_buttons.scss","webpack:///./node_modules/admin-lte/build/scss/_alerts.scss","webpack:///./node_modules/admin-lte/build/scss/_table.scss","webpack:///./node_modules/admin-lte/build/scss/_info-box.scss","webpack:///./node_modules/admin-lte/build/scss/_miscellaneous.scss","webpack:///./node_modules/admin-lte/build/scss/_print.scss","webpack:///./node_modules/admin-lte/build/scss/_text.scss","webpack:///./node_modules/admin-lte/build/scss/_elevation.scss","webpack:///./node_modules/admin-lte/build/scss/mixins/_backgrounds.scss","webpack:///./node_modules/admin-lte/build/scss/_colors.scss","webpack:///./node_modules/admin-lte/build/scss/mixins/_accent.scss"],"names":[],"mappings":"AAAA;;;GAIA,6BAME,kCACA,mCACA,qBACA,kBACA,oBACA,oBACA,aAAgB,CAElB,OACE,oBACA,kBACA,uBAA0B,CAE5B,OACE,eAAkB,CAEpB,OACE,gBAAmB,CAErB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,OACE,aAAgB,CAElB,QACE,cAAiB,CAEnB,OACE,kBACA,YAAe,CAEjB,OACE,qBACA,kBACA,cAAiB,CACjB,UACE,iBAAoB,CAExB,OACE,UACA,kBACA,kBACA,UACA,mBAAsB,CAExB,WACE,wBACA,mBACA,wBAA2B,CAE7B,cACE,UAAa,CAEf,eACE,WAAc,CAEhB,yFAKE,iBAAoB,CAEtB,8FAKE,gBAAmB,CAErB,SACE,6CACQ,oCAAuC,CAEjD,UACE,+CACQ,sCAAyC,CAEnD,2BACE,GAEU,sBAAyB,CACnC,GAEU,uBAA2B,CAAE,CAEzC,mBACE,GAEU,sBAAyB,CACnC,GAEU,uBAA2B,CAAE,CAEzC,cACE,sEAEQ,uBAA0B,CAEpC,eACE,sEAEQ,wBAA2B,CAErC,eACE,sEAEQ,wBAA2B,CAErC,oBACE,gFAEQ,oBAAyB,CAEnC,kBAGU,oBAAyB,CAEnC,qEAJE,+EAOkC,CAHpC,mDAGU,mBAA0B,CAEpC,oIAOU,WAAc,CAExB,UACE,qBACA,WACA,gBACA,kBACA,sBACA,WAAc,CAEhB,0BAEE,OACA,kBACA,kBACA,UAAa,CAEf,aACE,mBAAsB,CAExB,aACE,aAAgB,CAElB,YACE,UAAa,CAIf,iBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qCACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,+CACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iCACE,eAAkB,CAEpB,iCACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uCACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,mCACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,qCACE,eAAkB,CAEpB,0CACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,iCACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,oCACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,kCACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,iCACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,mCACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,iCACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,sCACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,8BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,6BACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,yBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,cACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,2BACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,eACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,+BACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,qBACE,eAAkB,CAEpB,4BACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,sBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,uBACE,eAAkB,CAEpB,wBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,kBACE,eAAkB,CAEpB,gCACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,gBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,oBACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,mBACE,eAAkB,CAEpB,0BACE,eAAkB,CAEpB,iBACE,eAAkB,CAEpB,SACE,SACA,mBACA,WACA,YACA,gBACA,UACA,kBACA,SAAY,CAEd,mDACE,UACA,YACA,SACA,iBACA,gBACA,UAAa,CACf,WACE,mCACA,kBACA,gBACA,mBACA,kCACA,qPAAqT,CAEvT,KACE,kCACkB,CACpB,WACE,iCACA,kBACA,gBACA,mBACA,kCACA,uPAA0T,CAE5T,UATE,eAWkB,CACpB,WACE,iCACA,kBACA,gBACA,mBACA,mCACA,0PAAgT,CAElT,cAVE,gCAakB,CAHpB,SAGE,eAAkB,61CC1gJpB;;;;;;;;;;;GAiBA,mCAEI,cACA,gBACA,sBACA,sBACA,qBACA,yBACA,0BACA,mBACA,2BACJ,CACA,kCACI,iBACJ,CACA,oCAEI,cACJ,CACA,2BAEI,kBACA,2BAIQ,sBAEJ,iBAGI,2BAEJ,yBACJ,wBACI,qBACQ,8BACJ,sBACZ,CACA,iBACI,0BAGA,YACJ,CACA,wCACI,wBACJ,CACA,kCAGY,YAEJ,aACR,CACA,0EAEI,aACA,YAGQ,YAEJ,cAEA,eACR,CACA,yBACI,eACA,UACA,gEACA,kBACA,gBACA,aACA,WACJ,CACA,6BACI,WACA,YACA,aACJ,CAEA,oGAII,WACA,cACA,YACA,aACA,cACA,YACA,YACA,cACA,iBACJ,CACA,sCAEI,sCACJ,CACA,sHAEI,8BACJ,CACA,sUAII,uBACA,kBACA,mBACA,4BACA,gCACJ,CACA,iBACI,mBACA,gBACA,eACA,WACA,mBACJ,CACA,YACI,mBACA,kBACA,kBACA,iBACA,UACA,SACA,OACA,MACA,SACA,QACA,qBACA,sBACH,SACD,CAIA,2CAFI,eAgBJ,CAdA,aACI,4BACA,6BACA,sBACA,uBACA,kBAEA,MACA,OACA,SACA,QACA,UACA,SACA,gCACJ,CACA,oBACI,kBACA,WACA,eACA,cACA,mBACJ,CACA,YACI,kBACA,gCACA,kBACA,cAGA,YACA,WACA,kBACJ,CACA,yBACI,gCACA,4BACA,iCACA,qCACA,0BACA,4BACA,wBACA,gBACA,iBACA,mBACA,0BACA,qBAEQ,sBACR,sBACA,sBAEQ,yBACR,yBACA,0BACA,0BAEQ,2BACR,oBACA,oBACA,oBACA,kCACA,SACJ,CACA,+DACI,iBACJ,CACA,+BACI,WACA,mBACJ,CACA,mCACI,0BACA,kBACJ,CACA,iBACI,oBACA,kBACA,oBACA,mBACA,qBACA,uBACA,wBACA,oBACA,mBACA,oBACA,sBACA,uBACA,qBACA,oBACA,qBACA,kBACA,cACA,WACJ,CACA,6CAEI,mBACA,cACA,kBACA,kBACA,MACA,OACA,YACA,WACA,gBACA,oBACA,UACJ,CACA,yBACI,gBACA,eACA,yBACA,mBACA,qBACJ,CACA,kCACI,aACA,sBACA,2BACA,sBACJ,CACA,mGAEI,YACA,WACA,gBACA,eACA,SACA,cACA,sBACJ,CACA,mHAEI,aACA,kBACA,YACA,cACA,gBACA,qBACJ,CACA,6DACI,WACA,uBACA,gBACA,eACA,QACJ,CACA,uBACI,6BACA,YACA,cACA,cACA,kBACA,WACA,eACA,gBACA,WACA,UACA,SACA,oBAGQ,kBAEJ,cAEA,YACR,CACA,2CACI,YACA,aACA,eACA,aACJ,CACA,yBACI,kBACA,MACA,QACA,SACA,OACA,gBACA,WACA,UACA,wBAGA,mBACJ,CACA,+BACI,kBACA,OACA,MAEA,0BAGA,mBACJ,CACA,oBACI,+BACA,uBACA,0DACA,iDACJ,CACA,0BACI,+BACJ,CACA,sDACI,GACI,SACJ,CACA,GACI,UACJ,CACJ,CACA,8CACI,GACI,SACJ,CACA,GACI,UACJ,CACJ,CAMA,2EAGI,2EACJ,CACA,oCACI,kBACA,cACJ,CACA,mCAEI,kBACA,UACA,kEACA,SACJ,CACA,qBACI,SACA,OACJ,CACA,cACI,mBACJ,CACA,oBAEI,kBAGA,oBACA,qBACJ,CACA,yCAPI,oBAEA,YACA,UASJ,CALA,qBAEI,iBAGJ,CACA,iDAEI,mBACJ,CACA,0EAEI,6BACJ,CACA,yDACI,mBACJ,CACA,yBACI,SACA,MACJ,CACA,uBACI,MACA,OACJ,CACA,sCACI,OACJ,CAKA,sEACI,WACA,MACJ,CACA,woBASI,UACA,kBACA,mBACJ,CACA,iCACI,kBACJ,CACA,8CACI,kBACJ,CACA,uCACI,gBACJ,CACA,qCACI,gBACJ,CACA,6DACI,cACJ,CACA,oFACI,MACA,QACJ,CACA,oLAEI,QACA,MACJ,CACA,oEAEI,oBACA,4BACJ,CACA,gDACI,ywFACA,4BACA,8BACA,6BACJ,CACA,6DAEI,oBACJ,CACA,kBACI,yBACJ,CAWA,kHAGI,sBACJ,CACA,2CACI,wBACA,eACA,eACJ,CAEA,iFAEI,WACA,WACJ,CACA,6EAEI,YACA,UACJ,CACA,yGAEI,UACA,OACJ,CACA,yEAEI,YACA,WAIA,4BAHJ,CAKA,2DAEI,YACA,sBACA,sBACJ,CAKA,0MAEI,sBACJ,CACA,mKAEI,cACJ,CACA,+JAEI,eACJ,CACA,mLAGI,+BACJ,CACA,gPAII,kBACJ,CACA,sEACI,yBACJ,CACA,uEACI,6BACJ,CACA,4EACI,0BACJ,CACA,6EACI,8BACJ,CACA,6EACI,yBACJ,CACA,8EACI,6BACJ,CACA,8QAII,WACA,kBACA,OACA,QACA,MACA,SACA,aACJ,CACA,0ZAII,YACJ,CACA,yIAEI,SACA,WACJ,CACA,qIAEI,UACA,UACJ,CACA,6JAEI,WACA,SACJ,CC1nBA;;;;GAMC,iBACG,gBACA,yBACA,4BACA,cACJ,CAEA,eACI,oBACJ,CAEI,8BACI,mBACA,cACJ,CAEJ,uBACI,4BACA,gBACA,iBACA,qBACA,kBACA,mBACA,gBACA,gBACA,cACJ,CAEA,mCACI,4BACA,UACA,QACJ,CAEI,4CACI,cACJ,CAEA,mHAEI,WACA,qBACA,kBACA,WACA,YACA,yBACA,gBACA,iBACJ,CAEA,iIAEI,WACA,qBACA,kBACA,MACA,OACA,UACA,YAGA,uDACA,gDACA,mDACJ,CAEJ,2IAEI,iBACJ,CAEA,yLAEI,gBACJ,CAEA,4PAII,oBACA,eACA,yBAEA,gBACA,WACJ,CAEA,uLAEI,oBACJ,CAEA,iIAEI,yBACA,oBACJ,CAEA,+HAEI,yBACA,uBACJ,CAEA,uLAEI,oBACJ,CAEA,iIAEI,yBACA,oBACJ,CAEA,uLAEI,oBACJ,CAEA,iIAEI,yBACA,oBACJ,CAEA,iLAEI,oBACJ,CAEA,2HAEI,yBACA,oBACJ,CAEA,uLAEI,oBACJ,CAEA,iIAEI,yBACA,oBACJ,CAEA,qLAEI,oBACJ,CAEA,+HAEI,yBACA,oBACJ,CAEA,2LAEI,oBACJ,CAEA,qIAEI,yBACA,oBACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CAEA,6LAEI,oBACJ,CAEA,uIAEI,yBACA,oBACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CAEA,6LAEI,oBACJ,CAEA,uIAEI,yBACA,oBACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CAEA,2LAEI,oBACJ,CAEA,qIAEI,yBACA,oBACJ,CAEA,6LAEI,oBACJ,CAEA,uIAEI,yBACA,oBACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CAEA,iMAEI,oBACJ,CAEA,2IAEI,yBACA,oBACJ,CAEA,2LAEI,oBACJ,CAEA,qIAEI,yBACA,oBACJ,CAEA,qLAEI,oBACJ,CAEA,+HAEI,yBACA,oBACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CAEA,qLAEI,oBACJ,CAEA,+HAEI,yBACA,oBACJ,CAEA,6HAEI,4BACA,0BACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CAEA,qLAEI,oBACJ,CAEA,+HAEI,yBACA,oBACJ,CAEA,uLAEI,oBACJ,CAEA,iIAEI,yBACA,oBACJ,CAEA,+LAEI,oBACJ,CAEA,yIAEI,yBACA,oBACJ,CAEA,qLAEI,oBACJ,CAEA,+HAEI,yBACA,oBACJ,CAEA,yLAEI,oBACJ,CAEA,mIAEI,yBACA,oBACJ,CC7QE,iBCwZF;;AAjhBA;;;;;;;;;;;;;;;;;;GAqBQ;;ACrBR;;;;;GCAA,MAGI,8MAIA,yIAIA,2GAKF,uLACA,sGF+CF,CG9CA,iBAGE,qBHiDF,CG9CA,KACE,uBACA,iBACA,8BACA,yCHiDF,CG3CA,sEACE,aHuDF,CG7CA,KACE,SACA,8JCgFI,eD9EJ,gBACA,gBACA,cACA,gBACA,qBHgDF,CGpCA,0CACE,mBHuCF,CG9BA,GACE,uBACA,SACA,gBHiCF,CGpBA,kBACE,aACA,mBH4BF,CGrBA,EACE,aACA,kBHwBF,CGbA,sCAEE,0BACA,0EACA,YACA,gBACA,mEHgBF,CGbA,QAEE,kBACA,mBHgBF,CGbA,iBALE,kBHyBF,CGpBA,SAGE,YHiBF,CGbA,wBAIE,eHgBF,CGbA,GACE,eHgBF,CGbA,GACE,oBACA,aHgBF,CGbA,WACE,eHgBF,CGbA,SAEE,kBHgBF,CGbA,MCxFI,aJyGJ,CGRA,QAEE,kBCnGE,cDqGF,cACA,uBHWF,CGRA,IAAM,aHYN,CGXA,IAAM,SHeN,CGRA,EACE,cAEA,4BHWF,CK3LE,UF+KA,oBHiBF,CKhME,QFmLE,aHaJ,CKhME,4DFkME,cACA,oBHOJ,CGEA,kBAIE,uFCpJE,aJsJJ,CGEA,IAEE,aAEA,mBAEA,cAGA,4BHJF,CGYA,OAEE,eHVF,CGkBA,IAEE,iBHfF,CGkBA,QAJE,qBHTF,CGaA,IAGE,eHhBF,CGyBA,MACE,wBHtBF,CGyBA,QACE,mBACA,sBACA,cACA,gBACA,mBHtBF,CG6BA,GAEE,mBACA,+BH3BF,CGmCA,MAEE,qBACA,mBHjCF,CGuCA,OAEE,eHrCF,CG6CA,iCACE,SH1CF,CG6CA,sCAKE,SACA,oBC5PE,kBD8PF,mBH1CF,CG6CA,aAEE,gBH1CF,CG6CA,cAEE,mBH1CF,CGgDA,cACE,cH7CF,CGmDA,OACE,gBHhDF,CGuDA,gDAIE,yBHpDF,CG6DI,4GACE,cHvDN,CG6DA,wHAIE,UACA,iBH1DF,CG6DA,uCAEE,sBACA,SH1DF,CG8DA,SACE,cAEA,eH5DF,CG+DA,SAME,YAEA,UACA,SACA,QHlEF,CGuEA,OACE,cACA,WACA,eACA,UACA,oBCnSI,iBDqSJ,oBACA,cACA,kBHpEF,CGuEA,SACE,uBHpEF,CGwEA,kFAEE,WHrEF,CGwEA,cAKE,oBACA,uBHzEF,CGgFA,yCACE,uBH7EF,CGqFA,6BACE,aACA,yBHlFF,CGyFA,OACE,oBHtFF,CGyFA,QACE,kBACA,cHtFF,CGyFA,SACE,YHtFF,CG2FA,SACE,sBHxFF,CDpYA,0CAEE,oBACA,oBACA,gBACA,gBACA,aCiZF,CD9YA,OKgHM,gBJmSN,CDlZA,OK+GM,cJwSN,CDtZA,OK8GM,iBJ6SN,CD1ZA,OK6GM,gBJkTN,CD9ZA,OK4GM,iBJuTN,CDlaA,OK2GM,cJ4TN,CDraA,MKyGM,kBLvGJ,eCwaF,CDpaA,WKmGM,cJuUN,CDraA,sBAHE,gBACA,eC6aF,CD3aA,WK8FM,gBJ6UN,CDtaA,WKyFM,gBJmVN,CDvaA,sBAHE,gBACA,eC+aF,CD7aA,WKoFM,gBJyVN,CDlaA,GACE,gBACA,mBACA,SACA,mCCqaF,CD7ZA,aKMI,cLHF,eCgaF,CD7ZA,WAEE,aACA,wBCgaF,CDnZA,4BOpFE,eACA,eNgfF,CD1ZA,kBACE,oBC6ZF,CD3ZE,mCACE,kBC8ZJ,CDpZA,YKjCI,cLmCF,wBCuZF,CDnZA,YACE,mBKeI,iBJwYN,CDnZA,mBACE,cK7CE,cL+CF,aCsZF,CDpZE,0BACE,kBCuZJ,COpgBA,0BCFE,eAGA,WRkhBF,COnhBA,eACE,eACA,sBACA,yBEEE,qBCFE,qCVghBN,COpgBA,QAEE,oBPsgBF,COngBA,YACE,oBACA,aPsgBF,COngBA,gBHkCI,cGhCF,aPsgBF,CW7iBA,KPuEI,gBOrEF,cACA,oBXgjBF,CW7iBE,OACE,aXgjBJ,CW3iBA,IACE,oBP0DE,gBOxDF,WACA,yBFCE,oBCFE,2CVijBN,CW5iBE,QACE,UPkDA,eOhDA,gBDRE,eVwjBN,CW1iBA,IACE,cPyCE,gBOvCF,aX6iBF,CW1iBE,SPoCE,kBOlCA,cACA,iBX6iBJ,CWxiBA,gBACE,iBACA,iBX2iBF,CYnlBE,oFCDA,WACA,oBACA,mBACA,kBACA,gBb6lBF,Cc1iBI,yBFzCE,yBACE,eZwlBN,CACF,CcjjBI,yBFzCE,uCACE,eZgmBN,CACF,CczjBI,yBFzCE,qDACE,eZymBN,CACF,CclkBI,0BFzCE,mEACE,gBZmnBN,CACF,CYxlBE,KCnCA,aACA,eACA,oBACA,kBb+nBF,CYzlBE,YACE,eACA,aZ4lBJ,CY1lBI,2CAEE,gBACA,cZ6lBN,CenpBE,sqBACE,kBACA,WACA,oBACA,kBf2tBJ,CersBM,KACE,aACA,YACA,cfwsBR,Ca5qBE,cACE,cACA,cb+qBJ,CajrBE,cACE,aACA,aborBJ,CatrBE,cACE,wBACA,wBbyrBJ,Ca3rBE,cACE,aACA,ab8rBJ,CahsBE,cACE,aACA,abmsBJ,CarsBE,cACE,wBACA,wBbwsBJ,Ce3tBM,UFCJ,cACA,WACA,cb8tBF,Ce3tBU,OFbR,uBAIA,uBbyuBF,CehuBU,OFbR,wBAIA,wBb8uBF,CeruBU,OFbR,aAIA,abmvBF,Ce1uBU,OFbR,wBAIA,wBbwvBF,Ce/uBU,OFbR,wBAIA,wBb6vBF,CepvBU,OFbR,aAIA,abkwBF,CezvBU,OFbR,wBAIA,wBbuwBF,Ce9vBU,OFbR,wBAIA,wBb4wBF,CenwBU,OFbR,aAIA,abixBF,CexwBU,QFbR,wBAIA,wBbsxBF,Ce7wBU,QFbR,wBAIA,wBb2xBF,CelxBU,QFbR,cAIA,cbgyBF,CejxBM,aAAwB,QfqxB9B,CenxBM,YAAuB,QfuxB7B,CepxBQ,SAAwB,OfwxBhC,CexxBQ,SAAwB,Of4xBhC,Ce5xBQ,SAAwB,OfgyBhC,CehyBQ,SAAwB,OfoyBhC,CepyBQ,SAAwB,OfwyBhC,CexyBQ,SAAwB,Of4yBhC,Ce5yBQ,SAAwB,OfgzBhC,CehzBQ,SAAwB,OfozBhC,CepzBQ,SAAwB,OfwzBhC,CexzBQ,SAAwB,Of4zBhC,Ce5zBQ,UAAwB,Qfg0BhC,Ceh0BQ,UAAwB,Qfo0BhC,Cep0BQ,UAAwB,Qfw0BhC,Cej0BY,UFhBV,yBbq1BF,Cer0BY,UFhBV,0Bby1BF,Cez0BY,UFhBV,eb61BF,Ce70BY,UFhBV,0Bbi2BF,Cej1BY,UFhBV,0Bbq2BF,Cer1BY,UFhBV,eby2BF,Cez1BY,UFhBV,0Bb62BF,Ce71BY,UFhBV,0Bbi3BF,Cej2BY,UFhBV,ebq3BF,Cer2BY,WFhBV,0Bby3BF,Cez2BY,WFhBV,0Bb63BF,Ccx3BI,yBC3BE,QACE,aACA,YACA,cfu5BN,Ca33BA,iBACE,cACA,cb83BF,Cah4BA,iBACE,aACA,abm4BF,Car4BA,iBACE,wBACA,wBbw4BF,Ca14BA,iBACE,aACA,ab64BF,Ca/4BA,iBACE,aACA,abk5BF,Cap5BA,iBACE,wBACA,wBbu5BF,Ce16BI,aFCJ,cACA,WACA,cb66BA,Ce16BQ,UFbR,uBAIA,uBbw7BA,Ce/6BQ,UFbR,wBAIA,wBb67BA,Cep7BQ,UFbR,aAIA,abk8BA,Cez7BQ,UFbR,wBAIA,wBbu8BA,Ce97BQ,UFbR,wBAIA,wBb48BA,Cen8BQ,UFbR,aAIA,abi9BA,Cex8BQ,UFbR,wBAIA,wBbs9BA,Ce78BQ,UFbR,wBAIA,wBb29BA,Cel9BQ,UFbR,aAIA,abg+BA,Cev9BQ,WFbR,wBAIA,wBbq+BA,Ce59BQ,WFbR,wBAIA,wBb0+BA,Cej+BQ,WFbR,cAIA,cb++BA,Ceh+BI,gBAAwB,Qfo+B5B,Cel+BI,eAAuB,Qfs+B3B,Cen+BM,YAAwB,Ofu+B9B,Cev+BM,YAAwB,Of2+B9B,Ce3+BM,YAAwB,Of++B9B,Ce/+BM,YAAwB,Ofm/B9B,Cen/BM,YAAwB,Ofu/B9B,Cev/BM,YAAwB,Of2/B9B,Ce3/BM,YAAwB,Of+/B9B,Ce//BM,YAAwB,OfmgC9B,CengCM,YAAwB,OfugC9B,CevgCM,YAAwB,Of2gC9B,Ce3gCM,aAAwB,Qf+gC9B,Ce/gCM,aAAwB,QfmhC9B,CenhCM,aAAwB,QfuhC9B,CehhCU,aFhBV,aboiCA,CephCU,aFhBV,yBbwiCA,CexhCU,aFhBV,0Bb4iCA,Ce5hCU,aFhBV,ebgjCA,CehiCU,aFhBV,0BbojCA,CepiCU,aFhBV,0BbwjCA,CexiCU,aFhBV,eb4jCA,Ce5iCU,aFhBV,0BbgkCA,CehjCU,aFhBV,0BbokCA,CepjCU,aFhBV,ebwkCA,CexjCU,cFhBV,0Bb4kCA,Ce5jCU,cFhBV,0BbglCA,CACF,Cc5kCI,yBC3BE,QACE,aACA,YACA,cf2mCN,Ca/kCA,iBACE,cACA,cbklCF,CaplCA,iBACE,aACA,abulCF,CazlCA,iBACE,wBACA,wBb4lCF,Ca9lCA,iBACE,aACA,abimCF,CanmCA,iBACE,aACA,absmCF,CaxmCA,iBACE,wBACA,wBb2mCF,Ce9nCI,aFCJ,cACA,WACA,cbioCA,Ce9nCQ,UFbR,uBAIA,uBb4oCA,CenoCQ,UFbR,wBAIA,wBbipCA,CexoCQ,UFbR,aAIA,abspCA,Ce7oCQ,UFbR,wBAIA,wBb2pCA,CelpCQ,UFbR,wBAIA,wBbgqCA,CevpCQ,UFbR,aAIA,abqqCA,Ce5pCQ,UFbR,wBAIA,wBb0qCA,CejqCQ,UFbR,wBAIA,wBb+qCA,CetqCQ,UFbR,aAIA,aborCA,Ce3qCQ,WFbR,wBAIA,wBbyrCA,CehrCQ,WFbR,wBAIA,wBb8rCA,CerrCQ,WFbR,cAIA,cbmsCA,CeprCI,gBAAwB,QfwrC5B,CetrCI,eAAuB,Qf0rC3B,CevrCM,YAAwB,Of2rC9B,Ce3rCM,YAAwB,Of+rC9B,Ce/rCM,YAAwB,OfmsC9B,CensCM,YAAwB,OfusC9B,CevsCM,YAAwB,Of2sC9B,Ce3sCM,YAAwB,Of+sC9B,Ce/sCM,YAAwB,OfmtC9B,CentCM,YAAwB,OfutC9B,CevtCM,YAAwB,Of2tC9B,Ce3tCM,YAAwB,Of+tC9B,Ce/tCM,aAAwB,QfmuC9B,CenuCM,aAAwB,QfuuC9B,CevuCM,aAAwB,Qf2uC9B,CepuCU,aFhBV,abwvCA,CexuCU,aFhBV,yBb4vCA,Ce5uCU,aFhBV,0BbgwCA,CehvCU,aFhBV,ebowCA,CepvCU,aFhBV,0BbwwCA,CexvCU,aFhBV,0Bb4wCA,Ce5vCU,aFhBV,ebgxCA,CehwCU,aFhBV,0BboxCA,CepwCU,aFhBV,0BbwxCA,CexwCU,aFhBV,eb4xCA,Ce5wCU,cFhBV,0BbgyCA,CehxCU,cFhBV,0BboyCA,CACF,CchyCI,yBC3BE,QACE,aACA,YACA,cf+zCN,CanyCA,iBACE,cACA,cbsyCF,CaxyCA,iBACE,aACA,ab2yCF,Ca7yCA,iBACE,wBACA,wBbgzCF,CalzCA,iBACE,aACA,abqzCF,CavzCA,iBACE,aACA,ab0zCF,Ca5zCA,iBACE,wBACA,wBb+zCF,Cel1CI,aFCJ,cACA,WACA,cbq1CA,Cel1CQ,UFbR,uBAIA,uBbg2CA,Cev1CQ,UFbR,wBAIA,wBbq2CA,Ce51CQ,UFbR,aAIA,ab02CA,Cej2CQ,UFbR,wBAIA,wBb+2CA,Cet2CQ,UFbR,wBAIA,wBbo3CA,Ce32CQ,UFbR,aAIA,aby3CA,Ceh3CQ,UFbR,wBAIA,wBb83CA,Cer3CQ,UFbR,wBAIA,wBbm4CA,Ce13CQ,UFbR,aAIA,abw4CA,Ce/3CQ,WFbR,wBAIA,wBb64CA,Cep4CQ,WFbR,wBAIA,wBbk5CA,Cez4CQ,WFbR,cAIA,cbu5CA,Cex4CI,gBAAwB,Qf44C5B,Ce14CI,eAAuB,Qf84C3B,Ce34CM,YAAwB,Of+4C9B,Ce/4CM,YAAwB,Ofm5C9B,Cen5CM,YAAwB,Ofu5C9B,Cev5CM,YAAwB,Of25C9B,Ce35CM,YAAwB,Of+5C9B,Ce/5CM,YAAwB,Ofm6C9B,Cen6CM,YAAwB,Ofu6C9B,Cev6CM,YAAwB,Of26C9B,Ce36CM,YAAwB,Of+6C9B,Ce/6CM,YAAwB,Ofm7C9B,Cen7CM,aAAwB,Qfu7C9B,Cev7CM,aAAwB,Qf27C9B,Ce37CM,aAAwB,Qf+7C9B,Cex7CU,aFhBV,ab48CA,Ce57CU,aFhBV,yBbg9CA,Ceh8CU,aFhBV,0Bbo9CA,Cep8CU,aFhBV,ebw9CA,Cex8CU,aFhBV,0Bb49CA,Ce58CU,aFhBV,0Bbg+CA,Ceh9CU,aFhBV,ebo+CA,Cep9CU,aFhBV,0Bbw+CA,Cex9CU,aFhBV,0Bb4+CA,Ce59CU,aFhBV,ebg/CA,Ceh+CU,cFhBV,0Bbo/CA,Cep+CU,cFhBV,0Bbw/CA,CACF,Ccp/CI,0BC3BE,QACE,aACA,YACA,cfmhDN,Cav/CA,iBACE,cACA,cb0/CF,Ca5/CA,iBACE,aACA,ab+/CF,CajgDA,iBACE,wBACA,wBbogDF,CatgDA,iBACE,aACA,abygDF,Ca3gDA,iBACE,aACA,ab8gDF,CahhDA,iBACE,wBACA,wBbmhDF,CetiDI,aFCJ,cACA,WACA,cbyiDA,CetiDQ,UFbR,uBAIA,uBbojDA,Ce3iDQ,UFbR,wBAIA,wBbyjDA,CehjDQ,UFbR,aAIA,ab8jDA,CerjDQ,UFbR,wBAIA,wBbmkDA,Ce1jDQ,UFbR,wBAIA,wBbwkDA,Ce/jDQ,UFbR,aAIA,ab6kDA,CepkDQ,UFbR,wBAIA,wBbklDA,CezkDQ,UFbR,wBAIA,wBbulDA,Ce9kDQ,UFbR,aAIA,ab4lDA,CenlDQ,WFbR,wBAIA,wBbimDA,CexlDQ,WFbR,wBAIA,wBbsmDA,Ce7lDQ,WFbR,cAIA,cb2mDA,Ce5lDI,gBAAwB,QfgmD5B,Ce9lDI,eAAuB,QfkmD3B,Ce/lDM,YAAwB,OfmmD9B,CenmDM,YAAwB,OfumD9B,CevmDM,YAAwB,Of2mD9B,Ce3mDM,YAAwB,Of+mD9B,Ce/mDM,YAAwB,OfmnD9B,CennDM,YAAwB,OfunD9B,CevnDM,YAAwB,Of2nD9B,Ce3nDM,YAAwB,Of+nD9B,Ce/nDM,YAAwB,OfmoD9B,CenoDM,YAAwB,OfuoD9B,CevoDM,aAAwB,Qf2oD9B,Ce3oDM,aAAwB,Qf+oD9B,Ce/oDM,aAAwB,QfmpD9B,Ce5oDU,aFhBV,abgqDA,CehpDU,aFhBV,yBboqDA,CeppDU,aFhBV,0BbwqDA,CexpDU,aFhBV,eb4qDA,Ce5pDU,aFhBV,0BbgrDA,CehqDU,aFhBV,0BborDA,CepqDU,aFhBV,ebwrDA,CexqDU,aFhBV,0Bb4rDA,Ce5qDU,aFhBV,0BbgsDA,CehrDU,aFhBV,ebosDA,CeprDU,cFhBV,0BbwsDA,CexrDU,cFhBV,0Bb4sDA,CACF,CgBhwDA,OACE,WACA,mBACA,cACA,4BhBmwDF,CgBjwDE,oBAEE,eACA,mBACA,4BhBowDJ,CgBjwDE,gBACE,sBACA,+BhBowDJ,CgBjwDE,mBACE,4BhBowDJ,CgB1vDE,0BAEE,ahB6vDJ,CgBjvDE,sDAEE,wBhBwvDJ,CgBpvDI,kDAEE,uBhBuvDN,CgBjvDE,mGAIE,QhBovDJ,CgB3uDE,yCACE,gChB8uDJ,CK7yDE,4BW2EI,cACA,iChBsuDN,CiBxzDI,mDAGE,wBjB2zDN,CiBvzDM,uFAIE,oBjB0zDR,CiB5yDQ,4GAEE,wBjBmzDV,CiB90DI,yDAGE,wBjBi1DN,CiB70DM,+FAIE,oBjBg1DR,CiBl0DQ,kHAEE,wBjBy0DV,CiBp2DI,mDAGE,wBjBu2DN,CiBn2DM,uFAIE,oBjBs2DR,CiBx1DQ,4GAEE,wBjB+1DV,CiB13DI,0CAGE,wBjB63DN,CiBz3DM,2EAIE,oBjB43DR,CiB92DQ,mGAEE,wBjBq3DV,CiBh5DI,mDAGE,wBjBm5DN,CiB/4DM,uFAIE,oBjBk5DR,CiBp4DQ,4GAEE,wBjB24DV,CiBt6DI,gDAGE,wBjBy6DN,CiBr6DM,mFAIE,oBjBw6DR,CiB15DQ,yGAEE,wBjBi6DV,CiB57DI,6CAGE,wBjB+7DN,CiB37DM,+EAIE,oBjB87DR,CiBh7DQ,sGAEE,wBjBu7DV,CiBl9DI,0CAGE,wBjBq9DN,CiBj9DM,2EAIE,oBjBo9DR,CiBt8DQ,mGAEE,wBjB68DV,CiB/8DQ,yJAEE,iCjB49DV,CgB54DI,sBACE,WACA,yBACA,oBhB+4DN,CgB14DI,uBACE,cACA,yBACA,oBhB64DN,CgBx4DA,YACE,WACA,wBhB24DF,CgBz4DE,mDAGE,oBhB44DJ,CgBz4DE,2BACE,QhB44DJ,CgBx4DI,oDACE,oChB24DN,CKhhEE,uCW4IM,WACA,qChBw4DR,Ccx9DI,4BEiGA,qBAEI,cACA,WACA,gBACA,gChB03DN,CgBv3DM,qCACE,QhB03DR,CACF,Ccr+DI,4BEiGA,qBAEI,cACA,WACA,gBACA,gChBu4DN,CgBp4DM,qCACE,QhBu4DR,CACF,Ccl/DI,4BEiGA,qBAEI,cACA,WACA,gBACA,gChBo5DN,CgBj5DM,qCACE,QhBo5DR,CACF,Cc//DI,6BEiGA,qBAEI,cACA,WACA,gBACA,gChBi6DN,CgB95DM,qCACE,QhBi6DR,CACF,CgB36DI,kBAEI,cACA,WACA,gBACA,gChB66DR,CgB16DQ,kCACE,QhB66DV,CkB1lEA,cACE,cACA,WACA,2BACA,uBdqHI,eclHJ,gBACA,gBACA,cACA,sBACA,4BACA,yBTAE,qBCFE,mCSAA,oEnBimEN,CmB7lEM,uCDdN,cCeQ,enBimEN,CACF,CkB5lEE,0BACE,6BACA,QlB+lEJ,CkB3lEE,6BACE,kBACA,yBlB8lEJ,CoBpnEE,oBACE,cACA,sBACA,qBACA,UVDE,kCVynEN,CkB/lEE,gCACE,cAEA,SlBimEJ,CkBpmEE,oCACE,cAEA,SlBimEJ,CkBpmEE,2BACE,cAEA,SlBimEJ,CkBzlEE,+CAEE,yBAEA,SlB2lEJ,CkBnlEE,mIACE,4DlBylEJ,CkBplEE,qCAME,cACA,qBlBklEJ,CkB7kEA,uCAEE,cACA,UlBglEF,CkBtkEA,gBACE,gCACA,mCACA,gBd3BE,kBc6BF,elBykEF,CkBtkEA,mBACE,8BACA,iCdqBI,kBcnBJ,elBykEF,CkBtkEA,mBACE,+BACA,kCdcI,kBcZJ,elBykEF,CkBhkEA,wBACE,cACA,WACA,kBACA,gBdDI,ecGJ,gBACA,cACA,6BAEA,2ClBmkEF,CkBjkEE,gFAEE,gBACA,clBokEJ,CkBxjEA,iBACE,6BACA,qBd1BI,kBc4BJ,gBTzIE,mBTqsEJ,CkBxjEA,iBACE,4BACA,mBdlCI,kBcoCJ,gBTjJE,mBT6sEJ,CkBhjEA,8EACE,WlBwjEF,CkBhjEA,YACE,kBlBmjEF,CkBhjEA,WACE,cACA,iBlBmjEF,CkB3iEA,UACE,aACA,eACA,kBACA,gBlB8iEF,CkB5iEE,uCAEE,kBACA,gBlB+iEJ,CkBtiEA,YACE,kBACA,cACA,oBlByiEF,CkBtiEA,kBACE,kBACA,iBACA,oBlByiEF,CkBtiEE,2FAEE,alByiEJ,CkBriEA,kBACE,elBwiEF,CkBriEA,mBACE,oBACA,mBACA,eACA,mBlBwiEF,CkBriEE,qCACE,gBACA,aACA,sBACA,alBwiEJ,CoBrvEE,gBACE,aACA,WACA,kBhByBA,cgBvBA,apBwvEJ,CoBrvEE,eACE,kBACA,SACA,OACA,UACA,aACA,eACA,qBACA,iBhBmEE,kBgBjEF,gBACA,WACA,oCX9CA,oBTuyEJ,CoBpvEI,qEAEE,QpBuvEN,CoBlvEI,8HAEE,apBuvEN,CoBryEI,0DAoDE,qBAGE,sBACA,6QACA,4BACA,yDACA,2DpBovER,CoBjvEM,sEACE,qBACA,sCpBqvER,CoBrzEI,0EAyEI,sBACA,6EpBivER,CoB3zEI,4DAiFE,qBAGE,sCACA,oiBpB6uER,CoB1uEM,wEACE,qBACA,sCpB8uER,CoBvuEM,sGACE,apB2uER,CoBxuEM,kMAEE,apB6uER,CoBtuEM,sHACE,apB0uER,CoBxuEQ,oIACE,oBpB4uEV,CoBvuEQ,oJACE,qBClJN,wBrB83EJ,CoBtuEQ,gJACE,sCpB0uEV,CoB7tEM,sRACE,oBpBsuER,CoBluEQ,sHACE,qBACA,sCpBsuEV,CoB72EE,kBACE,aACA,WACA,kBhByBA,cgBvBA,apBg3EJ,CoB72EE,iBACE,kBACA,SACA,OACA,UACA,aACA,eACA,qBACA,iBhBmEE,kBgBjEF,gBACA,WACA,oCX9CA,oBT+5EJ,CoB52EI,yEAEE,QpB+2EN,CoB12EI,8IAEE,apB+2EN,CoB75EI,8DAoDE,qBAGE,sBACA,sUACA,4BACA,yDACA,2DpB42ER,CoBz2EM,0EACE,qBACA,sCpB62ER,CoB76EI,8EAyEI,sBACA,6EpBy2ER,CoBn7EI,gEAiFE,qBAGE,sCACA,6lBpBq2ER,CoBl2EM,4EACE,qBACA,sCpBs2ER,CoB/1EM,0GACE,apBm2ER,CoBh2EM,kNAEE,apBq2ER,CoB91EM,0HACE,apBk2ER,CoBh2EQ,wIACE,oBpBo2EV,CoB/1EQ,wJACE,qBClJN,wBrBs/EJ,CoB91EQ,oJACE,sCpBk2EV,CoBr1EM,8RACE,oBpB81ER,CoB11EQ,0HACE,qBACA,sCpB81EV,CkB/vEA,aACE,aACA,mBACA,kBlBkwEF,CkB7vEE,yBACE,UlBgwEJ,Cc/9EI,yBIoOA,mBAGE,sBlBgwEJ,CkB3vEE,4CAPE,aACA,mBAEA,elBuwEJ,CkBnwEE,yBAEE,cACA,kBlBgwEJ,CkB1vEE,2BACE,qBACA,WACA,qBlB6vEJ,CkBzvEE,qCACE,oBlB4vEJ,CkBzvEE,sDAEE,UlB4vEJ,CkBvvEE,yBACE,aACA,mBACA,uBACA,WACA,clB0vEJ,CkBxvEE,+BACE,kBACA,cACA,aACA,oBACA,alB2vEJ,CkBxvEE,6BACE,mBACA,sBlB2vEJ,CkBzvEE,mCACE,elB4vEJ,CACF,CsB9kFA,KACE,qBAEA,gBACA,cACA,kBAGA,sBACA,qFACA,6BACA,6BCuFA,uBnBuBI,emBrBJ,gBdxFE,qBUFE,6HnBolFN,CmBhlFM,uCGdN,KHeQ,enBolFN,CACF,CK9lFE,WiBUE,cACA,oBtBwlFJ,CsBrlFE,sBAEE,UACA,etBwlFJ,CsBplFE,4BAEE,YZnBE,eV2mFN,CsBplFE,mCACE,ctBulFJ,CsBrlFI,oFZ1BE,eVonFN,CsB9kFA,uCAEE,mBtBilFF,CsBxkFE,aC3DA,WFAE,yBEEF,qBbQI,eVgoFN,CuB/nFE,yDALE,WFNA,yBEQA,oBvBgpFJ,CuB7oFE,sCbDI,sCV8oFN,CuB/nFE,4CAEE,WACA,yBACA,oBvBkoFJ,CuB3nFE,uIAGE,WACA,yBAIA,oBvB2nFJ,CuBznFI,yJAKI,sCvB0nFR,CsBlnFE,eC3DA,WFAE,yBEEF,qBbQI,eV0qFN,CuBzqFE,+DALE,WFNA,yBEQA,oBvB0rFJ,CuBvrFE,0CbDI,uCVwrFN,CuBzqFE,gDAEE,WACA,yBACA,oBvB4qFJ,CuBrqFE,6IAGE,WACA,yBAIA,oBvBqqFJ,CuBnqFI,+JAKI,uCvBoqFR,CsB5pFE,aC3DA,WFAE,yBEEF,qBbQI,eVotFN,CuBntFE,yDALE,WFNA,yBEQA,oBvBouFJ,CuBjuFE,sCbDI,qCVkuFN,CuBntFE,4CAEE,WACA,yBACA,oBvBstFJ,CuB/sFE,uIAGE,WACA,yBAIA,oBvB+sFJ,CuB7sFI,yJAKI,qCvB8sFR,CsBtsFE,UC3DA,WFAE,yBEEF,qBbQI,eV8vFN,CuB7vFE,gDALE,WFNA,yBEQA,oBvB8wFJ,CuB3wFE,gCbDI,sCV4wFN,CuB7vFE,sCAEE,WACA,yBACA,oBvBgwFJ,CuBzvFE,8HAGE,WACA,yBAIA,oBvByvFJ,CuBvvFI,gJAKI,sCvBwvFR,CsBhvFE,aC3DA,cFAE,yBEEF,qBbQI,eVwyFN,CuBvyFE,yDALE,cFNA,yBEQA,oBvBwzFJ,CuBrzFE,sCbDI,sCVszFN,CuBvyFE,4CAEE,cACA,yBACA,oBvB0yFJ,CuBnyFE,uIAGE,cACA,yBAIA,oBvBmyFJ,CuBjyFI,yJAKI,sCvBkyFR,CsB1xFE,YC3DA,WFAE,yBEEF,qBbQI,eVk1FN,CuBj1FE,sDALE,WFNA,yBEQA,oBvBk2FJ,CuB/1FE,oCbDI,qCVg2FN,CuBj1FE,0CAEE,WACA,yBACA,oBvBo1FJ,CuB70FE,oIAGE,WACA,yBAIA,oBvB60FJ,CuB30FI,sJAKI,qCvB40FR,CsBp0FE,WC3DA,cFAE,yBEEF,qBbQI,eV43FN,CuB33FE,mDALE,cFNA,yBEQA,oBvB44FJ,CuBz4FE,kCbDI,uCV04FN,CuB33FE,wCAEE,cACA,yBACA,oBvB83FJ,CuBv3FE,iIAGE,cACA,yBAIA,oBvBu3FJ,CuBr3FI,mJAKI,uCvBs3FR,CsB92FE,UC3DA,WFAE,yBEEF,qBbQI,eVs6FN,CuBr6FE,gDALE,WFNA,yBEQA,oBvBs7FJ,CuBn7FE,gCbDI,oCVo7FN,CuBr6FE,sCAEE,WACA,yBACA,oBvBw6FJ,CuBj6FE,8HAGE,WACA,yBAIA,oBvBi6FJ,CuB/5FI,gJAKI,oCvBg6FR,CsBl5FE,qBCPA,cACA,oBvB65FF,CKl9FE,2BkBwDE,WACA,yBACA,oBvB85FJ,CuB35FE,sDAEE,qCvB85FJ,CuB35FE,4DAEE,cACA,4BvB85FJ,CuB35FE,+JAGE,WACA,yBACA,oBvB85FJ,CuB55FI,iLAKI,qCvB65FR,CsBt7FE,uBCPA,cACA,oBvBi8FF,CKt/FE,6BkBwDE,WACA,yBACA,oBvBk8FJ,CuB/7FE,0DAEE,uCvBk8FJ,CuB/7FE,gEAEE,cACA,4BvBk8FJ,CuB/7FE,qKAGE,WACA,yBACA,oBvBk8FJ,CuBh8FI,uLAKI,uCvBi8FR,CsB19FE,qBCPA,cACA,oBvBq+FF,CK1hGE,2BkBwDE,WACA,yBACA,oBvBs+FJ,CuBn+FE,sDAEE,qCvBs+FJ,CuBn+FE,4DAEE,cACA,4BvBs+FJ,CuBn+FE,+JAGE,WACA,yBACA,oBvBs+FJ,CuBp+FI,iLAKI,qCvBq+FR,CsB9/FE,kBCPA,cACA,oBvBygGF,CK9jGE,wBkBwDE,WACA,yBACA,oBvB0gGJ,CuBvgGE,gDAEE,sCvB0gGJ,CuBvgGE,sDAEE,cACA,4BvB0gGJ,CuBvgGE,sJAGE,WACA,yBACA,oBvB0gGJ,CuBxgGI,wKAKI,sCvBygGR,CsBliGE,qBCPA,cACA,oBvB6iGF,CKlmGE,2BkBwDE,cACA,yBACA,oBvB8iGJ,CuB3iGE,sDAEE,qCvB8iGJ,CuB3iGE,4DAEE,cACA,4BvB8iGJ,CuB3iGE,+JAGE,cACA,yBACA,oBvB8iGJ,CuB5iGI,iLAKI,qCvB6iGR,CsBtkGE,oBCPA,cACA,oBvBilGF,CKtoGE,0BkBwDE,WACA,yBACA,oBvBklGJ,CuB/kGE,oDAEE,qCvBklGJ,CuB/kGE,0DAEE,cACA,4BvBklGJ,CuB/kGE,4JAGE,WACA,yBACA,oBvBklGJ,CuBhlGI,8KAKI,qCvBilGR,CsB1mGE,mBCPA,cACA,oBvBqnGF,CK1qGE,yBkBwDE,cACA,yBACA,oBvBsnGJ,CuBnnGE,kDAEE,uCvBsnGJ,CuBnnGE,wDAEE,cACA,4BvBsnGJ,CuBnnGE,yJAGE,cACA,yBACA,oBvBsnGJ,CuBpnGI,2KAKI,uCvBqnGR,CsB9oGE,kBCPA,cACA,oBvBypGF,CK9sGE,wBkBwDE,WACA,yBACA,oBvB0pGJ,CuBvpGE,gDAEE,oCvB0pGJ,CuBvpGE,sDAEE,cACA,4BvB0pGJ,CuBvpGE,sJAGE,WACA,yBACA,oBvB0pGJ,CuBxpGI,wKAKI,oCvBypGR,CsBvqGA,UACE,gBACA,cACA,oBtB0qGF,CKnvGE,gBiB4EE,atB4qGJ,CsBxqGE,gDAHE,oBtBgrGJ,CsBxqGE,sCAEE,cACA,mBtB2qGJ,CsBhqGA,2BCPE,mBnBuBI,kBmBrBJ,gBdxFE,mBTqwGJ,CsBpqGA,2BCXE,qBnBuBI,kBmBrBJ,gBdxFE,mBT6wGJ,CsBnqGA,WACE,cACA,UtBsqGF,CsBnqGE,sBACE,gBtBsqGJ,CsB9pGE,sFACE,UtBmqGJ,CwB9yGA,MLgBM,8BnBkyGN,CmB9xGM,uCKpBN,MLqBQ,enBkyGN,CACF,CwBrzGE,iBACE,SxBwzGJ,CwBnzGE,qBACE,YxBszGJ,CwBlzGA,YACE,kBACA,SACA,gBLDI,2BnBuzGN,CmBnzGM,uCKNN,YLOQ,enBuzGN,CACF,CyB50GA,uCAIE,iBzB+0GF,CyB50GA,iBACE,kBzB+0GF,C0B3zGI,uBACE,qBACA,mBACA,sBACA,WAhCJ,sBACA,oCACA,gBACA,kC1B+1GF,C0B1yGI,6BACE,a1B6yGN,CyBv1GA,eACE,kBACA,SACA,OACA,aACA,aACA,WACA,gBACA,gBACA,mBrBsGI,eqBpGJ,cACA,gBACA,gBACA,sBACA,4BACA,iChBdE,qBCFE,wCV42GN,CyBn1GI,oBACE,WACA,MzBs1GN,CyBn1GI,qBACE,QACA,SzBs1GN,Cc10GI,yBWnBA,uBACE,WACA,MzBi2GJ,CyB91GE,wBACE,QACA,SzBi2GJ,CACF,Cct1GI,yBWnBA,uBACE,WACA,MzB62GJ,CyB12GE,wBACE,QACA,SzB62GJ,CACF,Ccl2GI,yBWnBA,uBACE,WACA,MzBy3GJ,CyBt3GE,wBACE,QACA,SzBy3GJ,CACF,Cc92GI,0BWnBA,uBACE,WACA,MzBq4GJ,CyBl4GE,wBACE,QACA,SzBq4GJ,CACF,CyB93GE,uBACE,SACA,YACA,aACA,qBzBi4GJ,C0Bh6GI,+BACE,qBACA,mBACA,sBACA,WAzBJ,aACA,oCACA,yBACA,kC1B67GF,C0B/4GI,qCACE,a1Bk5GN,CyBv4GE,0BACE,MACA,WACA,UACA,aACA,mBzB04GJ,C0Bv7GI,kCACE,qBACA,mBACA,sBACA,WAlBJ,kCACA,eACA,qCACA,sB1B68GF,C0Bt6GI,wCACE,a1By6GN,CyBp5GI,kCACE,gBzBu5GN,CyBj5GE,yBACE,MACA,WACA,UACA,aACA,oBzBo5GJ,C0Bl9GI,iCACE,qBACA,mBACA,sBACA,WAYE,Y1By8GR,C0Bt8GM,kCACE,qBACA,oBACA,sBACA,WA9BN,kCACA,wBACA,oC1B4+GF,C0B38GI,uCACE,a1B88GN,CyBx6GI,kCACE,gBzB26GN,CyBn6GE,0IAIE,WACA,WzBs6GJ,CyBj6GA,kBE9GE,SACA,eACA,gBACA,4B3BmhHF,CyBj6GA,eACE,cACA,WACA,oBACA,WACA,gBACA,cACA,mBAEA,mBACA,6BACA,QzBm6GF,CKxhHE,0CoBoIE,cACA,qBJ/IA,wBrByiHJ,CyBt5GE,4CAEE,WACA,qBJtJA,wBrBgjHJ,CyBt5GE,gDAEE,cACA,oBACA,4BzBy5GJ,CyBj5GA,oBACE,azBo5GF,CyBh5GA,iBACE,cACA,mBACA,gBrBrDI,kBqBuDJ,cACA,kBzBm5GF,CyB/4GA,oBACE,cACA,oBACA,azBk5GF,C4B7kHA,+BAEE,kBACA,oBACA,qB5BglHF,C4B9kHE,yCACE,kBACA,a5BklHJ,C4B3kHI,wNAGE,S5BslHN,C4BhlHA,aACE,aACA,eACA,0B5BmlHF,C4BjlHE,0BACE,U5BolHJ,C4B9kHE,0EAEE,gB5BilHJ,C4B7kHE,mGnBXE,0BACA,4BT6lHJ,C4B9kHE,+EnBFE,yBACA,2BTqlHJ,C4BlkHA,uBACE,uBACA,qB5BqkHF,C4BnkHE,0GAGE,a5BskHJ,C4BnkHE,wCACE,c5BskHJ,C4BlkHA,yEACE,sBACA,oB5BskHF,C4BnkHA,yEACE,qBACA,mB5BukHF,C4B7jHE,2ElBpFI,eVypHN,C4B3jHA,oBACE,sBACA,uBACA,sB5B8jHF,C4B5jHE,wDAEE,U5B+jHJ,C4B5jHE,4FAEE,e5B+jHJ,C4B3jHE,qHnBrFE,6BACA,2BTqpHJ,C4B5jHE,iGnBxGE,yBACA,yBTyqHJ,C4B9iHE,yDAEE,e5BijHJ,C4B/iHI,gMAEE,kBACA,mBACA,mB5BojHN,C6B7sHA,aACE,kBACA,aACA,eACA,oBACA,U7BgtHF,C6B9sHE,sHAIE,kBACA,cACA,SACA,YACA,e7BitHJ,C6B/sHI,0gBAGE,gB7B2tHN,C6BttHE,yIAGE,S7BytHJ,C6BrtHE,mDACE,S7BwtHJ,C6BntHI,2FpBIA,yBACA,2BTotHJ,C6BptHE,0BACE,aACA,kB7ButHJ,C6BrtHI,6HpBLA,yBACA,2BT+tHJ,C6B9sHI,+apBhCA,0BACA,4BT2vHJ,C6B7sHA,yCAEE,Y7BgtHF,C6B3sHE,mDACE,kBACA,S7B+sHJ,C6B7sHI,+DACE,S7BitHN,C6B7sHE,4VAIE,gB7BotHJ,C6BhtHA,qBAAuB,iB7BotHvB,C6BntHA,oBAAsB,gB7ButHtB,C6B/sHA,kBACE,aACA,mBACA,uBACA,gBzBSI,eyBPJ,gBACA,gBACA,cACA,kBACA,mBACA,yBACA,yBpB5GE,oBT+zHJ,C6B/sHE,2EAEE,Y7BktHJ,C6BxsHA,2EAEE,2B7B2sHF,C6BxsHA,6PAME,mBzB1BI,kByB4BJ,gBpBzIE,mBTq1HJ,C6BxsHA,2EAEE,4B7B2sHF,C6BxsHA,6PAME,qBzB3CI,kByB6CJ,gBpB1JE,mBTs2HJ,C6BxsHA,8DAEE,qB7B2sHF,C6BhsHA,skBpB3JI,0BACA,4BTs2HJ,C6BjsHA,+WpBxJI,yBACA,2BTk2HJ,C8B14HA,gBACE,kBACA,UACA,cACA,kBACA,oBACA,mD9B64HF,C8B14HA,uBACE,oBACA,iB9B64HF,C8B14HA,sBACE,kBACA,OACA,WACA,WACA,eACA,S9B64HF,C8B34HE,2DACE,WACA,qBT3BA,yBXUE,eVi6HN,C8B34HE,yDAGI,iF9B44HN,C8Bt4HE,uEACE,oB9By4HJ,C8Bt4HE,yEACE,WACA,yBACA,qBpBtCE,eVg7HN,C8Bn4HI,2GACE,a9Bu4HN,C8Br4HM,yHACE,wB9By4HR,C8B/3HA,sBACE,kBACA,gBAEA,kB9Bi4HF,C8B73HE,6BAOE,oBAEA,yBACA,yBpB7EE,+CV88HN,C8B53HE,yDAdE,kBACA,WACA,aACA,cACA,WACA,YAEA,U9B84HJ,C8Bv4HE,4BAQE,gC9B+3HJ,C8Br3HE,8CrBlGE,oBT29HJ,C8Bp3HI,2EACE,4N9Bu3HN,C8Bl3HI,kFACE,qBT1HF,yBXUE,eVu+HN,C8Bn3HI,iFACE,yK9Bs3HN,C8Bj3HI,qFTpIA,mCrBy/HJ,C8Bl3HI,2FTvIA,mCrB6/HJ,C8B32HE,2CAEE,iB9B62HJ,C8Bz2HI,wEACE,sK9B42HN,C8Bv2HI,kFT9JA,mCrBygIJ,C8Bh2HA,eACE,oB9Bm2HF,C8Bh2HI,4CACE,cACA,cACA,mBAEA,mB9Bk2HN,C8B/1HI,2CACE,uBACA,0BACA,uBACA,wBACA,yBAEA,oBXlLA,iInBohIN,CmBhhIM,uCWuKF,2CXtKI,enBohIN,CACF,C8Bl2HI,yEACE,yBACA,4B9Bq2HN,C8Bh2HI,mFTzMA,mCrB6iIJ,C8Bv1HA,eACE,qBACA,WACA,2BACA,uC1BjGI,e0BoGJ,gBACA,gBACA,cACA,sBACA,8NACA,yBrBtNE,qBqByNF,4D9By1HF,C8Bv1HE,oCpB7NI,2CV0jIN,C8B71HE,qBACE,qBACA,S9B21HJ,C8Bn1HI,gCAME,cACA,qB9Bi1HN,C8B70HE,8DAEE,YACA,qBACA,qB9Bg1HJ,C8B70HE,wBACE,cACA,wB9Bg1HJ,C8B50HE,2BACE,Y9B+0HJ,C8B30HE,8BACE,kBACA,yB9B80HJ,C8B10HA,kBACE,6BACA,mBACA,sBACA,mB1BtNE,aJoiIJ,C8B10HA,kBACE,4BACA,kBACA,qBACA,kB1B9NE,cJ4iIJ,C8Br0HA,aAEE,qBAGA,e9Bw0HF,C8Br0HA,gCAPE,kBAEA,WACA,0B9Bm1HF,C8B/0HA,mBAEE,UAGA,SACA,gBACA,S9Bw0HF,C8Bt0HE,4CACE,qBACA,e9By0HJ,C8Br0HE,+FAEE,wB9Bw0HJ,C8Bp0HI,qDACE,gB9Bu0HN,C8Bn0HE,yDACE,yB9Bs0HJ,C8Bl0HA,mBAIE,OACA,UACA,2BAEA,gBAEA,gBAGA,sBACA,yBrBlVE,qBCFE,eV0pIN,C8Bl0HE,4CAjBA,kBACA,MACA,QAIA,uBAIA,gBACA,a9By1HF,C8Bn1HE,yBAIE,SACA,UACA,cACA,eAIA,iBT7WA,yBS+WA,oBrBnWA,+BTyqIJ,C8B3zHA,cACE,WACA,YACA,UACA,6BACA,4D9B8zHF,C8B5zHE,oBACE,S9B+zHJ,C8B3zHI,0CAA0B,yD9B+zH9B,C8B9zHI,sCAA0B,yD9Bk0H9B,C8Bj0HI,+BAA0B,yD9Bq0H9B,C8Bl0HE,gCACE,Q9Bq0HJ,C8Bl0HE,oCACE,WACA,YACA,mBTlZA,yBSoZA,SrBxYA,mBCFE,yCSAA,sNW8YF,uC9Bq0HJ,CmB/sIM,uCWiYJ,oCXhYM,uCnBmtIN,CACF,C8Bz0HI,2CT1ZA,wBrBuuIJ,C8Bx0HE,6CACE,WACA,aACA,kBACA,eACA,yBACA,yBrBzZA,mBCFE,+CVwuIN,C8Bx0HE,gCACE,WACA,YT5aA,yBS8aA,SrBlaA,mBCFE,yCSAA,mNWwaF,oC9B20HJ,CmB/uIM,uCW4ZJ,gCX3ZM,oCnBmvIN,CACF,C8B/0HI,uCTpbA,wBrBuwIJ,C8B90HE,gCACE,WACA,aACA,kBACA,eACA,yBACA,yBrBnbA,mBCFE,+CVwwIN,C8B90HE,yBACE,WACA,YACA,aACA,eACA,cTzcA,yBS2cA,SrB/bA,mBCFE,yCSAA,kNWqcF,e9Bi1HJ,CmBlxIM,uCWsbJ,yBXrbM,mCnBsxIN,CACF,C8Br1HI,gCTjdA,wBrB0yIJ,C8Bp1HE,yBACE,WACA,aACA,kBACA,eACA,6BACA,yBACA,mBpBndE,+CV2yIN,C8B/0HE,4DAJE,yBrBtdA,kBTozIJ,C8B11HE,8BACE,iB9By1HJ,C8Bn1HI,6CACE,wB9Bs1HN,C8Bn1HI,sDACE,c9Bs1HN,C8Bn1HI,yCACE,wB9Bs1HN,C8Bn1HI,yCACE,c9Bs1HN,C8Bn1HI,kCACE,wB9Bs1HN,C8Bj1HA,+DXzfM,sGnBg1IN,CmB50IM,uCWqfN,+DXpfQ,enBk1IN,CACF,C+Bn2IA,KACE,aACA,eACA,eACA,gBACA,e/Bs2IF,C+Bn2IA,UACE,cACA,kB/Bs2IF,CKr2IE,gC0BGE,oB/Bu2IJ,C+Bn2IE,mBACE,cACA,oBACA,c/Bs2IJ,C+B91IA,UACE,+B/Bi2IF,C+B/1IE,oBACE,mBACA,6BtBZA,8BACA,8BT+2IJ,CK33IE,oD0B2BI,oC/Bq2IN,C+Bl2II,6BACE,cACA,6BACA,wB/Bq2IN,C+Bj2IE,8DAEE,cACA,sBACA,iC/Bo2IJ,C+Bj2IE,yBAEE,gBtBnCA,yBACA,yBTu4IJ,C+Bz1IE,qBtBxDE,oBTq5IJ,C+Bz1IE,uDAEE,WACA,wB/B41IJ,C+Bl1IE,wCAEE,cACA,iB/Bq1IJ,C+Bh1IE,kDAEE,aACA,YACA,iB/Bm1IJ,C+Bz0IE,uBACE,Y/B40IJ,C+B10IE,qBACE,a/B60IJ,CgCj7IA,QACE,kBAKA,ahCo7IF,CgCh7IE,4IARA,aACA,eACA,mBACA,6BhCi8IF,CgCp6IA,cACE,qBACA,qBACA,wBACA,mB5BwEI,kB4BtEJ,oBACA,kBhCu6IF,CKj9IE,wC2B6CE,oBhCy6IJ,CgCh6IA,YACE,aACA,sBACA,eACA,gBACA,ehCm6IF,CgCj6IE,sBACE,gBACA,chCo6IJ,CgCj6IE,2BACE,gBACA,UhCo6IJ,CgC35IA,aACE,qBACA,kBACA,oBhC85IF,CgCl5IA,iBACE,gBACA,YAGA,kBhCm5IF,CgC/4IA,gBACE,sB5BSI,kB4BPJ,cACA,6BACA,6BvBxGE,oBT2/IJ,CK7/IE,4C2B8GE,oBhCo5IJ,CgC94IA,qBACE,qBACA,YACA,aACA,sBACA,WACA,kChCi5IF,CgC94IA,mBACE,gBACA,ehCi5IF,Ccv9II,4BkBkFI,gMACE,gBACA,chC84IR,CACF,Cch/II,yBkB6FA,kBAoBI,qBACA,0BhCo4IN,CgCl4IM,8BACE,kBhCq4IR,CgCn4IQ,6CACE,iBhCs4IV,CgCn4IQ,wCACE,mBACA,iBhCs4IV,CgCj4IM,gMACE,gBhCy4IR,CgC33IM,qCACE,gBhC83IR,CgC33IM,mCACE,uBAGA,ehC43IR,CgCz3IM,kCACE,YhC43IR,CACF,Cc7gJI,4BkBkFI,gMACE,gBACA,chCo8IR,CACF,CctiJI,yBkB6FA,kBAoBI,qBACA,0BhC07IN,CgCx7IM,8BACE,kBhC27IR,CgCz7IQ,6CACE,iBhC47IV,CgCz7IQ,wCACE,mBACA,iBhC47IV,CgCv7IM,gMACE,gBhC+7IR,CgCj7IM,qCACE,gBhCo7IR,CgCj7IM,mCACE,uBAGA,ehCk7IR,CgC/6IM,kCACE,YhCk7IR,CACF,CcnkJI,4BkBkFI,gMACE,gBACA,chC0/IR,CACF,Cc5lJI,yBkB6FA,kBAoBI,qBACA,0BhCg/IN,CgC9+IM,8BACE,kBhCi/IR,CgC/+IQ,6CACE,iBhCk/IV,CgC/+IQ,wCACE,mBACA,iBhCk/IV,CgC7+IM,gMACE,gBhCq/IR,CgCv+IM,qCACE,gBhC0+IR,CgCv+IM,mCACE,uBAGA,ehCw+IR,CgCr+IM,kCACE,YhCw+IR,CACF,CcznJI,6BkBkFI,gMACE,gBACA,chCgjJR,CACF,CclpJI,0BkB6FA,kBAoBI,qBACA,0BhCsiJN,CgCpiJM,8BACE,kBhCuiJR,CgCriJQ,6CACE,iBhCwiJV,CgCriJQ,wCACE,mBACA,iBhCwiJV,CgCniJM,gMACE,gBhC2iJR,CgC7hJM,qCACE,gBhCgiJR,CgC7hJM,mCACE,uBAGA,ehC8hJR,CgC3hJM,kCACE,YhC8hJR,CACF,CgC/lJI,eAoBI,qBACA,0BhC+kJR,CgClmJQ,8KACE,gBACA,chC0mJV,CgCvlJQ,2BACE,kBhC0lJV,CgCxlJU,0CACE,iBhC2lJZ,CgCxlJU,qCACE,mBACA,iBhC2lJZ,CgCtlJQ,8KACE,gBhC8lJV,CgChlJQ,kCACE,gBhCmlJV,CgChlJQ,gCACE,uBAGA,ehCilJV,CgC9kJQ,+BACE,YhCilJV,CK1xJE,gG2B2NI,oBhCwkJN,CgCnkJI,oCACE,oBhCskJN,CKvyJE,oF2BoOM,oBhCwkJR,CgCrkJM,6CACE,oBhCwkJR,CgCpkJI,0KAIE,oBhCukJN,CgCnkJE,8BACE,qBACA,2BhCskJJ,CgCnkJE,mCACE,wQhCskJJ,CgCnkJE,2BACE,oBhCskJJ,CKp0JE,mG2BmQM,oBhC0kJR,CK70JE,6F2B+QI,UhCukJN,CgClkJI,mCACE,yBhCqkJN,CK11JE,kF2BwRM,UhCukJR,CgCpkJM,4CACE,yBhCukJR,CgCnkJI,sKAIE,UhCskJN,CgClkJE,6BACE,0BACA,+BhCqkJJ,CgClkJE,kCACE,+QhCqkJJ,CgClkJE,0BACE,yBhCqkJJ,CKv3JE,gG2BuTM,UhCykJR,CiC54JA,MACE,kBACA,aACA,sBACA,YAEA,qBACA,sBACA,2BACA,gCxBKE,oBT04JJ,CiC54JE,SACE,eACA,ajC+4JJ,CiC54JE,kBACE,mBACA,qBjC+4JJ,CiC74JI,8BACE,mBxBCF,8BACA,8BTg5JJ,CiC94JI,6BACE,sBxBUF,kCACA,gCTw4JJ,CiC54JE,8DAEE,YjC+4JJ,CiC34JA,WAGE,cAGA,eACA,ejC04JF,CiCt4JA,YACE,oBjCy4JF,CiCt4JA,eACE,mBjC04JF,CiCt4JA,qCAHE,ejC64JF,CK97JE,iB4B0DE,oBjCw4JJ,CiCr4JE,sBACE,mBjCw4JJ,CiCh4JA,aAEE,gBAEA,iCACA,sCjCk4JF,CiCh4JE,yBxBvEE,+BT28JJ,CiC/3JA,aACE,uBAEA,iCACA,mCjCi4JF,CiC/3JE,wBxBlFE,+BTq9JJ,CiCz3JA,kBAEE,sBAEA,ejC43JF,CiCz3JA,qCANE,sBAEA,oBjCk4JF,CiCx3JA,kBACE,kBACA,MACA,QACA,SACA,OACA,gBxB/GE,oBT2+JJ,CiCx3JA,yCAGE,cACA,UjC23JF,CiCx3JA,wBxBjHI,8BACA,8BT8+JJ,CiCz3JA,2BxBxGI,kCACA,gCTs+JJ,CiCt3JE,iBACE,mBjCy3JJ,Ccx9JI,yBmB6FJ,WAMI,aACA,mBACA,oBACA,kBjC03JF,CiCx3JE,iBAEE,YACA,mBACA,gBACA,iBjC03JJ,CACF,CiC92JE,kBACE,mBjCi3JJ,Cc5+JI,yBmBuHJ,YAQI,aACA,kBjCk3JF,CiC/2JE,kBAEE,YACA,ejCi3JJ,CiC/2JI,wBACE,cACA,ajCk3JN,CiC72JM,mCxBzKJ,0BACA,4BT0hKF,CiC/2JQ,iGAGE,yBjCi3JV,CiC/2JQ,oGAGE,4BjCi3JV,CiC72JM,oCxB1KJ,yBACA,2BT2hKF,CiC/2JQ,mGAGE,wBjCi3JV,CiC/2JQ,sGAGE,2BjCi3JV,CACF,CiCp2JE,oBACE,oBjCu2JJ,Cc/hKI,yBmBsLJ,cAMI,mCACA,2CACA,UACA,QjCw2JF,CiCt2JE,oBACE,qBACA,UjCy2JJ,CACF,CiCh2JA,WACE,oBjCm2JF,CiCj2JE,iBACE,ejCo2JJ,CiCl2JI,oCACE,gBxBvOF,6BACA,2BT6kKJ,CiCn2JI,qCxBzPA,yBACA,yBTgmKJ,CiCp2JI,8BxBtQA,gBwBwQE,ejCu2JN,CkCjoKA,YACE,aACA,eACA,oBACA,mBAEA,gBACA,yBzBWE,oBTynKJ,CkC9nKE,kCACE,kBlCioKJ,CkC/nKI,yCACE,WACA,oBACA,cACA,WlCkoKN,CkCxnKE,+CACE,0BAIA,oBlCunKJ,CkCpnKE,wBACE,alC2nKJ,CmClqKA,YACE,a7BGA,eACA,gBGaE,oBTupKJ,CmCnqKA,WACE,kBACA,cACA,qBACA,iBACA,iBACA,cAEA,sBACA,wBnCqqKF,CmCnqKE,iBACE,UACA,cACA,qBACA,yBACA,oBnCsqKJ,CmCnqKE,iBACE,UACA,UACA,0CnCsqKJ,CmChqKI,kCACE,c1BaF,8BACA,gCTupKJ,CmChqKI,iC1BNA,+BACA,iCT0qKJ,CmChqKE,6BACE,UACA,WACA,yBACA,oBnCmqKJ,CmChqKE,+BACE,cACA,oBAEA,YACA,sBACA,oBnCkqKJ,CoCztKE,0BACE,sBhC2HE,kBgCzHF,epC4tKJ,CoCvtKM,iD3BqCF,6BACA,+BTsrKJ,CoCvtKM,gD3BkBF,8BACA,gCTysKJ,CoCzuKE,0BACE,qBhC2HE,kBgCzHF,epC4uKJ,CoCvuKM,iD3BqCF,6BACA,+BTssKJ,CoCvuKM,gD3BkBF,8BACA,gCTytKJ,CqCvvKA,OACE,qBACA,mBjCiEE,ciC/DF,gBACA,cACA,kBACA,mBACA,wB5BKE,qBUFE,6HnByvKN,CmBrvKM,uCkBfN,OlBgBQ,enByvKN,CACF,CK/vKE,4BgCGI,oBrCiwKN,CqC5vKE,aACE,YrC+vKJ,CqC1vKA,YACE,kBACA,QrC6vKF,CqCtvKA,YACE,mBACA,kB5BvBE,mBTixKJ,CqCjvKE,eCjDA,WACA,wBtCsyKF,CKxxKE,4CiCVI,WACA,wBtCuyKN,CsCpyKI,4CAEE,UACA,yCtCuyKN,CqClwKE,iBCjDA,WACA,wBtCuzKF,CKzyKE,gDiCVI,WACA,wBtCwzKN,CsCrzKI,gDAEE,UACA,2CtCwzKN,CqCnxKE,eCjDA,WACA,wBtCw0KF,CK1zKE,4CiCVI,WACA,wBtCy0KN,CsCt0KI,4CAEE,UACA,yCtCy0KN,CqCpyKE,YCjDA,WACA,wBtCy1KF,CK30KE,sCiCVI,WACA,wBtC01KN,CsCv1KI,sCAEE,UACA,0CtC01KN,CqCrzKE,eCjDA,cACA,wBtC02KF,CK51KE,4CiCVI,cACA,wBtC22KN,CsCx2KI,4CAEE,UACA,yCtC22KN,CqCt0KE,cCjDA,WACA,wBtC23KF,CK72KE,0CiCVI,WACA,wBtC43KN,CsCz3KI,0CAEE,UACA,yCtC43KN,CqCv1KE,aCjDA,cACA,wBtC44KF,CK93KE,wCiCVI,cACA,wBtC64KN,CsC14KI,wCAEE,UACA,2CtC64KN,CqCx2KE,YCjDA,WACA,wBtC65KF,CK/4KE,sCiCVI,WACA,wBtC85KN,CsC35KI,sCAEE,UACA,wCtC85KN,CuC36KA,WACE,kBACA,mBAEA,yB9BcE,mBTg6KJ,Cct3KI,yByB5DJ,WAQI,iBvC+6KF,CACF,CuC56KA,iBACE,gBACA,e9BIE,eT46KJ,CwC17KA,OACE,kBACA,uBACA,mBACA,6B/BUE,oBTo7KJ,CwCz7KA,eAEE,axC27KF,CwCv7KA,YACE,exC07KF,CwCl7KA,mBACE,kBxCq7KF,CwCl7KE,0BACE,kBACA,MACA,QACA,UACA,uBACA,axCq7KJ,CwC36KE,eC/CA,cpBKE,yBoBHF,oBzC89KF,CyC59KE,kBACE,wBzC+9KJ,CyC59KE,2BACE,azC+9KJ,CwCz7KE,iBC/CA,cpBKE,yBoBHF,oBzC4+KF,CyC1+KE,oBACE,wBzC6+KJ,CyC1+KE,6BACE,azC6+KJ,CwCv8KE,eC/CA,cpBKE,yBoBHF,oBzC0/KF,CyCx/KE,kBACE,wBzC2/KJ,CyCx/KE,2BACE,azC2/KJ,CwCr9KE,YC/CA,cpBKE,yBoBHF,oBzCwgLF,CyCtgLE,eACE,wBzCygLJ,CyCtgLE,wBACE,azCygLJ,CwCn+KE,eC/CA,cpBKE,yBoBHF,oBzCshLF,CyCphLE,kBACE,wBzCuhLJ,CyCphLE,2BACE,azCuhLJ,CwCj/KE,cC/CA,cpBKE,yBoBHF,oBzCoiLF,CyCliLE,iBACE,wBzCqiLJ,CyCliLE,0BACE,azCqiLJ,CwC//KE,aC/CA,cpBKE,yBoBHF,oBzCkjLF,CyChjLE,gBACE,wBzCmjLJ,CyChjLE,yBACE,azCmjLJ,CwC7gLE,YC/CA,cpBKE,yBoBHF,oBzCgkLF,CyC9jLE,eACE,wBzCikLJ,CyC9jLE,wBACE,azCikLJ,C0CzkLE,wCACE,GAAO,0B1C6kLT,C0C5kLE,GAAK,uB1CglLP,CACF,C0CnlLE,gCACE,GAAO,0B1C6kLT,C0C5kLE,GAAK,uB1CglLP,CACF,C0C7kLA,UAEE,YAEA,ctCmHI,iBsCjHJ,yBjCIE,qBCFE,6CVglLN,C0C7kLA,wBAVE,aAEA,e1CimLF,C0CzlLA,cAEE,sBACA,uBAEA,WACA,kBACA,mBACA,yBvBXI,yBnB4lLN,CmBxlLM,uCuBDN,cvBEQ,enB4lLN,CACF,C0CnlLA,sBrBYE,sKqBVA,yB1CslLF,C0CllLE,uBACE,2G1CqlLJ,C0CllLM,uCAJJ,uBAKM,qC1CslLN,CACF,C2CjoLA,OACE,aACA,sB3CooLF,C2CjoLA,YACE,M3CooLF,C4CtoLA,YACE,aACA,sBAGA,eACA,gBnCQE,oBTgoLJ,C4C9nLA,wBACE,WACA,cACA,kB5CioLF,CKxoLE,4DuCWE,UACA,cACA,qBACA,wB5CkoLJ,C4C/nLE,+BACE,cACA,wB5CkoLJ,C4CznLA,iBACE,kBACA,cACA,uBAGA,sBACA,iC5C0nLF,C4CxnLE,6BnC1BE,+BACA,+BTspLJ,C4CznLE,4BnChBE,mCACA,iCT6oLJ,C4C1nLE,oDAEE,cACA,oBACA,qB5C6nLJ,C4CznLE,wBACE,UACA,WACA,yBACA,oB5C4nLJ,C4CznLE,kCACE,kB5C4nLJ,C4C1nLI,yCACE,gBACA,oB5C6nLN,C4C/mLI,uBACE,kB5CknLN,C4C/mLQ,oDnC1BJ,iCAZA,yBT0pLJ,C4C/mLQ,mDnC3CJ,+BAYA,2BTmpLJ,C4C/mLQ,+CACE,Y5CknLV,C4C/mLQ,yDACE,qBACA,mB5CknLV,C4ChnLU,gEACE,iBACA,qB5CmnLZ,Cc9qLI,yB8BmCA,0BACE,kB5C+oLJ,C4C5oLM,uDnC1BJ,iCAZA,yBTurLF,C4C5oLM,sDnC3CJ,+BAYA,2BTgrLF,C4C5oLM,kDACE,Y5C+oLR,C4C5oLM,4DACE,qBACA,mB5C+oLR,C4C7oLQ,mEACE,iBACA,qB5CgpLV,CACF,Cc5sLI,yB8BmCA,0BACE,kB5C6qLJ,C4C1qLM,uDnC1BJ,iCAZA,yBTqtLF,C4C1qLM,sDnC3CJ,+BAYA,2BT8sLF,C4C1qLM,kDACE,Y5C6qLR,C4C1qLM,4DACE,qBACA,mB5C6qLR,C4C3qLQ,mEACE,iBACA,qB5C8qLV,CACF,Cc1uLI,yB8BmCA,0BACE,kB5C2sLJ,C4CxsLM,uDnC1BJ,iCAZA,yBTmvLF,C4CxsLM,sDnC3CJ,+BAYA,2BT4uLF,C4CxsLM,kDACE,Y5C2sLR,C4CxsLM,4DACE,qBACA,mB5C2sLR,C4CzsLQ,mEACE,iBACA,qB5C4sLV,CACF,CcxwLI,0B8BmCA,0BACE,kB5CyuLJ,C4CtuLM,uDnC1BJ,iCAZA,yBTixLF,C4CtuLM,sDnC3CJ,+BAYA,2BT0wLF,C4CtuLM,kDACE,Y5CyuLR,C4CtuLM,4DACE,qBACA,mB5CyuLR,C4CvuLQ,mEACE,iBACA,qB5C0uLV,CACF,C4C7tLA,kBnCnHI,eTo1LJ,C4C9tLE,mCACE,oB5CiuLJ,C4C/tLI,8CACE,qB5CkuLN,C6C32LE,yBACE,cACA,wB7C82LJ,CKn2LE,4GwCPM,cACA,wB7C+2LR,C6C52LM,uDACE,WACA,yBACA,oB7C+2LR,C6C53LE,2BACE,cACA,wB7C+3LJ,CKp3LE,gHwCPM,cACA,wB7Cg4LR,C6C73LM,yDACE,WACA,yBACA,oB7Cg4LR,C6C74LE,yBACE,cACA,wB7Cg5LJ,CKr4LE,4GwCPM,cACA,wB7Ci5LR,C6C94LM,uDACE,WACA,yBACA,oB7Ci5LR,C6C95LE,sBACE,cACA,wB7Ci6LJ,CKt5LE,sGwCPM,cACA,wB7Ck6LR,C6C/5LM,oDACE,WACA,yBACA,oB7Ck6LR,C6C/6LE,yBACE,cACA,wB7Ck7LJ,CKv6LE,4GwCPM,cACA,wB7Cm7LR,C6Ch7LM,uDACE,WACA,yBACA,oB7Cm7LR,C6Ch8LE,wBACE,cACA,wB7Cm8LJ,CKx7LE,0GwCPM,cACA,wB7Co8LR,C6Cj8LM,sDACE,WACA,yBACA,oB7Co8LR,C6Cj9LE,uBACE,cACA,wB7Co9LJ,CKz8LE,wGwCPM,cACA,wB7Cq9LR,C6Cl9LM,qDACE,WACA,yBACA,oB7Cq9LR,C6Cl+LE,sBACE,cACA,wB7Cq+LJ,CK19LE,sGwCPM,cACA,wB7Cs+LR,C6Cn+LM,oDACE,WACA,yBACA,oB7Cs+LR,C8Ct/LA,OACE,Y1C8HI,iB0C5HJ,gBACA,cACA,WACA,yBACA,U9Cy/LF,CKp/LE,ayCDE,WACA,oB9Cy/LJ,CKr/LE,sFyCCI,W9Cy/LN,C8C9+LA,aACE,UACA,6BACA,Q9Ci/LF,C8C3+LA,iBACE,mB9C8+LF,C+CphMA,OAGE,iBACA,gB3C2HI,kB2CxHJ,qCACA,4BACA,gCACA,0CACA,UtCOE,oBT8gMJ,C+ClhME,wBACE,oB/CqhMJ,C+ClhME,eACE,S/CqhMJ,C+ClhME,YACE,cACA,S/CqhMJ,C+ClhME,YACE,Y/CqhMJ,C+CjhMA,cACE,aACA,mBACA,sBACA,cACA,qCACA,4BACA,wCtCZE,0CACA,0CTiiMJ,C+ClhMA,YACE,c/CqhMF,CgD3jMA,YAEE,ehD6jMF,CgD3jME,mBACE,kBACA,ehD8jMJ,CgDzjMA,OACE,eACA,MACA,OACA,aACA,aACA,WACA,YACA,gBAGA,ShD0jMF,CgDnjMA,cACE,kBACA,WACA,aAEA,mBhDqjMF,CgDljME,0B7B3BI,kC6B6BF,2BhDqjMJ,CmB9kMM,uC6BuBJ,0B7BtBM,enBklMN,CACF,CgDzjME,0BACE,chD4jMJ,CgDxjME,kCACE,qBhD2jMJ,CgDvjMA,yBACE,aACA,4BhD0jMF,CgDxjME,wCACE,8BACA,ehD2jMJ,CgDxjME,8EAEE,ahD2jMJ,CgDxjME,qCACE,ehD2jMJ,CgDvjMA,uBACE,aACA,mBACA,4BhD0jMF,CgDvjME,8BACE,cACA,0BACA,sEACA,UhD0jMJ,CgDtjME,+CACE,sBACA,uBACA,WhDyjMJ,CgDvjMI,8DACE,ehD0jMN,CgDvjMI,sDACE,YhD0jMN,CgDpjMA,eACE,kBACA,aACA,sBACA,WAGA,oBACA,sBACA,4BACA,gCvClGE,oBCFE,yCsCwGJ,ShDojMF,CgDhjMA,gBACE,eACA,MACA,OACA,aACA,YACA,aACA,qBhDmjMF,CgDhjME,qBAAS,ShDojMX,CgDnjME,qBAAS,UhDujMX,CgDljMA,cACE,aACA,uBACA,8BACA,aACA,gCvCtHE,yCACA,yCT4qMJ,CgDpjME,qBACE,aAEA,6BhDsjMJ,CgDjjMA,aACE,gBACA,ehDojMF,CgD/iMA,YACE,kBAGA,cACA,YhDgjMF,CgD5iMA,cACE,aACA,eACA,mBACA,yBACA,eACA,6BvCzIE,6CACA,2CTyrMJ,CgD3iME,gBACE,ahD8iMJ,CgDziMA,yBACE,kBACA,YACA,WACA,YACA,ehD4iMF,CcnrMI,yBkC6IF,cACE,gBACA,mBhD0iMF,CgDviMA,yBACE,8BhD0iMF,CgDxiME,wCACE,+BhD2iMJ,CgDviMA,uBACE,8BhD0iMF,CgDxiME,8BACE,4BACA,qEhD2iMJ,CgDviMA,etC/MI,sCV0vMJ,CgDviMA,UAAY,ehD2iMZ,CACF,CcntMI,yBkC2KF,oBAEE,ehD4iMF,CACF,Cc1tMI,0BkCkLF,UAAY,gBhD6iMZ,CACF,CiD3xMA,SACE,kBACA,aACA,cACA,SCJA,8JAEA,kBACA,gBACA,gBACA,gBACA,iBACA,qBACA,iBACA,oBACA,sBACA,kBACA,oBACA,mBACA,gB9CgHI,kB6CpHJ,qBACA,SjDwyMF,CiDtyME,cAAS,UjD0yMX,CiDxyME,gBACE,kBACA,cACA,YACA,YjD2yMJ,CiDzyMI,uBACE,kBACA,WACA,yBACA,kBjD4yMN,CiDvyMA,mDACE,ejD2yMF,CiDzyME,iEACE,QjD6yMJ,CiD3yMI,+EACE,MACA,2BACA,qBjD+yMN,CiD1yMA,uDACE,ejD8yMF,CiD5yME,qEACE,OACA,YACA,YjDgzMJ,CiD9yMI,mFACE,QACA,iCACA,uBjDkzMN,CiD7yMA,yDACE,ejDizMF,CiD/yME,uEACE,KjDmzMJ,CiDjzMI,qFACE,SACA,2BACA,wBjDqzMN,CiDhzMA,qDACE,ejDozMF,CiDlzME,mEACE,QACA,YACA,YjDszMJ,CiDpzMI,iFACE,OACA,iCACA,sBjDwzMN,CiDnyMA,eACE,gBACA,qBACA,WACA,kBACA,sBxC9FE,oBTq4MJ,CmDv5MA,SAEE,MACA,OACA,aAEA,gBDLA,8JAEA,kBACA,gBACA,gBACA,gBACA,iBACA,qBACA,iBACA,oBACA,sBACA,kBACA,oBACA,mBACA,gB9CgHI,kB+CnHJ,qBACA,sBACA,4BACA,gC1CGE,oBCFE,wCVq6MN,CmDl6ME,yBAlBA,kBAIA,anDw7MF,CmD16ME,gBAGE,WACA,aACA,cnDq6MJ,CmDn6MI,6CAEE,kBACA,cACA,WACA,yBACA,kBnDs6MN,CmDj6MA,mDACE,mBnDq6MF,CmDn6ME,iEACE,yBnDu6MJ,CmDr6MI,+EACE,SACA,2BACA,gCnDy6MN,CmDt6MI,6EACE,WACA,2BACA,qBnD06MN,CmDr6MA,uDACE,iBnDy6MF,CmDv6ME,qEACE,wBACA,YACA,YACA,cnD26MJ,CmDz6MI,mFACE,OACA,iCACA,kCnD66MN,CmD16MI,iFACE,SACA,iCACA,uBnD86MN,CmDz6MA,yDACE,gBnD66MF,CmD36ME,uEACE,sBnD+6MJ,CmD76MI,qFACE,MACA,2BACA,mCnDi7MN,CmD96MI,mFACE,QACA,2BACA,wBnDk7MN,CmD76ME,uGACE,kBACA,MACA,SACA,cACA,WACA,mBACA,WACA,+BnDi7MJ,CmD76MA,qDACE,kBnDi7MF,CmD/6ME,mEACE,yBACA,YACA,YACA,cnDm7MJ,CmDj7MI,iFACE,QACA,iCACA,iCnDq7MN,CmDl7MI,+EACE,UACA,iCACA,sBnDs7MN,CmDh6MA,gBACE,qBACA,gB/C3BI,e+C6BJ,cACA,yBACA,gC1CnIE,yCACA,yCTuiNJ,CmDl6ME,sBACE,YnDq6MJ,CmDj6MA,cACE,qBACA,anDo6MF,CoD/jNA,UACE,iBpDkkNF,CoD/jNA,wBACE,kBpDkkNF,CoD/jNA,gBACE,kBACA,WACA,epDkkNF,CqDzlNE,sBACE,cACA,WACA,UrD4lNJ,CoDpkNA,eACE,kBACA,aACA,WACA,WACA,mBACA,8DjClBI,6BnB0lNN,CmBtlNM,uCiCQN,ejCPQ,enB0lNN,CACF,CoD1kNA,8DAGE,apD6kNF,CoD1kNA,yEAEE,0BpD6kNF,CoD1kNA,yEAEE,2BpD6kNF,CoDpkNE,8BACE,UACA,4BACA,cpDukNJ,CoDpkNE,kJAGE,UACA,SpDukNJ,CoDpkNE,qFAEE,UACA,UjC5DE,yBnBooNN,CmBhoNM,uCiCqDJ,qFjCpDM,enBqoNN,CACF,CoDrkNA,8CAEE,kBACA,MACA,SACA,UAEA,aACA,mBACA,uBACA,UACA,WACA,kBACA,WjCnFI,4BnB2pNN,CmBvpNM,uCiCkEN,8CjCjEQ,enB4pNN,CACF,CKlqNE,oH+CwFE,WACA,qBACA,UACA,UpDilNJ,CoD9kNA,uBACE,MpDilNF,CoD5kNA,uBACE,OpD+kNF,CoDxkNA,wDAEE,qBACA,WACA,YACA,kCpD2kNF,CoDzkNA,4BACE,kNpD4kNF,CoD1kNA,4BACE,kNpD6kNF,CoDpkNA,qBACE,kBACA,QACA,SACA,OACA,WACA,aACA,uBACA,eAEA,iBACA,gBACA,epDskNF,CoDpkNE,wBACE,uBACA,cACA,WACA,WACA,iBACA,gBACA,mBACA,eACA,sBACA,4BAEA,kCACA,qCACA,WjC5JE,2BnBmuNN,CmB/tNM,uCiC0IJ,wBjCzIM,enBmuNN,CACF,CoDzkNE,6BACE,SpD4kNJ,CoDnkNA,kBACE,kBACA,UACA,YACA,SACA,WACA,iBACA,oBACA,WACA,iBpDskNF,CsDrwNA,kCACE,GAAK,uBtDywNL,CACF,CsD3wNA,0BACE,GAAK,uBtDywNL,CACF,CsDvwNA,gBACE,qBACA,WACA,YACA,2BAEA,wDAEA,kBACA,mGtDywNF,CsDtwNA,mBACE,WACA,YACA,iBtDywNF,CsDlwNA,gCACE,GACE,kBtDqwNF,CsDnwNA,IACE,UACA,ctDswNF,CACF,CsD7wNA,wBACE,GACE,kBtDqwNF,CsDnwNA,IACE,UACA,ctDswNF,CACF,CsDnwNA,cACE,qBACA,WACA,YACA,2BACA,8BAEA,kBACA,UACA,+FtDqwNF,CsDlwNA,iBACE,WACA,WtDqwNF,CsDjwNE,uCACE,8BAEE,uDtDowNJ,CACF,CuDh0NA,gBAAqB,iCvDo0NrB,CuDn0NA,WAAqB,4BvDu0NrB,CuDt0NA,cAAqB,+BvD00NrB,CuDz0NA,cAAqB,+BvD60NrB,CuD50NA,mBAAqB,oCvDg1NrB,CuD/0NA,gBAAqB,iCvDm1NrB,CK10NE,sFmDLI,kCxD01NN,CKr1NE,8FmDLI,kCxDq2NN,CKh2NE,sFmDLI,kCxDg3NN,CK32NE,0EmDLI,kCxD23NN,CKt3NE,sFmDLI,kCxDs4NN,CKj4NE,kFmDLI,kCxDi5NN,CK54NE,8EmDLI,kCxD45NN,CKv5NE,0EmDLI,kCxDu6NN,CyDl6NA,gBACE,sCzDy6NF,C0Dp7NA,QAAkB,kC1Dw7NlB,C0Dv7NA,YAAkB,sC1D27NlB,C0D17NA,cAAkB,wC1D87NlB,C0D77NA,eAAkB,yC1Di8NlB,C0Dh8NA,aAAkB,uC1Do8NlB,C0Dl8NA,UAAmB,kB1Ds8NnB,C0Dr8NA,cAAmB,sB1Dy8NnB,C0Dx8NA,gBAAmB,wB1D48NnB,C0D38NA,iBAAmB,yB1D+8NnB,C0D98NA,eAAmB,uB1Dk9NnB,C0D/8NE,gBACE,8B1Dk9NJ,C0Dn9NE,kBACE,8B1Ds9NJ,C0Dv9NE,gBACE,8B1D09NJ,C0D39NE,aACE,8B1D89NJ,C0D/9NE,gBACE,8B1Dk+NJ,C0Dn+NE,eACE,8B1Ds+NJ,C0Dv+NE,cACE,8B1D0+NJ,C0D3+NE,aACE,8B1D8+NJ,C0D1+NA,cACE,2B1D6+NF,C0Dt+NA,YACE,6B1Dy+NF,C0Dt+NA,SACE,8B1Dy+NF,C0Dt+NA,aACE,uC1D0+NF,C0Dt+NA,4BAHE,wC1D8+NF,C0Dt+NA,+BAHE,2C1D8+NF,C0Dt+NA,8BAHE,0C1D8+NF,C0D3+NA,cACE,uC1D0+NF,C0Dt+NA,YACE,6B1Dy+NF,C0Dt+NA,gBACE,2B1Dy+NF,C0Dt+NA,cACE,6B1Dy+NF,C0Dt+NA,WACE,yB1Dy+NF,CqDjjOE,gBACE,cACA,WACA,UrDojOJ,C2D7iOM,QAAwB,sB3DijO9B,C2DjjOM,UAAwB,wB3DqjO9B,C2DrjOM,gBAAwB,8B3DyjO9B,C2DzjOM,SAAwB,uB3D6jO9B,C2D7jOM,SAAwB,uB3DikO9B,C2DjkOM,aAAwB,2B3DqkO9B,C2DrkOM,cAAwB,4B3DykO9B,C2DzkOM,QAAwB,sB3D6kO9B,C2D7kOM,eAAwB,6B3DilO9B,CchiOI,yB6CjDE,WAAwB,sB3DslO5B,C2DtlOI,aAAwB,wB3D0lO5B,C2D1lOI,mBAAwB,8B3D8lO5B,C2D9lOI,YAAwB,uB3DkmO5B,C2DlmOI,YAAwB,uB3DsmO5B,C2DtmOI,gBAAwB,2B3D0mO5B,C2D1mOI,iBAAwB,4B3D8mO5B,C2D9mOI,WAAwB,sB3DknO5B,C2DlnOI,kBAAwB,6B3DsnO5B,CACF,CctkOI,yB6CjDE,WAAwB,sB3D4nO5B,C2D5nOI,aAAwB,wB3DgoO5B,C2DhoOI,mBAAwB,8B3DooO5B,C2DpoOI,YAAwB,uB3DwoO5B,C2DxoOI,YAAwB,uB3D4oO5B,C2D5oOI,gBAAwB,2B3DgpO5B,C2DhpOI,iBAAwB,4B3DopO5B,C2DppOI,WAAwB,sB3DwpO5B,C2DxpOI,kBAAwB,6B3D4pO5B,CACF,Cc5mOI,yB6CjDE,WAAwB,sB3DkqO5B,C2DlqOI,aAAwB,wB3DsqO5B,C2DtqOI,mBAAwB,8B3D0qO5B,C2D1qOI,YAAwB,uB3D8qO5B,C2D9qOI,YAAwB,uB3DkrO5B,C2DlrOI,gBAAwB,2B3DsrO5B,C2DtrOI,iBAAwB,4B3D0rO5B,C2D1rOI,WAAwB,sB3D8rO5B,C2D9rOI,kBAAwB,6B3DksO5B,CACF,CclpOI,0B6CjDE,WAAwB,sB3DwsO5B,C2DxsOI,aAAwB,wB3D4sO5B,C2D5sOI,mBAAwB,8B3DgtO5B,C2DhtOI,YAAwB,uB3DotO5B,C2DptOI,YAAwB,uB3DwtO5B,C2DxtOI,gBAAwB,2B3D4tO5B,C2D5tOI,iBAAwB,4B3DguO5B,C2DhuOI,WAAwB,sB3DouO5B,C2DpuOI,kBAAwB,6B3DwuO5B,CACF,C2D/tOA,aAEI,cAAqB,sB3DkuOvB,C2DluOE,gBAAqB,wB3DsuOvB,C2DtuOE,sBAAqB,8B3D0uOvB,C2D1uOE,eAAqB,uB3D8uOvB,C2D9uOE,eAAqB,uB3DkvOvB,C2DlvOE,mBAAqB,2B3DsvOvB,C2DtvOE,oBAAqB,4B3D0vOvB,C2D1vOE,cAAqB,sB3D8vOvB,C2D9vOE,qBAAqB,6B3DkwOvB,CACF,C4DxxOA,kBACE,kBACA,cACA,WACA,UACA,e5D2xOF,C4DzxOE,yBACE,cACA,U5D4xOJ,C4DzxOE,2IAKE,kBACA,MACA,SACA,OACA,WACA,YACA,Q5D4xOJ,C4DnxOI,+BACE,0B5DsxON,C4DvxOI,+BACE,kB5D0xON,C4D3xOI,8BACE,e5D8xON,C4D/xOI,8BACE,gB5DkyON,C6D3zOI,UAAgC,4B7D+zOpC,C6D9zOI,aAAgC,+B7Dk0OpC,C6Dj0OI,kBAAgC,oC7Dq0OpC,C6Dp0OI,qBAAgC,uC7Dw0OpC,C6Dt0OI,WAA8B,wB7D00OlC,C6Dz0OI,aAA8B,0B7D60OlC,C6D50OI,mBAA8B,gC7Dg1OlC,C6D/0OI,WAA8B,uB7Dm1OlC,C6Dl1OI,aAA8B,qB7Ds1OlC,C6Dr1OI,aAA8B,qB7Dy1OlC,C6Dx1OI,eAA8B,uB7D41OlC,C6D31OI,eAA8B,uB7D+1OlC,C6D71OI,uBAAoC,oC7Di2OxC,C6Dh2OI,qBAAoC,kC7Do2OxC,C6Dn2OI,wBAAoC,gC7Du2OxC,C6Dt2OI,yBAAoC,uC7D02OxC,C6Dz2OI,wBAAoC,sC7D62OxC,C6D32OI,mBAAiC,gC7D+2OrC,C6D92OI,iBAAiC,8B7Dk3OrC,C6Dj3OI,oBAAiC,4B7Dq3OrC,C6Dp3OI,sBAAiC,8B7Dw3OrC,C6Dv3OI,qBAAiC,6B7D23OrC,C6Dz3OI,qBAAkC,kC7D63OtC,C6D53OI,mBAAkC,gC7Dg4OtC,C6D/3OI,sBAAkC,8B7Dm4OtC,C6Dl4OI,uBAAkC,qC7Ds4OtC,C6Dr4OI,sBAAkC,oC7Dy4OtC,C6Dx4OI,uBAAkC,+B7D44OtC,C6D14OI,iBAAgC,yB7D84OpC,C6D74OI,kBAAgC,+B7Di5OpC,C6Dh5OI,gBAAgC,6B7Do5OpC,C6Dn5OI,mBAAgC,2B7Du5OpC,C6Dt5OI,qBAAgC,6B7D05OpC,C6Dz5OI,oBAAgC,4B7D65OpC,Ccj5OI,yB+ClDA,aAAgC,4B7Dw8OlC,C6Dv8OE,gBAAgC,+B7D28OlC,C6D18OE,qBAAgC,oC7D88OlC,C6D78OE,wBAAgC,uC7Di9OlC,C6D/8OE,cAA8B,wB7Dm9OhC,C6Dl9OE,gBAA8B,0B7Ds9OhC,C6Dr9OE,sBAA8B,gC7Dy9OhC,C6Dx9OE,cAA8B,uB7D49OhC,C6D39OE,gBAA8B,qB7D+9OhC,C6D99OE,gBAA8B,qB7Dk+OhC,C6Dj+OE,kBAA8B,uB7Dq+OhC,C6Dp+OE,kBAA8B,uB7Dw+OhC,C6Dt+OE,0BAAoC,oC7D0+OtC,C6Dz+OE,wBAAoC,kC7D6+OtC,C6D5+OE,2BAAoC,gC7Dg/OtC,C6D/+OE,4BAAoC,uC7Dm/OtC,C6Dl/OE,2BAAoC,sC7Ds/OtC,C6Dp/OE,sBAAiC,gC7Dw/OnC,C6Dv/OE,oBAAiC,8B7D2/OnC,C6D1/OE,uBAAiC,4B7D8/OnC,C6D7/OE,yBAAiC,8B7DigPnC,C6DhgPE,wBAAiC,6B7DogPnC,C6DlgPE,wBAAkC,kC7DsgPpC,C6DrgPE,sBAAkC,gC7DygPpC,C6DxgPE,yBAAkC,8B7D4gPpC,C6D3gPE,0BAAkC,qC7D+gPpC,C6D9gPE,yBAAkC,oC7DkhPpC,C6DjhPE,0BAAkC,+B7DqhPpC,C6DnhPE,oBAAgC,yB7DuhPlC,C6DthPE,qBAAgC,+B7D0hPlC,C6DzhPE,mBAAgC,6B7D6hPlC,C6D5hPE,sBAAgC,2B7DgiPlC,C6D/hPE,wBAAgC,6B7DmiPlC,C6DliPE,uBAAgC,4B7DsiPlC,CACF,Cc3hPI,yB+ClDA,aAAgC,4B7DklPlC,C6DjlPE,gBAAgC,+B7DqlPlC,C6DplPE,qBAAgC,oC7DwlPlC,C6DvlPE,wBAAgC,uC7D2lPlC,C6DzlPE,cAA8B,wB7D6lPhC,C6D5lPE,gBAA8B,0B7DgmPhC,C6D/lPE,sBAA8B,gC7DmmPhC,C6DlmPE,cAA8B,uB7DsmPhC,C6DrmPE,gBAA8B,qB7DymPhC,C6DxmPE,gBAA8B,qB7D4mPhC,C6D3mPE,kBAA8B,uB7D+mPhC,C6D9mPE,kBAA8B,uB7DknPhC,C6DhnPE,0BAAoC,oC7DonPtC,C6DnnPE,wBAAoC,kC7DunPtC,C6DtnPE,2BAAoC,gC7D0nPtC,C6DznPE,4BAAoC,uC7D6nPtC,C6D5nPE,2BAAoC,sC7DgoPtC,C6D9nPE,sBAAiC,gC7DkoPnC,C6DjoPE,oBAAiC,8B7DqoPnC,C6DpoPE,uBAAiC,4B7DwoPnC,C6DvoPE,yBAAiC,8B7D2oPnC,C6D1oPE,wBAAiC,6B7D8oPnC,C6D5oPE,wBAAkC,kC7DgpPpC,C6D/oPE,sBAAkC,gC7DmpPpC,C6DlpPE,yBAAkC,8B7DspPpC,C6DrpPE,0BAAkC,qC7DypPpC,C6DxpPE,yBAAkC,oC7D4pPpC,C6D3pPE,0BAAkC,+B7D+pPpC,C6D7pPE,oBAAgC,yB7DiqPlC,C6DhqPE,qBAAgC,+B7DoqPlC,C6DnqPE,mBAAgC,6B7DuqPlC,C6DtqPE,sBAAgC,2B7D0qPlC,C6DzqPE,wBAAgC,6B7D6qPlC,C6D5qPE,uBAAgC,4B7DgrPlC,CACF,CcrqPI,yB+ClDA,aAAgC,4B7D4tPlC,C6D3tPE,gBAAgC,+B7D+tPlC,C6D9tPE,qBAAgC,oC7DkuPlC,C6DjuPE,wBAAgC,uC7DquPlC,C6DnuPE,cAA8B,wB7DuuPhC,C6DtuPE,gBAA8B,0B7D0uPhC,C6DzuPE,sBAA8B,gC7D6uPhC,C6D5uPE,cAA8B,uB7DgvPhC,C6D/uPE,gBAA8B,qB7DmvPhC,C6DlvPE,gBAA8B,qB7DsvPhC,C6DrvPE,kBAA8B,uB7DyvPhC,C6DxvPE,kBAA8B,uB7D4vPhC,C6D1vPE,0BAAoC,oC7D8vPtC,C6D7vPE,wBAAoC,kC7DiwPtC,C6DhwPE,2BAAoC,gC7DowPtC,C6DnwPE,4BAAoC,uC7DuwPtC,C6DtwPE,2BAAoC,sC7D0wPtC,C6DxwPE,sBAAiC,gC7D4wPnC,C6D3wPE,oBAAiC,8B7D+wPnC,C6D9wPE,uBAAiC,4B7DkxPnC,C6DjxPE,yBAAiC,8B7DqxPnC,C6DpxPE,wBAAiC,6B7DwxPnC,C6DtxPE,wBAAkC,kC7D0xPpC,C6DzxPE,sBAAkC,gC7D6xPpC,C6D5xPE,yBAAkC,8B7DgyPpC,C6D/xPE,0BAAkC,qC7DmyPpC,C6DlyPE,yBAAkC,oC7DsyPpC,C6DryPE,0BAAkC,+B7DyyPpC,C6DvyPE,oBAAgC,yB7D2yPlC,C6D1yPE,qBAAgC,+B7D8yPlC,C6D7yPE,mBAAgC,6B7DizPlC,C6DhzPE,sBAAgC,2B7DozPlC,C6DnzPE,wBAAgC,6B7DuzPlC,C6DtzPE,uBAAgC,4B7D0zPlC,CACF,Cc/yPI,0B+ClDA,aAAgC,4B7Ds2PlC,C6Dr2PE,gBAAgC,+B7Dy2PlC,C6Dx2PE,qBAAgC,oC7D42PlC,C6D32PE,wBAAgC,uC7D+2PlC,C6D72PE,cAA8B,wB7Di3PhC,C6Dh3PE,gBAA8B,0B7Do3PhC,C6Dn3PE,sBAA8B,gC7Du3PhC,C6Dt3PE,cAA8B,uB7D03PhC,C6Dz3PE,gBAA8B,qB7D63PhC,C6D53PE,gBAA8B,qB7Dg4PhC,C6D/3PE,kBAA8B,uB7Dm4PhC,C6Dl4PE,kBAA8B,uB7Ds4PhC,C6Dp4PE,0BAAoC,oC7Dw4PtC,C6Dv4PE,wBAAoC,kC7D24PtC,C6D14PE,2BAAoC,gC7D84PtC,C6D74PE,4BAAoC,uC7Di5PtC,C6Dh5PE,2BAAoC,sC7Do5PtC,C6Dl5PE,sBAAiC,gC7Ds5PnC,C6Dr5PE,oBAAiC,8B7Dy5PnC,C6Dx5PE,uBAAiC,4B7D45PnC,C6D35PE,yBAAiC,8B7D+5PnC,C6D95PE,wBAAiC,6B7Dk6PnC,C6Dh6PE,wBAAkC,kC7Do6PpC,C6Dn6PE,sBAAkC,gC7Du6PpC,C6Dt6PE,yBAAkC,8B7D06PpC,C6Dz6PE,0BAAkC,qC7D66PpC,C6D56PE,yBAAkC,oC7Dg7PpC,C6D/6PE,0BAAkC,+B7Dm7PpC,C6Dj7PE,oBAAgC,yB7Dq7PlC,C6Dp7PE,qBAAgC,+B7Dw7PlC,C6Dv7PE,mBAAgC,6B7D27PlC,C6D17PE,sBAAgC,2B7D87PlC,C6D77PE,wBAAgC,6B7Di8PlC,C6Dh8PE,uBAAgC,4B7Do8PlC,CACF,C8D/+PI,YAAwB,oB9Dm/P5B,C8Dl/PI,aAAwB,qB9Ds/P5B,C8Dr/PI,YAAwB,oB9Dy/P5B,Ccr8PI,yBgDtDA,eAAwB,oB9DggQ1B,C8D//PE,gBAAwB,qB9DmgQ1B,C8DlgQE,eAAwB,oB9DsgQ1B,CACF,Ccn9PI,yBgDtDA,eAAwB,oB9D8gQ1B,C8D7gQE,gBAAwB,qB9DihQ1B,C8DhhQE,eAAwB,oB9DohQ1B,CACF,Ccj+PI,yBgDtDA,eAAwB,oB9D4hQ1B,C8D3hQE,gBAAwB,qB9D+hQ1B,C8D9hQE,eAAwB,oB9DkiQ1B,CACF,Cc/+PI,0BgDtDA,eAAwB,oB9D0iQ1B,C8DziQE,gBAAwB,qB9D6iQ1B,C8D5iQE,eAAwB,oB9DgjQ1B,CACF,C+DtjQE,iBAAyB,wH/D0jQ3B,C+D1jQE,kBAAyB,4H/D8jQ3B,C+D9jQE,kBAAyB,4H/DkkQ3B,CgElkQE,eAAsB,uBhEskQxB,CgEtkQE,iBAAsB,yBhE0kQxB,CiEzkQE,iBAAyB,yBjE6kQ3B,CiE7kQE,mBAAyB,2BjEilQ3B,CiEjlQE,mBAAyB,2BjEqlQ3B,CiErlQE,gBAAyB,wBjEylQ3B,CiEzlQE,iBAAyB,yBjE6lQ3B,CiExlQA,WAEE,KjE8lQF,CiExlQA,yBAPE,eAEA,QACA,OACA,YjEmmQF,CiEhmQA,cAGE,QjE6lQF,CiEvlQE,4BADF,YAEI,gBACA,MACA,YjE2lQF,CACF,CkErnQA,SCEE,kBACA,UACA,WACA,UACA,YACA,gBACA,mBACA,mBACA,QnEunQF,CmE7mQE,mDAEE,gBACA,WACA,YACA,iBACA,UACA,kBnEgnQJ,CoE7oQA,WAAa,sDpEipQb,CoEhpQA,QAAU,iDpEopQV,CoEnpQA,WAAa,iDpEupQb,CoEtpQA,aAAe,yBpE0pQf,CqEzpQI,MAAuB,mBrE6pQ3B,CqE7pQI,MAAuB,mBrEiqQ3B,CqEjqQI,MAAuB,mBrEqqQ3B,CqErqQI,OAAuB,oBrEyqQ3B,CqEzqQI,QAAuB,oBrE6qQ3B,CqE7qQI,MAAuB,oBrEirQ3B,CqEjrQI,MAAuB,oBrEqrQ3B,CqErrQI,MAAuB,oBrEyrQ3B,CqEzrQI,OAAuB,qBrE6rQ3B,CqE7rQI,QAAuB,qBrEisQ3B,CqE7rQA,QAAU,wBrEisQV,CqEhsQA,QAAU,yBrEosQV,CqEhsQA,YAAc,yBrEosQd,CqEnsQA,YAAc,0BrEusQd,CqErsQA,QAAU,qBrEysQV,CqExsQA,QAAU,sBrE4sQV,CsErtQQ,KAAgC,kBtEytQxC,CsExtQQ,YAEE,sBtE2tQV,CsEztQQ,YAEE,wBtE4tQV,CsE1tQQ,YAEE,yBtE6tQV,CsE3tQQ,YAEE,uBtE8tQV,CsE7uQQ,KAAgC,uBtEivQxC,CsEhvQQ,YAEE,2BtEmvQV,CsEjvQQ,YAEE,6BtEovQV,CsElvQQ,YAEE,8BtEqvQV,CsEnvQQ,YAEE,4BtEsvQV,CsErwQQ,KAAgC,sBtEywQxC,CsExwQQ,YAEE,0BtE2wQV,CsEzwQQ,YAEE,4BtE4wQV,CsE1wQQ,YAEE,6BtE6wQV,CsE3wQQ,YAEE,2BtE8wQV,CsE7xQQ,KAAgC,qBtEiyQxC,CsEhyQQ,YAEE,yBtEmyQV,CsEjyQQ,YAEE,2BtEoyQV,CsElyQQ,YAEE,4BtEqyQV,CsEnyQQ,YAEE,0BtEsyQV,CsErzQQ,KAAgC,uBtEyzQxC,CsExzQQ,YAEE,2BtE2zQV,CsEzzQQ,YAEE,6BtE4zQV,CsE1zQQ,YAEE,8BtE6zQV,CsE3zQQ,YAEE,4BtE8zQV,CsE70QQ,KAAgC,qBtEi1QxC,CsEh1QQ,YAEE,yBtEm1QV,CsEj1QQ,YAEE,2BtEo1QV,CsEl1QQ,YAEE,4BtEq1QV,CsEn1QQ,YAEE,0BtEs1QV,CsEr2QQ,KAAgC,mBtEy2QxC,CsEx2QQ,YAEE,uBtE22QV,CsEz2QQ,YAEE,yBtE42QV,CsE12QQ,YAEE,0BtE62QV,CsE32QQ,YAEE,wBtE82QV,CsE73QQ,KAAgC,wBtEi4QxC,CsEh4QQ,YAEE,4BtEm4QV,CsEj4QQ,YAEE,8BtEo4QV,CsEl4QQ,YAEE,+BtEq4QV,CsEn4QQ,YAEE,6BtEs4QV,CsEr5QQ,KAAgC,uBtEy5QxC,CsEx5QQ,YAEE,2BtE25QV,CsEz5QQ,YAEE,6BtE45QV,CsE15QQ,YAEE,8BtE65QV,CsE35QQ,YAEE,4BtE85QV,CsE76QQ,KAAgC,sBtEi7QxC,CsEh7QQ,YAEE,0BtEm7QV,CsEj7QQ,YAEE,4BtEo7QV,CsEl7QQ,YAEE,6BtEq7QV,CsEn7QQ,YAEE,2BtEs7QV,CsEr8QQ,KAAgC,wBtEy8QxC,CsEx8QQ,YAEE,4BtE28QV,CsEz8QQ,YAEE,8BtE48QV,CsE18QQ,YAEE,+BtE68QV,CsE38QQ,YAEE,6BtE88QV,CsE79QQ,KAAgC,sBtEi+QxC,CsEh+QQ,YAEE,0BtEm+QV,CsEj+QQ,YAEE,4BtEo+QV,CsEl+QQ,YAEE,6BtEq+QV,CsEn+QQ,YAEE,2BtEs+QV,CsE99QQ,MAAwB,wBtEk+QhC,CsEj+QQ,cAEE,4BtEo+QV,CsEl+QQ,cAEE,8BtEq+QV,CsEn+QQ,cAEE,+BtEs+QV,CsEp+QQ,cAEE,6BtEu+QV,CsEt/QQ,MAAwB,uBtE0/QhC,CsEz/QQ,cAEE,2BtE4/QV,CsE1/QQ,cAEE,6BtE6/QV,CsE3/QQ,cAEE,8BtE8/QV,CsE5/QQ,cAEE,4BtE+/QV,CsE9gRQ,MAAwB,sBtEkhRhC,CsEjhRQ,cAEE,0BtEohRV,CsElhRQ,cAEE,4BtEqhRV,CsEnhRQ,cAEE,6BtEshRV,CsEphRQ,cAEE,2BtEuhRV,CsEtiRQ,MAAwB,wBtE0iRhC,CsEziRQ,cAEE,4BtE4iRV,CsE1iRQ,cAEE,8BtE6iRV,CsE3iRQ,cAEE,+BtE8iRV,CsE5iRQ,cAEE,6BtE+iRV,CsE9jRQ,MAAwB,sBtEkkRhC,CsEjkRQ,cAEE,0BtEokRV,CsElkRQ,cAEE,4BtEqkRV,CsEnkRQ,cAEE,6BtEskRV,CsEpkRQ,cAEE,2BtEukRV,CsEjkRI,QAAmB,qBtEqkRvB,CsEpkRI,kBAEE,yBtEukRN,CsErkRI,kBAEE,2BtEwkRN,CsEtkRI,kBAEE,4BtEykRN,CsEvkRI,kBAEE,0BtE0kRN,CcnlRI,yBwDlDI,QAAgC,kBtE0oRtC,CsEzoRM,kBAEE,sBtE4oRR,CsE1oRM,kBAEE,wBtE6oRR,CsE3oRM,kBAEE,yBtE8oRR,CsE5oRM,kBAEE,uBtE+oRR,CsE9pRM,QAAgC,uBtEkqRtC,CsEjqRM,kBAEE,2BtEoqRR,CsElqRM,kBAEE,6BtEqqRR,CsEnqRM,kBAEE,8BtEsqRR,CsEpqRM,kBAEE,4BtEuqRR,CsEtrRM,QAAgC,sBtE0rRtC,CsEzrRM,kBAEE,0BtE4rRR,CsE1rRM,kBAEE,4BtE6rRR,CsE3rRM,kBAEE,6BtE8rRR,CsE5rRM,kBAEE,2BtE+rRR,CsE9sRM,QAAgC,qBtEktRtC,CsEjtRM,kBAEE,yBtEotRR,CsEltRM,kBAEE,2BtEqtRR,CsEntRM,kBAEE,4BtEstRR,CsEptRM,kBAEE,0BtEutRR,CsEtuRM,QAAgC,uBtE0uRtC,CsEzuRM,kBAEE,2BtE4uRR,CsE1uRM,kBAEE,6BtE6uRR,CsE3uRM,kBAEE,8BtE8uRR,CsE5uRM,kBAEE,4BtE+uRR,CsE9vRM,QAAgC,qBtEkwRtC,CsEjwRM,kBAEE,yBtEowRR,CsElwRM,kBAEE,2BtEqwRR,CsEnwRM,kBAEE,4BtEswRR,CsEpwRM,kBAEE,0BtEuwRR,CsEtxRM,QAAgC,mBtE0xRtC,CsEzxRM,kBAEE,uBtE4xRR,CsE1xRM,kBAEE,yBtE6xRR,CsE3xRM,kBAEE,0BtE8xRR,CsE5xRM,kBAEE,wBtE+xRR,CsE9yRM,QAAgC,wBtEkzRtC,CsEjzRM,kBAEE,4BtEozRR,CsElzRM,kBAEE,8BtEqzRR,CsEnzRM,kBAEE,+BtEszRR,CsEpzRM,kBAEE,6BtEuzRR,CsEt0RM,QAAgC,uBtE00RtC,CsEz0RM,kBAEE,2BtE40RR,CsE10RM,kBAEE,6BtE60RR,CsE30RM,kBAEE,8BtE80RR,CsE50RM,kBAEE,4BtE+0RR,CsE91RM,QAAgC,sBtEk2RtC,CsEj2RM,kBAEE,0BtEo2RR,CsEl2RM,kBAEE,4BtEq2RR,CsEn2RM,kBAEE,6BtEs2RR,CsEp2RM,kBAEE,2BtEu2RR,CsEt3RM,QAAgC,wBtE03RtC,CsEz3RM,kBAEE,4BtE43RR,CsE13RM,kBAEE,8BtE63RR,CsE33RM,kBAEE,+BtE83RR,CsE53RM,kBAEE,6BtE+3RR,CsE94RM,QAAgC,sBtEk5RtC,CsEj5RM,kBAEE,0BtEo5RR,CsEl5RM,kBAEE,4BtEq5RR,CsEn5RM,kBAEE,6BtEs5RR,CsEp5RM,kBAEE,2BtEu5RR,CsE/4RM,SAAwB,wBtEm5R9B,CsEl5RM,oBAEE,4BtEq5RR,CsEn5RM,oBAEE,8BtEs5RR,CsEp5RM,oBAEE,+BtEu5RR,CsEr5RM,oBAEE,6BtEw5RR,CsEv6RM,SAAwB,uBtE26R9B,CsE16RM,oBAEE,2BtE66RR,CsE36RM,oBAEE,6BtE86RR,CsE56RM,oBAEE,8BtE+6RR,CsE76RM,oBAEE,4BtEg7RR,CsE/7RM,SAAwB,sBtEm8R9B,CsEl8RM,oBAEE,0BtEq8RR,CsEn8RM,oBAEE,4BtEs8RR,CsEp8RM,oBAEE,6BtEu8RR,CsEr8RM,oBAEE,2BtEw8RR,CsEv9RM,SAAwB,wBtE29R9B,CsE19RM,oBAEE,4BtE69RR,CsE39RM,oBAEE,8BtE89RR,CsE59RM,oBAEE,+BtE+9RR,CsE79RM,oBAEE,6BtEg+RR,CsE/+RM,SAAwB,sBtEm/R9B,CsEl/RM,oBAEE,0BtEq/RR,CsEn/RM,oBAEE,4BtEs/RR,CsEp/RM,oBAEE,6BtEu/RR,CsEr/RM,oBAEE,2BtEw/RR,CsEl/RE,WAAmB,qBtEs/RrB,CsEr/RE,wBAEE,yBtEw/RJ,CsEt/RE,wBAEE,2BtEy/RJ,CsEv/RE,wBAEE,4BtE0/RJ,CsEx/RE,wBAEE,0BtE2/RJ,CACF,CcrgSI,yBwDlDI,QAAgC,kBtE4jStC,CsE3jSM,kBAEE,sBtE8jSR,CsE5jSM,kBAEE,wBtE+jSR,CsE7jSM,kBAEE,yBtEgkSR,CsE9jSM,kBAEE,uBtEikSR,CsEhlSM,QAAgC,uBtEolStC,CsEnlSM,kBAEE,2BtEslSR,CsEplSM,kBAEE,6BtEulSR,CsErlSM,kBAEE,8BtEwlSR,CsEtlSM,kBAEE,4BtEylSR,CsExmSM,QAAgC,sBtE4mStC,CsE3mSM,kBAEE,0BtE8mSR,CsE5mSM,kBAEE,4BtE+mSR,CsE7mSM,kBAEE,6BtEgnSR,CsE9mSM,kBAEE,2BtEinSR,CsEhoSM,QAAgC,qBtEooStC,CsEnoSM,kBAEE,yBtEsoSR,CsEpoSM,kBAEE,2BtEuoSR,CsEroSM,kBAEE,4BtEwoSR,CsEtoSM,kBAEE,0BtEyoSR,CsExpSM,QAAgC,uBtE4pStC,CsE3pSM,kBAEE,2BtE8pSR,CsE5pSM,kBAEE,6BtE+pSR,CsE7pSM,kBAEE,8BtEgqSR,CsE9pSM,kBAEE,4BtEiqSR,CsEhrSM,QAAgC,qBtEorStC,CsEnrSM,kBAEE,yBtEsrSR,CsEprSM,kBAEE,2BtEurSR,CsErrSM,kBAEE,4BtEwrSR,CsEtrSM,kBAEE,0BtEyrSR,CsExsSM,QAAgC,mBtE4sStC,CsE3sSM,kBAEE,uBtE8sSR,CsE5sSM,kBAEE,yBtE+sSR,CsE7sSM,kBAEE,0BtEgtSR,CsE9sSM,kBAEE,wBtEitSR,CsEhuSM,QAAgC,wBtEouStC,CsEnuSM,kBAEE,4BtEsuSR,CsEpuSM,kBAEE,8BtEuuSR,CsEruSM,kBAEE,+BtEwuSR,CsEtuSM,kBAEE,6BtEyuSR,CsExvSM,QAAgC,uBtE4vStC,CsE3vSM,kBAEE,2BtE8vSR,CsE5vSM,kBAEE,6BtE+vSR,CsE7vSM,kBAEE,8BtEgwSR,CsE9vSM,kBAEE,4BtEiwSR,CsEhxSM,QAAgC,sBtEoxStC,CsEnxSM,kBAEE,0BtEsxSR,CsEpxSM,kBAEE,4BtEuxSR,CsErxSM,kBAEE,6BtEwxSR,CsEtxSM,kBAEE,2BtEyxSR,CsExySM,QAAgC,wBtE4yStC,CsE3ySM,kBAEE,4BtE8ySR,CsE5ySM,kBAEE,8BtE+ySR,CsE7ySM,kBAEE,+BtEgzSR,CsE9ySM,kBAEE,6BtEizSR,CsEh0SM,QAAgC,sBtEo0StC,CsEn0SM,kBAEE,0BtEs0SR,CsEp0SM,kBAEE,4BtEu0SR,CsEr0SM,kBAEE,6BtEw0SR,CsEt0SM,kBAEE,2BtEy0SR,CsEj0SM,SAAwB,wBtEq0S9B,CsEp0SM,oBAEE,4BtEu0SR,CsEr0SM,oBAEE,8BtEw0SR,CsEt0SM,oBAEE,+BtEy0SR,CsEv0SM,oBAEE,6BtE00SR,CsEz1SM,SAAwB,uBtE61S9B,CsE51SM,oBAEE,2BtE+1SR,CsE71SM,oBAEE,6BtEg2SR,CsE91SM,oBAEE,8BtEi2SR,CsE/1SM,oBAEE,4BtEk2SR,CsEj3SM,SAAwB,sBtEq3S9B,CsEp3SM,oBAEE,0BtEu3SR,CsEr3SM,oBAEE,4BtEw3SR,CsEt3SM,oBAEE,6BtEy3SR,CsEv3SM,oBAEE,2BtE03SR,CsEz4SM,SAAwB,wBtE64S9B,CsE54SM,oBAEE,4BtE+4SR,CsE74SM,oBAEE,8BtEg5SR,CsE94SM,oBAEE,+BtEi5SR,CsE/4SM,oBAEE,6BtEk5SR,CsEj6SM,SAAwB,sBtEq6S9B,CsEp6SM,oBAEE,0BtEu6SR,CsEr6SM,oBAEE,4BtEw6SR,CsEt6SM,oBAEE,6BtEy6SR,CsEv6SM,oBAEE,2BtE06SR,CsEp6SE,WAAmB,qBtEw6SrB,CsEv6SE,wBAEE,yBtE06SJ,CsEx6SE,wBAEE,2BtE26SJ,CsEz6SE,wBAEE,4BtE46SJ,CsE16SE,wBAEE,0BtE66SJ,CACF,Ccv7SI,yBwDlDI,QAAgC,kBtE8+StC,CsE7+SM,kBAEE,sBtEg/SR,CsE9+SM,kBAEE,wBtEi/SR,CsE/+SM,kBAEE,yBtEk/SR,CsEh/SM,kBAEE,uBtEm/SR,CsElgTM,QAAgC,uBtEsgTtC,CsErgTM,kBAEE,2BtEwgTR,CsEtgTM,kBAEE,6BtEygTR,CsEvgTM,kBAEE,8BtE0gTR,CsExgTM,kBAEE,4BtE2gTR,CsE1hTM,QAAgC,sBtE8hTtC,CsE7hTM,kBAEE,0BtEgiTR,CsE9hTM,kBAEE,4BtEiiTR,CsE/hTM,kBAEE,6BtEkiTR,CsEhiTM,kBAEE,2BtEmiTR,CsEljTM,QAAgC,qBtEsjTtC,CsErjTM,kBAEE,yBtEwjTR,CsEtjTM,kBAEE,2BtEyjTR,CsEvjTM,kBAEE,4BtE0jTR,CsExjTM,kBAEE,0BtE2jTR,CsE1kTM,QAAgC,uBtE8kTtC,CsE7kTM,kBAEE,2BtEglTR,CsE9kTM,kBAEE,6BtEilTR,CsE/kTM,kBAEE,8BtEklTR,CsEhlTM,kBAEE,4BtEmlTR,CsElmTM,QAAgC,qBtEsmTtC,CsErmTM,kBAEE,yBtEwmTR,CsEtmTM,kBAEE,2BtEymTR,CsEvmTM,kBAEE,4BtE0mTR,CsExmTM,kBAEE,0BtE2mTR,CsE1nTM,QAAgC,mBtE8nTtC,CsE7nTM,kBAEE,uBtEgoTR,CsE9nTM,kBAEE,yBtEioTR,CsE/nTM,kBAEE,0BtEkoTR,CsEhoTM,kBAEE,wBtEmoTR,CsElpTM,QAAgC,wBtEspTtC,CsErpTM,kBAEE,4BtEwpTR,CsEtpTM,kBAEE,8BtEypTR,CsEvpTM,kBAEE,+BtE0pTR,CsExpTM,kBAEE,6BtE2pTR,CsE1qTM,QAAgC,uBtE8qTtC,CsE7qTM,kBAEE,2BtEgrTR,CsE9qTM,kBAEE,6BtEirTR,CsE/qTM,kBAEE,8BtEkrTR,CsEhrTM,kBAEE,4BtEmrTR,CsElsTM,QAAgC,sBtEssTtC,CsErsTM,kBAEE,0BtEwsTR,CsEtsTM,kBAEE,4BtEysTR,CsEvsTM,kBAEE,6BtE0sTR,CsExsTM,kBAEE,2BtE2sTR,CsE1tTM,QAAgC,wBtE8tTtC,CsE7tTM,kBAEE,4BtEguTR,CsE9tTM,kBAEE,8BtEiuTR,CsE/tTM,kBAEE,+BtEkuTR,CsEhuTM,kBAEE,6BtEmuTR,CsElvTM,QAAgC,sBtEsvTtC,CsErvTM,kBAEE,0BtEwvTR,CsEtvTM,kBAEE,4BtEyvTR,CsEvvTM,kBAEE,6BtE0vTR,CsExvTM,kBAEE,2BtE2vTR,CsEnvTM,SAAwB,wBtEuvT9B,CsEtvTM,oBAEE,4BtEyvTR,CsEvvTM,oBAEE,8BtE0vTR,CsExvTM,oBAEE,+BtE2vTR,CsEzvTM,oBAEE,6BtE4vTR,CsE3wTM,SAAwB,uBtE+wT9B,CsE9wTM,oBAEE,2BtEixTR,CsE/wTM,oBAEE,6BtEkxTR,CsEhxTM,oBAEE,8BtEmxTR,CsEjxTM,oBAEE,4BtEoxTR,CsEnyTM,SAAwB,sBtEuyT9B,CsEtyTM,oBAEE,0BtEyyTR,CsEvyTM,oBAEE,4BtE0yTR,CsExyTM,oBAEE,6BtE2yTR,CsEzyTM,oBAEE,2BtE4yTR,CsE3zTM,SAAwB,wBtE+zT9B,CsE9zTM,oBAEE,4BtEi0TR,CsE/zTM,oBAEE,8BtEk0TR,CsEh0TM,oBAEE,+BtEm0TR,CsEj0TM,oBAEE,6BtEo0TR,CsEn1TM,SAAwB,sBtEu1T9B,CsEt1TM,oBAEE,0BtEy1TR,CsEv1TM,oBAEE,4BtE01TR,CsEx1TM,oBAEE,6BtE21TR,CsEz1TM,oBAEE,2BtE41TR,CsEt1TE,WAAmB,qBtE01TrB,CsEz1TE,wBAEE,yBtE41TJ,CsE11TE,wBAEE,2BtE61TJ,CsE31TE,wBAEE,4BtE81TJ,CsE51TE,wBAEE,0BtE+1TJ,CACF,Ccz2TI,0BwDlDI,QAAgC,kBtEg6TtC,CsE/5TM,kBAEE,sBtEk6TR,CsEh6TM,kBAEE,wBtEm6TR,CsEj6TM,kBAEE,yBtEo6TR,CsEl6TM,kBAEE,uBtEq6TR,CsEp7TM,QAAgC,uBtEw7TtC,CsEv7TM,kBAEE,2BtE07TR,CsEx7TM,kBAEE,6BtE27TR,CsEz7TM,kBAEE,8BtE47TR,CsE17TM,kBAEE,4BtE67TR,CsE58TM,QAAgC,sBtEg9TtC,CsE/8TM,kBAEE,0BtEk9TR,CsEh9TM,kBAEE,4BtEm9TR,CsEj9TM,kBAEE,6BtEo9TR,CsEl9TM,kBAEE,2BtEq9TR,CsEp+TM,QAAgC,qBtEw+TtC,CsEv+TM,kBAEE,yBtE0+TR,CsEx+TM,kBAEE,2BtE2+TR,CsEz+TM,kBAEE,4BtE4+TR,CsE1+TM,kBAEE,0BtE6+TR,CsE5/TM,QAAgC,uBtEggUtC,CsE//TM,kBAEE,2BtEkgUR,CsEhgUM,kBAEE,6BtEmgUR,CsEjgUM,kBAEE,8BtEogUR,CsElgUM,kBAEE,4BtEqgUR,CsEphUM,QAAgC,qBtEwhUtC,CsEvhUM,kBAEE,yBtE0hUR,CsExhUM,kBAEE,2BtE2hUR,CsEzhUM,kBAEE,4BtE4hUR,CsE1hUM,kBAEE,0BtE6hUR,CsE5iUM,QAAgC,mBtEgjUtC,CsE/iUM,kBAEE,uBtEkjUR,CsEhjUM,kBAEE,yBtEmjUR,CsEjjUM,kBAEE,0BtEojUR,CsEljUM,kBAEE,wBtEqjUR,CsEpkUM,QAAgC,wBtEwkUtC,CsEvkUM,kBAEE,4BtE0kUR,CsExkUM,kBAEE,8BtE2kUR,CsEzkUM,kBAEE,+BtE4kUR,CsE1kUM,kBAEE,6BtE6kUR,CsE5lUM,QAAgC,uBtEgmUtC,CsE/lUM,kBAEE,2BtEkmUR,CsEhmUM,kBAEE,6BtEmmUR,CsEjmUM,kBAEE,8BtEomUR,CsElmUM,kBAEE,4BtEqmUR,CsEpnUM,QAAgC,sBtEwnUtC,CsEvnUM,kBAEE,0BtE0nUR,CsExnUM,kBAEE,4BtE2nUR,CsEznUM,kBAEE,6BtE4nUR,CsE1nUM,kBAEE,2BtE6nUR,CsE5oUM,QAAgC,wBtEgpUtC,CsE/oUM,kBAEE,4BtEkpUR,CsEhpUM,kBAEE,8BtEmpUR,CsEjpUM,kBAEE,+BtEopUR,CsElpUM,kBAEE,6BtEqpUR,CsEpqUM,QAAgC,sBtEwqUtC,CsEvqUM,kBAEE,0BtE0qUR,CsExqUM,kBAEE,4BtE2qUR,CsEzqUM,kBAEE,6BtE4qUR,CsE1qUM,kBAEE,2BtE6qUR,CsErqUM,SAAwB,wBtEyqU9B,CsExqUM,oBAEE,4BtE2qUR,CsEzqUM,oBAEE,8BtE4qUR,CsE1qUM,oBAEE,+BtE6qUR,CsE3qUM,oBAEE,6BtE8qUR,CsE7rUM,SAAwB,uBtEisU9B,CsEhsUM,oBAEE,2BtEmsUR,CsEjsUM,oBAEE,6BtEosUR,CsElsUM,oBAEE,8BtEqsUR,CsEnsUM,oBAEE,4BtEssUR,CsErtUM,SAAwB,sBtEytU9B,CsExtUM,oBAEE,0BtE2tUR,CsEztUM,oBAEE,4BtE4tUR,CsE1tUM,oBAEE,6BtE6tUR,CsE3tUM,oBAEE,2BtE8tUR,CsE7uUM,SAAwB,wBtEivU9B,CsEhvUM,oBAEE,4BtEmvUR,CsEjvUM,oBAEE,8BtEovUR,CsElvUM,oBAEE,+BtEqvUR,CsEnvUM,oBAEE,6BtEsvUR,CsErwUM,SAAwB,sBtEywU9B,CsExwUM,oBAEE,0BtE2wUR,CsEzwUM,oBAEE,4BtE4wUR,CsE1wUM,oBAEE,6BtE6wUR,CsE3wUM,oBAEE,2BtE8wUR,CsExwUE,WAAmB,qBtE4wUrB,CsE3wUE,wBAEE,yBtE8wUJ,CsE5wUE,wBAEE,2BtE+wUJ,CsE7wUE,wBAEE,4BtEgxUJ,CsE9wUE,wBAEE,0BtEixUJ,CACF,CuEl1UE,sBACE,kBACA,MACA,QACA,SACA,OACA,UAEA,oBACA,WAEA,4BvEm1UJ,CwE71UA,gBAAkB,gGxEi2UlB,CwE71UA,cAAiB,4BxEi2UjB,CwEh2UA,WAAiB,4BxEo2UjB,CwEn2UA,aAAiB,4BxEu2UjB,CwEt2UA,eCTE,gBACA,uBACA,kBzEm3UF,CwEp2UI,WAAwB,yBxEw2U5B,CwEv2UI,YAAwB,0BxE22U5B,CwE12UI,aAAwB,2BxE82U5B,Ccz0UI,yB0DvCA,cAAwB,yBxEq3U1B,CwEp3UE,eAAwB,0BxEw3U1B,CwEv3UE,gBAAwB,2BxE23U1B,CACF,Ccv1UI,yB0DvCA,cAAwB,yBxEm4U1B,CwEl4UE,eAAwB,0BxEs4U1B,CwEr4UE,gBAAwB,2BxEy4U1B,CACF,Ccr2UI,yB0DvCA,cAAwB,yBxEi5U1B,CwEh5UE,eAAwB,0BxEo5U1B,CwEn5UE,gBAAwB,2BxEu5U1B,CACF,Ccn3UI,0B0DvCA,cAAwB,yBxE+5U1B,CwE95UE,eAAwB,0BxEk6U1B,CwEj6UE,gBAAwB,2BxEq6U1B,CACF,CwEh6UA,gBAAmB,kCxEo6UnB,CwEn6UA,gBAAmB,kCxEu6UnB,CwEt6UA,iBAAmB,mCxE06UnB,CwEt6UA,mBAAuB,yBxE06UvB,CwEz6UA,qBAAuB,6BxE66UvB,CwE56UA,oBAAuB,yBxEg7UvB,CwE/6UA,kBAAuB,yBxEm7UvB,CwEl7UA,oBAAuB,4BxEs7UvB,CwEr7UA,aAAuB,2BxEy7UvB,C0E59UE,cACE,uB1Em+UJ,CKz9UE,0CqELM,uB1Em+UR,C0Ez+UE,gBACE,uB1E4+UJ,CKl+UE,8CqELM,uB1E4+UR,C0El/UE,cACE,uB1Eq/UJ,CK3+UE,0CqELM,uB1Eq/UR,C0E3/UE,WACE,uB1E8/UJ,CKp/UE,oCqELM,uB1E8/UR,C0EpgVE,cACE,uB1EugVJ,CK7/UE,0CqELM,uB1EugVR,C0E7gVE,aACE,uB1EghVJ,CKtgVE,wCqELM,uB1EghVR,C0EthVE,YACE,uB1EyhVJ,CK/gVE,sCqELM,uB1EyhVR,C0E/hVE,WACE,uB1EkiVJ,CKxhVE,oCqELM,uB1EkiVR,CwE3/UA,WAAa,uBxE+/Ub,CwE9/UA,YAAc,uBxEkgVd,CwEhgVA,eAAiB,8BxEogVjB,CwEngVA,eAAiB,kCxEugVjB,CwEngVA,WGvDE,WACA,kBACA,iBACA,6BACA,Q3E8jVF,CwEvgVA,sBAAwB,8BxE2gVxB,CwEzgVA,YACE,gCACA,8BxE4gVF,CwEvgVA,YAAc,uBxE2gVd,C4E5kVA,SACE,4B5E+kVF,C4E5kVA,WACE,2B5E+kVF,C6E/kVE,aACE,iBAKE,2BAEA,yB7E+kVJ,C6E3kVI,YACE,yB7E8kVN,C6ErkVE,kBACE,4B7EwkVJ,C6E1jVE,IACE,8B7E6jVJ,C6E3jVE,eAEE,yBACA,uB7E8jVJ,C6EtjVE,MACE,0B7EyjVJ,C6EtjVE,OAEE,uB7EyjVJ,C6EtjVE,QAGE,UACA,Q7EyjVJ,C6EtjVE,MAEE,sB7EyjVJ,C6EjjVE,MACE,O7EojVN,C6E/iVI,gBACE,yB7EsjVJ,C6EljVE,QACE,Y7EqjVJ,C6EnjVE,OACE,qB7EsjVJ,C6EnjVE,OACE,kC7EsjVJ,C6EpjVI,oBAEE,+B7EujVN,C6EljVI,sCAEE,kC7EqjVN,C6EjjVE,YACE,a7EojVJ,C6EljVI,2EAIE,oB7EqjVN,C6EjjVE,sBACE,cACA,oB7EojVJ,CACF;;A8E5rVA;;;;;;;;;;;;;;;;;;GCIA,mBACE,sB/E+sVF,C+E5sVA,mBAGE,e/E+sVF,C+E5sVA,SACE,iB/E+sVF,C+E7sVE,0BACE,mC/EgtVJ,C+E7sVE,uBrELI,gCVstVN,C+E9sVI,qDAEE,cACA,gB/EitVN,C+E9sVI,qCACE,Y/EitVN,C+E7sVE,2CACE,gCACE,iC/EgtVJ,C+E9sVE,wCACE,qC/EitVJ,CACF,C+EzsVI,iFACE,0B/EgtVN,C+EzsVI,wEACE,iC/EgtVN,C+EhsVI,mJACE,0BACA,Y/E4sVN,C+ElsVI,sUACE,6B/E2sVN,C+EvqVM,8DACE,iCACA,W/E4rVR,C+EhqVI,oEACE,iC/EgvVN,C+E7uVI,2CAKE,Y/EgvVN,C+E5sVQ,4DACE,sB/EouVV,C+EjuVQ,mKAEE,0B/EouVV,C+EjuVQ,oDACE,6B/EouVV,C+EjuVQ,iJAEE,iC/EouVV,C+E/tVQ,oEACE,0B/EkuVV,C+E/tVQ,4DACE,iC/EkuVV,C+E7tVQ,+CACE,K/EguVV,C+E7tVQ,uCACE,cACA,kBACA,wB/EguVV,C+E5tVU,2DACE,0BACA,iCACA,Y/E+tVZ,C+E7tVY,uIAEE,6B/EguVd,C+EptVQ,yHANM,iCACA,W/EuuVd,C+EluVQ,0CACE,gBACA,eACA,MAGA,Y/E4tVV,C+EvtVU,qFACE,wB/E0tVZ,C+EvtVU,sFACE,qB/E0tVZ,C+E/tVU,uFACE,wB/EkuVZ,C+E/tVU,wFACE,qB/EkuVZ,C+EvuVU,qFACE,wB/E0uVZ,C+EvuVU,sFACE,qB/E0uVZ,C+E/uVU,kFACE,wB/EkvVZ,C+E/uVU,mFACE,qB/EkvVZ,C+EvvVU,qFACE,wB/E0vVZ,C+EvvVU,sFACE,qB/E0vVZ,C+E/vVU,oFACE,wB/EkwVZ,C+E/vVU,qFACE,qB/EkwVZ,C+EvwVU,mFACE,wB/E0wVZ,C+EvwVU,oFACE,qB/E0wVZ,C+E/wVU,kFACE,wB/EkxVZ,C+E/wVU,mFACE,qB/EkxVZ,C+E9wVQ,+CACE,6B/EixVV,C+E9wVQ,yIAEE,iC/EixVV,C+E9wVQ,2CACE,OACA,eACA,QACA,MACA,Y/EixVV,C+E5wVQ,uDACE,iC/E+wVV,C+EhwVQ,2EACE,mC/EmwVV,C+EjwVU,oFACE,iC/EowVZ,C+E9vVQ,8CACE,e/EiwVV,C+E9vVQ,8FAEE,Y/EiwVV,C+E9vVQ,+CACE,e/EiwVV,C+E5vVQ,wDACE,Y/E+vVV,CcthWI,yBiE0II,+DACE,sB/Eg5VR,C+E74VM,yKAEE,0B/Eg5VR,C+E74VM,uDACE,6B/Eg5VR,C+E74VM,uJAEE,iC/Eg5VR,C+E34VM,uEACE,0B/E84VR,C+E34VM,+DACE,iC/E84VR,C+Ez4VM,kDACE,K/E44VR,C+Ez4VM,0CACE,cACA,kBACA,wB/E44VR,C+Ex4VQ,8DACE,0BACA,iCACA,Y/E24VV,C+Ez4VU,6IAEE,6B/E44VZ,C+Ev4VU,kFACE,iCACA,W/E04VZ,C+Er4VM,6CACE,gBACA,eACA,MACA,iCACA,YACA,Y/Ew4VR,C+En4VQ,wFACE,wB/Es4VV,C+En4VQ,yFACE,qB/Es4VV,C+E34VQ,0FACE,wB/E84VV,C+E34VQ,2FACE,qB/E84VV,C+En5VQ,wFACE,wB/Es5VV,C+En5VQ,yFACE,qB/Es5VV,C+E35VQ,qFACE,wB/E85VV,C+E35VQ,sFACE,qB/E85VV,C+En6VQ,wFACE,wB/Es6VV,C+En6VQ,yFACE,qB/Es6VV,C+E36VQ,uFACE,wB/E86VV,C+E36VQ,wFACE,qB/E86VV,C+En7VQ,sFACE,wB/Es7VV,C+En7VQ,uFACE,qB/Es7VV,C+E37VQ,qFACE,wB/E87VV,C+E37VQ,sFACE,qB/E87VV,C+E17VM,kDACE,6B/E67VR,C+E17VM,+IAEE,iC/E67VR,C+E17VM,8CACE,OACA,eACA,QACA,MACA,Y/E67VR,C+Ex7VM,0DACE,iC/E27VR,C+E56VM,8EACE,mC/E+6VR,C+E76VQ,uFACE,iC/Eg7VV,C+E16VM,iDACE,e/E66VR,C+E16VM,oGAEE,Y/E66VR,C+E16VM,kDACE,e/E66VR,C+Ex6VM,2DACE,Y/E26VR,CACF,CcnsWI,yBiE0II,+DACE,sB/E6jWR,C+E1jWM,yKAEE,0B/E6jWR,C+E1jWM,uDACE,6B/E6jWR,C+E1jWM,uJAEE,iC/E6jWR,C+ExjWM,uEACE,0B/E2jWR,C+ExjWM,+DACE,iC/E2jWR,C+EtjWM,kDACE,K/EyjWR,C+EtjWM,0CACE,cACA,kBACA,wB/EyjWR,C+ErjWQ,8DACE,0BACA,iCACA,Y/EwjWV,C+EtjWU,6IAEE,6B/EyjWZ,C+EpjWU,kFACE,iCACA,W/EujWZ,C+EljWM,6CACE,gBACA,eACA,MACA,iCACA,YACA,Y/EqjWR,C+EhjWQ,wFACE,wB/EmjWV,C+EhjWQ,yFACE,qB/EmjWV,C+ExjWQ,0FACE,wB/E2jWV,C+ExjWQ,2FACE,qB/E2jWV,C+EhkWQ,wFACE,wB/EmkWV,C+EhkWQ,yFACE,qB/EmkWV,C+ExkWQ,qFACE,wB/E2kWV,C+ExkWQ,sFACE,qB/E2kWV,C+EhlWQ,wFACE,wB/EmlWV,C+EhlWQ,yFACE,qB/EmlWV,C+ExlWQ,uFACE,wB/E2lWV,C+ExlWQ,wFACE,qB/E2lWV,C+EhmWQ,sFACE,wB/EmmWV,C+EhmWQ,uFACE,qB/EmmWV,C+ExmWQ,qFACE,wB/E2mWV,C+ExmWQ,sFACE,qB/E2mWV,C+EvmWM,kDACE,6B/E0mWR,C+EvmWM,+IAEE,iC/E0mWR,C+EvmWM,8CACE,OACA,eACA,QACA,MACA,Y/E0mWR,C+ErmWM,0DACE,iC/EwmWR,C+EzlWM,8EACE,mC/E4lWR,C+E1lWQ,uFACE,iC/E6lWV,C+EvlWM,iDACE,e/E0lWR,C+EvlWM,oGAEE,Y/E0lWR,C+EvlWM,kDACE,e/E0lWR,C+ErlWM,2DACE,Y/EwlWR,CACF,Cch3WI,yBiE0II,+DACE,sB/E0uWR,C+EvuWM,yKAEE,0B/E0uWR,C+EvuWM,uDACE,6B/E0uWR,C+EvuWM,uJAEE,iC/E0uWR,C+EruWM,uEACE,0B/EwuWR,C+EruWM,+DACE,iC/EwuWR,C+EnuWM,kDACE,K/EsuWR,C+EnuWM,0CACE,cACA,kBACA,wB/EsuWR,C+EluWQ,8DACE,0BACA,iCACA,Y/EquWV,C+EnuWU,6IAEE,6B/EsuWZ,C+EjuWU,kFACE,iCACA,W/EouWZ,C+E/tWM,6CACE,gBACA,eACA,MACA,iCACA,YACA,Y/EkuWR,C+E7tWQ,wFACE,wB/EguWV,C+E7tWQ,yFACE,qB/EguWV,C+EruWQ,0FACE,wB/EwuWV,C+EruWQ,2FACE,qB/EwuWV,C+E7uWQ,wFACE,wB/EgvWV,C+E7uWQ,yFACE,qB/EgvWV,C+ErvWQ,qFACE,wB/EwvWV,C+ErvWQ,sFACE,qB/EwvWV,C+E7vWQ,wFACE,wB/EgwWV,C+E7vWQ,yFACE,qB/EgwWV,C+ErwWQ,uFACE,wB/EwwWV,C+ErwWQ,wFACE,qB/EwwWV,C+E7wWQ,sFACE,wB/EgxWV,C+E7wWQ,uFACE,qB/EgxWV,C+ErxWQ,qFACE,wB/EwxWV,C+ErxWQ,sFACE,qB/EwxWV,C+EpxWM,kDACE,6B/EuxWR,C+EpxWM,+IAEE,iC/EuxWR,C+EpxWM,8CACE,OACA,eACA,QACA,MACA,Y/EuxWR,C+ElxWM,0DACE,iC/EqxWR,C+EtwWM,8EACE,mC/EywWR,C+EvwWQ,uFACE,iC/E0wWV,C+EpwWM,iDACE,e/EuwWR,C+EpwWM,oGAEE,Y/EuwWR,C+EpwWM,kDACE,e/EuwWR,C+ElwWM,2DACE,Y/EqwWR,CACF,Cc7hXI,0BiE0II,+DACE,sB/Eu5WR,C+Ep5WM,yKAEE,0B/Eu5WR,C+Ep5WM,uDACE,6B/Eu5WR,C+Ep5WM,uJAEE,iC/Eu5WR,C+El5WM,uEACE,0B/Eq5WR,C+El5WM,+DACE,iC/Eq5WR,C+Eh5WM,kDACE,K/Em5WR,C+Eh5WM,0CACE,cACA,kBACA,wB/Em5WR,C+E/4WQ,8DACE,0BACA,iCACA,Y/Ek5WV,C+Eh5WU,6IAEE,6B/Em5WZ,C+E94WU,kFACE,iCACA,W/Ei5WZ,C+E54WM,6CACE,gBACA,eACA,MACA,iCACA,YACA,Y/E+4WR,C+E14WQ,wFACE,wB/E64WV,C+E14WQ,yFACE,qB/E64WV,C+El5WQ,0FACE,wB/Eq5WV,C+El5WQ,2FACE,qB/Eq5WV,C+E15WQ,wFACE,wB/E65WV,C+E15WQ,yFACE,qB/E65WV,C+El6WQ,qFACE,wB/Eq6WV,C+El6WQ,sFACE,qB/Eq6WV,C+E16WQ,wFACE,wB/E66WV,C+E16WQ,yFACE,qB/E66WV,C+El7WQ,uFACE,wB/Eq7WV,C+El7WQ,wFACE,qB/Eq7WV,C+E17WQ,sFACE,wB/E67WV,C+E17WQ,uFACE,qB/E67WV,C+El8WQ,qFACE,wB/Eq8WV,C+El8WQ,sFACE,qB/Eq8WV,C+Ej8WM,kDACE,6B/Eo8WR,C+Ej8WM,+IAEE,iC/Eo8WR,C+Ej8WM,8CACE,OACA,eACA,QACA,MACA,Y/Eo8WR,C+E/7WM,0DACE,iC/Ek8WR,C+En7WM,8EACE,mC/Es7WR,C+Ep7WQ,uFACE,iC/Eu7WV,C+Ej7WM,iDACE,e/Eo7WR,C+Ej7WM,oGAEE,Y/Eo7WR,C+Ej7WM,kDACE,e/Eo7WR,C+E/6WM,2DACE,Y/Ek7WR,CACF,C+Ex5WI,mDACE,e/E26WN,C+En6WQ,+CACE,Q/Es6WV,C+Ej6WQ,2CACE,SACA,OACA,eACA,QACA,Y/Eo6WV,C+Ej6WQ,+CACE,iC/Eo6WV,C+E/5WQ,+CACE,e/Ek6WV,CclvXI,yBiE2TI,kDACE,Q/E27WR,C+Et7WM,8CACE,SACA,OACA,eACA,QACA,Y/Ey7WR,C+Et7WM,kDACE,iC/Ey7WR,C+Ep7WM,kDACE,e/Eu7WR,CACF,CcxwXI,yBiE2TI,kDACE,Q/Ei9WR,C+E58WM,8CACE,SACA,OACA,eACA,QACA,Y/E+8WR,C+E58WM,kDACE,iC/E+8WR,C+E18WM,kDACE,e/E68WR,CACF,Cc9xXI,yBiE2TI,kDACE,Q/Eu+WR,C+El+WM,8CACE,SACA,OACA,eACA,QACA,Y/Eq+WR,C+El+WM,kDACE,iC/Eq+WR,C+Eh+WM,kDACE,e/Em+WR,CACF,CcpzXI,0BiE2TI,kDACE,Q/E6/WR,C+Ex/WM,8CACE,SACA,OACA,eACA,QACA,Y/E2/WR,C+Ex/WM,kDACE,iC/E2/WR,C+Et/WM,kDACE,e/Ey/WR,CACF,C+Ep/WE,yBACE,a/Eu/WJ,C+Ep/WM,mDACE,kBACA,mBACA,W/Eu/WR,C+En/WI,uCACE,eACA,c/Es/WN,C+Et+WI,2lBAEE,a/Em/WN,Ccx2XI,yBiE2XF,4H5DvaI,uC4D6aA,iB/E++WJ,CACF,CmBz5XM,6D4DmaJ,4H5DlaM,enB+5XN,CACF,Ccz3XI,yBiEmYE,kLACE,a/E4/WN,CACF,Ccp3XI,4BiE4XE,6QAEE,a/EggXN,CACF,Cc54XI,yBiEkZF,8F5D9bI,uC4DocA,iB/E4/WJ,CACF,CmB77XM,6D4D0bJ,8F5DzbM,enBm8XN,CACF,Cc75XI,yBiE0ZE,oJACE,kB/EygXN,CACF,Ccx5XI,4BiEmZE,iNAEE,kB/E6gXN,CACF,C+ExgXA,iBACE,kB/E2gXF,C+EzgXE,0BACE,e/E4gXJ,C+EvgXE,mC5D7dI,6D4DieF,W/EygXJ,CmBt+XM,uC4DydJ,mC5DxdM,enB2+XN,CACF,C+E5gXI,yJAEE,yB/E+gXN,C+E1gXI,uEAEE,kB/E6gXN,C+E1gXI,4EACE,S/E6gXN,Cct8XI,4BiE8bA,mCAEE,0BACA,kB/E4gXJ,C+ExgXI,+DAEE,a/E2gXN,CACF,C+ErgXE,kCACE,eACA,gBACA,kBACA,K/EwgXJ,C+EngXE,0BACE,W/EsgXJ,C+EngXE,4BAIE,M/EwgXJ,C+EngXE,2DARE,SACA,WACA,aAEA,eACA,K/E8gXJ,C+EpgXI,wDACE,iC/EugXN,C+ElgXA,uCAEI,4BACE,c/EogXJ,CACF,C+EhgXA,aACE,gBACA,6BACA,cACA,Y/EmgXF,C+EjgXE,2CAEE,e/EogXJ,C+EhgXA,gBACE,kB/EmgXF,C+EjgXE,yBACE,kB/EogXJ,C+EjgXE,mBACE,iBACA,Q/EogXJ,C+ElgXI,4BACE,gB/EqgXN,C+EjgXE,4BACE,uBACA,mBACA,gBACA,S/EogXJ,C+ElgXI,qCACE,kB/EqgXN,C+E7/WE,oOAOE,0BACA,uE/EggXJ,CgFjnYA,aACE,gCACA,YhFonYF,CgFlnYE,uBACE,cACA,iBhFqnYJ,CgFhnYI,+DACE,kBACA,mBhFonYN,CgFlnYM,gcAME,iBhF2nYR,CgFpnYI,mCACE,QhFunYN,CgFnnYM,uDACE,UACA,gBACA,OhFsnYR,CgFpnYQ,4BALF,uDAMI,OACA,UhFwnYR,CACF,CgFjnYA,YACE,4BACA,UhFonYF,CgFhnYA,cACE,gBACA,gBACA,gBACA,kBACA,UACA,OhFmnYF,CgFhnYA,YACE,6BACA,mBhFmnYF,CgFhnYA,qBACE,oBhFmnYF,CgFjnYE,yCACE,ahFonYJ,CgFhnYA,iCAEE,ehFmnYF,CgF/mYE,2DAEE,oCACA,QhFknYJ,CgF9mYI,oDACE,wBhFinYN,CgFlnYI,wDACE,wBhFinYN,CgFlnYI,+CACE,wBhFinYN,CgF9mYI,kEACE,wBhFinYN,CgF7mYM,gHAEE,oCACA,mBACA,ahFgnYR,CgFzmYE,6DAEE,yBACA,QhF4mYJ,CgFxmYI,qDACE,oBhF2mYN,CgF5mYI,yDACE,oBhF2mYN,CgF5mYI,gDACE,oBhF2mYN,CgFxmYI,mEACE,oBhF2mYN,CgFvmYM,kHAEE,yBACA,mBACA,ahF0mYR,CiF3uYA,YAEE,cACA,kBACA,gBACA,uBACA,iCACA,kBjF6uYF,CiF3uYE,kBACE,WACA,oBjF8uYJ,CiF3uYE,qBACE,iBjF8uYJ,CiF3uYE,kCACE,gCACA,wBjF8uYJ,CiF3uYE,mCACE,gCACA,oBjF8uYJ,CiF3uYE,yBACE,WACA,eACA,kBACA,mBACA,gBACA,gBACA,UjF8uYJ,CiF3uYE,4BACE,WACA,eACA,kBACA,gBACA,UjF8uYJ,CiF3uYE,4BACE,eACA,gBACA,UjF8uYJ,CiF5uYI,mCACE,iBjF+uYN,CiFzuYI,mEACE,YACA,sBACA,mBACA,kBjF6uYN,CiF1uYI,yEACE,kBACA,ejF8uYN,CiF3uYI,yEACE,oBACA,ejF+uYN,CkFvzYA,cACE,aACA,kBACA,YlF0zYF,CkFtzYI,+BACE,SACA,YlFyzYN,CkFnzYA,SACE,iCACA,gBAIA,elFszYF,CkFlzYA,YACE,iBlFqzYF,CkFnzYE,kCACE,+BlFszYJ,CkFnzYE,mCACE,+BlFszYJ,CkFnzYE,8BAEE,gBACA,kBlFszYJ,CkFnzYE,mBACE,qBACA,kBlFszYJ,CkFnzYE,gBACE,YACA,YlFszYJ,CkFnzYE,kBACE,qBACA,wBlFszYJ,CkFnzYE,+CAEE,iBlFszYJ,CkF9yYI,iCACE,mBlFizYN,CkF/yYM,wC/D1DA,oCnB62YN,CmBz2YM,uC+DsDA,wC/DrDE,enB62YN,CACF,CkFnzYE,8DAEE,kBACA,WACA,SlFszYJ,CkFpzYI,0IAEE,iBlFyzYN,CkFtzYI,wFACE,YlF0zYN,CkFrzYI,sCACE,alFwzYN,CkFpzYM,0CCnFJ,wBnF24YF,CkFjzYE,uBACE,elFozYJ,CkFlzYI,iCACE,mBACA,iBACA,mBACA,kBACA,YlFqzYN,CkFnzYM,mOAME,gBlFszYR,CkFlzYI,oCACE,clFqzYN,CkFhzYE,2BACE,aACA,gBACA,SlFmzYJ,CkF/yYQ,yDACE,YlFkzYV,CkF3yYI,4CACE,mCACA,iBlF8yYN,CkF5yYM,qDACE,kBlF+yYR,CkFzyYQ,qEACE,kBACA,iBlF4yYV,CkF1yYU,8EACE,kBACA,kBlF6yYZ,CkFtyYE,yBACE,gBACA,alFyyYJ,CkFvyYI,6CACE,yBlF0yYN,CkFtyYE,yBACE,qBACA,oDACA,sDACA,0DACA,QlFyyYJ,CkFryYA,iBAOE,gCACA,SACA,aACA,OACA,eACA,QACA,MACA,YlFkyYF,Ccv6YI,4BoEyHA,+BACE,alFkzYJ,CACF,CkFryYA,wBAEE,qBlFuyYF,CkFnyYI,4CACE,alFsyYN,CkFnyYI,4CACE,0BACA,alFsyYN,CkFpyYM,uJAGE,0BACA,alFuyYR,CkFnyYI,mDxEvNE,oCwEyNA,2BlFsyYN,CkFnyYI,mDACE,alFsyYN,CkF7xYM,+HAEE,alFgyYR,CkF3xYI,kIAEE,gCACA,alF8xYN,CkF3xYI,gEACE,WAGE,8DlF4xYR,CkFvxYI,6DACE,sBlF0xYN,CkFrxYE,oCACE,mBACA,alFwxYJ,CkFnxYI,mCACE,alFsxYN,CkFpxYM,yCACE,oBlFuxYR,CkF/wYM,0DACE,UlFkxYR,CkF9wYQ,wIAEE,gCACA,alFixYV,CkF7wYM,gEACE,+BlFgxYR,CkFjwYY,2OAEE,2BlFwwYd,CkF/vYA,uBAEE,wBlFiwYF,CkF7vYI,2CACE,UlFgwYN,CkF7vYI,2CACE,8BACA,alFgwYN,CkF9vYM,oJAGE,gCACA,UlFiwYR,CkF7vYI,kDxElVE,oCwEoVA,iClFgwYN,CkF7vYI,kDACE,alFgwYN,CkFvvYM,+DACE,alF0vYR,CkFrvYI,8LAGE,oCACA,UlFwvYN,CkFrvYI,+DACE,WAGE,8DlFsvYR,CkFjvYI,4DACE,sBlFovYN,CkF/uYE,mCACE,mBACA,alFkvYJ,CkF7uYI,kCACE,alFgvYN,CkF9uYM,gFAEE,oBlFivYR,CkFzuYM,yDACE,alF4uYR,CkF1uYQ,8HAEE,oCACA,UlF6uYV,CkFxuYQ,4MAGE,oCACA,alF2uYV,CkF3tYY,wOAEE,+BlFkuYd,CoF7pZI,6HACE,yBACA,UpFiqZN,CoF5pZI,mJACE,oBpFgqZN,CoFxqZI,iIACE,yBACA,UpF4qZN,CoFvqZI,uJACE,oBpF2qZN,CoFnrZI,6HACE,yBACA,UpFurZN,CoFlrZI,mJACE,oBpFsrZN,CoF9rZI,uHACE,yBACA,UpFksZN,CoF7rZI,6IACE,oBpFisZN,CoFzsZI,6HACE,yBACA,apF6sZN,CoFxsZI,mJACE,oBpF4sZN,CoFptZI,2HACE,yBACA,UpFwtZN,CoFntZI,iJACE,oBpFutZN,CoF/tZI,yHACE,yBACA,apFmuZN,CoF9tZI,+IACE,oBpFkuZN,CoF1uZI,uHACE,yBACA,UpF8uZN,CoFzuZI,6IACE,oBpF6uZN,CoFrvZI,iIACE,yBACA,UpFyvZN,CoFpvZI,uJACE,oBpFwvZN,CoFhwZI,uHACE,yBACA,UpFowZN,CoF/vZI,6IACE,oBpFmwZN,CoF3wZI,yHACE,yBACA,UpF+wZN,CoF1wZI,+IACE,oBpF8wZN,CoFtxZI,uHACE,yBACA,apF0xZN,CoFrxZI,6IACE,oBpFyxZN,CoFjyZI,6HACE,yBACA,UpFqyZN,CoFhyZI,mJACE,oBpFoyZN,CoF5yZI,2HACE,yBACA,UpFgzZN,CoF3yZI,iJACE,oBpF+yZN,CoFvzZI,uHACE,yBACA,UpF2zZN,CoFtzZI,6IACE,oBpF0zZN,CoFl0ZI,2HACE,yBACA,UpFs0ZN,CoFj0ZI,iJACE,oBpFq0ZN,CoF70ZI,2HACE,yBACA,UpFi1ZN,CoF50ZI,iJACE,oBpFg1ZN,CoFx1ZI,uHACE,yBACA,UpF41ZN,CoFv1ZI,6IACE,oBpF21ZN,CoFn2ZI,qHACE,yBACA,UpFu2ZN,CoFl2ZI,2IACE,oBpFs2ZN,CoF92ZI,2HACE,yBACA,apFk3ZN,CoF72ZI,iJACE,oBpFi3ZN,CoFz3ZI,2HACE,yBACA,apF63ZN,CoFx3ZI,iJACE,oBpF43ZN,CoFp4ZI,yHACE,yBACA,UpFw4ZN,CoFn4ZI,+IACE,oBpFu4ZN,CoF/4ZI,uHACE,yBACA,UpFm5ZN,CoF94ZI,6IACE,oBpFk5ZN,CoF15ZI,uHACE,yBACA,UpF85ZN,CoFz5ZI,6IACE,oBpF65ZN,CoFr6ZI,yHACE,sBACA,apFy6ZN,CoFp6ZI,+IACE,iBpFw6ZN,CoFh7ZI,uHACE,yBACA,UpFo7ZN,CoF/6ZI,6IACE,oBpFm7ZN,CoF37ZI,iIACE,yBACA,UpF+7ZN,CoF17ZI,uJACE,oBpF87ZN,CkF7+YC,uuBACG,kBACA,kBlFq/YJ,CkFh/YA,UACE,uBlFm/YF,CkFh/YI,8BACE,gBACA,elFm/YN,CkFj/YM,wCACE,kBlFo/YR,CkF3+YU,6EACE,iBlF8+YZ,CkFt+YI,yCACE,clFy+YN,CkFv+YM,mDACE,kBlF0+YR,CkFv+YM,uDACE,uBlF0+YR,CkFx+YQ,iEACE,mBlF2+YV,CkFv+YU,+EACE,mBlF0+YZ,CkFt+YY,6FACE,mBlFy+Yd,CkFr+Yc,2GACE,mBlFw+YhB,CkF79YM,qEACE,kBlFg+YR,CkF79YM,qEACE,kBlFg+YR,CkF59YQ,mFACE,kBlF+9YV,CkF39YU,iGACE,kBlF89YZ,CkF19YY,+GACE,mBlF69Yd,CkFz9Yc,6HACE,mBlF49YhB,CkF98YM,0bACE,iBlFo9YR,CkF/8YM,8cACE,kBlFq9YR,CkFj9YQ,sgBACE,mBlFu9YV,CkFn9YU,8jBACE,mBlFy9YZ,CkFr9YY,snBACE,mBlF29Yd,CkFv9Yc,8qBACE,mBlF69YhB,CkFp9YE,oB/DlmBI,sCnB0jaN,CmBtjaM,uC+D8lBJ,oB/D7lBM,enB0jaN,CACF,CkFz9YI,kCACE,kBlF49YN,CkFv9YI,4FAEE,8BlF09YN,CkFv9YQ,oIACE,uBlF29YV,CkFp9YA,YACE,uBlFu9YF,CkFp9YI,4CACE,gBACA,elFu9YN,CkFr9YM,sDACE,kBlFw9YR,CkFt9YQ,+DACE,kBlFy9YV,CkFj9YM,mDACE,mBACA,kCACA,elFo9YR,CkFl9YQ,6DACE,8BlFq9YV,CkFx8YQ,4JACE,8BlF+8YV,CkFt8YM,mH/D3qBA,uC+D6qBE,kBlF08YR,CmBnnaM,uC+DuqBA,mH/DtqBE,enBwnaN,CACF,CkFx8YI,kZACE,iBlF88YN,CkF58YM,0cACE,kBACA,iBlFk9YR,CkFz8YI,kbACE,kBlF+8YN,CkF78YM,0eACE,kBACA,kBlFm9YR,CkF38YM,qJACE,kBlF+8YR,CkF38YQ,mKACE,kBlF+8YV,CkFx8YQ,mLACE,eACA,alF48YV,CkFl8YM,qKACE,kBlFs8YR,CkFl8YQ,mLACE,8BlFs8YV,CkF97YM,4IAEE,8BlFi8YR,CkF97YM,yEACE,UlFi8YR,CkF57YM,+NAGE,gBACA,UlF+7YR,CkFx7YM,8IAEE,0BlF27YR,CkFx7YM,0EACE,UlF27YR,CkFt7YM,kOAGE,gBACA,UlFy7YR,CkFj7YE,kDACE,kFACA,oDACA,sDACA,yDlFo7YJ,CkFh7YI,oEACE,aACA,sDACA,sDACA,yDlFm7YN,CkF36YI,8aACE,kFACA,oDACA,sDACA,yDlFi7YN,CkF16YE,gDAEE,mBACA,qBlF66YJ,CkF16YE,6CACE,mBACA,qBlF66YJ,CkF16YE,8DAEE,WlF66YJ,CkFz6YI,gFAEE,SlF46YN,CkFr6YE,+EAEE,mBACA,yBACA,UlFw6YJ,CkFr6YE,2FAEE,wBlFw6YJ,CkFr6YE,yCACE,kBlFw6YJ,CkFr6YE,yCACE,kBlFw6YJ,CkFn6YE,iFAEE,mBACA,yBACA,alFs6YJ,CkFn6YE,6FAEE,wBlFs6YJ,CkFn6YE,0CACE,kBlFs6YJ,CkFn6YE,0CACE,kBlFs6YJ,CkFj6YA,mCACE,UlFo6YF,CkFl6YA,0BACE,mBlFq6YF,CkF/5YE,6CACE,alFk6YJ,CkFh6YE,qFAGE,aACA,iBlFm6YJ,CqFz0aA,kBAEE,UACA,kBACA,kBrF40aF,CqF10aE,gDACE,UACA,QrF80aJ,CqF30aE,gDACE,UACA,OrF+0aJ,CqF30aA,SACE,UACA,iBrF80aF,CqF50aE,wBACE,UACA,OrF+0aJ,CqFz0aI,+BACE,arF40aN,CcnzaI,yBsErCF,uGAGE,mBACA,epF41aF,CoFv1aE,8CACE,YpF01aJ,CoFt1aE,wIAGE,4BpFy1aJ,CoFr1aE,wDACE,YpFw1aJ,CoFr1aE,wDACE,OpFw1aJ,CoFr1aE,6JAGE,iBpF41aJ,CoFr1aE,qMANE,sDACA,sDACA,0DACA,iBpF+1aJ,CoFr1aE,wCACE,qBACA,oDACA,sDACA,0DACA,kBpFw1aJ,CoFp1aE,6CACE,iBpFu1aJ,CoFr1aI,iGAGE,cACA,YpFu1aN,CoFn1aM,gEACE,UpFs1aR,CoF90aM,wPACE,WpFu1aR,CoFp1aM,wIACE,epFw1aR,CoFt1aQ,sJACE,UpF01aV,CoFt1aM,gkBAIE,qBACA,cACA,oDACA,sDACA,0DACA,kBpF61aR,CoF11aM,kIACE,sDACA,sDACA,0DACA,iBpF81aR,CoF31aM,0IACE,kBpF+1aR,CoF11aM,gSAEE,wBACA,+BpF+1aR,CoF51aM,4LACE,8BpFg2aR,CoF11aE,qDACE,uBpF61aJ,CoFx1aM,4EACE,WpF21aR,CoFv1aI,wDACE,YpF01aN,CACF,Ccl7aI,4BuE1BF,6CACE,yBrFg9aF,CACF,Ccr8aI,yBsErCF,gHAGE,mBACA,epF8+aF,CoFz+aE,iDACE,YpF4+aJ,CoFx+aE,iJAGE,4BpF2+aJ,CoFv+aE,2DACE,YpF0+aJ,CoFv+aE,2DACE,OpF0+aJ,CoFv+aE,sKAGE,iBpF8+aJ,CoFv+aE,iNANE,sDACA,sDACA,0DACA,iBpFi/aJ,CoFv+aE,2CACE,qBACA,oDACA,sDACA,0DACA,kBpF0+aJ,CoFt+aE,gDACE,iBpFy+aJ,CoFv+aI,uGAGE,cACA,YpFy+aN,CoFr+aM,mEACE,UpFw+aR,CoFh+aM,oQACE,WpFy+aR,CoFt+aM,8IACE,epF0+aR,CoFx+aQ,4JACE,UpF4+aV,CoFx+aM,wlBAIE,qBACA,cACA,oDACA,sDACA,0DACA,kBpF++aR,CoF5+aM,wIACE,sDACA,sDACA,0DACA,iBpFg/aR,CoF7+aM,gJACE,kBpFi/aR,CoF5+aM,4SAEE,wBACA,+BpFi/aR,CoF9+aM,kMACE,8BpFk/aR,CoF5+aE,wDACE,uBpF++aJ,CoF1+aM,+EACE,WpF6+aR,CoFz+aI,2DACE,YpF4+aN,CACF,CcpkbI,4BuEfF,gDACE,yBrFulbF,CACF,CqFplbA,0BACE,GACE,SrFulbF,CqFplbA,GACE,SrFulbF,CACF,CqF9lbA,kBACE,GACE,SrFulbF,CqFplbA,GACE,SrFulbF,CACF,CqFplbA,2BACE,GACE,SrFulbF,CqFplbA,GACE,SrFulbF,CACF,CqF9lbA,mBACE,GACE,SrFulbF,CqFplbA,GACE,SrFulbF,CACF,CqFjlbI,8GACE,oBrFqlbN,CqFjlbE,0HAEE,YrFolbJ,CqFllbI,kJACE,YrFslbN,CqFnlbI,kJACE,sBrFulbN,CqFplbI,gKACE,oBrFwlbN,CqFrlbI,4IACE,oDACA,sDACA,0DACA,kBrFylbN,CqFtlbI,4IACE,sDACA,sDACA,0DACA,iBrF0lbN,CqFvlbI,kNACE,crF2lbN,CqFxlbI,4dAGE,kBACA,sDACA,sDACA,0DACA,kBACA,OrF8lbN,CqF3lbI,4LACE,crF+lbN,CqF1lbA,aACE,iBrF6lbF,CqF3lbE,mBACE,gBrF8lbJ,CqF1lbA,uCAEE,gBACA,kBrF6lbF,CqF1lbA,iCACE,iBrF6lbF,CqF3lbE,8CACE,gBACA,kBACA,WACA,OrF8lbJ,CqF1lbA,wHlEvJM,sEnByvbN,CmBrvbM,uCkEmJN,wHlElJQ,enB6vbN,CACF,CsF/wbA,6BACE,iBtFkxbF,CsF/wbA,iBACE,0BACA,kBACA,uBACA,YtFkxbF,CsFhxbE,yCAEE,0BACA,aACA,aACA,YnEHE,wDnBuxbN,CmBnxbM,uCmENJ,yCnEOM,enBwxbN,CACF,CsFvxbE,wBACE,WACA,cACA,eACA,MACA,UtF0xbJ,CsFrxbE,8BACE,6BACA,0BtFwxbJ,CsFpxbA,sCACE,0BtFuxbF,CsFpxbA,sCACE,4BtFuxbF,CsFnxbI,sFnEhCE,uCnBwzbN,CmBpzbM,uCmE4BF,sFnE3BI,enByzbN,CACF,CsFvxbE,uCACE,atF0xbJ,CsFxxbI,qFAEE,OtF2xbN,CsFrxbI,oPAEE,kBtF0xbN,CsFnxbE,6CACE,atFsxbJ,CsFpxbI,iGAEE,QnEjEA,wDnBy1bN,CmBr1bM,uCmE2DF,iGnE1DI,enB01bN,CACF,CsFxxbI,4QAEE,kBtF6xbN,CsFtxbE,8EAGE,atFyxbJ,CsFrxbE,sBACE,kBtFwxbJ,CsFhxbE,gNAOE,UtFuxbJ,CsFnxbE,gCACE,oCACA,gBACA,iBtFsxbJ,CsFpxbI,0CACE,QtFuxbN,CsFpxbI,0CACE,gBACA,kBACA,kBACA,iBtFuxbN,CsFrxbM,4OAKE,QtFwxbR,CsFrxbM,kMAIE,gCACA,8BACA,6BACA,UtFwxbR,CsFrxbM,iDACE,wBtFwxbR,CsFnxbE,gCACE,iBtFsxbJ,CsFjxbA,uBACE,cAIE,gBACA,6BtF+wbJ,CuF/6bE,wBACE,2BvFu7bJ,CuFp7bE,gCACE,oBvFu7bJ,CuFn7bA,qBACE,eACA,QvFs7bF,CuFl7bE,qBACE,avFq7bJ,CuFh7bA,kBACE,gBACA,gBACA,SvFm7bF,CuFj7bE,oCACE,QvFo7bJ,CuFj7bE,iCACE,kBvFo7bJ,CuFj7bE,oBACE,SACA,kBvFo7bJ,CuF/6bA,kBACE,iBvFk7bF,CuFh7bE,0B7D5CA,kCACA,eACA,qCACA,uB6D2CE,YACA,kBACA,gBvFs7bJ,CuFn7bE,iCACE,UACA,cACA,aACA,KvFs7bJ,CuF56bI,yMACE,avFk7bN,CuF16bA,kBACE,gBACA,gBACA,SvF66bF,CuF36bE,oCACE,QvF86bJ,CuF36bE,iCACE,kBvF86bJ,CuF36bE,oBACE,SACA,kBvF86bJ,CuFz6bA,kCAEE,cACA,kBACA,mBACA,iBvF46bF,CuFv6bA,2CJhGE,8DIkGA,mFvF06bF,CuFv6bA,2BACE,GACE,4CACA,mCACA,SvF06bF,CuFv6bA,IACE,6CACA,kCvF06bF,CuFv6bA,IACE,4CACA,SvF06bF,CuFv6bA,IACE,2CvF06bF,CuFv6bA,GACE,4BvF06bF,CACF,CuFj8bA,mBACE,GACE,4CACA,mCACA,SvF06bF,CuFv6bA,IACE,6CACA,kCvF06bF,CuFv6bA,IACE,4CACA,SvF06bF,CuFv6bA,IACE,2CvF06bF,CuFv6bA,GACE,4BvF06bF,CACF,CuFr6bE,mCACE,iBvFw6bJ,CuFv6bI,kDACE,kBACA,QACA,SvF06bN,Cc9/bI,4ByE0FF,gCACE,WvFw6bF,CuFv6bE,mCACE,evF06bJ,CuFz6bI,kDACE,kBACA,SACA,UACA,sBACA,evF46bN,CACF,CuFr6bE,uCACE,YvFw6bJ,CuFr6bE,sC9E7JE,yBACA,0B8E8JA,UACA,WvFy6bJ,CuFv6bI,uF9EpJA,+BACA,6BTgkcJ,CuFv6bI,qDACE,aACA,aACA,iBvF06bN,CuFv6bM,yDACE,UACA,YACA,WAGA,mCvF06bR,CuFv6bM,uDACE,UACA,eAEA,evFy6bR,CuFv6bQ,6DACE,cACA,cvF06bV,CuFp6bI,iDAEE,gCACA,6BACA,YvFs6bN,CqDzocE,uDACE,cACA,WACA,UrD4ocJ,CcplcI,yByE0KE,mDAEI,0BACA,uBvF66bR,CACF,CuFx6bI,mDAEE,yBACA,YvF06bN,CqD3pcE,yDACE,cACA,WACA,UrD8pcJ,CuF96bM,gEACE,avFi7bR,Cc1mcI,yByE2LI,sEAEI,wBvFk7bV,CACF,CuF56bE,mCAQE,kBACA,WACA,cACA,kBACA,gBACA,YvFw6bJ,CczncI,yByEoMF,mCAEI,WACA,iBACA,mBACA,evFw7bJ,CACF,CwFzrcE,qBACE,axF4rcJ,CwF1rcI,wCACE,axF6rcN,CwFvrcM,mDACE,UxF0rcR,CwFnrcA,sBACE,gBACA,8BxFsrcF,CwFprcE,gCACE,iCACA,0BACA,iBxFurcJ,CKrscE,4EmFiBI,gDxFyrcN,CwFrrcE,sFAEE,gDxFwrcJ,CwFrrcE,qCACE,8BACA,cxFwrcJ,CwFtrcI,+CACE,4BACA,kCACA,yBACA,+BACA,gBxFyrcN,CK5tcE,0GmFsCM,gDxF2rcR,CwFvrcI,oHAEE,gDxF0rcN,CwFrrcA,kBACE,kBxFwrcF,CwFtrcE,4BACE,kBACA,kBxFyrcJ,CwFtrcE,iCACE,iBxFyrcJ,CwFlrcI,cACE,wBxFqrcN,CwFtrcI,aACE,wBxFyrcN,CwFlrcI,gBACE,wBxFqrcN,CwFtrcI,kBACE,wBxFyrcN,CwF1rcI,gBACE,wBxF6rcN,CwF9rcI,aACE,wBxFiscN,CwFlscI,gBACE,wBxFqscN,CwFtscI,eACE,wBxFyscN,CwFnscE,kBACE,wBxFsscJ,CwFvscE,aACE,wBxF0scJ,CwF3scE,cACE,wBxF8scJ,CwF/scE,aACE,wBxFktcJ,CwFntcE,gBACE,wBxFstcJ,CwFvtcE,eACE,wBxF0tcJ,CwF3tcE,aACE,wBxF8tcJ,CwF/tcE,eACE,wBxFkucJ,CwFnucE,eACE,wBxFsucJ,CwFvucE,aACE,wBxF0ucJ,CwF3ucE,YACE,wBxF8ucJ,CwF/ucE,eACE,wBxFkvcJ,CwFnvcE,eACE,wBxFsvcJ,CwFvvcE,cACE,wBxF0vcJ,CwF3vcE,aACE,wBxF8vcJ,CwF/vcE,aACE,wBxFkwcJ,CwFnwcE,cACE,qBxFswcJ,CwFvwcE,aACE,wBxF0wcJ,CwF3wcE,kBACE,wBxF8wcJ,CyF12cE,qBACE,iBzF62cJ,CyF32cI,mCACE,kBzF82cN,CyF32cI,gCACE,6BACA,SACA,eACA,eAEA,uBACA,kBACA,UACA,KzF62cN,CyFr2cI,+FhFXA,eTq3cJ,CyFj2cE,uKAME,+BzFo2cJ,CyFl1cI,+zBAME,gCzFo2cN,CyFj1cI,+zBAME,iCzFm2cN,CyF91cA,qDACE,ezFi2cF,CyF91cA,kBrF9BI,cqFgCF,cACA,aACA,kBACA,UzFi2cF,CyF91cA,iBhF5FI,qBL6GE,kBqFdJ,oCACA,cACA,aACA,gBACA,iBACA,eACA,qBACA,kBACA,SACA,SzFi2cF,CyF71cE,yBACE,oBzFg2cJ,CyFt1cI,+BACE,qBACA,sCzFy1cN,CyFt1cI,qFAEE,azFy1cN,CyFl1cE,iCAEI,sBACA,6EzFo1cN,CyF90cE,0BACE,oBzFi1cJ,CyF10cI,gCACE,qBACA,sCzF60cN,CyFh0cI,sLAEE,azFw0cN,CyFj0cI,+CACE,azFo0cN,CyFj0cI,6FAEE,azFo0cN,CyF9zcE,uDACE,azFi0cJ,CyF/zcI,8DACE,oBzFk0cN,CyF9zcE,qGAEE,azFi0cJ,CyF7zcI,sEpEpNA,yBoEsNE,oBzFg0cN,CyF3zcI,oEACE,sCzF8zcN,CyFlzcI,mIACE,oBzFyzcN,CyFtzcI,+FAEE,azFyzcN,CyFrzcM,uDACE,qBACA,sCzFwzcR,C0F3idI,4FACE,mBACA,oB1F8idN,C0F3idI,kGACE,uD1F8idN,C0F3idI,2FACE,kB1F8idN,C0FzidI,mGACE,mBACA,oB1F4idN,C0FzidI,yGACE,uD1F4idN,C0FzidI,kGACE,kB1F4idN,C0FrkdI,8FACE,mBACA,oB1FwkdN,C0FrkdI,oGACE,yD1FwkdN,C0FrkdI,6FACE,kB1FwkdN,C0FnkdI,qGACE,mBACA,oB1FskdN,C0FnkdI,2GACE,yD1FskdN,C0FnkdI,oGACE,kB1FskdN,C0F/ldI,4FACE,mBACA,oB1FkmdN,C0F/ldI,kGACE,uD1FkmdN,C0F/ldI,2FACE,kB1FkmdN,C0F7ldI,mGACE,mBACA,oB1FgmdN,C0F7ldI,yGACE,uD1FgmdN,C0F7ldI,kGACE,kB1FgmdN,C0FzndI,yFACE,mBACA,oB1F4ndN,C0FzndI,+FACE,wD1F4ndN,C0FzndI,wFACE,kB1F4ndN,C0FvndI,gGACE,mBACA,oB1F0ndN,C0FvndI,sGACE,wD1F0ndN,C0FvndI,+FACE,kB1F0ndN,C0FnpdI,4FACE,mBACA,oB1FspdN,C0FnpdI,kGACE,uD1FspdN,C0FnpdI,2FACE,kB1FspdN,C0FjpdI,mGACE,mBACA,oB1FopdN,C0FjpdI,yGACE,uD1FopdN,C0FjpdI,kGACE,kB1FopdN,C0F7qdI,2FACE,mBACA,oB1FgrdN,C0F7qdI,iGACE,uD1FgrdN,C0F7qdI,0FACE,kB1FgrdN,C0F3qdI,kGACE,mBACA,oB1F8qdN,C0F3qdI,wGACE,uD1F8qdN,C0F3qdI,iGACE,kB1F8qdN,C0FvsdI,0FACE,mBACA,oB1F0sdN,C0FvsdI,gGACE,yD1F0sdN,C0FvsdI,yFACE,kB1F0sdN,C0FrsdI,iGACE,mBACA,oB1FwsdN,C0FrsdI,uGACE,yD1FwsdN,C0FrsdI,gGACE,e1FwsdN,C0FjudI,yFACE,mBACA,oB1FoudN,C0FjudI,+FACE,sD1FoudN,C0FjudI,wFACE,e1FoudN,C0F/tdI,gGACE,mBACA,oB1FkudN,C0F/tdI,sGACE,sD1FkudN,C0F/tdI,+FACE,kB1FkudN,C0F3vdI,8FACE,mBACA,oB1F8vdN,C0F3vdI,oGACE,wD1F8vdN,C0F3vdI,6FACE,kB1F8vdN,C0FzvdI,qGACE,mBACA,oB1F4vdN,C0FzvdI,2GACE,wD1F4vdN,C0FzvdI,oGACE,kB1F4vdN,C0FrxdI,yFACE,mBACA,iB1FwxdN,C0FrxdI,+FACE,qD1FwxdN,C0FrxdI,wFACE,e1FwxdN,C0FnxdI,gGACE,mBACA,iB1FsxdN,C0FnxdI,sGACE,qD1FsxdN,C0FnxdI,+FACE,kB1FsxdN,C0F/ydI,0FACE,mBACA,oB1FkzdN,C0F/ydI,gGACE,wD1FkzdN,C0F/ydI,yFACE,kB1FkzdN,C0F7ydI,iGACE,mBACA,oB1FgzdN,C0F7ydI,uGACE,wD1FgzdN,C0F7ydI,gGACE,kB1FgzdN,C0Fz0dI,yFACE,mBACA,oB1F40dN,C0Fz0dI,+FACE,uD1F40dN,C0Fz0dI,wFACE,kB1F40dN,C0Fv0dI,gGACE,mBACA,oB1F00dN,C0Fv0dI,sGACE,uD1F00dN,C0Fv0dI,+FACE,kB1F00dN,C0Fn2dI,4FACE,mBACA,oB1Fs2dN,C0Fn2dI,kGACE,wD1Fs2dN,C0Fn2dI,2FACE,kB1Fs2dN,C0Fj2dI,mGACE,mBACA,oB1Fo2dN,C0Fj2dI,yGACE,wD1Fo2dN,C0Fj2dI,kGACE,kB1Fo2dN,C0F73dI,2FACE,mBACA,oB1Fg4dN,C0F73dI,iGACE,uD1Fg4dN,C0F73dI,0FACE,kB1Fg4dN,C0F33dI,kGACE,mBACA,oB1F83dN,C0F33dI,wGACE,uD1F83dN,C0F33dI,iGACE,kB1F83dN,C0Fv5dI,yFACE,mBACA,oB1F05dN,C0Fv5dI,+FACE,uD1F05dN,C0Fv5dI,wFACE,kB1F05dN,C0Fr5dI,gGACE,mBACA,oB1Fw5dN,C0Fr5dI,sGACE,uD1Fw5dN,C0Fr5dI,+FACE,kB1Fw5dN,C0Fj7dI,2FACE,mBACA,oB1Fo7dN,C0Fj7dI,iGACE,wD1Fo7dN,C0Fj7dI,0FACE,kB1Fo7dN,C0F/6dI,kGACE,mBACA,oB1Fk7dN,C0F/6dI,wGACE,wD1Fk7dN,C0F/6dI,iGACE,kB1Fk7dN,C0F38dI,2FACE,mBACA,oB1F88dN,C0F38dI,iGACE,wD1F88dN,C0F38dI,0FACE,kB1F88dN,C0Fz8dI,kGACE,mBACA,oB1F48dN,C0Fz8dI,wGACE,wD1F48dN,C0Fz8dI,iGACE,kB1F48dN,C0Fr+dI,yFACE,mBACA,oB1Fw+dN,C0Fr+dI,+FACE,wD1Fw+dN,C0Fr+dI,wFACE,kB1Fw+dN,C0Fn+dI,gGACE,mBACA,oB1Fs+dN,C0Fn+dI,sGACE,wD1Fs+dN,C0Fn+dI,+FACE,kB1Fs+dN,C0F//dI,wFACE,mBACA,oB1FkgeN,C0F//dI,8FACE,uD1FkgeN,C0F//dI,uFACE,kB1FkgeN,C0F7/dI,+FACE,mBACA,oB1FggeN,C0F7/dI,qGACE,uD1FggeN,C0F7/dI,8FACE,kB1FggeN,C0FzheI,2FACE,mBACA,oB1F4heN,C0FzheI,iGACE,wD1F4heN,C0FzheI,0FACE,kB1F4heN,C0FvheI,kGACE,mBACA,oB1F0heN,C0FvheI,wGACE,wD1F0heN,C0FvheI,iGACE,kB1F0heN,C0FnjeI,2FACE,mBACA,oB1FsjeN,C0FnjeI,iGACE,uD1FsjeN,C0FnjeI,0FACE,kB1FsjeN,C0FjjeI,kGACE,mBACA,oB1FojeN,C0FjjeI,wGACE,uD1FojeN,C0FjjeI,iGACE,kB1FojeN,C0F7keI,0FACE,mBACA,oB1FgleN,C0F7keI,gGACE,uD1FgleN,C0F7keI,yFACE,kB1FgleN,C0F3keI,iGACE,mBACA,oB1F8keN,C0F3keI,uGACE,uD1F8keN,C0F3keI,gGACE,kB1F8keN,C0FvmeI,yFACE,mBACA,oB1F0meN,C0FvmeI,+FACE,wD1F0meN,C0FvmeI,wFACE,kB1F0meN,C0FrmeI,gGACE,mBACA,oB1FwmeN,C0FrmeI,sGACE,wD1FwmeN,C0FrmeI,+FACE,kB1FwmeN,C0FjoeI,yFACE,mBACA,oB1FooeN,C0FjoeI,+FACE,wD1FooeN,C0FjoeI,wFACE,kB1FooeN,C0F/neI,gGACE,mBACA,oB1FkoeN,C0F/neI,sGACE,wD1FkoeN,C0F/neI,+FACE,kB1FkoeN,C0F3peI,0FACE,gBACA,iB1F8peN,C0F3peI,gGACE,uD1F8peN,C0F3peI,yFACE,kB1F8peN,C0FzpeI,iGACE,gBACA,iB1F4peN,C0FzpeI,uGACE,uD1F4peN,C0FzpeI,gGACE,e1F4peN,C0FrreI,yFACE,mBACA,oB1FwreN,C0FrreI,+FACE,yD1FwreN,C0FrreI,wFACE,kB1FwreN,C0FnreI,gGACE,mBACA,oB1FsreN,C0FnreI,sGACE,yD1FsreN,C0FnreI,+FACE,kB1FsreN,C0F/seI,8FACE,mBACA,oB1FkteN,C0F/seI,oGACE,sD1FkteN,C0F/seI,6FACE,e1FkteN,C0F7seI,qGACE,mBACA,oB1FgteN,C0F7seI,2GACE,sD1FgteN,C0F7seI,oGACE,kB1FgteN,C0FxseI,yCACE,Y1F2seN,C0FzseM,+DACE,uD1F4seR,C0FzseM,2DACE,uD1F4seR,C0FzseM,oDACE,uD1F4seR,C0FxseI,yDACE,wB1F2seN,C0FzseM,gEACE,wB1F4seR,C0FxseI,qDACE,wB1F2seN,C0FzseM,4DACE,wB1F4seR,C0FxseI,8CACE,wB1F2seN,C0FzseM,qDACE,wB1F4seR,C0FhveI,2CACE,Y1FmveN,C0FjveM,iEACE,yD1FoveR,C0FjveM,6DACE,yD1FoveR,C0FjveM,sDACE,yD1FoveR,C0FhveI,2DACE,wB1FmveN,C0FjveM,kEACE,wB1FoveR,C0FhveI,uDACE,wB1FmveN,C0FjveM,8DACE,wB1FoveR,C0FhveI,gDACE,wB1FmveN,C0FjveM,uDACE,wB1FoveR,C0FxxeI,yCACE,Y1F2xeN,C0FzxeM,+DACE,uD1F4xeR,C0FzxeM,2DACE,uD1F4xeR,C0FzxeM,oDACE,uD1F4xeR,C0FxxeI,yDACE,wB1F2xeN,C0FzxeM,gEACE,wB1F4xeR,C0FxxeI,qDACE,wB1F2xeN,C0FzxeM,4DACE,wB1F4xeR,C0FxxeI,8CACE,wB1F2xeN,C0FzxeM,qDACE,wB1F4xeR,C0Fh0eI,sCACE,Y1Fm0eN,C0Fj0eM,4DACE,wD1Fo0eR,C0Fj0eM,wDACE,wD1Fo0eR,C0Fj0eM,iDACE,wD1Fo0eR,C0Fh0eI,sDACE,wB1Fm0eN,C0Fj0eM,6DACE,wB1Fo0eR,C0Fh0eI,kDACE,wB1Fm0eN,C0Fj0eM,yDACE,wB1Fo0eR,C0Fh0eI,2CACE,wB1Fm0eN,C0Fj0eM,kDACE,wB1Fo0eR,C0Fx2eI,yCACE,Y1F22eN,C0Fz2eM,+DACE,uD1F42eR,C0Fz2eM,2DACE,uD1F42eR,C0Fz2eM,oDACE,uD1F42eR,C0Fx2eI,yDACE,wB1F22eN,C0Fz2eM,gEACE,wB1F42eR,C0Fx2eI,qDACE,wB1F22eN,C0Fz2eM,4DACE,wB1F42eR,C0Fx2eI,8CACE,wB1F22eN,C0Fz2eM,qDACE,wB1F42eR,C0Fh5eI,wCACE,Y1Fm5eN,C0Fj5eM,8DACE,uD1Fo5eR,C0Fj5eM,0DACE,uD1Fo5eR,C0Fj5eM,mDACE,uD1Fo5eR,C0Fh5eI,wDACE,wB1Fm5eN,C0Fj5eM,+DACE,wB1Fo5eR,C0Fh5eI,oDACE,wB1Fm5eN,C0Fj5eM,2DACE,wB1Fo5eR,C0Fh5eI,6CACE,wB1Fm5eN,C0Fj5eM,oDACE,wB1Fo5eR,C0Fx7eI,uCACE,Y1F27eN,C0Fz7eM,6DACE,yD1F47eR,C0Fz7eM,yDACE,yD1F47eR,C0Fz7eM,kDACE,yD1F47eR,C0Fx7eI,uDACE,wB1F27eN,C0Fz7eM,8DACE,qB1F47eR,C0Fx7eI,mDACE,wB1F27eN,C0Fz7eM,0DACE,qB1F47eR,C0Fx7eI,4CACE,wB1F27eN,C0Fz7eM,mDACE,qB1F47eR,C0Fh+eI,sCACE,Y1Fm+eN,C0Fj+eM,4DACE,sD1Fo+eR,C0Fj+eM,wDACE,sD1Fo+eR,C0Fj+eM,iDACE,sD1Fo+eR,C0Fh+eI,sDACE,wB1Fm+eN,C0Fj+eM,6DACE,wB1Fo+eR,C0Fh+eI,kDACE,wB1Fm+eN,C0Fj+eM,yDACE,wB1Fo+eR,C0Fh+eI,2CACE,wB1Fm+eN,C0Fj+eM,kDACE,wB1Fo+eR,C0FxgfI,2CACE,Y1F2gfN,C0FzgfM,iEACE,wD1F4gfR,C0FzgfM,6DACE,wD1F4gfR,C0FzgfM,sDACE,wD1F4gfR,C0FxgfI,2DACE,wB1F2gfN,C0FzgfM,kEACE,wB1F4gfR,C0FxgfI,uDACE,wB1F2gfN,C0FzgfM,8DACE,wB1F4gfR,C0FxgfI,gDACE,wB1F2gfN,C0FzgfM,uDACE,wB1F4gfR,C0FhjfI,sCACE,Y1FmjfN,C0FjjfM,4DACE,qD1FojfR,C0FjjfM,wDACE,qD1FojfR,C0FjjfM,iDACE,qD1FojfR,C0FhjfI,sDACE,wB1FmjfN,C0FjjfM,6DACE,wB1FojfR,C0FhjfI,kDACE,wB1FmjfN,C0FjjfM,yDACE,wB1FojfR,C0FhjfI,2CACE,wB1FmjfN,C0FjjfM,kDACE,wB1FojfR,C0FxlfI,uCACE,Y1F2lfN,C0FzlfM,6DACE,wD1F4lfR,C0FzlfM,yDACE,wD1F4lfR,C0FzlfM,kDACE,wD1F4lfR,C0FxlfI,uDACE,wB1F2lfN,C0FzlfM,8DACE,wB1F4lfR,C0FxlfI,mDACE,wB1F2lfN,C0FzlfM,0DACE,wB1F4lfR,C0FxlfI,4CACE,wB1F2lfN,C0FzlfM,mDACE,wB1F4lfR,C0FhofI,sCACE,Y1FmofN,C0FjofM,4DACE,uD1FoofR,C0FjofM,wDACE,uD1FoofR,C0FjofM,iDACE,uD1FoofR,C0FhofI,sDACE,wB1FmofN,C0FjofM,6DACE,wB1FoofR,C0FhofI,kDACE,wB1FmofN,C0FjofM,yDACE,wB1FoofR,C0FhofI,2CACE,wB1FmofN,C0FjofM,kDACE,wB1FoofR,C0FxqfI,yCACE,Y1F2qfN,C0FzqfM,+DACE,wD1F4qfR,C0FzqfM,2DACE,wD1F4qfR,C0FzqfM,oDACE,wD1F4qfR,C0FxqfI,yDACE,wB1F2qfN,C0FzqfM,gEACE,wB1F4qfR,C0FxqfI,qDACE,wB1F2qfN,C0FzqfM,4DACE,wB1F4qfR,C0FxqfI,8CACE,wB1F2qfN,C0FzqfM,qDACE,wB1F4qfR,C0FhtfI,wCACE,Y1FmtfN,C0FjtfM,8DACE,uD1FotfR,C0FjtfM,0DACE,uD1FotfR,C0FjtfM,mDACE,uD1FotfR,C0FhtfI,wDACE,wB1FmtfN,C0FjtfM,+DACE,wB1FotfR,C0FhtfI,oDACE,wB1FmtfN,C0FjtfM,2DACE,wB1FotfR,C0FhtfI,6CACE,wB1FmtfN,C0FjtfM,oDACE,wB1FotfR,C0FxvfI,sCACE,Y1F2vfN,C0FzvfM,4DACE,uD1F4vfR,C0FzvfM,wDACE,uD1F4vfR,C0FzvfM,iDACE,uD1F4vfR,C0FxvfI,sDACE,wB1F2vfN,C0FzvfM,6DACE,wB1F4vfR,C0FxvfI,kDACE,wB1F2vfN,C0FzvfM,yDACE,wB1F4vfR,C0FxvfI,2CACE,wB1F2vfN,C0FzvfM,kDACE,wB1F4vfR,C0FhyfI,wCACE,Y1FmyfN,C0FjyfM,8DACE,wD1FoyfR,C0FjyfM,0DACE,wD1FoyfR,C0FjyfM,mDACE,wD1FoyfR,C0FhyfI,wDACE,wB1FmyfN,C0FjyfM,+DACE,wB1FoyfR,C0FhyfI,oDACE,wB1FmyfN,C0FjyfM,2DACE,wB1FoyfR,C0FhyfI,6CACE,wB1FmyfN,C0FjyfM,oDACE,wB1FoyfR,C0Fx0fI,wCACE,Y1F20fN,C0Fz0fM,8DACE,wD1F40fR,C0Fz0fM,0DACE,wD1F40fR,C0Fz0fM,mDACE,wD1F40fR,C0Fx0fI,wDACE,wB1F20fN,C0Fz0fM,+DACE,wB1F40fR,C0Fx0fI,oDACE,wB1F20fN,C0Fz0fM,2DACE,wB1F40fR,C0Fx0fI,6CACE,wB1F20fN,C0Fz0fM,oDACE,wB1F40fR,C0Fh3fI,sCACE,Y1Fm3fN,C0Fj3fM,4DACE,wD1Fo3fR,C0Fj3fM,wDACE,wD1Fo3fR,C0Fj3fM,iDACE,wD1Fo3fR,C0Fh3fI,sDACE,wB1Fm3fN,C0Fj3fM,6DACE,wB1Fo3fR,C0Fh3fI,kDACE,wB1Fm3fN,C0Fj3fM,yDACE,wB1Fo3fR,C0Fh3fI,2CACE,wB1Fm3fN,C0Fj3fM,kDACE,wB1Fo3fR,C0Fx5fI,qCACE,Y1F25fN,C0Fz5fM,2DACE,uD1F45fR,C0Fz5fM,uDACE,uD1F45fR,C0Fz5fM,gDACE,uD1F45fR,C0Fx5fI,qDACE,wB1F25fN,C0Fz5fM,4DACE,wB1F45fR,C0Fx5fI,iDACE,wB1F25fN,C0Fz5fM,wDACE,wB1F45fR,C0Fx5fI,0CACE,wB1F25fN,C0Fz5fM,iDACE,wB1F45fR,C0Fh8fI,wCACE,Y1Fm8fN,C0Fj8fM,8DACE,wD1Fo8fR,C0Fj8fM,0DACE,wD1Fo8fR,C0Fj8fM,mDACE,wD1Fo8fR,C0Fh8fI,wDACE,wB1Fm8fN,C0Fj8fM,+DACE,wB1Fo8fR,C0Fh8fI,oDACE,wB1Fm8fN,C0Fj8fM,2DACE,wB1Fo8fR,C0Fh8fI,6CACE,wB1Fm8fN,C0Fj8fM,oDACE,wB1Fo8fR,C0Fx+fI,wCACE,Y1F2+fN,C0Fz+fM,8DACE,uD1F4+fR,C0Fz+fM,0DACE,uD1F4+fR,C0Fz+fM,mDACE,uD1F4+fR,C0Fx+fI,wDACE,wB1F2+fN,C0Fz+fM,+DACE,wB1F4+fR,C0Fx+fI,oDACE,wB1F2+fN,C0Fz+fM,2DACE,wB1F4+fR,C0Fx+fI,6CACE,wB1F2+fN,C0Fz+fM,oDACE,wB1F4+fR,C0FhhgBI,uCACE,Y1FmhgBN,C0FjhgBM,6DACE,uD1FohgBR,C0FjhgBM,yDACE,uD1FohgBR,C0FjhgBM,kDACE,uD1FohgBR,C0FhhgBI,uDACE,wB1FmhgBN,C0FjhgBM,8DACE,wB1FohgBR,C0FhhgBI,mDACE,wB1FmhgBN,C0FjhgBM,0DACE,wB1FohgBR,C0FhhgBI,4CACE,wB1FmhgBN,C0FjhgBM,mDACE,wB1FohgBR,C0FxjgBI,sCACE,Y1F2jgBN,C0FzjgBM,4DACE,wD1F4jgBR,C0FzjgBM,wDACE,wD1F4jgBR,C0FzjgBM,iDACE,wD1F4jgBR,C0FxjgBI,sDACE,wB1F2jgBN,C0FzjgBM,6DACE,wB1F4jgBR,C0FxjgBI,kDACE,wB1F2jgBN,C0FzjgBM,yDACE,wB1F4jgBR,C0FxjgBI,2CACE,wB1F2jgBN,C0FzjgBM,kDACE,wB1F4jgBR,C0FhmgBI,sCACE,Y1FmmgBN,C0FjmgBM,4DACE,wD1FomgBR,C0FjmgBM,wDACE,wD1FomgBR,C0FjmgBM,iDACE,wD1FomgBR,C0FhmgBI,sDACE,wB1FmmgBN,C0FjmgBM,6DACE,wB1FomgBR,C0FhmgBI,kDACE,wB1FmmgBN,C0FjmgBM,yDACE,wB1FomgBR,C0FhmgBI,2CACE,wB1FmmgBN,C0FjmgBM,kDACE,wB1FomgBR,C0FxogBI,uCACE,Y1F2ogBN,C0FzogBM,6DACE,uD1F4ogBR,C0FzogBM,yDACE,uD1F4ogBR,C0FzogBM,kDACE,uD1F4ogBR,C0FrogBM,qHACE,qB1F4ogBR,C0FrogBM,6GACE,qB1F4ogBR,C0FrogBM,+FACE,qB1F4ogBR,C0FhrgBI,sCACE,Y1FmrgBN,C0FjrgBM,4DACE,yD1ForgBR,C0FjrgBM,wDACE,yD1ForgBR,C0FjrgBM,iDACE,yD1ForgBR,C0FhrgBI,sDACE,wB1FmrgBN,C0FjrgBM,6DACE,wB1ForgBR,C0FhrgBI,kDACE,wB1FmrgBN,C0FjrgBM,yDACE,wB1ForgBR,C0FhrgBI,2CACE,wB1FmrgBN,C0FjrgBM,kDACE,wB1ForgBR,C0FxtgBI,2CACE,Y1F2tgBN,C0FztgBM,iEACE,sD1F4tgBR,C0FztgBM,6DACE,sD1F4tgBR,C0FztgBM,sDACE,sD1F4tgBR,C0FxtgBI,2DACE,wB1F2tgBN,C0FztgBM,kEACE,wB1F4tgBR,C0FxtgBI,uDACE,wB1F2tgBN,C0FztgBM,8DACE,wB1F4tgBR,C0FxtgBI,gDACE,wB1F2tgBN,C0FztgBM,uDACE,wB1F4tgBR,C2FnygBA,UjFWM,gBDEF,iBT2xgBJ,C2FnygBE,mBACE,qBACA,aACA,kBACA,kBACA,U3FsygBJ,C2FpygBI,iCACE,SACA,kBACA,U3FuygBN,C2FnygBI,qDAEE,U3FsygBN,C2FnygBI,qDAEE,U3FsygBN,C2FnygBI,uDAEE,S3FsygBN,C2FjygBA,gBACE,mB3FoygBF,C2FhygBA,aACE,W3FmygBF,C2FhygBA,aACE,U3FmygBF,C2FhygBA,cACE,U3FmygBF,C2F7xgBI,uBACE,Q3FgygBN,C4Fv1gBM,8CACE,wB5F01gBR,C4Fx1gBQ,8FAEE,U5F21gBV,C4Fx1gBQ,uDACE,a5F21gBV,C4Ft1gBI,2BACE,4B5Fy1gBN,C4Fn1gBU,qDACE,4B5Fs1gBZ,C4Fn1gBU,sDACE,4B5Fs1gBZ,C4F50gBI,gGACE,wB5Fi1gBN,C4F/0gBM,kHACE,U5Fo1gBR,C4F50gBM,kQAEE,W5Fi1gBR,C4F90gBM,+wBAKE,mBACA,U5Fs1gBR,C4Fn1gBM,yJACE,wB5Fu1gBR,C4Fp1gBM,sSAEE,mBACA,U5Fy1gBR,C4F95gBM,gDACE,wB5Fi6gBR,C4F/5gBQ,kGAEE,U5Fk6gBV,C4F/5gBQ,yDACE,a5Fk6gBV,C4F75gBI,6BACE,4B5Fg6gBN,C4F15gBU,uDACE,4B5F65gBZ,C4F15gBU,wDACE,4B5F65gBZ,C4Fn5gBI,sGACE,wB5Fw5gBN,C4Ft5gBM,wHACE,U5F25gBR,C4Fn5gBM,0QAEE,W5Fw5gBR,C4Fr5gBM,myBAKE,mBACA,U5F65gBR,C4F15gBM,6JACE,wB5F85gBR,C4F35gBM,8SAEE,mBACA,U5Fg6gBR,C4Fr+gBM,8CACE,wB5Fw+gBR,C4Ft+gBQ,8FAEE,U5Fy+gBV,C4Ft+gBQ,uDACE,a5Fy+gBV,C4Fp+gBI,2BACE,4B5Fu+gBN,C4Fj+gBU,qDACE,4B5Fo+gBZ,C4Fj+gBU,sDACE,4B5Fo+gBZ,C4F19gBI,gGACE,wB5F+9gBN,C4F79gBM,kHACE,U5Fk+gBR,C4F19gBM,kQAEE,W5F+9gBR,C4F59gBM,+wBAKE,mBACA,U5Fo+gBR,C4Fj+gBM,yJACE,wB5Fq+gBR,C4Fl+gBM,sSAEE,mBACA,U5Fu+gBR,C4F5ihBM,2CACE,wB5F+ihBR,C4F7ihBQ,wFAEE,U5FgjhBV,C4F7ihBQ,oDACE,a5FgjhBV,C4F3ihBI,wBACE,4B5F8ihBN,C4FxihBU,kDACE,4B5F2ihBZ,C4FxihBU,mDACE,4B5F2ihBZ,C4FjihBI,uFACE,wB5FsihBN,C4FpihBM,yGACE,U5FyihBR,C4FjihBM,sPAEE,W5FsihBR,C4FnihBM,ivBAKE,mBACA,U5F2ihBR,C4FxihBM,mJACE,wB5F4ihBR,C4FzihBM,0RAEE,mBACA,U5F8ihBR,C4FnnhBM,8CACE,wB5FsnhBR,C4F/mhBQ,qJACE,a5FunhBV,C4FlnhBI,2BACE,4B5FqnhBN,C4F/mhBU,qDACE,4B5FknhBZ,C4F/mhBU,sDACE,4B5FknhBZ,C4FxmhBI,gGACE,uB5F6mhBN,C4F3mhBM,kHACE,a5FgnhBR,C4FxmhBM,kQAEE,W5F6mhBR,C4F1mhBM,+wBAKE,mBACA,a5FknhBR,C4F/mhBM,yJACE,2B5FmnhBR,C4FhnhBM,sSAEE,mBACA,a5FqnhBR,C4F1rhBM,6CACE,wB5F6rhBR,C4F3rhBQ,4FAEE,U5F8rhBV,C4F3rhBQ,sDACE,a5F8rhBV,C4FzrhBI,0BACE,4B5F4rhBN,C4FtrhBU,oDACE,4B5FyrhBZ,C4FtrhBU,qDACE,4B5FyrhBZ,C4F/qhBI,6FACE,wB5ForhBN,C4FlrhBM,+GACE,U5FurhBR,C4F/qhBM,8PAEE,W5ForhBR,C4FjrhBM,qwBAKE,mBACA,U5FyrhBR,C4FtrhBM,uJACE,wB5F0rhBR,C4FvrhBM,kSAEE,mBACA,U5F4rhBR,C4FjwhBM,4CACE,wB5FowhBR,C4F7vhBQ,+IACE,a5FqwhBV,C4FhwhBI,yBACE,4B5FmwhBN,C4F7vhBU,mDACE,4B5FgwhBZ,C4F7vhBU,oDACE,4B5FgwhBZ,C4FtvhBI,0FACE,uB5F2vhBN,C4FzvhBM,4GACE,a5F8vhBR,C4FtvhBM,0PAEE,W5F2vhBR,C4FxvhBM,2vBAKE,mBACA,a5FgwhBR,C4F7vhBM,qJACE,2B5FiwhBR,C4F9vhBM,8RAEE,gBACA,a5FmwhBR,C4Fx0hBM,2CACE,wB5F20hBR,C4Fz0hBQ,wFAEE,U5F40hBV,C4Fz0hBQ,oDACE,a5F40hBV,C4Fv0hBI,wBACE,4B5F00hBN,C4Fp0hBU,kDACE,4B5Fu0hBZ,C4Fp0hBU,mDACE,4B5Fu0hBZ,C4F7zhBI,uFACE,wB5Fk0hBN,C4Fh0hBM,yGACE,U5Fq0hBR,C4F7zhBM,sPAEE,W5Fk0hBR,C4F/zhBM,ivBAKE,mBACA,U5Fu0hBR,C4Fp0hBM,mJACE,wB5Fw0hBR,C4Fr0hBM,0RAEE,mBACA,U5F00hBR,C4F/4hBM,gDACE,wB5Fk5hBR,C4Fh5hBQ,kGAEE,U5Fm5hBV,C4Fh5hBQ,yDACE,a5Fm5hBV,C4F94hBI,6BACE,4B5Fi5hBN,C4F34hBU,uDACE,4B5F84hBZ,C4F34hBU,wDACE,4B5F84hBZ,C4Fp4hBI,sGACE,wB5Fy4hBN,C4Fv4hBM,wHACE,U5F44hBR,C4Fp4hBM,0QAEE,W5Fy4hBR,C4Ft4hBM,myBAKE,mBACA,U5F84hBR,C4F34hBM,6JACE,wB5F+4hBR,C4F54hBM,8SAEE,mBACA,U5Fi5hBR,C4Ft9hBM,2CACE,wB5Fy9hBR,C4Fv9hBQ,wFAEE,U5F09hBV,C4Fv9hBQ,oDACE,a5F09hBV,C4Fr9hBI,wBACE,4B5Fw9hBN,C4Fl9hBU,kDACE,4B5Fq9hBZ,C4Fl9hBU,mDACE,4B5Fq9hBZ,C4F38hBI,uFACE,wB5Fg9hBN,C4F98hBM,yGACE,U5Fm9hBR,C4F38hBM,sPAEE,W5Fg9hBR,C4F78hBM,ivBAKE,mBACA,U5Fq9hBR,C4Fl9hBM,mJACE,wB5Fs9hBR,C4Fn9hBM,0RAEE,mBACA,U5Fw9hBR,C4F7hiBM,4CACE,wB5FgiiBR,C4F9hiBQ,0FAEE,U5FiiiBV,C4F9hiBQ,qDACE,a5FiiiBV,C4F5hiBI,yBACE,4B5F+hiBN,C4FzhiBU,mDACE,4B5F4hiBZ,C4FzhiBU,oDACE,4B5F4hiBZ,C4FlhiBI,0FACE,wB5FuhiBN,C4FrhiBM,4GACE,U5F0hiBR,C4FlhiBM,0PAEE,W5FuhiBR,C4FphiBM,2vBAKE,mBACA,U5F4hiBR,C4FzhiBM,qJACE,wB5F6hiBR,C4F1hiBM,8RAEE,mBACA,U5F+hiBR,C4FpmiBM,2CACE,wB5FumiBR,C4FhmiBQ,4IACE,a5FwmiBV,C4FnmiBI,wBACE,4B5FsmiBN,C4FhmiBU,kDACE,4B5FmmiBZ,C4FhmiBU,mDACE,4B5FmmiBZ,C4FzliBI,uFACE,uB5F8liBN,C4F5liBM,yGACE,a5FimiBR,C4FzliBM,sPAEE,W5F8liBR,C4F3liBM,ivBAKE,mBACA,a5FmmiBR,C4FhmiBM,mJACE,2B5FomiBR,C4FjmiBM,0RAEE,mBACA,a5FsmiBR,C4F3qiBM,8CACE,wB5F8qiBR,C4F5qiBQ,8FAEE,U5F+qiBV,C4F5qiBQ,uDACE,a5F+qiBV,C4F1qiBI,2BACE,4B5F6qiBN,C4FvqiBU,qDACE,4B5F0qiBZ,C4FvqiBU,sDACE,4B5F0qiBZ,C4FhqiBI,gGACE,wB5FqqiBN,C4FnqiBM,kHACE,U5FwqiBR,C4FhqiBM,kQAEE,W5FqqiBR,C4FlqiBM,+wBAKE,mBACA,U5F0qiBR,C4FvqiBM,yJACE,wB5F2qiBR,C4FxqiBM,sSAEE,mBACA,U5F6qiBR,C4FlviBM,6CACE,wB5FqviBR,C4FnviBQ,4FAEE,U5FsviBV,C4FnviBQ,sDACE,a5FsviBV,C4FjviBI,0BACE,4B5FoviBN,C4F9uiBU,oDACE,4B5FiviBZ,C4F9uiBU,qDACE,4B5FiviBZ,C4FvuiBI,6FACE,wB5F4uiBN,C4F1uiBM,+GACE,U5F+uiBR,C4FvuiBM,8PAEE,W5F4uiBR,C4FzuiBM,qwBAKE,mBACA,U5FiviBR,C4F9uiBM,uJACE,wB5FkviBR,C4F/uiBM,kSAEE,mBACA,U5FoviBR,C4FzziBM,2CACE,wB5F4ziBR,C4F1ziBQ,wFAEE,U5F6ziBV,C4F1ziBQ,oDACE,a5F6ziBV,C4FxziBI,wBACE,4B5F2ziBN,C4FrziBU,kDACE,4B5FwziBZ,C4FrziBU,mDACE,4B5FwziBZ,C4F9yiBI,uFACE,wB5FmziBN,C4FjziBM,yGACE,U5FsziBR,C4F9yiBM,sPAEE,W5FmziBR,C4FhziBM,ivBAKE,mBACA,U5FwziBR,C4FrziBM,mJACE,wB5FyziBR,C4FtziBM,0RAEE,mBACA,U5F2ziBR,C4Fh4iBM,6CACE,wB5Fm4iBR,C4Fj4iBQ,4FAEE,U5Fo4iBV,C4Fj4iBQ,sDACE,a5Fo4iBV,C4F/3iBI,0BACE,4B5Fk4iBN,C4F53iBU,oDACE,4B5F+3iBZ,C4F53iBU,qDACE,4B5F+3iBZ,C4Fr3iBI,6FACE,wB5F03iBN,C4Fx3iBM,+GACE,U5F63iBR,C4Fr3iBM,8PAEE,W5F03iBR,C4Fv3iBM,qwBAKE,mBACA,U5F+3iBR,C4F53iBM,uJACE,wB5Fg4iBR,C4F73iBM,kSAEE,mBACA,U5Fk4iBR,C4Fv8iBM,6CACE,wB5F08iBR,C4Fx8iBQ,4FAEE,U5F28iBV,C4Fx8iBQ,sDACE,a5F28iBV,C4Ft8iBI,0BACE,4B5Fy8iBN,C4Fn8iBU,oDACE,4B5Fs8iBZ,C4Fn8iBU,qDACE,4B5Fs8iBZ,C4F57iBI,6FACE,wB5Fi8iBN,C4F/7iBM,+GACE,U5Fo8iBR,C4F57iBM,8PAEE,W5Fi8iBR,C4F97iBM,qwBAKE,mBACA,U5Fs8iBR,C4Fn8iBM,uJACE,wB5Fu8iBR,C4Fp8iBM,kSAEE,mBACA,U5Fy8iBR,C4F9gjBM,2CACE,wB5FihjBR,C4F/gjBQ,wFAEE,U5FkhjBV,C4F/gjBQ,oDACE,a5FkhjBV,C4F7gjBI,wBACE,4B5FghjBN,C4F1gjBU,kDACE,4B5F6gjBZ,C4F1gjBU,mDACE,4B5F6gjBZ,C4FngjBI,uFACE,wB5FwgjBN,C4FtgjBM,yGACE,U5F2gjBR,C4FngjBM,sPAEE,W5FwgjBR,C4FrgjBM,ivBAKE,mBACA,U5F6gjBR,C4F1gjBM,mJACE,wB5F8gjBR,C4F3gjBM,0RAEE,mBACA,U5FghjBR,C4FrljBM,0CACE,wB5FwljBR,C4FtljBQ,sFAEE,U5FyljBV,C4FtljBQ,mDACE,a5FyljBV,C4FpljBI,uBACE,4B5FuljBN,C4FjljBU,iDACE,4B5FoljBZ,C4FjljBU,kDACE,4B5FoljBZ,C4F1kjBI,oFACE,wB5F+kjBN,C4F7kjBM,sGACE,U5FkljBR,C4F1kjBM,kPAEE,W5F+kjBR,C4F5kjBM,uuBAKE,mBACA,U5FoljBR,C4FjljBM,iJACE,wB5FqljBR,C4FlljBM,sRAEE,mBACA,U5FuljBR,C4F5pjBM,6CACE,wB5F+pjBR,C4FxpjBQ,kJACE,a5FgqjBV,C4F3pjBI,0BACE,4B5F8pjBN,C4FxpjBU,oDACE,4B5F2pjBZ,C4FxpjBU,qDACE,4B5F2pjBZ,C4FjpjBI,6FACE,uB5FspjBN,C4FppjBM,+GACE,a5FypjBR,C4FjpjBM,8PAEE,W5FspjBR,C4FnpjBM,qwBAKE,mBACA,a5F2pjBR,C4FxpjBM,uJACE,2B5F4pjBR,C4FzpjBM,kSAEE,mBACA,a5F8pjBR,C4FnujBM,6CACE,wB5FsujBR,C4F/tjBQ,kJACE,a5FuujBV,C4FlujBI,0BACE,4B5FqujBN,C4F/tjBU,oDACE,4B5FkujBZ,C4F/tjBU,qDACE,4B5FkujBZ,C4FxtjBI,6FACE,uB5F6tjBN,C4F3tjBM,+GACE,a5FgujBR,C4FxtjBM,8PAEE,W5F6tjBR,C4F1tjBM,qwBAKE,mBACA,a5FkujBR,C4F/tjBM,uJACE,2B5FmujBR,C4FhujBM,kSAEE,mBACA,a5FqujBR,C4F1yjBM,4CACE,wB5F6yjBR,C4F3yjBQ,0FAEE,U5F8yjBV,C4F3yjBQ,qDACE,a5F8yjBV,C4FzyjBI,yBACE,4B5F4yjBN,C4FtyjBU,mDACE,4B5FyyjBZ,C4FtyjBU,oDACE,4B5FyyjBZ,C4F/xjBI,0FACE,wB5FoyjBN,C4FlyjBM,4GACE,U5FuyjBR,C4F/xjBM,0PAEE,W5FoyjBR,C4FjyjBM,2vBAKE,mBACA,U5FyyjBR,C4FtyjBM,qJACE,wB5F0yjBR,C4FvyjBM,8RAEE,mBACA,U5F4yjBR,C4Fj3jBM,2CACE,wB5Fo3jBR,C4Fl3jBQ,wFAEE,U5Fq3jBV,C4Fl3jBQ,oDACE,a5Fq3jBV,C4Fh3jBI,wBACE,4B5Fm3jBN,C4F72jBU,kDACE,4B5Fg3jBZ,C4F72jBU,mDACE,4B5Fg3jBZ,C4Ft2jBI,uFACE,wB5F22jBN,C4Fz2jBM,yGACE,U5F82jBR,C4Ft2jBM,sPAEE,W5F22jBR,C4Fx2jBM,ivBAKE,mBACA,U5Fg3jBR,C4F72jBM,mJACE,wB5Fi3jBR,C4F92jBM,0RAEE,mBACA,U5Fm3jBR,C4Fx7jBM,2CACE,wB5F27jBR,C4Fz7jBQ,wFAEE,U5F47jBV,C4Fz7jBQ,oDACE,a5F47jBV,C4Fv7jBI,wBACE,4B5F07jBN,C4Fp7jBU,kDACE,4B5Fu7jBZ,C4Fp7jBU,mDACE,4B5Fu7jBZ,C4F76jBI,uFACE,wB5Fk7jBN,C4Fh7jBM,yGACE,U5Fq7jBR,C4F76jBM,sPAEE,W5Fk7jBR,C4F/6jBM,ivBAKE,mBACA,U5Fu7jBR,C4Fp7jBM,mJACE,wB5Fw7jBR,C4Fr7jBM,0RAEE,mBACA,U5F07jBR,C4F//jBM,4CACE,qB5FkgkBR,C4F3/jBQ,+IACE,a5FmgkBV,C4F9/jBI,yBACE,yB5FigkBN,C4F3/jBU,mDACE,4B5F8/jBZ,C4F3/jBU,oDACE,yB5F8/jBZ,C4Fp/jBI,0FACE,uB5Fy/jBN,C4Fv/jBM,4GACE,a5F4/jBR,C4Fp/jBM,0PAEE,W5Fy/jBR,C4Ft/jBM,2vBAKE,mBACA,a5F8/jBR,C4F3/jBM,qJACE,2B5F+/jBR,C4F5/jBM,8RAEE,gBACA,a5FigkBR,C4FtkkBM,2CACE,wB5FykkBR,C4FvkkBQ,wFAEE,U5F0kkBV,C4FvkkBQ,oDACE,a5F0kkBV,C4FrkkBI,wBACE,4B5FwkkBN,C4FlkkBU,kDACE,4B5FqkkBZ,C4FlkkBU,mDACE,4B5FqkkBZ,C4F3jkBI,uFACE,wB5FgkkBN,C4F9jkBM,yGACE,U5FmkkBR,C4F3jkBM,sPAEE,W5FgkkBR,C4F7jkBM,ivBAKE,mBACA,U5FqkkBR,C4FlkkBM,mJACE,wB5FskkBR,C4FnkkBM,0RAEE,mBACA,U5FwkkBR,C4F7okBM,gDACE,wB5FgpkBR,C4F9okBQ,kGAEE,U5FipkBV,C4F9okBQ,yDACE,a5FipkBV,C4F5okBI,6BACE,4B5F+okBN,C4FzokBU,uDACE,4B5F4okBZ,C4FzokBU,wDACE,4B5F4okBZ,C4FlokBI,sGACE,wB5FuokBN,C4FrokBM,wHACE,U5F0okBR,C4FlokBM,0QAEE,W5FuokBR,C4FpokBM,myBAKE,mBACA,U5F4okBR,C4FzokBM,6JACE,wB5F6okBR,C4F1okBM,8SAEE,mBACA,U5F+okBR,C6F9skBA,MnFGM,6DmFDJ,kB7FitkBF,C6F9skBI,2BACE,oB7FitkBN,C6F9skBI,uCAEE,U7FitkBN,C6F7skBE,qBACE,sBACA,OACA,0BACA,yBACA,eACA,MACA,qBACA,Y7FgtkBJ,C6F9skBI,8CACE,uB7FitkBN,C6F9skBI,4CACE,Y7FitkBN,C6F9skBI,oEpF5BA,yBT+ukBJ,C6F3skBI,kEAEE,Y7F8skBN,C6FzskBI,0BACE,yCACA,Q7F4skBN,C6F1skBM,uCACE,e7F6skBR,C6FtskBI,gCACE,iBACA,a7FyskBN,C6FrskBE,oBACE,uC7FwskBJ,C6FrskBE,mBACE,sC7FwskBJ,C6FnskBM,gDACE,e7FsskBR,C6FnskBU,gFACE,gB7FsskBZ,C6F/rkBM,uCACE,e7FkskBR,C6FhskBQ,6DACE,cACA,a7FmskBV,C6F9rkBI,4BACE,kB7FiskBN,C6F1rkBQ,4IACE,e7FiskBV,C6F/rkBU,qFACE,e7FkskBZ,C6FzrkBU,gEACE,kB7F4rkBZ,C6FrrkBE,wBACE,Y7FwrkBJ,C6FprkBQ,qEACE,cACA,a7FurkBV,C6FnrkBM,uCACE,gC7FsrkBR,C6FprkBQ,6CACE,4B7FurkBV,C6FnrkBU,oDACE,Y7FsrkBZ,C6FhrkBI,oCACE,wB7FmrkBN,C6F7qkBM,4JACE,e7ForkBR,C6FlrkBQ,6FACE,e7FqrkBV,C6F7qkBU,wEACE,kB7FgrkBZ,C6FtqkBA,oBACE,e7FyqkBF,CqD72kBE,uDACE,cACA,WACA,UrDk3kBJ,C6FtqkBA,aACE,6BACA,yCACA,uBACA,kBpFzLE,8BACA,8BTm2kBJ,C6FrqkBE,6BACE,e7FwqkBJ,C6FrqkBE,yBACE,YACA,qB7FwqkBJ,C6FtqkBI,yGAGE,qBACA,iB7FyqkBN,C6FtqkBI,+CACE,iB7FyqkBN,C6FpqkBA,YACE,WACA,iBACA,gBACA,Q7FuqkBF,C6FpqkBA,WACE,U7FuqkBF,C6FlqkBA,UACE,uBACA,cACA,kBACA,iBACA,oB7FqqkBF,C6FnqkBE,0CAEE,a7FsqkBJ,C6FnqkBE,gCAEE,yB7FsqkBJ,C6FjqkBE,qBACE,c7FoqkBJ,C6FjqkBE,mBACE,mB7FoqkBJ,C6FxpkBE,kBACE,e7F2pkBJ,C6FzpkBI,4DAEE,kB7F4pkBN,C6FvpkBE,eACE,c7F0pkBJ,C6FvpkBE,6BACE,Y7F0pkBJ,C6FvpkBE,iCACE,W7F0pkBJ,C6FtpkBA,cvFnTE,eACA,gBuFoTA,a7F0pkBF,C6FvpkBI,yBADF,iBAEI,WACA,iB7F2pkBJ,CACF,C6FtpkBA,eACE,kB7FypkBF,C6FvpkBE,6BAEE,gCACA,a7FypkBJ,CqDl+kBE,mCACE,cACA,WACA,UrDq+kBJ,C6F7pkBI,0CACE,e7FgqkBN,C6F7pkBI,2CACE,a7FgqkBN,C6F7pkBI,iCACE,gBACA,eACA,U7FgqkBN,C6F5pkBE,6BACE,cACA,gB7F+pkBJ,C6F5pkBE,yBACE,cACA,cACA,e7F+pkBJ,C6F5pkBE,2BACE,eACA,e7F+pkBJ,C6FvpkBA,WACE,gBACA,SACA,cACA,S7F0pkBF,C6FvpkBE,cpFrWE,kBoFuWA,mBACA,8BACA,cACA,kBACA,Y7F0pkBJ,C6FxpkBI,2BACE,e7F2pkBN,C6FxpkBI,mCACE,mB7F2pkBN,C6FxpkBI,oBACE,qBACA,gBACA,e7F2pkBN,C6FvpkBI,qBACE,gBACA,gB7F0pkBN,C6FtpkBI,qBACE,cACA,aACA,W7FypkBN,C6FtpkBM,iKAME,eACA,gB7FypkBR,C6FrpkBI,2BACE,oB7FwpkBN,C6FrpkBI,mBACE,a7FwpkBN,C6FtpkBM,yBACE,gBACA,4B7FypkBR,C6FtpkBM,0BACE,4B7FypkBR,C6FlpkBI,oBACE,yB7FqpkBN,C6FtpkBI,sBACE,yB7FypkBN,C6F1pkBI,oBACE,yB7F6pkBN,C6F9pkBI,iBACE,yB7FiqkBN,C6FlqkBI,oBACE,yB7FqqkBN,C6FtqkBI,mBACE,yB7FyqkBN,C6F1qkBI,kBACE,yB7F6qkBN,C6F9qkBI,iBACE,yB7FirkBN,C6F5qkBI,sBACE,yB7F+qkBN,C6FhrkBI,iBACE,yB7FmrkBN,C6FprkBI,kBACE,yB7FurkBN,C6FxrkBI,iBACE,yB7F2rkBN,C6F5rkBI,oBACE,yB7F+rkBN,C6FhskBI,mBACE,yB7FmskBN,C6FpskBI,iBACE,yB7FuskBN,C6FxskBI,mBACE,yB7F2skBN,C6F5skBI,mBACE,yB7F+skBN,C6FhtkBI,iBACE,yB7FmtkBN,C6FptkBI,gBACE,yB7FutkBN,C6FxtkBI,mBACE,yB7F2tkBN,C6F5tkBI,mBACE,yB7F+tkBN,C6FhukBI,kBACE,yB7FmukBN,C6FpukBI,iBACE,yB7FuukBN,C6FxukBI,iBACE,yB7F2ukBN,C6F5ukBI,kBACE,sB7F+ukBN,C6FhvkBI,iBACE,yB7FmvkBN,C6FpvkBI,sBACE,yB7FuvkBN,C6FnvkBE,mBACE,YACA,qBACA,Y7FsvkBJ,C6F/ukBA,YACE,e7FkvkBF,C6F5ukBI,8CACE,a7F+ukBN,C8F/rlBE,uBACE,sBACA,cACA,YACA,OACA,WACA,kBACA,MACA,WACA,Y9FkslBJ,C8F1rlBI,gFAEE,oB9F6rlBN,C8FprlBI,mKACE,WACA,wB9F2rlBN,C+F1tlBE,4BAEE,kB/F6tlBJ,C+FztlBE,ctFOE,gBsFLA,iBACA,e/F4tlBJ,C+FxtlBE,cACE,gBACA,iB/F2tlBJ,C+FztlBI,+BACE,gBACA,eACA,cACA,gBACA,gBACA,eACA,UACA,aACA,kBACA,QACA,iBACA,K/F4tlBN,C+FxtlBE,cACE,2B/F2tlBJ,C+FttlBA,aACE,yBACA,kBACA,U/FytlBF,C+FvtlBE,0DAGE,yBACA,a/F0tlBJ,C+FrtlBA,StFxCI,kBsF0CF,yBACA,sBACA,cACA,eACA,YACA,qBACA,eACA,iBACA,kBACA,iB/FwtlBF,C+FrtlBE,yFAME,cACA,c/FwtlBJ,C+FrtlBE,eACE,mBACA,kBACA,U/FwtlBJ,C+FrtlBE,+BrFxEI,2CVkylBN,C+FptlBE,gBACE,eACA,gBACA,kBACA,YACA,Q/FutlBJ,C+FjtlBA,QxEDE,uBnBuBI,iBmBrBJ,gBdxFE,oBT+ylBJ,CgG5zlBE,aACE,iBhG+zlBJ,CgG5zlBE,cACE,WACA,UhG+zlBJ,CgG7zlBI,oBACE,UhGg0lBN,CgG5zlBE,SACE,WACA,yBhG+zlBJ,CgGzzlBE,eACE,WACA,mBACA,oBhG4zlBJ,CgGzzlBE,uBvD/BA,cpBKE,yBoBHF,oBzC41lBF,CyC11lBE,0BACE,wBzC61lBJ,CyC11lBE,mCACE,azC61lBJ,CgG70lBE,iBACE,WACA,mBACA,oBhGg1lBJ,CgG70lBE,yBvD/BA,cpBKE,yBoBHF,oBzCg3lBF,CyC92lBE,4BACE,wBzCi3lBJ,CyC92lBE,qCACE,azCi3lBJ,CgGj2lBE,eACE,WACA,mBACA,oBhGo2lBJ,CgGj2lBE,uBvD/BA,cpBKE,yBoBHF,oBzCo4lBF,CyCl4lBE,0BACE,wBzCq4lBJ,CyCl4lBE,mCACE,azCq4lBJ,CgGr3lBE,YACE,WACA,mBACA,oBhGw3lBJ,CgGr3lBE,oBvD/BA,cpBKE,yBoBHF,oBzCw5lBF,CyCt5lBE,uBACE,wBzCy5lBJ,CyCt5lBE,gCACE,azCy5lBJ,CgGz4lBE,eACE,cACA,mBACA,oBhG44lBJ,CgGz4lBE,uBvD/BA,cpBKE,yBoBHF,oBzC46lBF,CyC16lBE,0BACE,wBzC66lBJ,CyC16lBE,mCACE,azC66lBJ,CgG75lBE,cACE,WACA,mBACA,oBhGg6lBJ,CgG75lBE,sBvD/BA,cpBKE,yBoBHF,oBzCg8lBF,CyC97lBE,yBACE,wBzCi8lBJ,CyC97lBE,kCACE,azCi8lBJ,CgGj7lBE,aACE,cACA,mBACA,oBhGo7lBJ,CgGj7lBE,qBvD/BA,cpBKE,yBoBHF,oBzCo9lBF,CyCl9lBE,wBACE,wBzCq9lBJ,CyCl9lBE,iCACE,azCq9lBJ,CgGr8lBE,YACE,WACA,mBACA,oBhGw8lBJ,CgGr8lBE,oBvD/BA,cpBKE,yBoBHF,oBzCw+lBF,CyCt+lBE,uBACE,wBzCy+lBJ,CyCt+lBE,gCACE,azCy+lBJ,CiG9+lBE,wBACE,ajGi/lBJ,CiG5+lBI,gDACE,sBACA,gBACA,wDAEA,gBACA,MACA,UjG8+lBN,CiGz+lBQ,2DACE,yBACA,uDjG4+lBV,CiGn+lBI,yDAGE,QjGs+lBN,CiGh+lBI,+DAGE,iBjGm+lBN,CiG99lBI,4JAIE,qBjGi+lBN,CiGx9lBM,gMACE,mBjG89lBR,CiG39lBM,4LACE,oBjGi+lBR,CkGlimBA,UxFYM,6DDEF,qByFVF,gBACA,aACA,mBACA,gBACA,cACA,kBACA,UlGoimBF,CkGlimBE,oBACE,kCACA,WACA,YlGqimBJ,CkGnimBI,kCACE,qBlGsimBN,CkGlimBE,yBAEI,qBAGF,mBACA,aACA,mBACA,uBACA,kBACA,UlGkimBJ,CkGhimBI,6BACE,clGmimBN,CkG/hmBE,4BACE,aACA,sBACA,uBACA,iBACA,OACA,clGkimBJ,CkG/hmBE,2BACE,cACA,kBACA,elGkimBJ,CkG/hmBE,yDAEE,cACA,gBACA,uBACA,kBlGkimBJ,CkG7hmBM,yEAEE,UlGgimBR,CkG9hmBQ,qGACE,qBlGkimBV,CkGvimBM,6EAEE,UlG0imBR,CkGximBQ,yGACE,qBlG4imBV,CkGjjmBM,yEAEE,UlGojmBR,CkGljmBQ,qGACE,qBlGsjmBV,CkG3jmBM,mEAEE,UlG8jmBR,CkG5jmBQ,+FACE,qBlGgkmBV,CkGrkmBM,yEAEE,alGwkmBR,CkGtkmBQ,qGACE,wBlG0kmBV,CkG/kmBM,uEAEE,UlGklmBR,CkGhlmBQ,mGACE,qBlGolmBV,CkGzlmBM,qEAEE,alG4lmBR,CkG1lmBQ,iGACE,wBlG8lmBV,CkGnmmBM,mEAEE,UlGsmmBR,CkGpmmBQ,+FACE,qBlGwmmBV,CkGlmmBE,yBACE,alGqmmBJ,CkGlmmBE,gCACE,QlGqmmBJ,Cc7nmBI,yBoFwCE,4PACE,YlGimmBN,CACF,Cc3omBI,yBoF2DE,4P9FQA,iB8FNE,alG6lmBN,CACF,Cc3pmBI,0BoF+EE,4P9FZA,e8FcE,alGylmBN,CACF,CmGnumBA,oBACE,kCnGsumBF,CmGlumBA,mBACE,cACA,cACA,iBnGqumBF,CmGnumBE,iCACE,kBnGsumBJ,CmGnumBE,uCACE,eACA,gBACA,SACA,SnGsumBJ,CmGnumBE,qCACE,wBnGsumBJ,CmGlumBE,qCACE,cnGqumBJ,CmG/tmBE,wCACE,cACA,gBACA,eACA,eACA,enGkumBJ,CmG9tmBA,aACE,cACA,eACA,gBACA,gBnGiumBF,CmG9tmBA,gBACE,4BACA,WACA,iBnGiumBF,CmG7tmBE,aACE,cACA,WnGgumBJ,CmG9tmBI,mBACE,anGiumBN,CmG3tmBA,YACE,UnG8tmBF,CmG5tmBE,gBACE,WACA,YACA,UnG+tmBJ,CmG5tmBE,oEAGE,cACA,gBnG+tmBJ,CmG5tmBE,sBACE,eACA,gBACA,enG+tmBJ,CmG5tmBE,yBACE,cACA,eACA,enG+tmBJ,CmG3tmBI,8BACE,eACA,enG8tmBN,CmG3tmBI,8GAGE,gBnG8tmBN,CmG3tmBI,oCACE,cnG8tmBN,CmGxtmBA,wBAGE,UnG2tmBF,CmGxtmBA,QACE,gBACA,cnG2tmBF,CmGztmBE,kBACE,kBnG4tmBJ,CmGxtmBA,QACE,cACA,cnG2tmBF,CmGztmBE,kBACE,oBnG4tmBJ,CmGxtmBA,QACE,cACA,cnG2tmBF,CmGztmBE,kBACE,oBnG4tmBJ,CmGvtmBA,cACE,yBACA,WnG0tmBF,CmGvtmBA,iBACE,yBACA,WnG0tmBF,CmGttmBA,a1FjJI,oBT22mBJ,CmGttmBA,Y1FrJI,iBT+2mBJ,CmGrtmBA,uCAGE,WnGwtmBF,CmGrtmBA,aACE,UnGwtmBF,CmGrtmBA,aACE,UnGwtmBF,CmGrtmBA,aACE,UnGwtmBF,CmGptmBA,2BAGE,cACA,iBnGutmBF,CmGptmBA,SACE,YACA,iBACA,UnGutmBF,CmGptmBA,SACE,YACA,iBACA,UnGutmBF,CmGptmBA,SACE,YACA,iBACA,UnGutmBF,CmGntmBA,kBACE,mBACA,kCACA,mBACA,WnGstmBF,CmGptmBE,kCACE,WACA,YACA,iBACA,enGutmBJ,CmGptmBE,qCACE,iBnGutmBJ,CmGptmBE,sCACE,QnGutmBJ,CmGptmBE,mCACE,anGutmBJ,CmG7smBE,gLAEE,YACA,OACA,kBACA,MACA,UnGstmBJ,CmGntmBE,gF1FhPE,qB0FkPA,mBACA,8BACA,aACA,uBACA,UnGytmBJ,CmGvtmBI,4mBAME,anG4umBN,CmGzumBI,oGACE,yBnG+umBN,CmG7umBM,ouBAME,anGkwmBR,CmG1vmBE,2BACE,iBnG6vmBJ,CmG5vmBI,oCACE,yBACA,0BACA,sBACA,oBACA,qBACA,2BACA,yBnG+vmBN,CmG7vmBM,yCACE,UnGgwmBR,CmGzvmBA,gBACE,YACA,gBACA,kBACA,WACA,SACA,WACA,UnG4vmBF,CmG1vmBE,0BACE,aACA,WnG6vmBJ,CmG3vmBI,kCACE,QACA,SACA,WnG8vmBN,CmG1vmBE,0BACE,aACA,WnG6vmBJ,CmG3vmBI,kCACE,UACA,SACA,WnG8vmBN,CmG1vmBE,wBACE,kCACA,gBACA,iBACA,kBACA,kBACA,WACA,kBACA,oCACA,yBACA,SACA,wBACA,UnG6vmBJ,CmG3vmBI,6DAEE,kCACA,mCACA,6BACA,YACA,WACA,iBnG8vmBN,CmG3vmBI,+BACE,MnG8vmBN,CmG3vmBI,8BACE,OnG8vmBN,CmGxvmBA,aACE,eACA,eACA,cACA,YnG2vmBF,CmGzvmBE,mBACE,enG4vmBJ,CmGvvmBA,IACE,cnG0vmBF,CmGtvmBA,WACE,gBACA,gCACA,mBACA,kBnGyvmBF,CmGvvmBE,gBACE,kBnG0vmBJ,CmGvvmBE,wBACE,enG0vmBJ,CmGvvmBE,oFAME,cACA,kBACA,enG0vmBJ,CmGtvmBI,yBACE,oBnGyvmBN,CmGvvmBM,wKAME,anG0vmBR,CmGnwmBI,2BACE,oBnGswmBN,CmGpwmBM,oLAME,anGuwmBR,CmGhxmBI,yBACE,oBnGmxmBN,CmGjxmBM,wKAME,anGoxmBR,CmG7xmBI,sBACE,oBnGgymBN,CmG9xmBM,sJAME,anGiymBR,CmG1ymBI,yBACE,oBnG6ymBN,CmG3ymBM,wKAME,anG8ymBR,CmGvzmBI,wBACE,oBnG0zmBN,CmGxzmBM,kKAME,anG2zmBR,CmGp0mBI,uBACE,oBnGu0mBN,CmGr0mBM,4JAME,anGw0mBR,CmGj1mBI,sBACE,oBnGo1mBN,CmGl1mBM,sJAME,anGq1mBR,CmG/0mBI,2BACE,oBnGk1mBN,CmGh1mBM,oLAME,anGm1mBR,CmG51mBI,sBACE,oBnG+1mBN,CmG71mBM,sJAME,anGg2mBR,CmGz2mBI,uBACE,oBnG42mBN,CmG12mBM,4JAME,anG62mBR,CmGt3mBI,sBACE,oBnGy3mBN,CmGv3mBM,sJAME,anG03mBR,CmGn4mBI,yBACE,oBnGs4mBN,CmGp4mBM,wKAME,anGu4mBR,CmGh5mBI,wBACE,oBnGm5mBN,CmGj5mBM,kKAME,anGo5mBR,CmG75mBI,sBACE,oBnGg6mBN,CmG95mBM,sJAME,anGi6mBR,CmG16mBI,wBACE,oBnG66mBN,CmG36mBM,kKAME,anG86mBR,CmGv7mBI,wBACE,oBnG07mBN,CmGx7mBM,kKAME,anG27mBR,CmGp8mBI,sBACE,oBnGu8mBN,CmGr8mBM,sJAME,anGw8mBR,CmGj9mBI,qBACE,oBnGo9mBN,CmGl9mBM,gJAME,anGq9mBR,CmG99mBI,wBACE,oBnGi+mBN,CmG/9mBM,kKAME,anGk+mBR,CmG3+mBI,wBACE,oBnG8+mBN,CmG5+mBM,kKAME,anG++mBR,CmGx/mBI,uBACE,oBnG2/mBN,CmGz/mBM,4JAME,anG4/mBR,CmGrgnBI,sBACE,oBnGwgnBN,CmGtgnBM,sJAME,anGygnBR,CmGlhnBI,sBACE,oBnGqhnBN,CmGnhnBM,sJAME,anGshnBR,CmG/hnBI,uBACE,iBnGkinBN,CmGhinBM,4JAME,UnGminBR,CmG5inBI,sBACE,oBnG+inBN,CmG7inBM,sJAME,anGgjnBR,CmGzjnBI,2BACE,oBnG4jnBN,CmG1jnBM,oLAME,anG6jnBR,CmGpjnBA,oBACE,6BACA,iBACA,iBnGujnBF,CmGpjnBA,yBACE,gBACA,gCACA,aACA,oBACA,oBnGujnBF,CmGljnBA,WACE,qBACA,iBACA,gBACA,oBnGqjnBF,CmGljnBA,sBACE,qBnGqjnBF,CoG9goBA,aAEE,qDACE,sBpGmhoBF,CoGxgoBA,8BjBZA,uBiBeE,wBACA,sBpG2goBF,CoGxgoBA,+BACE,uBpG2goBF,CoGvgoBA,SACE,SACA,SACA,UACA,UpG0goBF,CoGvgoBA,aACE,WACA,iBpG0goBF,CoGtgoBA,kBACE,apGygoBF,CoGvgoBE,8DAEE,4BpG0goBJ,CACF,CqGrjoBE,mDACE,erG0joBJ,CqGtjoBA,SACE,0BrGyjoBF,CqGtjoBA,SACE,2BrGyjoBF,CqGtjoBA,SACE,wBrGyjoBF,CqGtjoBA,SACE,2BrGyjoBF,CqGtjoBA,SACE,wBrGyjoBF,CqGpjoBE,gBACE,uBrGujoBJ,CqGxjoBE,WACE,uBrG2joBJ,CqG5joBE,YACE,uBrG+joBJ,CqGhkoBE,WACE,uBrGmkoBJ,CqGpkoBE,cACE,uBrGukoBJ,CqGxkoBE,aACE,uBrG2koBJ,CqG5koBE,WACE,uBrG+koBJ,CqGhloBE,aACE,uBrGmloBJ,CqGploBE,aACE,uBrGuloBJ,CqGxloBE,WACE,uBrG2loBJ,CqG5loBE,UACE,uBrG+loBJ,CqGhmoBE,aACE,uBrGmmoBJ,CqGpmoBE,aACE,uBrGumoBJ,CqGxmoBE,YACE,uBrG2moBJ,CqG5moBE,WACE,uBrG+moBJ,CqGhnoBE,WACE,uBrGmnoBJ,CqGpnoBE,YACE,oBrGunoBJ,CqGxnoBE,WACE,uBrG2noBJ,CqG5noBE,gBACE,uBrG+noBJ,CsG7poBA,aACE,yBtGgqoBF,CsG3poBE,aACE,wEtG8poBJ,CsG/poBE,aACE,wEtGkqoBJ,CsGnqoBE,aACE,0EtGsqoBJ,CsGvqoBE,aACE,4EtG0qoBJ,CsG3qoBE,aACE,2EtG8qoBJ,CuGnroBE,YACE,kCvGsroBJ,CuGproBI,0BAEE,oBvGuroBN,CuGnroBM,sBACE,qBACA,avGsroBR,CuGnroBM,wJAIE,mCACA,qBACA,UvGsroBR,CuG1soBE,cACE,kCvG6soBJ,CuG3soBI,8BAEE,oBvG8soBN,CuG1soBM,wBACE,qBACA,avG6soBR,CuG1soBM,gKAIE,mCACA,qBACA,UvG6soBR,CuGjuoBE,YACE,kCvGouoBJ,CuGluoBI,0BAEE,oBvGquoBN,CuGjuoBM,sBACE,qBACA,avGouoBR,CuGjuoBM,wJAIE,mCACA,qBACA,UvGouoBR,CuGxvoBE,SACE,kCvG2voBJ,CuGzvoBI,oBAEE,oBvG4voBN,CuGxvoBM,mBACE,qBACA,avG2voBR,CuGxvoBM,4IAIE,mCACA,qBACA,UvG2voBR,CuG/woBE,YACE,kCvGkxoBJ,CuGhxoBI,0BAEE,uBvGmxoBN,CuG/woBM,sBACE,qBACA,avGkxoBR,CuG/woBM,wJAIE,mCACA,qBACA,avGkxoBR,CuGtyoBE,WACE,kCvGyyoBJ,CuGvyoBI,wBAEE,oBvG0yoBN,CuGtyoBM,qBACE,qBACA,avGyyoBR,CuGtyoBM,oJAIE,mCACA,qBACA,UvGyyoBR,CuG7zoBE,UACE,kCvGg0oBJ,CuG9zoBI,sBAEE,uBvGi0oBN,CuG7zoBM,oBACE,qBACA,avGg0oBR,CuG7zoBM,gJAIE,mCACA,qBACA,avGg0oBR,CuGp1oBE,SACE,kCvGu1oBJ,CuGr1oBI,oBAEE,oBvGw1oBN,CuGp1oBM,mBACE,qBACA,avGu1oBR,CuGp1oBM,4IAIE,mCACA,qBACA,UvGu1oBR,CuG32oBE,cACE,kCvG82oBJ,CuG52oBI,8BAEE,oBvG+2oBN,CuG32oBM,wBACE,qBACA,avG82oBR,CuG32oBM,gKAIE,mCACA,qBACA,UvG82oBR,CuGl4oBE,SACE,kCvGq4oBJ,CuGn4oBI,oBAEE,oBvGs4oBN,CuGl4oBM,mBACE,qBACA,avGq4oBR,CuGl4oBM,4IAIE,mCACA,kBACA,UvGq4oBR,CuGz5oBE,UACE,kCvG45oBJ,CuG15oBI,sBAEE,oBvG65oBN,CuGz5oBM,oBACE,qBACA,avG45oBR,CuGz5oBM,gJAIE,mCACA,qBACA,UvG45oBR,CuGh7oBE,SACE,kCvGm7oBJ,CuGj7oBI,oBAEE,uBvGo7oBN,CuGh7oBM,mBACE,qBACA,avGm7oBR,CuGh7oBM,4IAIE,mCACA,qBACA,UvGm7oBR,CuGv8oBE,YACE,kCvG08oBJ,CuGx8oBI,0BAEE,oBvG28oBN,CuGv8oBM,sBACE,qBACA,avG08oBR,CuGv8oBM,wJAIE,mCACA,qBACA,UvG08oBR,CuG99oBE,WACE,kCvGi+oBJ,CuG/9oBI,wBAEE,oBvGk+oBN,CuG99oBM,qBACE,qBACA,avGi+oBR,CuG99oBM,oJAIE,mCACA,qBACA,UvGi+oBR,CuGr/oBE,SACE,kCvGw/oBJ,CuGt/oBI,oBAEE,oBvGy/oBN,CuGr/oBM,mBACE,qBACA,avGw/oBR,CuGr/oBM,4IAIE,mCACA,qBACA,UvGw/oBR,CuG5gpBE,WACE,kCvG+gpBJ,CuG7gpBI,wBAEE,oBvGghpBN,CuG5gpBM,qBACE,qBACA,avG+gpBR,CuG5gpBM,oJAIE,mCACA,qBACA,UvG+gpBR,CuGnipBE,WACE,kCvGsipBJ,CuGpipBI,wBAEE,oBvGuipBN,CuGnipBM,qBACE,qBACA,avGsipBR,CuGnipBM,oJAIE,mCACA,qBACA,UvGsipBR,CuG1jpBE,SACE,kCvG6jpBJ,CuG3jpBI,oBAEE,oBvG8jpBN,CuG1jpBM,mBACE,qBACA,avG6jpBR,CuG1jpBM,4IAIE,mCACA,qBACA,UvG6jpBR,CuGjlpBE,QACE,kCvGolpBJ,CuGllpBI,kBAEE,oBvGqlpBN,CuGjlpBM,kBACE,qBACA,avGolpBR,CuGjlpBM,wIAIE,mCACA,qBACA,UvGolpBR,CuGxmpBE,WACE,kCvG2mpBJ,CuGzmpBI,wBAEE,uBvG4mpBN,CuGxmpBM,qBACE,qBACA,avG2mpBR,CuGxmpBM,oJAIE,mCACA,qBACA,UvG2mpBR,CuG/npBE,WACE,kCvGkopBJ,CuGhopBI,wBAEE,uBvGmopBN,CuG/npBM,qBACE,qBACA,avGkopBR,CuG/npBM,oJAIE,mCACA,qBACA,avGkopBR,CuGtppBE,UACE,kCvGyppBJ,CuGvppBI,sBAEE,oBvG0ppBN,CuGtppBM,oBACE,qBACA,avGyppBR,CuGtppBM,gJAIE,mCACA,qBACA,UvGyppBR,CuG7qpBE,SACE,kCvGgrpBJ,CuG9qpBI,oBAEE,oBvGirpBN,CuG7qpBM,mBACE,qBACA,avGgrpBR,CuG7qpBM,4IAIE,mCACA,qBACA,UvGgrpBR,CuGpspBE,SACE,kCvGuspBJ,CuGrspBI,oBAEE,oBvGwspBN,CuGpspBM,mBACE,qBACA,avGuspBR,CuGpspBM,4IAIE,mCACA,qBACA,UvGuspBR,CuG3tpBE,UACE,+BvG8tpBJ,CuG5tpBI,sBAEE,uBvG+tpBN,CuG3tpBM,oBACE,qBACA,avG8tpBR,CuG3tpBM,gJAIE,mCACA,qBACA,avG8tpBR,CuGlvpBE,SACE,kCvGqvpBJ,CuGnvpBI,oBAEE,oBvGsvpBN,CuGlvpBM,mBACE,qBACA,avGqvpBR,CuGlvpBM,4IAIE,mCACA,qBACA,UvGqvpBR,CuGzwpBE,cACE,kCvG4wpBJ,CuG1wpBI,8BAEE,oBvG6wpBN,CuGzwpBM,wBACE,qBACA,avG4wpBR,CuGzwpBM,gKAIE,mCACA,qBACA,UvG4wpBR,CwGxxpBA,SACE,yBACA,axG2xpBF,CwGxxpBA,eACE,yBACA,uBxG2xpBF,CwGxxpBA,UACE,sBACA,oBxG2xpBF,CwGxxpBA,UACE,sBACA,uBxG2xpBF,CuGxxpBE,qBAEE,W/CjBA,6ExD2ypBJ,CuGvxpBM,+OAKE,+BvG8xpBR,CuG3xpBM,+BAEE,qBACA,c/C/BJ,6ExD4zpBJ,CuG1xpBM,4LAKE,qBACA,W/CxCJ,6ExDw0pBJ,CuGzzpBE,uBAEE,W/CjBA,6ExDm1pBJ,CuG/zpBM,yPAKE,+BvGs0pBR,CuGn0pBM,iCAEE,qBACA,c/C/BJ,6ExDo2pBJ,CuGl0pBM,oMAKE,qBACA,W/CxCJ,6ExDg3pBJ,CuGj2pBE,qBAEE,W/CjBA,6ExD23pBJ,CuGv2pBM,+OAKE,+BvG82pBR,CuG32pBM,+BAEE,qBACA,c/C/BJ,6ExD44pBJ,CuG12pBM,4LAKE,qBACA,W/CxCJ,6ExDw5pBJ,CuGz4pBE,kBAEE,W/CjBA,6ExDm6pBJ,CuG/4pBM,gOAKE,+BvGs5pBR,CuGn5pBM,4BAEE,qBACA,c/C/BJ,6ExDo7pBJ,CuGl5pBM,gLAKE,qBACA,W/CxCJ,6ExDg8pBJ,CuGj7pBE,qBAEE,c/CjBA,6ExD28pBJ,CuGv7pBM,+OAKE,+BvG87pBR,CuG37pBM,+BAEE,qBACA,c/C/BJ,6ExD49pBJ,CuG17pBM,4LAKE,qBACA,c/CxCJ,6ExDw+pBJ,CuGz9pBE,oBAEE,W/CjBA,6ExDm/pBJ,CuG/9pBM,0OAKE,+BvGs+pBR,CuGn+pBM,8BAEE,qBACA,c/C/BJ,6ExDogqBJ,CuGl+pBM,wLAKE,qBACA,W/CxCJ,6ExDghqBJ,CuGjgqBE,mBAEE,c/CjBA,6ExD2hqBJ,CuGvgqBM,qOAKE,+BvG8gqBR,CuG3gqBM,6BAEE,qBACA,c/C/BJ,6ExD4iqBJ,CuG1gqBM,oLAKE,qBACA,c/CxCJ,6ExDwjqBJ,CuGziqBE,kBAEE,W/CjBA,6ExDmkqBJ,CuG/iqBM,gOAKE,+BvGsjqBR,CuGnjqBM,4BAEE,qBACA,c/C/BJ,6ExDolqBJ,CuGljqBM,gLAKE,qBACA,W/CxCJ,6ExDgmqBJ,CuGjlqBE,uBAEE,W/CjBA,6ExD2mqBJ,CuGvlqBM,yPAKE,+BvG8lqBR,CuG3lqBM,iCAEE,qBACA,c/C/BJ,6ExD4nqBJ,CuG1lqBM,oMAKE,qBACA,W/CxCJ,6ExDwoqBJ,CuGznqBE,kBAEE,W/CjBA,6ExDmpqBJ,CuG/nqBM,gOAKE,+BvGsoqBR,CuGnoqBM,4BAEE,qBACA,c/C/BJ,6ExDoqqBJ,CuGloqBM,gLAKE,kBACA,W/CxCJ,6ExDgrqBJ,CuGjqqBE,mBAEE,W/CjBA,6ExD2rqBJ,CuGvqqBM,qOAKE,+BvG8qqBR,CuG3qqBM,6BAEE,qBACA,c/C/BJ,6ExD4sqBJ,CuG1qqBM,oLAKE,qBACA,W/CxCJ,6ExDwtqBJ,CuGzsqBE,kBAEE,c/CjBA,6ExDmuqBJ,CuG/sqBM,gOAKE,+BvGstqBR,CuGntqBM,4BAEE,qBACA,c/C/BJ,6ExDovqBJ,CuGltqBM,gLAKE,qBACA,W/CxCJ,6ExDgwqBJ,CuGjvqBE,qBAEE,W/CjBA,6ExD2wqBJ,CuGvvqBM,+OAKE,+BvG8vqBR,CuG3vqBM,+BAEE,qBACA,c/C/BJ,6ExD4xqBJ,CuG1vqBM,4LAKE,qBACA,W/CxCJ,6ExDwyqBJ,CuGzxqBE,oBAEE,W/CjBA,6ExDmzqBJ,CuG/xqBM,0OAKE,+BvGsyqBR,CuGnyqBM,8BAEE,qBACA,c/C/BJ,6ExDo0qBJ,CuGlyqBM,wLAKE,qBACA,W/CxCJ,6ExDg1qBJ,CuGj0qBE,kBAEE,W/CjBA,6ExD21qBJ,CuGv0qBM,gOAKE,+BvG80qBR,CuG30qBM,4BAEE,qBACA,c/C/BJ,6ExD42qBJ,CuG10qBM,gLAKE,qBACA,W/CxCJ,6ExDw3qBJ,CuGz2qBE,oBAEE,W/CjBA,6ExDm4qBJ,CuG/2qBM,0OAKE,+BvGs3qBR,CuGn3qBM,8BAEE,qBACA,c/C/BJ,6ExDo5qBJ,CuGl3qBM,wLAKE,qBACA,W/CxCJ,6ExDg6qBJ,CuGj5qBE,oBAEE,W/CjBA,6ExD26qBJ,CuGv5qBM,0OAKE,+BvG85qBR,CuG35qBM,8BAEE,qBACA,c/C/BJ,6ExD47qBJ,CuG15qBM,wLAKE,qBACA,W/CxCJ,6ExDw8qBJ,CuGz7qBE,kBAEE,W/CjBA,6ExDm9qBJ,CuG/7qBM,gOAKE,+BvGs8qBR,CuGn8qBM,4BAEE,qBACA,c/C/BJ,6ExDo+qBJ,CuGl8qBM,gLAKE,qBACA,W/CxCJ,6ExDg/qBJ,CuGj+qBE,iBAEE,W/CjBA,6ExD2/qBJ,CuGv+qBM,2NAKE,+BvG8+qBR,CuG3+qBM,2BAEE,qBACA,c/C/BJ,6ExD4grBJ,CuG1+qBM,4KAKE,qBACA,W/CxCJ,6ExDwhrBJ,CuGzgrBE,oBAEE,c/CjBA,6ExDmirBJ,CuG/grBM,0OAKE,+BvGshrBR,CuGnhrBM,8BAEE,qBACA,c/C/BJ,6ExDojrBJ,CuGlhrBM,wLAKE,qBACA,W/CxCJ,6ExDgkrBJ,CuGjjrBE,oBAEE,c/CjBA,6ExD2krBJ,CuGvjrBM,0OAKE,+BvG8jrBR,CuG3jrBM,8BAEE,qBACA,c/C/BJ,6ExD4lrBJ,CuG1jrBM,wLAKE,qBACA,c/CxCJ,6ExDwmrBJ,CuGzlrBE,mBAEE,W/CjBA,6ExDmnrBJ,CuG/lrBM,qOAKE,+BvGsmrBR,CuGnmrBM,6BAEE,qBACA,c/C/BJ,6ExDoorBJ,CuGlmrBM,oLAKE,qBACA,W/CxCJ,6ExDgprBJ,CuGjorBE,kBAEE,W/CjBA,6ExD2prBJ,CuGvorBM,gOAKE,+BvG8orBR,CuG3orBM,4BAEE,qBACA,c/C/BJ,6ExD4qrBJ,CuG1orBM,gLAKE,qBACA,W/CxCJ,6ExDwrrBJ,CuGzqrBE,kBAEE,W/CjBA,6ExDmsrBJ,CuG/qrBM,gOAKE,+BvGsrrBR,CuGnrrBM,4BAEE,qBACA,c/C/BJ,6ExDotrBJ,CuGlrrBM,gLAKE,qBACA,W/CxCJ,6ExDgurBJ,CuGjtrBE,mBAEE,c/CjBA,oExD2urBJ,CuGvtrBM,qOAKE,+BvG8trBR,CuG3trBM,6BAEE,qBACA,c/C/BJ,6ExD4vrBJ,CuG1trBM,oLAKE,qBACA,c/CxCJ,6ExDwwrBJ,CuGzvrBE,kBAEE,W/CjBA,6ExDmxrBJ,CuG/vrBM,gOAKE,+BvGswrBR,CuGnwrBM,4BAEE,qBACA,c/C/BJ,6ExDoyrBJ,CuGlwrBM,gLAKE,qBACA,W/CxCJ,6ExDgzrBJ,CuGjyrBE,uBAEE,W/CjBA,6ExD2zrBJ,CuGvyrBM,yPAKE,+BvG8yrBR,CuG3yrBM,iCAEE,qBACA,c/C/BJ,6ExD40rBJ,CuG1yrBM,oMAKE,qBACA,W/CxCJ,6ExDw1rBJ,CwG9zrBA,sBACE,WxGw0rBF,CwGp0rBA,mBACE,uBxGu0rBF,CwGn0rBA,YACE,axGs0rBF,CwGp0rBE,oCAEE,axGu0rBJ,CwGn0rBA,YACE,axGs0rBF,CwGp0rBE,oCAEE,axGu0rBJ,CyGh4rBI,wIAEE,azGm4rBN,CKr4rBE,oJoGKM,azGq4rBR,CyGh4rBM,4EAEE,mBACA,UzGm4rBR,CyG93rBM,2EACE,mBACA,oBzGi4rBR,CyG93rBM,0EAEE,4NzGg4rBR,CyG53rBI,6QAIE,oBzG+3rBN,CyG33rBM,sCACE,azG83rBR,CyG33rBM,iFAEE,yBACA,qBACA,UzG83rBR,CyG33rBM,qFAEE,sBACA,qBACA,azG83rBR,CyGx3rBQ,oHACE,azG23rBV,CKt7rBE,0HoG8DU,UzG43rBZ,CyGp3rBQ,qHACE,azGu3rBV,CK97rBE,2HoG0EU,azGw3rBZ,CyGl8rBI,4IAEE,azGq8rBN,CKv8rBE,wJoGKM,azGu8rBR,CyGl8rBM,gFAEE,mBACA,UzGq8rBR,CyGh8rBM,6EACE,mBACA,oBzGm8rBR,CyGh8rBM,4EAEE,4NzGk8rBR,CyG97rBI,qRAIE,oBzGi8rBN,CyG77rBM,wCACE,azGg8rBR,CyG77rBM,qFAEE,yBACA,qBACA,UzGg8rBR,CyG77rBM,yFAEE,sBACA,qBACA,azGg8rBR,CyG17rBQ,sHACE,azG67rBV,CKx/rBE,4HoG8DU,UzG87rBZ,CyGt7rBQ,uHACE,azGy7rBV,CKhgsBE,6HoG0EU,azG07rBZ,CyGpgsBI,wIAEE,azGugsBN,CKzgsBE,oJoGKM,azGygsBR,CyGpgsBM,4EAEE,mBACA,UzGugsBR,CyGlgsBM,2EACE,mBACA,oBzGqgsBR,CyGlgsBM,0EAEE,4NzGogsBR,CyGhgsBI,6QAIE,oBzGmgsBN,CyG//rBM,sCACE,azGkgsBR,CyG//rBM,iFAEE,yBACA,qBACA,UzGkgsBR,CyG//rBM,qFAEE,sBACA,qBACA,azGkgsBR,CyG5/rBQ,oHACE,azG+/rBV,CK1jsBE,0HoG8DU,UzGggsBZ,CyGx/rBQ,qHACE,azG2/rBV,CKlksBE,2HoG0EU,azG4/rBZ,CyGtksBI,kIAEE,azGyksBN,CK3ksBE,8IoGKM,azG2ksBR,CyGtksBM,sEAEE,mBACA,UzGyksBR,CyGpksBM,wEACE,mBACA,oBzGuksBR,CyGpksBM,uEAEE,4NzGsksBR,CyGlksBI,iQAIE,oBzGqksBN,CyGjksBM,mCACE,azGoksBR,CyGjksBM,2EAEE,yBACA,qBACA,UzGoksBR,CyGjksBM,+EAEE,sBACA,qBACA,azGoksBR,CyG9jsBQ,iHACE,azGiksBV,CK5nsBE,uHoG8DU,UzGkksBZ,CyG1jsBQ,kHACE,azG6jsBV,CKposBE,wHoG0EU,azG8jsBZ,CyGxosBI,wIAEE,azG2osBN,CK7osBE,oJoGKM,azG6osBR,CyGxosBM,4EAEE,mBACA,azG2osBR,CyGtosBM,2EACE,mBACA,oBzGyosBR,CyGtosBM,0EAEE,4NzGwosBR,CyGposBI,6QAIE,oBzGuosBN,CyGnosBM,sCACE,azGsosBR,CyGnosBM,iFAEE,yBACA,qBACA,UzGsosBR,CyGnosBM,qFAEE,sBACA,qBACA,azGsosBR,CyGhosBQ,oHACE,azGmosBV,CK9rsBE,0HoG8DU,UzGoosBZ,CyG5nsBQ,qHACE,azG+nsBV,CKtssBE,2HoG0EU,azGgosBZ,CyG1ssBI,sIAEE,azG6ssBN,CK/ssBE,kJoGKM,azG+ssBR,CyG1ssBM,0EAEE,mBACA,UzG6ssBR,CyGxssBM,0EACE,mBACA,oBzG2ssBR,CyGxssBM,yEAEE,4NzG0ssBR,CyGtssBI,yQAIE,oBzGyssBN,CyGrssBM,qCACE,azGwssBR,CyGrssBM,+EAEE,yBACA,qBACA,UzGwssBR,CyGrssBM,mFAEE,sBACA,qBACA,azGwssBR,CyGlssBQ,mHACE,azGqssBV,CKhwsBE,yHoG8DU,UzGsssBZ,CyG9rsBQ,oHACE,azGissBV,CKxwsBE,0HoG0EU,azGkssBZ,CyG5wsBI,oIAEE,azG+wsBN,CKjxsBE,gJoGKM,azGixsBR,CyG5wsBM,wEAEE,mBACA,azG+wsBR,CyG1wsBM,yEACE,mBACA,oBzG6wsBR,CyG1wsBM,wEAEE,4NzG4wsBR,CyGxwsBI,qQAIE,iBzG2wsBN,CyGvwsBM,oCACE,azG0wsBR,CyGvwsBM,6EAEE,yBACA,qBACA,UzG0wsBR,CyGvwsBM,iFAEE,sBACA,qBACA,azG0wsBR,CyGpwsBQ,kHACE,azGuwsBV,CKl0sBE,wHoG8DU,UzGwwsBZ,CyGhwsBQ,mHACE,azGmwsBV,CK10sBE,yHoG0EU,azGowsBZ,CyG90sBI,kIAEE,azGi1sBN,CKn1sBE,8IoGKM,azGm1sBR,CyG90sBM,sEAEE,mBACA,UzGi1sBR,CyG50sBM,wEACE,mBACA,oBzG+0sBR,CyG50sBM,uEAEE,4NzG80sBR,CyG10sBI,iQAIE,oBzG60sBN,CyGz0sBM,mCACE,azG40sBR,CyGz0sBM,2EAEE,yBACA,qBACA,UzG40sBR,CyGz0sBM,+EAEE,sBACA,qBACA,azG40sBR,CyGt0sBQ,iHACE,azGy0sBV,CKp4sBE,uHoG8DU,UzG00sBZ,CyGl0sBQ,kHACE,azGq0sBV,CK54sBE,wHoG0EU,azGs0sBZ,CyGh5sBI,4IAEE,azGm5sBN,CKr5sBE,wJoGKM,azGq5sBR,CyGh5sBM,gFAEE,mBACA,UzGm5sBR,CyG94sBM,6EACE,mBACA,oBzGi5sBR,CyG94sBM,4EAEE,4NzGg5sBR,CyG54sBI,qRAIE,oBzG+4sBN,CyG34sBM,wCACE,azG84sBR,CyG34sBM,qFAEE,yBACA,qBACA,UzG84sBR,CyG34sBM,yFAEE,sBACA,qBACA,azG84sBR,CyGx4sBQ,sHACE,azG24sBV,CKt8sBE,4HoG8DU,UzG44sBZ,CyGp4sBQ,uHACE,azGu4sBV,CK98sBE,6HoG0EU,azGw4sBZ,CyGl9sBI,kIAEE,azGq9sBN,CKv9sBE,8IoGKM,UzGu9sBR,CyGl9sBM,sEAEE,mBACA,UzGq9sBR,CyGh9sBM,wEACE,mBACA,iBzGm9sBR,CyGh9sBM,uEAEE,4NzGk9sBR,CyG98sBI,iQAIE,oBzGi9sBN,CyG78sBM,mCACE,azGg9sBR,CyG78sBM,2EAEE,yBACA,qBACA,UzGg9sBR,CyG78sBM,+EAEE,sBACA,qBACA,azGg9sBR,CyG18sBQ,iHACE,azG68sBV,CKxgtBE,uHoG8DU,UzG88sBZ,CyGt8sBQ,kHACE,azGy8sBV,CKhhtBE,wHoG0EU,azG08sBZ,CyGphtBI,oIAEE,azGuhtBN,CKzhtBE,gJoGKM,azGyhtBR,CyGphtBM,wEAEE,mBACA,UzGuhtBR,CyGlhtBM,yEACE,mBACA,oBzGqhtBR,CyGlhtBM,wEAEE,4NzGohtBR,CyGhhtBI,qQAIE,oBzGmhtBN,CyG/gtBM,oCACE,azGkhtBR,CyG/gtBM,6EAEE,yBACA,qBACA,UzGkhtBR,CyG/gtBM,iFAEE,sBACA,qBACA,azGkhtBR,CyG5gtBQ,kHACE,azG+gtBV,CK1ktBE,wHoG8DU,UzGghtBZ,CyGxgtBQ,mHACE,azG2gtBV,CKlltBE,yHoG0EU,azG4gtBZ,CyGtltBI,kIAEE,azGyltBN,CK3ltBE,8IoGKM,azG2ltBR,CyGtltBM,sEAEE,mBACA,azGyltBR,CyGpltBM,wEACE,mBACA,oBzGultBR,CyGpltBM,uEAEE,4NzGsltBR,CyGlltBI,iQAIE,oBzGqltBN,CyGjltBM,mCACE,azGoltBR,CyGjltBM,2EAEE,yBACA,qBACA,UzGoltBR,CyGjltBM,+EAEE,sBACA,qBACA,azGoltBR,CyG9ktBQ,iHACE,azGiltBV,CK5otBE,uHoG8DU,UzGkltBZ,CyG1ktBQ,kHACE,azG6ktBV,CKpptBE,wHoG0EU,azG8ktBZ,CyGxptBI,wIAEE,azG2ptBN,CK7ptBE,oJoGKM,azG6ptBR,CyGxptBM,4EAEE,mBACA,UzG2ptBR,CyGtptBM,2EACE,mBACA,oBzGyptBR,CyGtptBM,0EAEE,4NzGwptBR,CyGpptBI,6QAIE,oBzGuptBN,CyGnptBM,sCACE,azGsptBR,CyGnptBM,iFAEE,yBACA,qBACA,UzGsptBR,CyGnptBM,qFAEE,sBACA,qBACA,azGsptBR,CyGhptBQ,oHACE,azGmptBV,CK9stBE,0HoG8DU,UzGoptBZ,CyG5otBQ,qHACE,azG+otBV,CKtttBE,2HoG0EU,azGgptBZ,CyG1ttBI,sIAEE,azG6ttBN,CK/ttBE,kJoGKM,azG+ttBR,CyG1ttBM,0EAEE,mBACA,UzG6ttBR,CyGxttBM,0EACE,mBACA,oBzG2ttBR,CyGxttBM,yEAEE,4NzG0ttBR,CyGtttBI,yQAIE,oBzGyttBN,CyGrttBM,qCACE,azGwttBR,CyGrttBM,+EAEE,yBACA,qBACA,UzGwttBR,CyGrttBM,mFAEE,sBACA,qBACA,azGwttBR,CyGlttBQ,mHACE,azGqttBV,CKhxtBE,yHoG8DU,UzGsttBZ,CyG9stBQ,oHACE,azGittBV,CKxxtBE,0HoG0EU,azGkttBZ,CyG5xtBI,kIAEE,azG+xtBN,CKjytBE,8IoGKM,azGiytBR,CyG5xtBM,sEAEE,mBACA,UzG+xtBR,CyG1xtBM,wEACE,mBACA,oBzG6xtBR,CyG1xtBM,uEAEE,4NzG4xtBR,CyGxxtBI,iQAIE,oBzG2xtBN,CyGvxtBM,mCACE,azG0xtBR,CyGvxtBM,2EAEE,yBACA,qBACA,UzG0xtBR,CyGvxtBM,+EAEE,sBACA,qBACA,azG0xtBR,CyGpxtBQ,iHACE,azGuxtBV,CKl1tBE,uHoG8DU,UzGwxtBZ,CyGhxtBQ,kHACE,azGmxtBV,CK11tBE,wHoG0EU,azGoxtBZ,CyG91tBI,sIAEE,azGi2tBN,CKn2tBE,kJoGKM,azGm2tBR,CyG91tBM,0EAEE,mBACA,UzGi2tBR,CyG51tBM,0EACE,mBACA,oBzG+1tBR,CyG51tBM,yEAEE,4NzG81tBR,CyG11tBI,yQAIE,oBzG61tBN,CyGz1tBM,qCACE,azG41tBR,CyGz1tBM,+EAEE,yBACA,qBACA,UzG41tBR,CyGz1tBM,mFAEE,sBACA,qBACA,azG41tBR,CyGt1tBQ,mHACE,azGy1tBV,CKp5tBE,yHoG8DU,UzG01tBZ,CyGl1tBQ,oHACE,azGq1tBV,CK55tBE,0HoG0EU,azGs1tBZ,CyGh6tBI,sIAEE,azGm6tBN,CKr6tBE,kJoGKM,azGq6tBR,CyGh6tBM,0EAEE,mBACA,UzGm6tBR,CyG95tBM,0EACE,mBACA,oBzGi6tBR,CyG95tBM,yEAEE,4NzGg6tBR,CyG55tBI,yQAIE,oBzG+5tBN,CyG35tBM,qCACE,azG85tBR,CyG35tBM,+EAEE,yBACA,qBACA,UzG85tBR,CyG35tBM,mFAEE,sBACA,qBACA,azG85tBR,CyGx5tBQ,mHACE,azG25tBV,CKt9tBE,yHoG8DU,UzG45tBZ,CyGp5tBQ,oHACE,azGu5tBV,CK99tBE,0HoG0EU,azGw5tBZ,CyGl+tBI,kIAEE,azGq+tBN,CKv+tBE,8IoGKM,azGu+tBR,CyGl+tBM,sEAEE,mBACA,UzGq+tBR,CyGh+tBM,wEACE,mBACA,oBzGm+tBR,CyGh+tBM,uEAEE,4NzGk+tBR,CyG99tBI,iQAIE,oBzGi+tBN,CyG79tBM,mCACE,azGg+tBR,CyG79tBM,2EAEE,yBACA,qBACA,UzGg+tBR,CyG79tBM,+EAEE,sBACA,qBACA,azGg+tBR,CyG19tBQ,iHACE,azG69tBV,CKxhuBE,uHoG8DU,UzG89tBZ,CyGt9tBQ,kHACE,azGy9tBV,CKhiuBE,wHoG0EU,azG09tBZ,CyGpiuBI,gIAEE,azGuiuBN,CKziuBE,4IoGKM,azGyiuBR,CyGpiuBM,oEAEE,mBACA,UzGuiuBR,CyGliuBM,uEACE,mBACA,oBzGqiuBR,CyGliuBM,sEAEE,4NzGoiuBR,CyGhiuBI,6PAIE,oBzGmiuBN,CyG/huBM,kCACE,azGkiuBR,CyG/huBM,yEAEE,yBACA,qBACA,UzGkiuBR,CyG/huBM,6EAEE,sBACA,qBACA,azGkiuBR,CyG5huBQ,gHACE,azG+huBV,CK1luBE,sHoG8DU,UzGgiuBZ,CyGxhuBQ,iHACE,azG2huBV,CKlmuBE,uHoG0EU,azG4huBZ,CyGtmuBI,sIAEE,azGymuBN,CK3muBE,kJoGKM,azG2muBR,CyGtmuBM,0EAEE,mBACA,azGymuBR,CyGpmuBM,0EACE,mBACA,oBzGumuBR,CyGpmuBM,yEAEE,4NzGsmuBR,CyGlmuBI,yQAIE,oBzGqmuBN,CyGjmuBM,qCACE,azGomuBR,CyGjmuBM,+EAEE,yBACA,qBACA,UzGomuBR,CyGjmuBM,mFAEE,sBACA,qBACA,azGomuBR,CyG9luBQ,mHACE,azGimuBV,CK5puBE,yHoG8DU,UzGkmuBZ,CyG1luBQ,oHACE,azG6luBV,CKpquBE,0HoG0EU,azG8luBZ,CyGxquBI,sIAEE,azG2quBN,CK7quBE,kJoGKM,azG6quBR,CyGxquBM,0EAEE,mBACA,azG2quBR,CyGtquBM,0EACE,mBACA,oBzGyquBR,CyGtquBM,yEAEE,4NzGwquBR,CyGpquBI,yQAIE,oBzGuquBN,CyGnquBM,qCACE,azGsquBR,CyGnquBM,+EAEE,yBACA,qBACA,UzGsquBR,CyGnquBM,mFAEE,sBACA,qBACA,azGsquBR,CyGhquBQ,mHACE,azGmquBV,CK9tuBE,yHoG8DU,UzGoquBZ,CyG5puBQ,oHACE,azG+puBV,CKtuuBE,0HoG0EU,azGgquBZ,CyG1uuBI,oIAEE,azG6uuBN,CK/uuBE,gJoGKM,azG+uuBR,CyG1uuBM,wEAEE,mBACA,UzG6uuBR,CyGxuuBM,yEACE,mBACA,oBzG2uuBR,CyGxuuBM,wEAEE,4NzG0uuBR,CyGtuuBI,qQAIE,oBzGyuuBN,CyGruuBM,oCACE,azGwuuBR,CyGruuBM,6EAEE,yBACA,qBACA,UzGwuuBR,CyGruuBM,iFAEE,sBACA,qBACA,azGwuuBR,CyGluuBQ,kHACE,azGquuBV,CKhyuBE,wHoG8DU,UzGsuuBZ,CyG9tuBQ,mHACE,azGiuuBV,CKxyuBE,yHoG0EU,azGkuuBZ,CyG5yuBI,kIAEE,azG+yuBN,CKjzuBE,8IoGKM,azGizuBR,CyG5yuBM,sEAEE,mBACA,UzG+yuBR,CyG1yuBM,wEACE,mBACA,oBzG6yuBR,CyG1yuBM,uEAEE,4NzG4yuBR,CyGxyuBI,iQAIE,oBzG2yuBN,CyGvyuBM,mCACE,azG0yuBR,CyGvyuBM,2EAEE,yBACA,qBACA,UzG0yuBR,CyGvyuBM,+EAEE,sBACA,qBACA,azG0yuBR,CyGpyuBQ,iHACE,azGuyuBV,CKl2uBE,uHoG8DU,UzGwyuBZ,CyGhyuBQ,kHACE,azGmyuBV,CK12uBE,wHoG0EU,azGoyuBZ,CyG92uBI,kIAEE,azGi3uBN,CKn3uBE,8IoGKM,azGm3uBR,CyG92uBM,sEAEE,mBACA,UzGi3uBR,CyG52uBM,wEACE,mBACA,oBzG+2uBR,CyG52uBM,uEAEE,4NzG82uBR,CyG12uBI,iQAIE,oBzG62uBN,CyGz2uBM,mCACE,azG42uBR,CyGz2uBM,2EAEE,yBACA,qBACA,UzG42uBR,CyGz2uBM,+EAEE,sBACA,qBACA,azG42uBR,CyGt2uBQ,iHACE,azGy2uBV,CKp6uBE,uHoG8DU,UzG02uBZ,CyGl2uBQ,kHACE,azGq2uBV,CK56uBE,wHoG0EU,azGs2uBZ,CyGh7uBI,oIAEE,UzGm7uBN,CKr7uBE,gJoGKM,azGq7uBR,CyGh7uBM,wEAEE,gBACA,azGm7uBR,CyG96uBM,yEACE,gBACA,iBzGi7uBR,CyG96uBM,wEAEE,4NzGg7uBR,CyG56uBI,qQAIE,iBzG+6uBN,CyG36uBM,oCACE,UzG86uBR,CyG36uBM,6EAEE,sBACA,kBACA,UzG86uBR,CyG36uBM,iFAEE,sBACA,qBACA,azG86uBR,CyGx6uBQ,kHACE,azG26uBV,CKt+uBE,wHoG8DU,UzG46uBZ,CyGp6uBQ,mHACE,azGu6uBV,CK9+uBE,yHoG0EU,azGw6uBZ,CyGl/uBI,kIAEE,azGq/uBN,CKv/uBE,8IoGKM,azGu/uBR,CyGl/uBM,sEAEE,mBACA,UzGq/uBR,CyGh/uBM,wEACE,mBACA,oBzGm/uBR,CyGh/uBM,uEAEE,4NzGk/uBR,CyG9+uBI,iQAIE,oBzGi/uBN,CyG7+uBM,mCACE,azGg/uBR,CyG7+uBM,2EAEE,yBACA,qBACA,UzGg/uBR,CyG7+uBM,+EAEE,sBACA,qBACA,azGg/uBR,CyG1+uBQ,iHACE,azG6+uBV,CKxivBE,uHoG8DU,UzG8+uBZ,CyGt+uBQ,kHACE,azGy+uBV,CKhjvBE,wHoG0EU,azG0+uBZ,CyGpjvBI,4IAEE,azGujvBN,CKzjvBE,wJoGKM,azGyjvBR,CyGpjvBM,gFAEE,mBACA,UzGujvBR,CyGljvBM,6EACE,mBACA,oBzGqjvBR,CyGljvBM,4EAEE,4NzGojvBR,CyGhjvBI,qRAIE,oBzGmjvBN,CyG/ivBM,wCACE,azGkjvBR,CyG/ivBM,qFAEE,yBACA,qBACA,UzGkjvBR,CyG/ivBM,yFAEE,sBACA,qBACA,azGkjvBR,CyG5ivBQ,sHACE,azG+ivBV,CK1mvBE,4HoG8DU,UzGgjvBZ,CyGxivBQ,uHACE,azG2ivBV,CKlnvBE,6HoG0EU,azG4ivBZ,CwG5ivBI,2HACE,UxG2jvBN,CwG5jvBI,+BACE,axG+jvBN,CwGhkvBI,8BACE,UxGmkvBN,CwGpkvBI,6BACE,axGukvBN,CwGxkvBI,4BACE,UxG2kvBN","file":"public/css/app.css","sourcesContent":["/*!\n * Font Awesome Free 5.15.2 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\n.fa,\n.fas,\n.far,\n.fal,\n.fad,\n.fab {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n line-height: 1; }\n\n.fa-lg {\n font-size: 1.33333em;\n line-height: 0.75em;\n vertical-align: -.0667em; }\n\n.fa-xs {\n font-size: .75em; }\n\n.fa-sm {\n font-size: .875em; }\n\n.fa-1x {\n font-size: 1em; }\n\n.fa-2x {\n font-size: 2em; }\n\n.fa-3x {\n font-size: 3em; }\n\n.fa-4x {\n font-size: 4em; }\n\n.fa-5x {\n font-size: 5em; }\n\n.fa-6x {\n font-size: 6em; }\n\n.fa-7x {\n font-size: 7em; }\n\n.fa-8x {\n font-size: 8em; }\n\n.fa-9x {\n font-size: 9em; }\n\n.fa-10x {\n font-size: 10em; }\n\n.fa-fw {\n text-align: center;\n width: 1.25em; }\n\n.fa-ul {\n list-style-type: none;\n margin-left: 2.5em;\n padding-left: 0; }\n .fa-ul > li {\n position: relative; }\n\n.fa-li {\n left: -2em;\n position: absolute;\n text-align: center;\n width: 2em;\n line-height: inherit; }\n\n.fa-border {\n border: solid 0.08em #eee;\n border-radius: .1em;\n padding: .2em .25em .15em; }\n\n.fa-pull-left {\n float: left; }\n\n.fa-pull-right {\n float: right; }\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n margin-right: .3em; }\n\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n margin-left: .3em; }\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg); }\n\n.fa-rotate-180 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg); }\n\n.fa-rotate-270 {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n -webkit-transform: rotate(270deg);\n transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n -webkit-transform: scale(-1, 1);\n transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(1, -1);\n transform: scale(1, -1); }\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n -webkit-transform: scale(-1, -1);\n transform: scale(-1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n -webkit-filter: none;\n filter: none; }\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n left: 0;\n position: absolute;\n text-align: center;\n width: 100%; }\n\n.fa-stack-1x {\n line-height: inherit; }\n\n.fa-stack-2x {\n font-size: 2em; }\n\n.fa-inverse {\n color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n.fa-500px:before {\n content: \"\\f26e\"; }\n\n.fa-accessible-icon:before {\n content: \"\\f368\"; }\n\n.fa-accusoft:before {\n content: \"\\f369\"; }\n\n.fa-acquisitions-incorporated:before {\n content: \"\\f6af\"; }\n\n.fa-ad:before {\n content: \"\\f641\"; }\n\n.fa-address-book:before {\n content: \"\\f2b9\"; }\n\n.fa-address-card:before {\n content: \"\\f2bb\"; }\n\n.fa-adjust:before {\n content: \"\\f042\"; }\n\n.fa-adn:before {\n content: \"\\f170\"; }\n\n.fa-adversal:before {\n content: \"\\f36a\"; }\n\n.fa-affiliatetheme:before {\n content: \"\\f36b\"; }\n\n.fa-air-freshener:before {\n content: \"\\f5d0\"; }\n\n.fa-airbnb:before {\n content: \"\\f834\"; }\n\n.fa-algolia:before {\n content: \"\\f36c\"; }\n\n.fa-align-center:before {\n content: \"\\f037\"; }\n\n.fa-align-justify:before {\n content: \"\\f039\"; }\n\n.fa-align-left:before {\n content: \"\\f036\"; }\n\n.fa-align-right:before {\n content: \"\\f038\"; }\n\n.fa-alipay:before {\n content: \"\\f642\"; }\n\n.fa-allergies:before {\n content: \"\\f461\"; }\n\n.fa-amazon:before {\n content: \"\\f270\"; }\n\n.fa-amazon-pay:before {\n content: \"\\f42c\"; }\n\n.fa-ambulance:before {\n content: \"\\f0f9\"; }\n\n.fa-american-sign-language-interpreting:before {\n content: \"\\f2a3\"; }\n\n.fa-amilia:before {\n content: \"\\f36d\"; }\n\n.fa-anchor:before {\n content: \"\\f13d\"; }\n\n.fa-android:before {\n content: \"\\f17b\"; }\n\n.fa-angellist:before {\n content: \"\\f209\"; }\n\n.fa-angle-double-down:before {\n content: \"\\f103\"; }\n\n.fa-angle-double-left:before {\n content: \"\\f100\"; }\n\n.fa-angle-double-right:before {\n content: \"\\f101\"; }\n\n.fa-angle-double-up:before {\n content: \"\\f102\"; }\n\n.fa-angle-down:before {\n content: \"\\f107\"; }\n\n.fa-angle-left:before {\n content: \"\\f104\"; }\n\n.fa-angle-right:before {\n content: \"\\f105\"; }\n\n.fa-angle-up:before {\n content: \"\\f106\"; }\n\n.fa-angry:before {\n content: \"\\f556\"; }\n\n.fa-angrycreative:before {\n content: \"\\f36e\"; }\n\n.fa-angular:before {\n content: \"\\f420\"; }\n\n.fa-ankh:before {\n content: \"\\f644\"; }\n\n.fa-app-store:before {\n content: \"\\f36f\"; }\n\n.fa-app-store-ios:before {\n content: \"\\f370\"; }\n\n.fa-apper:before {\n content: \"\\f371\"; }\n\n.fa-apple:before {\n content: \"\\f179\"; }\n\n.fa-apple-alt:before {\n content: \"\\f5d1\"; }\n\n.fa-apple-pay:before {\n content: \"\\f415\"; }\n\n.fa-archive:before {\n content: \"\\f187\"; }\n\n.fa-archway:before {\n content: \"\\f557\"; }\n\n.fa-arrow-alt-circle-down:before {\n content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-left:before {\n content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-right:before {\n content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-up:before {\n content: \"\\f35b\"; }\n\n.fa-arrow-circle-down:before {\n content: \"\\f0ab\"; }\n\n.fa-arrow-circle-left:before {\n content: \"\\f0a8\"; }\n\n.fa-arrow-circle-right:before {\n content: \"\\f0a9\"; }\n\n.fa-arrow-circle-up:before {\n content: \"\\f0aa\"; }\n\n.fa-arrow-down:before {\n content: \"\\f063\"; }\n\n.fa-arrow-left:before {\n content: \"\\f060\"; }\n\n.fa-arrow-right:before {\n content: \"\\f061\"; }\n\n.fa-arrow-up:before {\n content: \"\\f062\"; }\n\n.fa-arrows-alt:before {\n content: \"\\f0b2\"; }\n\n.fa-arrows-alt-h:before {\n content: \"\\f337\"; }\n\n.fa-arrows-alt-v:before {\n content: \"\\f338\"; }\n\n.fa-artstation:before {\n content: \"\\f77a\"; }\n\n.fa-assistive-listening-systems:before {\n content: \"\\f2a2\"; }\n\n.fa-asterisk:before {\n content: \"\\f069\"; }\n\n.fa-asymmetrik:before {\n content: \"\\f372\"; }\n\n.fa-at:before {\n content: \"\\f1fa\"; }\n\n.fa-atlas:before {\n content: \"\\f558\"; }\n\n.fa-atlassian:before {\n content: \"\\f77b\"; }\n\n.fa-atom:before {\n content: \"\\f5d2\"; }\n\n.fa-audible:before {\n content: \"\\f373\"; }\n\n.fa-audio-description:before {\n content: \"\\f29e\"; }\n\n.fa-autoprefixer:before {\n content: \"\\f41c\"; }\n\n.fa-avianex:before {\n content: \"\\f374\"; }\n\n.fa-aviato:before {\n content: \"\\f421\"; }\n\n.fa-award:before {\n content: \"\\f559\"; }\n\n.fa-aws:before {\n content: \"\\f375\"; }\n\n.fa-baby:before {\n content: \"\\f77c\"; }\n\n.fa-baby-carriage:before {\n content: \"\\f77d\"; }\n\n.fa-backspace:before {\n content: \"\\f55a\"; }\n\n.fa-backward:before {\n content: \"\\f04a\"; }\n\n.fa-bacon:before {\n content: \"\\f7e5\"; }\n\n.fa-bacteria:before {\n content: \"\\e059\"; }\n\n.fa-bacterium:before {\n content: \"\\e05a\"; }\n\n.fa-bahai:before {\n content: \"\\f666\"; }\n\n.fa-balance-scale:before {\n content: \"\\f24e\"; }\n\n.fa-balance-scale-left:before {\n content: \"\\f515\"; }\n\n.fa-balance-scale-right:before {\n content: \"\\f516\"; }\n\n.fa-ban:before {\n content: \"\\f05e\"; }\n\n.fa-band-aid:before {\n content: \"\\f462\"; }\n\n.fa-bandcamp:before {\n content: \"\\f2d5\"; }\n\n.fa-barcode:before {\n content: \"\\f02a\"; }\n\n.fa-bars:before {\n content: \"\\f0c9\"; }\n\n.fa-baseball-ball:before {\n content: \"\\f433\"; }\n\n.fa-basketball-ball:before {\n content: \"\\f434\"; }\n\n.fa-bath:before {\n content: \"\\f2cd\"; }\n\n.fa-battery-empty:before {\n content: \"\\f244\"; }\n\n.fa-battery-full:before {\n content: \"\\f240\"; }\n\n.fa-battery-half:before {\n content: \"\\f242\"; }\n\n.fa-battery-quarter:before {\n content: \"\\f243\"; }\n\n.fa-battery-three-quarters:before {\n content: \"\\f241\"; }\n\n.fa-battle-net:before {\n content: \"\\f835\"; }\n\n.fa-bed:before {\n content: \"\\f236\"; }\n\n.fa-beer:before {\n content: \"\\f0fc\"; }\n\n.fa-behance:before {\n content: \"\\f1b4\"; }\n\n.fa-behance-square:before {\n content: \"\\f1b5\"; }\n\n.fa-bell:before {\n content: \"\\f0f3\"; }\n\n.fa-bell-slash:before {\n content: \"\\f1f6\"; }\n\n.fa-bezier-curve:before {\n content: \"\\f55b\"; }\n\n.fa-bible:before {\n content: \"\\f647\"; }\n\n.fa-bicycle:before {\n content: \"\\f206\"; }\n\n.fa-biking:before {\n content: \"\\f84a\"; }\n\n.fa-bimobject:before {\n content: \"\\f378\"; }\n\n.fa-binoculars:before {\n content: \"\\f1e5\"; }\n\n.fa-biohazard:before {\n content: \"\\f780\"; }\n\n.fa-birthday-cake:before {\n content: \"\\f1fd\"; }\n\n.fa-bitbucket:before {\n content: \"\\f171\"; }\n\n.fa-bitcoin:before {\n content: \"\\f379\"; }\n\n.fa-bity:before {\n content: \"\\f37a\"; }\n\n.fa-black-tie:before {\n content: \"\\f27e\"; }\n\n.fa-blackberry:before {\n content: \"\\f37b\"; }\n\n.fa-blender:before {\n content: \"\\f517\"; }\n\n.fa-blender-phone:before {\n content: \"\\f6b6\"; }\n\n.fa-blind:before {\n content: \"\\f29d\"; }\n\n.fa-blog:before {\n content: \"\\f781\"; }\n\n.fa-blogger:before {\n content: \"\\f37c\"; }\n\n.fa-blogger-b:before {\n content: \"\\f37d\"; }\n\n.fa-bluetooth:before {\n content: \"\\f293\"; }\n\n.fa-bluetooth-b:before {\n content: \"\\f294\"; }\n\n.fa-bold:before {\n content: \"\\f032\"; }\n\n.fa-bolt:before {\n content: \"\\f0e7\"; }\n\n.fa-bomb:before {\n content: \"\\f1e2\"; }\n\n.fa-bone:before {\n content: \"\\f5d7\"; }\n\n.fa-bong:before {\n content: \"\\f55c\"; }\n\n.fa-book:before {\n content: \"\\f02d\"; }\n\n.fa-book-dead:before {\n content: \"\\f6b7\"; }\n\n.fa-book-medical:before {\n content: \"\\f7e6\"; }\n\n.fa-book-open:before {\n content: \"\\f518\"; }\n\n.fa-book-reader:before {\n content: \"\\f5da\"; }\n\n.fa-bookmark:before {\n content: \"\\f02e\"; }\n\n.fa-bootstrap:before {\n content: \"\\f836\"; }\n\n.fa-border-all:before {\n content: \"\\f84c\"; }\n\n.fa-border-none:before {\n content: \"\\f850\"; }\n\n.fa-border-style:before {\n content: \"\\f853\"; }\n\n.fa-bowling-ball:before {\n content: \"\\f436\"; }\n\n.fa-box:before {\n content: \"\\f466\"; }\n\n.fa-box-open:before {\n content: \"\\f49e\"; }\n\n.fa-box-tissue:before {\n content: \"\\e05b\"; }\n\n.fa-boxes:before {\n content: \"\\f468\"; }\n\n.fa-braille:before {\n content: \"\\f2a1\"; }\n\n.fa-brain:before {\n content: \"\\f5dc\"; }\n\n.fa-bread-slice:before {\n content: \"\\f7ec\"; }\n\n.fa-briefcase:before {\n content: \"\\f0b1\"; }\n\n.fa-briefcase-medical:before {\n content: \"\\f469\"; }\n\n.fa-broadcast-tower:before {\n content: \"\\f519\"; }\n\n.fa-broom:before {\n content: \"\\f51a\"; }\n\n.fa-brush:before {\n content: \"\\f55d\"; }\n\n.fa-btc:before {\n content: \"\\f15a\"; }\n\n.fa-buffer:before {\n content: \"\\f837\"; }\n\n.fa-bug:before {\n content: \"\\f188\"; }\n\n.fa-building:before {\n content: \"\\f1ad\"; }\n\n.fa-bullhorn:before {\n content: \"\\f0a1\"; }\n\n.fa-bullseye:before {\n content: \"\\f140\"; }\n\n.fa-burn:before {\n content: \"\\f46a\"; }\n\n.fa-buromobelexperte:before {\n content: \"\\f37f\"; }\n\n.fa-bus:before {\n content: \"\\f207\"; }\n\n.fa-bus-alt:before {\n content: \"\\f55e\"; }\n\n.fa-business-time:before {\n content: \"\\f64a\"; }\n\n.fa-buy-n-large:before {\n content: \"\\f8a6\"; }\n\n.fa-buysellads:before {\n content: \"\\f20d\"; }\n\n.fa-calculator:before {\n content: \"\\f1ec\"; }\n\n.fa-calendar:before {\n content: \"\\f133\"; }\n\n.fa-calendar-alt:before {\n content: \"\\f073\"; }\n\n.fa-calendar-check:before {\n content: \"\\f274\"; }\n\n.fa-calendar-day:before {\n content: \"\\f783\"; }\n\n.fa-calendar-minus:before {\n content: \"\\f272\"; }\n\n.fa-calendar-plus:before {\n content: \"\\f271\"; }\n\n.fa-calendar-times:before {\n content: \"\\f273\"; }\n\n.fa-calendar-week:before {\n content: \"\\f784\"; }\n\n.fa-camera:before {\n content: \"\\f030\"; }\n\n.fa-camera-retro:before {\n content: \"\\f083\"; }\n\n.fa-campground:before {\n content: \"\\f6bb\"; }\n\n.fa-canadian-maple-leaf:before {\n content: \"\\f785\"; }\n\n.fa-candy-cane:before {\n content: \"\\f786\"; }\n\n.fa-cannabis:before {\n content: \"\\f55f\"; }\n\n.fa-capsules:before {\n content: \"\\f46b\"; }\n\n.fa-car:before {\n content: \"\\f1b9\"; }\n\n.fa-car-alt:before {\n content: \"\\f5de\"; }\n\n.fa-car-battery:before {\n content: \"\\f5df\"; }\n\n.fa-car-crash:before {\n content: \"\\f5e1\"; }\n\n.fa-car-side:before {\n content: \"\\f5e4\"; }\n\n.fa-caravan:before {\n content: \"\\f8ff\"; }\n\n.fa-caret-down:before {\n content: \"\\f0d7\"; }\n\n.fa-caret-left:before {\n content: \"\\f0d9\"; }\n\n.fa-caret-right:before {\n content: \"\\f0da\"; }\n\n.fa-caret-square-down:before {\n content: \"\\f150\"; }\n\n.fa-caret-square-left:before {\n content: \"\\f191\"; }\n\n.fa-caret-square-right:before {\n content: \"\\f152\"; }\n\n.fa-caret-square-up:before {\n content: \"\\f151\"; }\n\n.fa-caret-up:before {\n content: \"\\f0d8\"; }\n\n.fa-carrot:before {\n content: \"\\f787\"; }\n\n.fa-cart-arrow-down:before {\n content: \"\\f218\"; }\n\n.fa-cart-plus:before {\n content: \"\\f217\"; }\n\n.fa-cash-register:before {\n content: \"\\f788\"; }\n\n.fa-cat:before {\n content: \"\\f6be\"; }\n\n.fa-cc-amazon-pay:before {\n content: \"\\f42d\"; }\n\n.fa-cc-amex:before {\n content: \"\\f1f3\"; }\n\n.fa-cc-apple-pay:before {\n content: \"\\f416\"; }\n\n.fa-cc-diners-club:before {\n content: \"\\f24c\"; }\n\n.fa-cc-discover:before {\n content: \"\\f1f2\"; }\n\n.fa-cc-jcb:before {\n content: \"\\f24b\"; }\n\n.fa-cc-mastercard:before {\n content: \"\\f1f1\"; }\n\n.fa-cc-paypal:before {\n content: \"\\f1f4\"; }\n\n.fa-cc-stripe:before {\n content: \"\\f1f5\"; }\n\n.fa-cc-visa:before {\n content: \"\\f1f0\"; }\n\n.fa-centercode:before {\n content: \"\\f380\"; }\n\n.fa-centos:before {\n content: \"\\f789\"; }\n\n.fa-certificate:before {\n content: \"\\f0a3\"; }\n\n.fa-chair:before {\n content: \"\\f6c0\"; }\n\n.fa-chalkboard:before {\n content: \"\\f51b\"; }\n\n.fa-chalkboard-teacher:before {\n content: \"\\f51c\"; }\n\n.fa-charging-station:before {\n content: \"\\f5e7\"; }\n\n.fa-chart-area:before {\n content: \"\\f1fe\"; }\n\n.fa-chart-bar:before {\n content: \"\\f080\"; }\n\n.fa-chart-line:before {\n content: \"\\f201\"; }\n\n.fa-chart-pie:before {\n content: \"\\f200\"; }\n\n.fa-check:before {\n content: \"\\f00c\"; }\n\n.fa-check-circle:before {\n content: \"\\f058\"; }\n\n.fa-check-double:before {\n content: \"\\f560\"; }\n\n.fa-check-square:before {\n content: \"\\f14a\"; }\n\n.fa-cheese:before {\n content: \"\\f7ef\"; }\n\n.fa-chess:before {\n content: \"\\f439\"; }\n\n.fa-chess-bishop:before {\n content: \"\\f43a\"; }\n\n.fa-chess-board:before {\n content: \"\\f43c\"; }\n\n.fa-chess-king:before {\n content: \"\\f43f\"; }\n\n.fa-chess-knight:before {\n content: \"\\f441\"; }\n\n.fa-chess-pawn:before {\n content: \"\\f443\"; }\n\n.fa-chess-queen:before {\n content: \"\\f445\"; }\n\n.fa-chess-rook:before {\n content: \"\\f447\"; }\n\n.fa-chevron-circle-down:before {\n content: \"\\f13a\"; }\n\n.fa-chevron-circle-left:before {\n content: \"\\f137\"; }\n\n.fa-chevron-circle-right:before {\n content: \"\\f138\"; }\n\n.fa-chevron-circle-up:before {\n content: \"\\f139\"; }\n\n.fa-chevron-down:before {\n content: \"\\f078\"; }\n\n.fa-chevron-left:before {\n content: \"\\f053\"; }\n\n.fa-chevron-right:before {\n content: \"\\f054\"; }\n\n.fa-chevron-up:before {\n content: \"\\f077\"; }\n\n.fa-child:before {\n content: \"\\f1ae\"; }\n\n.fa-chrome:before {\n content: \"\\f268\"; }\n\n.fa-chromecast:before {\n content: \"\\f838\"; }\n\n.fa-church:before {\n content: \"\\f51d\"; }\n\n.fa-circle:before {\n content: \"\\f111\"; }\n\n.fa-circle-notch:before {\n content: \"\\f1ce\"; }\n\n.fa-city:before {\n content: \"\\f64f\"; }\n\n.fa-clinic-medical:before {\n content: \"\\f7f2\"; }\n\n.fa-clipboard:before {\n content: \"\\f328\"; }\n\n.fa-clipboard-check:before {\n content: \"\\f46c\"; }\n\n.fa-clipboard-list:before {\n content: \"\\f46d\"; }\n\n.fa-clock:before {\n content: \"\\f017\"; }\n\n.fa-clone:before {\n content: \"\\f24d\"; }\n\n.fa-closed-captioning:before {\n content: \"\\f20a\"; }\n\n.fa-cloud:before {\n content: \"\\f0c2\"; }\n\n.fa-cloud-download-alt:before {\n content: \"\\f381\"; }\n\n.fa-cloud-meatball:before {\n content: \"\\f73b\"; }\n\n.fa-cloud-moon:before {\n content: \"\\f6c3\"; }\n\n.fa-cloud-moon-rain:before {\n content: \"\\f73c\"; }\n\n.fa-cloud-rain:before {\n content: \"\\f73d\"; }\n\n.fa-cloud-showers-heavy:before {\n content: \"\\f740\"; }\n\n.fa-cloud-sun:before {\n content: \"\\f6c4\"; }\n\n.fa-cloud-sun-rain:before {\n content: \"\\f743\"; }\n\n.fa-cloud-upload-alt:before {\n content: \"\\f382\"; }\n\n.fa-cloudflare:before {\n content: \"\\e07d\"; }\n\n.fa-cloudscale:before {\n content: \"\\f383\"; }\n\n.fa-cloudsmith:before {\n content: \"\\f384\"; }\n\n.fa-cloudversify:before {\n content: \"\\f385\"; }\n\n.fa-cocktail:before {\n content: \"\\f561\"; }\n\n.fa-code:before {\n content: \"\\f121\"; }\n\n.fa-code-branch:before {\n content: \"\\f126\"; }\n\n.fa-codepen:before {\n content: \"\\f1cb\"; }\n\n.fa-codiepie:before {\n content: \"\\f284\"; }\n\n.fa-coffee:before {\n content: \"\\f0f4\"; }\n\n.fa-cog:before {\n content: \"\\f013\"; }\n\n.fa-cogs:before {\n content: \"\\f085\"; }\n\n.fa-coins:before {\n content: \"\\f51e\"; }\n\n.fa-columns:before {\n content: \"\\f0db\"; }\n\n.fa-comment:before {\n content: \"\\f075\"; }\n\n.fa-comment-alt:before {\n content: \"\\f27a\"; }\n\n.fa-comment-dollar:before {\n content: \"\\f651\"; }\n\n.fa-comment-dots:before {\n content: \"\\f4ad\"; }\n\n.fa-comment-medical:before {\n content: \"\\f7f5\"; }\n\n.fa-comment-slash:before {\n content: \"\\f4b3\"; }\n\n.fa-comments:before {\n content: \"\\f086\"; }\n\n.fa-comments-dollar:before {\n content: \"\\f653\"; }\n\n.fa-compact-disc:before {\n content: \"\\f51f\"; }\n\n.fa-compass:before {\n content: \"\\f14e\"; }\n\n.fa-compress:before {\n content: \"\\f066\"; }\n\n.fa-compress-alt:before {\n content: \"\\f422\"; }\n\n.fa-compress-arrows-alt:before {\n content: \"\\f78c\"; }\n\n.fa-concierge-bell:before {\n content: \"\\f562\"; }\n\n.fa-confluence:before {\n content: \"\\f78d\"; }\n\n.fa-connectdevelop:before {\n content: \"\\f20e\"; }\n\n.fa-contao:before {\n content: \"\\f26d\"; }\n\n.fa-cookie:before {\n content: \"\\f563\"; }\n\n.fa-cookie-bite:before {\n content: \"\\f564\"; }\n\n.fa-copy:before {\n content: \"\\f0c5\"; }\n\n.fa-copyright:before {\n content: \"\\f1f9\"; }\n\n.fa-cotton-bureau:before {\n content: \"\\f89e\"; }\n\n.fa-couch:before {\n content: \"\\f4b8\"; }\n\n.fa-cpanel:before {\n content: \"\\f388\"; }\n\n.fa-creative-commons:before {\n content: \"\\f25e\"; }\n\n.fa-creative-commons-by:before {\n content: \"\\f4e7\"; }\n\n.fa-creative-commons-nc:before {\n content: \"\\f4e8\"; }\n\n.fa-creative-commons-nc-eu:before {\n content: \"\\f4e9\"; }\n\n.fa-creative-commons-nc-jp:before {\n content: \"\\f4ea\"; }\n\n.fa-creative-commons-nd:before {\n content: \"\\f4eb\"; }\n\n.fa-creative-commons-pd:before {\n content: \"\\f4ec\"; }\n\n.fa-creative-commons-pd-alt:before {\n content: \"\\f4ed\"; }\n\n.fa-creative-commons-remix:before {\n content: \"\\f4ee\"; }\n\n.fa-creative-commons-sa:before {\n content: \"\\f4ef\"; }\n\n.fa-creative-commons-sampling:before {\n content: \"\\f4f0\"; }\n\n.fa-creative-commons-sampling-plus:before {\n content: \"\\f4f1\"; }\n\n.fa-creative-commons-share:before {\n content: \"\\f4f2\"; }\n\n.fa-creative-commons-zero:before {\n content: \"\\f4f3\"; }\n\n.fa-credit-card:before {\n content: \"\\f09d\"; }\n\n.fa-critical-role:before {\n content: \"\\f6c9\"; }\n\n.fa-crop:before {\n content: \"\\f125\"; }\n\n.fa-crop-alt:before {\n content: \"\\f565\"; }\n\n.fa-cross:before {\n content: \"\\f654\"; }\n\n.fa-crosshairs:before {\n content: \"\\f05b\"; }\n\n.fa-crow:before {\n content: \"\\f520\"; }\n\n.fa-crown:before {\n content: \"\\f521\"; }\n\n.fa-crutch:before {\n content: \"\\f7f7\"; }\n\n.fa-css3:before {\n content: \"\\f13c\"; }\n\n.fa-css3-alt:before {\n content: \"\\f38b\"; }\n\n.fa-cube:before {\n content: \"\\f1b2\"; }\n\n.fa-cubes:before {\n content: \"\\f1b3\"; }\n\n.fa-cut:before {\n content: \"\\f0c4\"; }\n\n.fa-cuttlefish:before {\n content: \"\\f38c\"; }\n\n.fa-d-and-d:before {\n content: \"\\f38d\"; }\n\n.fa-d-and-d-beyond:before {\n content: \"\\f6ca\"; }\n\n.fa-dailymotion:before {\n content: \"\\e052\"; }\n\n.fa-dashcube:before {\n content: \"\\f210\"; }\n\n.fa-database:before {\n content: \"\\f1c0\"; }\n\n.fa-deaf:before {\n content: \"\\f2a4\"; }\n\n.fa-deezer:before {\n content: \"\\e077\"; }\n\n.fa-delicious:before {\n content: \"\\f1a5\"; }\n\n.fa-democrat:before {\n content: \"\\f747\"; }\n\n.fa-deploydog:before {\n content: \"\\f38e\"; }\n\n.fa-deskpro:before {\n content: \"\\f38f\"; }\n\n.fa-desktop:before {\n content: \"\\f108\"; }\n\n.fa-dev:before {\n content: \"\\f6cc\"; }\n\n.fa-deviantart:before {\n content: \"\\f1bd\"; }\n\n.fa-dharmachakra:before {\n content: \"\\f655\"; }\n\n.fa-dhl:before {\n content: \"\\f790\"; }\n\n.fa-diagnoses:before {\n content: \"\\f470\"; }\n\n.fa-diaspora:before {\n content: \"\\f791\"; }\n\n.fa-dice:before {\n content: \"\\f522\"; }\n\n.fa-dice-d20:before {\n content: \"\\f6cf\"; }\n\n.fa-dice-d6:before {\n content: \"\\f6d1\"; }\n\n.fa-dice-five:before {\n content: \"\\f523\"; }\n\n.fa-dice-four:before {\n content: \"\\f524\"; }\n\n.fa-dice-one:before {\n content: \"\\f525\"; }\n\n.fa-dice-six:before {\n content: \"\\f526\"; }\n\n.fa-dice-three:before {\n content: \"\\f527\"; }\n\n.fa-dice-two:before {\n content: \"\\f528\"; }\n\n.fa-digg:before {\n content: \"\\f1a6\"; }\n\n.fa-digital-ocean:before {\n content: \"\\f391\"; }\n\n.fa-digital-tachograph:before {\n content: \"\\f566\"; }\n\n.fa-directions:before {\n content: \"\\f5eb\"; }\n\n.fa-discord:before {\n content: \"\\f392\"; }\n\n.fa-discourse:before {\n content: \"\\f393\"; }\n\n.fa-disease:before {\n content: \"\\f7fa\"; }\n\n.fa-divide:before {\n content: \"\\f529\"; }\n\n.fa-dizzy:before {\n content: \"\\f567\"; }\n\n.fa-dna:before {\n content: \"\\f471\"; }\n\n.fa-dochub:before {\n content: \"\\f394\"; }\n\n.fa-docker:before {\n content: \"\\f395\"; }\n\n.fa-dog:before {\n content: \"\\f6d3\"; }\n\n.fa-dollar-sign:before {\n content: \"\\f155\"; }\n\n.fa-dolly:before {\n content: \"\\f472\"; }\n\n.fa-dolly-flatbed:before {\n content: \"\\f474\"; }\n\n.fa-donate:before {\n content: \"\\f4b9\"; }\n\n.fa-door-closed:before {\n content: \"\\f52a\"; }\n\n.fa-door-open:before {\n content: \"\\f52b\"; }\n\n.fa-dot-circle:before {\n content: \"\\f192\"; }\n\n.fa-dove:before {\n content: \"\\f4ba\"; }\n\n.fa-download:before {\n content: \"\\f019\"; }\n\n.fa-draft2digital:before {\n content: \"\\f396\"; }\n\n.fa-drafting-compass:before {\n content: \"\\f568\"; }\n\n.fa-dragon:before {\n content: \"\\f6d5\"; }\n\n.fa-draw-polygon:before {\n content: \"\\f5ee\"; }\n\n.fa-dribbble:before {\n content: \"\\f17d\"; }\n\n.fa-dribbble-square:before {\n content: \"\\f397\"; }\n\n.fa-dropbox:before {\n content: \"\\f16b\"; }\n\n.fa-drum:before {\n content: \"\\f569\"; }\n\n.fa-drum-steelpan:before {\n content: \"\\f56a\"; }\n\n.fa-drumstick-bite:before {\n content: \"\\f6d7\"; }\n\n.fa-drupal:before {\n content: \"\\f1a9\"; }\n\n.fa-dumbbell:before {\n content: \"\\f44b\"; }\n\n.fa-dumpster:before {\n content: \"\\f793\"; }\n\n.fa-dumpster-fire:before {\n content: \"\\f794\"; }\n\n.fa-dungeon:before {\n content: \"\\f6d9\"; }\n\n.fa-dyalog:before {\n content: \"\\f399\"; }\n\n.fa-earlybirds:before {\n content: \"\\f39a\"; }\n\n.fa-ebay:before {\n content: \"\\f4f4\"; }\n\n.fa-edge:before {\n content: \"\\f282\"; }\n\n.fa-edge-legacy:before {\n content: \"\\e078\"; }\n\n.fa-edit:before {\n content: \"\\f044\"; }\n\n.fa-egg:before {\n content: \"\\f7fb\"; }\n\n.fa-eject:before {\n content: \"\\f052\"; }\n\n.fa-elementor:before {\n content: \"\\f430\"; }\n\n.fa-ellipsis-h:before {\n content: \"\\f141\"; }\n\n.fa-ellipsis-v:before {\n content: \"\\f142\"; }\n\n.fa-ello:before {\n content: \"\\f5f1\"; }\n\n.fa-ember:before {\n content: \"\\f423\"; }\n\n.fa-empire:before {\n content: \"\\f1d1\"; }\n\n.fa-envelope:before {\n content: \"\\f0e0\"; }\n\n.fa-envelope-open:before {\n content: \"\\f2b6\"; }\n\n.fa-envelope-open-text:before {\n content: \"\\f658\"; }\n\n.fa-envelope-square:before {\n content: \"\\f199\"; }\n\n.fa-envira:before {\n content: \"\\f299\"; }\n\n.fa-equals:before {\n content: \"\\f52c\"; }\n\n.fa-eraser:before {\n content: \"\\f12d\"; }\n\n.fa-erlang:before {\n content: \"\\f39d\"; }\n\n.fa-ethereum:before {\n content: \"\\f42e\"; }\n\n.fa-ethernet:before {\n content: \"\\f796\"; }\n\n.fa-etsy:before {\n content: \"\\f2d7\"; }\n\n.fa-euro-sign:before {\n content: \"\\f153\"; }\n\n.fa-evernote:before {\n content: \"\\f839\"; }\n\n.fa-exchange-alt:before {\n content: \"\\f362\"; }\n\n.fa-exclamation:before {\n content: \"\\f12a\"; }\n\n.fa-exclamation-circle:before {\n content: \"\\f06a\"; }\n\n.fa-exclamation-triangle:before {\n content: \"\\f071\"; }\n\n.fa-expand:before {\n content: \"\\f065\"; }\n\n.fa-expand-alt:before {\n content: \"\\f424\"; }\n\n.fa-expand-arrows-alt:before {\n content: \"\\f31e\"; }\n\n.fa-expeditedssl:before {\n content: \"\\f23e\"; }\n\n.fa-external-link-alt:before {\n content: \"\\f35d\"; }\n\n.fa-external-link-square-alt:before {\n content: \"\\f360\"; }\n\n.fa-eye:before {\n content: \"\\f06e\"; }\n\n.fa-eye-dropper:before {\n content: \"\\f1fb\"; }\n\n.fa-eye-slash:before {\n content: \"\\f070\"; }\n\n.fa-facebook:before {\n content: \"\\f09a\"; }\n\n.fa-facebook-f:before {\n content: \"\\f39e\"; }\n\n.fa-facebook-messenger:before {\n content: \"\\f39f\"; }\n\n.fa-facebook-square:before {\n content: \"\\f082\"; }\n\n.fa-fan:before {\n content: \"\\f863\"; }\n\n.fa-fantasy-flight-games:before {\n content: \"\\f6dc\"; }\n\n.fa-fast-backward:before {\n content: \"\\f049\"; }\n\n.fa-fast-forward:before {\n content: \"\\f050\"; }\n\n.fa-faucet:before {\n content: \"\\e005\"; }\n\n.fa-fax:before {\n content: \"\\f1ac\"; }\n\n.fa-feather:before {\n content: \"\\f52d\"; }\n\n.fa-feather-alt:before {\n content: \"\\f56b\"; }\n\n.fa-fedex:before {\n content: \"\\f797\"; }\n\n.fa-fedora:before {\n content: \"\\f798\"; }\n\n.fa-female:before {\n content: \"\\f182\"; }\n\n.fa-fighter-jet:before {\n content: \"\\f0fb\"; }\n\n.fa-figma:before {\n content: \"\\f799\"; }\n\n.fa-file:before {\n content: \"\\f15b\"; }\n\n.fa-file-alt:before {\n content: \"\\f15c\"; }\n\n.fa-file-archive:before {\n content: \"\\f1c6\"; }\n\n.fa-file-audio:before {\n content: \"\\f1c7\"; }\n\n.fa-file-code:before {\n content: \"\\f1c9\"; }\n\n.fa-file-contract:before {\n content: \"\\f56c\"; }\n\n.fa-file-csv:before {\n content: \"\\f6dd\"; }\n\n.fa-file-download:before {\n content: \"\\f56d\"; }\n\n.fa-file-excel:before {\n content: \"\\f1c3\"; }\n\n.fa-file-export:before {\n content: \"\\f56e\"; }\n\n.fa-file-image:before {\n content: \"\\f1c5\"; }\n\n.fa-file-import:before {\n content: \"\\f56f\"; }\n\n.fa-file-invoice:before {\n content: \"\\f570\"; }\n\n.fa-file-invoice-dollar:before {\n content: \"\\f571\"; }\n\n.fa-file-medical:before {\n content: \"\\f477\"; }\n\n.fa-file-medical-alt:before {\n content: \"\\f478\"; }\n\n.fa-file-pdf:before {\n content: \"\\f1c1\"; }\n\n.fa-file-powerpoint:before {\n content: \"\\f1c4\"; }\n\n.fa-file-prescription:before {\n content: \"\\f572\"; }\n\n.fa-file-signature:before {\n content: \"\\f573\"; }\n\n.fa-file-upload:before {\n content: \"\\f574\"; }\n\n.fa-file-video:before {\n content: \"\\f1c8\"; }\n\n.fa-file-word:before {\n content: \"\\f1c2\"; }\n\n.fa-fill:before {\n content: \"\\f575\"; }\n\n.fa-fill-drip:before {\n content: \"\\f576\"; }\n\n.fa-film:before {\n content: \"\\f008\"; }\n\n.fa-filter:before {\n content: \"\\f0b0\"; }\n\n.fa-fingerprint:before {\n content: \"\\f577\"; }\n\n.fa-fire:before {\n content: \"\\f06d\"; }\n\n.fa-fire-alt:before {\n content: \"\\f7e4\"; }\n\n.fa-fire-extinguisher:before {\n content: \"\\f134\"; }\n\n.fa-firefox:before {\n content: \"\\f269\"; }\n\n.fa-firefox-browser:before {\n content: \"\\e007\"; }\n\n.fa-first-aid:before {\n content: \"\\f479\"; }\n\n.fa-first-order:before {\n content: \"\\f2b0\"; }\n\n.fa-first-order-alt:before {\n content: \"\\f50a\"; }\n\n.fa-firstdraft:before {\n content: \"\\f3a1\"; }\n\n.fa-fish:before {\n content: \"\\f578\"; }\n\n.fa-fist-raised:before {\n content: \"\\f6de\"; }\n\n.fa-flag:before {\n content: \"\\f024\"; }\n\n.fa-flag-checkered:before {\n content: \"\\f11e\"; }\n\n.fa-flag-usa:before {\n content: \"\\f74d\"; }\n\n.fa-flask:before {\n content: \"\\f0c3\"; }\n\n.fa-flickr:before {\n content: \"\\f16e\"; }\n\n.fa-flipboard:before {\n content: \"\\f44d\"; }\n\n.fa-flushed:before {\n content: \"\\f579\"; }\n\n.fa-fly:before {\n content: \"\\f417\"; }\n\n.fa-folder:before {\n content: \"\\f07b\"; }\n\n.fa-folder-minus:before {\n content: \"\\f65d\"; }\n\n.fa-folder-open:before {\n content: \"\\f07c\"; }\n\n.fa-folder-plus:before {\n content: \"\\f65e\"; }\n\n.fa-font:before {\n content: \"\\f031\"; }\n\n.fa-font-awesome:before {\n content: \"\\f2b4\"; }\n\n.fa-font-awesome-alt:before {\n content: \"\\f35c\"; }\n\n.fa-font-awesome-flag:before {\n content: \"\\f425\"; }\n\n.fa-font-awesome-logo-full:before {\n content: \"\\f4e6\"; }\n\n.fa-fonticons:before {\n content: \"\\f280\"; }\n\n.fa-fonticons-fi:before {\n content: \"\\f3a2\"; }\n\n.fa-football-ball:before {\n content: \"\\f44e\"; }\n\n.fa-fort-awesome:before {\n content: \"\\f286\"; }\n\n.fa-fort-awesome-alt:before {\n content: \"\\f3a3\"; }\n\n.fa-forumbee:before {\n content: \"\\f211\"; }\n\n.fa-forward:before {\n content: \"\\f04e\"; }\n\n.fa-foursquare:before {\n content: \"\\f180\"; }\n\n.fa-free-code-camp:before {\n content: \"\\f2c5\"; }\n\n.fa-freebsd:before {\n content: \"\\f3a4\"; }\n\n.fa-frog:before {\n content: \"\\f52e\"; }\n\n.fa-frown:before {\n content: \"\\f119\"; }\n\n.fa-frown-open:before {\n content: \"\\f57a\"; }\n\n.fa-fulcrum:before {\n content: \"\\f50b\"; }\n\n.fa-funnel-dollar:before {\n content: \"\\f662\"; }\n\n.fa-futbol:before {\n content: \"\\f1e3\"; }\n\n.fa-galactic-republic:before {\n content: \"\\f50c\"; }\n\n.fa-galactic-senate:before {\n content: \"\\f50d\"; }\n\n.fa-gamepad:before {\n content: \"\\f11b\"; }\n\n.fa-gas-pump:before {\n content: \"\\f52f\"; }\n\n.fa-gavel:before {\n content: \"\\f0e3\"; }\n\n.fa-gem:before {\n content: \"\\f3a5\"; }\n\n.fa-genderless:before {\n content: \"\\f22d\"; }\n\n.fa-get-pocket:before {\n content: \"\\f265\"; }\n\n.fa-gg:before {\n content: \"\\f260\"; }\n\n.fa-gg-circle:before {\n content: \"\\f261\"; }\n\n.fa-ghost:before {\n content: \"\\f6e2\"; }\n\n.fa-gift:before {\n content: \"\\f06b\"; }\n\n.fa-gifts:before {\n content: \"\\f79c\"; }\n\n.fa-git:before {\n content: \"\\f1d3\"; }\n\n.fa-git-alt:before {\n content: \"\\f841\"; }\n\n.fa-git-square:before {\n content: \"\\f1d2\"; }\n\n.fa-github:before {\n content: \"\\f09b\"; }\n\n.fa-github-alt:before {\n content: \"\\f113\"; }\n\n.fa-github-square:before {\n content: \"\\f092\"; }\n\n.fa-gitkraken:before {\n content: \"\\f3a6\"; }\n\n.fa-gitlab:before {\n content: \"\\f296\"; }\n\n.fa-gitter:before {\n content: \"\\f426\"; }\n\n.fa-glass-cheers:before {\n content: \"\\f79f\"; }\n\n.fa-glass-martini:before {\n content: \"\\f000\"; }\n\n.fa-glass-martini-alt:before {\n content: \"\\f57b\"; }\n\n.fa-glass-whiskey:before {\n content: \"\\f7a0\"; }\n\n.fa-glasses:before {\n content: \"\\f530\"; }\n\n.fa-glide:before {\n content: \"\\f2a5\"; }\n\n.fa-glide-g:before {\n content: \"\\f2a6\"; }\n\n.fa-globe:before {\n content: \"\\f0ac\"; }\n\n.fa-globe-africa:before {\n content: \"\\f57c\"; }\n\n.fa-globe-americas:before {\n content: \"\\f57d\"; }\n\n.fa-globe-asia:before {\n content: \"\\f57e\"; }\n\n.fa-globe-europe:before {\n content: \"\\f7a2\"; }\n\n.fa-gofore:before {\n content: \"\\f3a7\"; }\n\n.fa-golf-ball:before {\n content: \"\\f450\"; }\n\n.fa-goodreads:before {\n content: \"\\f3a8\"; }\n\n.fa-goodreads-g:before {\n content: \"\\f3a9\"; }\n\n.fa-google:before {\n content: \"\\f1a0\"; }\n\n.fa-google-drive:before {\n content: \"\\f3aa\"; }\n\n.fa-google-pay:before {\n content: \"\\e079\"; }\n\n.fa-google-play:before {\n content: \"\\f3ab\"; }\n\n.fa-google-plus:before {\n content: \"\\f2b3\"; }\n\n.fa-google-plus-g:before {\n content: \"\\f0d5\"; }\n\n.fa-google-plus-square:before {\n content: \"\\f0d4\"; }\n\n.fa-google-wallet:before {\n content: \"\\f1ee\"; }\n\n.fa-gopuram:before {\n content: \"\\f664\"; }\n\n.fa-graduation-cap:before {\n content: \"\\f19d\"; }\n\n.fa-gratipay:before {\n content: \"\\f184\"; }\n\n.fa-grav:before {\n content: \"\\f2d6\"; }\n\n.fa-greater-than:before {\n content: \"\\f531\"; }\n\n.fa-greater-than-equal:before {\n content: \"\\f532\"; }\n\n.fa-grimace:before {\n content: \"\\f57f\"; }\n\n.fa-grin:before {\n content: \"\\f580\"; }\n\n.fa-grin-alt:before {\n content: \"\\f581\"; }\n\n.fa-grin-beam:before {\n content: \"\\f582\"; }\n\n.fa-grin-beam-sweat:before {\n content: \"\\f583\"; }\n\n.fa-grin-hearts:before {\n content: \"\\f584\"; }\n\n.fa-grin-squint:before {\n content: \"\\f585\"; }\n\n.fa-grin-squint-tears:before {\n content: \"\\f586\"; }\n\n.fa-grin-stars:before {\n content: \"\\f587\"; }\n\n.fa-grin-tears:before {\n content: \"\\f588\"; }\n\n.fa-grin-tongue:before {\n content: \"\\f589\"; }\n\n.fa-grin-tongue-squint:before {\n content: \"\\f58a\"; }\n\n.fa-grin-tongue-wink:before {\n content: \"\\f58b\"; }\n\n.fa-grin-wink:before {\n content: \"\\f58c\"; }\n\n.fa-grip-horizontal:before {\n content: \"\\f58d\"; }\n\n.fa-grip-lines:before {\n content: \"\\f7a4\"; }\n\n.fa-grip-lines-vertical:before {\n content: \"\\f7a5\"; }\n\n.fa-grip-vertical:before {\n content: \"\\f58e\"; }\n\n.fa-gripfire:before {\n content: \"\\f3ac\"; }\n\n.fa-grunt:before {\n content: \"\\f3ad\"; }\n\n.fa-guilded:before {\n content: \"\\e07e\"; }\n\n.fa-guitar:before {\n content: \"\\f7a6\"; }\n\n.fa-gulp:before {\n content: \"\\f3ae\"; }\n\n.fa-h-square:before {\n content: \"\\f0fd\"; }\n\n.fa-hacker-news:before {\n content: \"\\f1d4\"; }\n\n.fa-hacker-news-square:before {\n content: \"\\f3af\"; }\n\n.fa-hackerrank:before {\n content: \"\\f5f7\"; }\n\n.fa-hamburger:before {\n content: \"\\f805\"; }\n\n.fa-hammer:before {\n content: \"\\f6e3\"; }\n\n.fa-hamsa:before {\n content: \"\\f665\"; }\n\n.fa-hand-holding:before {\n content: \"\\f4bd\"; }\n\n.fa-hand-holding-heart:before {\n content: \"\\f4be\"; }\n\n.fa-hand-holding-medical:before {\n content: \"\\e05c\"; }\n\n.fa-hand-holding-usd:before {\n content: \"\\f4c0\"; }\n\n.fa-hand-holding-water:before {\n content: \"\\f4c1\"; }\n\n.fa-hand-lizard:before {\n content: \"\\f258\"; }\n\n.fa-hand-middle-finger:before {\n content: \"\\f806\"; }\n\n.fa-hand-paper:before {\n content: \"\\f256\"; }\n\n.fa-hand-peace:before {\n content: \"\\f25b\"; }\n\n.fa-hand-point-down:before {\n content: \"\\f0a7\"; }\n\n.fa-hand-point-left:before {\n content: \"\\f0a5\"; }\n\n.fa-hand-point-right:before {\n content: \"\\f0a4\"; }\n\n.fa-hand-point-up:before {\n content: \"\\f0a6\"; }\n\n.fa-hand-pointer:before {\n content: \"\\f25a\"; }\n\n.fa-hand-rock:before {\n content: \"\\f255\"; }\n\n.fa-hand-scissors:before {\n content: \"\\f257\"; }\n\n.fa-hand-sparkles:before {\n content: \"\\e05d\"; }\n\n.fa-hand-spock:before {\n content: \"\\f259\"; }\n\n.fa-hands:before {\n content: \"\\f4c2\"; }\n\n.fa-hands-helping:before {\n content: \"\\f4c4\"; }\n\n.fa-hands-wash:before {\n content: \"\\e05e\"; }\n\n.fa-handshake:before {\n content: \"\\f2b5\"; }\n\n.fa-handshake-alt-slash:before {\n content: \"\\e05f\"; }\n\n.fa-handshake-slash:before {\n content: \"\\e060\"; }\n\n.fa-hanukiah:before {\n content: \"\\f6e6\"; }\n\n.fa-hard-hat:before {\n content: \"\\f807\"; }\n\n.fa-hashtag:before {\n content: \"\\f292\"; }\n\n.fa-hat-cowboy:before {\n content: \"\\f8c0\"; }\n\n.fa-hat-cowboy-side:before {\n content: \"\\f8c1\"; }\n\n.fa-hat-wizard:before {\n content: \"\\f6e8\"; }\n\n.fa-hdd:before {\n content: \"\\f0a0\"; }\n\n.fa-head-side-cough:before {\n content: \"\\e061\"; }\n\n.fa-head-side-cough-slash:before {\n content: \"\\e062\"; }\n\n.fa-head-side-mask:before {\n content: \"\\e063\"; }\n\n.fa-head-side-virus:before {\n content: \"\\e064\"; }\n\n.fa-heading:before {\n content: \"\\f1dc\"; }\n\n.fa-headphones:before {\n content: \"\\f025\"; }\n\n.fa-headphones-alt:before {\n content: \"\\f58f\"; }\n\n.fa-headset:before {\n content: \"\\f590\"; }\n\n.fa-heart:before {\n content: \"\\f004\"; }\n\n.fa-heart-broken:before {\n content: \"\\f7a9\"; }\n\n.fa-heartbeat:before {\n content: \"\\f21e\"; }\n\n.fa-helicopter:before {\n content: \"\\f533\"; }\n\n.fa-highlighter:before {\n content: \"\\f591\"; }\n\n.fa-hiking:before {\n content: \"\\f6ec\"; }\n\n.fa-hippo:before {\n content: \"\\f6ed\"; }\n\n.fa-hips:before {\n content: \"\\f452\"; }\n\n.fa-hire-a-helper:before {\n content: \"\\f3b0\"; }\n\n.fa-history:before {\n content: \"\\f1da\"; }\n\n.fa-hive:before {\n content: \"\\e07f\"; }\n\n.fa-hockey-puck:before {\n content: \"\\f453\"; }\n\n.fa-holly-berry:before {\n content: \"\\f7aa\"; }\n\n.fa-home:before {\n content: \"\\f015\"; }\n\n.fa-hooli:before {\n content: \"\\f427\"; }\n\n.fa-hornbill:before {\n content: \"\\f592\"; }\n\n.fa-horse:before {\n content: \"\\f6f0\"; }\n\n.fa-horse-head:before {\n content: \"\\f7ab\"; }\n\n.fa-hospital:before {\n content: \"\\f0f8\"; }\n\n.fa-hospital-alt:before {\n content: \"\\f47d\"; }\n\n.fa-hospital-symbol:before {\n content: \"\\f47e\"; }\n\n.fa-hospital-user:before {\n content: \"\\f80d\"; }\n\n.fa-hot-tub:before {\n content: \"\\f593\"; }\n\n.fa-hotdog:before {\n content: \"\\f80f\"; }\n\n.fa-hotel:before {\n content: \"\\f594\"; }\n\n.fa-hotjar:before {\n content: \"\\f3b1\"; }\n\n.fa-hourglass:before {\n content: \"\\f254\"; }\n\n.fa-hourglass-end:before {\n content: \"\\f253\"; }\n\n.fa-hourglass-half:before {\n content: \"\\f252\"; }\n\n.fa-hourglass-start:before {\n content: \"\\f251\"; }\n\n.fa-house-damage:before {\n content: \"\\f6f1\"; }\n\n.fa-house-user:before {\n content: \"\\e065\"; }\n\n.fa-houzz:before {\n content: \"\\f27c\"; }\n\n.fa-hryvnia:before {\n content: \"\\f6f2\"; }\n\n.fa-html5:before {\n content: \"\\f13b\"; }\n\n.fa-hubspot:before {\n content: \"\\f3b2\"; }\n\n.fa-i-cursor:before {\n content: \"\\f246\"; }\n\n.fa-ice-cream:before {\n content: \"\\f810\"; }\n\n.fa-icicles:before {\n content: \"\\f7ad\"; }\n\n.fa-icons:before {\n content: \"\\f86d\"; }\n\n.fa-id-badge:before {\n content: \"\\f2c1\"; }\n\n.fa-id-card:before {\n content: \"\\f2c2\"; }\n\n.fa-id-card-alt:before {\n content: \"\\f47f\"; }\n\n.fa-ideal:before {\n content: \"\\e013\"; }\n\n.fa-igloo:before {\n content: \"\\f7ae\"; }\n\n.fa-image:before {\n content: \"\\f03e\"; }\n\n.fa-images:before {\n content: \"\\f302\"; }\n\n.fa-imdb:before {\n content: \"\\f2d8\"; }\n\n.fa-inbox:before {\n content: \"\\f01c\"; }\n\n.fa-indent:before {\n content: \"\\f03c\"; }\n\n.fa-industry:before {\n content: \"\\f275\"; }\n\n.fa-infinity:before {\n content: \"\\f534\"; }\n\n.fa-info:before {\n content: \"\\f129\"; }\n\n.fa-info-circle:before {\n content: \"\\f05a\"; }\n\n.fa-innosoft:before {\n content: \"\\e080\"; }\n\n.fa-instagram:before {\n content: \"\\f16d\"; }\n\n.fa-instagram-square:before {\n content: \"\\e055\"; }\n\n.fa-instalod:before {\n content: \"\\e081\"; }\n\n.fa-intercom:before {\n content: \"\\f7af\"; }\n\n.fa-internet-explorer:before {\n content: \"\\f26b\"; }\n\n.fa-invision:before {\n content: \"\\f7b0\"; }\n\n.fa-ioxhost:before {\n content: \"\\f208\"; }\n\n.fa-italic:before {\n content: \"\\f033\"; }\n\n.fa-itch-io:before {\n content: \"\\f83a\"; }\n\n.fa-itunes:before {\n content: \"\\f3b4\"; }\n\n.fa-itunes-note:before {\n content: \"\\f3b5\"; }\n\n.fa-java:before {\n content: \"\\f4e4\"; }\n\n.fa-jedi:before {\n content: \"\\f669\"; }\n\n.fa-jedi-order:before {\n content: \"\\f50e\"; }\n\n.fa-jenkins:before {\n content: \"\\f3b6\"; }\n\n.fa-jira:before {\n content: \"\\f7b1\"; }\n\n.fa-joget:before {\n content: \"\\f3b7\"; }\n\n.fa-joint:before {\n content: \"\\f595\"; }\n\n.fa-joomla:before {\n content: \"\\f1aa\"; }\n\n.fa-journal-whills:before {\n content: \"\\f66a\"; }\n\n.fa-js:before {\n content: \"\\f3b8\"; }\n\n.fa-js-square:before {\n content: \"\\f3b9\"; }\n\n.fa-jsfiddle:before {\n content: \"\\f1cc\"; }\n\n.fa-kaaba:before {\n content: \"\\f66b\"; }\n\n.fa-kaggle:before {\n content: \"\\f5fa\"; }\n\n.fa-key:before {\n content: \"\\f084\"; }\n\n.fa-keybase:before {\n content: \"\\f4f5\"; }\n\n.fa-keyboard:before {\n content: \"\\f11c\"; }\n\n.fa-keycdn:before {\n content: \"\\f3ba\"; }\n\n.fa-khanda:before {\n content: \"\\f66d\"; }\n\n.fa-kickstarter:before {\n content: \"\\f3bb\"; }\n\n.fa-kickstarter-k:before {\n content: \"\\f3bc\"; }\n\n.fa-kiss:before {\n content: \"\\f596\"; }\n\n.fa-kiss-beam:before {\n content: \"\\f597\"; }\n\n.fa-kiss-wink-heart:before {\n content: \"\\f598\"; }\n\n.fa-kiwi-bird:before {\n content: \"\\f535\"; }\n\n.fa-korvue:before {\n content: \"\\f42f\"; }\n\n.fa-landmark:before {\n content: \"\\f66f\"; }\n\n.fa-language:before {\n content: \"\\f1ab\"; }\n\n.fa-laptop:before {\n content: \"\\f109\"; }\n\n.fa-laptop-code:before {\n content: \"\\f5fc\"; }\n\n.fa-laptop-house:before {\n content: \"\\e066\"; }\n\n.fa-laptop-medical:before {\n content: \"\\f812\"; }\n\n.fa-laravel:before {\n content: \"\\f3bd\"; }\n\n.fa-lastfm:before {\n content: \"\\f202\"; }\n\n.fa-lastfm-square:before {\n content: \"\\f203\"; }\n\n.fa-laugh:before {\n content: \"\\f599\"; }\n\n.fa-laugh-beam:before {\n content: \"\\f59a\"; }\n\n.fa-laugh-squint:before {\n content: \"\\f59b\"; }\n\n.fa-laugh-wink:before {\n content: \"\\f59c\"; }\n\n.fa-layer-group:before {\n content: \"\\f5fd\"; }\n\n.fa-leaf:before {\n content: \"\\f06c\"; }\n\n.fa-leanpub:before {\n content: \"\\f212\"; }\n\n.fa-lemon:before {\n content: \"\\f094\"; }\n\n.fa-less:before {\n content: \"\\f41d\"; }\n\n.fa-less-than:before {\n content: \"\\f536\"; }\n\n.fa-less-than-equal:before {\n content: \"\\f537\"; }\n\n.fa-level-down-alt:before {\n content: \"\\f3be\"; }\n\n.fa-level-up-alt:before {\n content: \"\\f3bf\"; }\n\n.fa-life-ring:before {\n content: \"\\f1cd\"; }\n\n.fa-lightbulb:before {\n content: \"\\f0eb\"; }\n\n.fa-line:before {\n content: \"\\f3c0\"; }\n\n.fa-link:before {\n content: \"\\f0c1\"; }\n\n.fa-linkedin:before {\n content: \"\\f08c\"; }\n\n.fa-linkedin-in:before {\n content: \"\\f0e1\"; }\n\n.fa-linode:before {\n content: \"\\f2b8\"; }\n\n.fa-linux:before {\n content: \"\\f17c\"; }\n\n.fa-lira-sign:before {\n content: \"\\f195\"; }\n\n.fa-list:before {\n content: \"\\f03a\"; }\n\n.fa-list-alt:before {\n content: \"\\f022\"; }\n\n.fa-list-ol:before {\n content: \"\\f0cb\"; }\n\n.fa-list-ul:before {\n content: \"\\f0ca\"; }\n\n.fa-location-arrow:before {\n content: \"\\f124\"; }\n\n.fa-lock:before {\n content: \"\\f023\"; }\n\n.fa-lock-open:before {\n content: \"\\f3c1\"; }\n\n.fa-long-arrow-alt-down:before {\n content: \"\\f309\"; }\n\n.fa-long-arrow-alt-left:before {\n content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-right:before {\n content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-up:before {\n content: \"\\f30c\"; }\n\n.fa-low-vision:before {\n content: \"\\f2a8\"; }\n\n.fa-luggage-cart:before {\n content: \"\\f59d\"; }\n\n.fa-lungs:before {\n content: \"\\f604\"; }\n\n.fa-lungs-virus:before {\n content: \"\\e067\"; }\n\n.fa-lyft:before {\n content: \"\\f3c3\"; }\n\n.fa-magento:before {\n content: \"\\f3c4\"; }\n\n.fa-magic:before {\n content: \"\\f0d0\"; }\n\n.fa-magnet:before {\n content: \"\\f076\"; }\n\n.fa-mail-bulk:before {\n content: \"\\f674\"; }\n\n.fa-mailchimp:before {\n content: \"\\f59e\"; }\n\n.fa-male:before {\n content: \"\\f183\"; }\n\n.fa-mandalorian:before {\n content: \"\\f50f\"; }\n\n.fa-map:before {\n content: \"\\f279\"; }\n\n.fa-map-marked:before {\n content: \"\\f59f\"; }\n\n.fa-map-marked-alt:before {\n content: \"\\f5a0\"; }\n\n.fa-map-marker:before {\n content: \"\\f041\"; }\n\n.fa-map-marker-alt:before {\n content: \"\\f3c5\"; }\n\n.fa-map-pin:before {\n content: \"\\f276\"; }\n\n.fa-map-signs:before {\n content: \"\\f277\"; }\n\n.fa-markdown:before {\n content: \"\\f60f\"; }\n\n.fa-marker:before {\n content: \"\\f5a1\"; }\n\n.fa-mars:before {\n content: \"\\f222\"; }\n\n.fa-mars-double:before {\n content: \"\\f227\"; }\n\n.fa-mars-stroke:before {\n content: \"\\f229\"; }\n\n.fa-mars-stroke-h:before {\n content: \"\\f22b\"; }\n\n.fa-mars-stroke-v:before {\n content: \"\\f22a\"; }\n\n.fa-mask:before {\n content: \"\\f6fa\"; }\n\n.fa-mastodon:before {\n content: \"\\f4f6\"; }\n\n.fa-maxcdn:before {\n content: \"\\f136\"; }\n\n.fa-mdb:before {\n content: \"\\f8ca\"; }\n\n.fa-medal:before {\n content: \"\\f5a2\"; }\n\n.fa-medapps:before {\n content: \"\\f3c6\"; }\n\n.fa-medium:before {\n content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n content: \"\\f3c7\"; }\n\n.fa-medkit:before {\n content: \"\\f0fa\"; }\n\n.fa-medrt:before {\n content: \"\\f3c8\"; }\n\n.fa-meetup:before {\n content: \"\\f2e0\"; }\n\n.fa-megaport:before {\n content: \"\\f5a3\"; }\n\n.fa-meh:before {\n content: \"\\f11a\"; }\n\n.fa-meh-blank:before {\n content: \"\\f5a4\"; }\n\n.fa-meh-rolling-eyes:before {\n content: \"\\f5a5\"; }\n\n.fa-memory:before {\n content: \"\\f538\"; }\n\n.fa-mendeley:before {\n content: \"\\f7b3\"; }\n\n.fa-menorah:before {\n content: \"\\f676\"; }\n\n.fa-mercury:before {\n content: \"\\f223\"; }\n\n.fa-meteor:before {\n content: \"\\f753\"; }\n\n.fa-microblog:before {\n content: \"\\e01a\"; }\n\n.fa-microchip:before {\n content: \"\\f2db\"; }\n\n.fa-microphone:before {\n content: \"\\f130\"; }\n\n.fa-microphone-alt:before {\n content: \"\\f3c9\"; }\n\n.fa-microphone-alt-slash:before {\n content: \"\\f539\"; }\n\n.fa-microphone-slash:before {\n content: \"\\f131\"; }\n\n.fa-microscope:before {\n content: \"\\f610\"; }\n\n.fa-microsoft:before {\n content: \"\\f3ca\"; }\n\n.fa-minus:before {\n content: \"\\f068\"; }\n\n.fa-minus-circle:before {\n content: \"\\f056\"; }\n\n.fa-minus-square:before {\n content: \"\\f146\"; }\n\n.fa-mitten:before {\n content: \"\\f7b5\"; }\n\n.fa-mix:before {\n content: \"\\f3cb\"; }\n\n.fa-mixcloud:before {\n content: \"\\f289\"; }\n\n.fa-mixer:before {\n content: \"\\e056\"; }\n\n.fa-mizuni:before {\n content: \"\\f3cc\"; }\n\n.fa-mobile:before {\n content: \"\\f10b\"; }\n\n.fa-mobile-alt:before {\n content: \"\\f3cd\"; }\n\n.fa-modx:before {\n content: \"\\f285\"; }\n\n.fa-monero:before {\n content: \"\\f3d0\"; }\n\n.fa-money-bill:before {\n content: \"\\f0d6\"; }\n\n.fa-money-bill-alt:before {\n content: \"\\f3d1\"; }\n\n.fa-money-bill-wave:before {\n content: \"\\f53a\"; }\n\n.fa-money-bill-wave-alt:before {\n content: \"\\f53b\"; }\n\n.fa-money-check:before {\n content: \"\\f53c\"; }\n\n.fa-money-check-alt:before {\n content: \"\\f53d\"; }\n\n.fa-monument:before {\n content: \"\\f5a6\"; }\n\n.fa-moon:before {\n content: \"\\f186\"; }\n\n.fa-mortar-pestle:before {\n content: \"\\f5a7\"; }\n\n.fa-mosque:before {\n content: \"\\f678\"; }\n\n.fa-motorcycle:before {\n content: \"\\f21c\"; }\n\n.fa-mountain:before {\n content: \"\\f6fc\"; }\n\n.fa-mouse:before {\n content: \"\\f8cc\"; }\n\n.fa-mouse-pointer:before {\n content: \"\\f245\"; }\n\n.fa-mug-hot:before {\n content: \"\\f7b6\"; }\n\n.fa-music:before {\n content: \"\\f001\"; }\n\n.fa-napster:before {\n content: \"\\f3d2\"; }\n\n.fa-neos:before {\n content: \"\\f612\"; }\n\n.fa-network-wired:before {\n content: \"\\f6ff\"; }\n\n.fa-neuter:before {\n content: \"\\f22c\"; }\n\n.fa-newspaper:before {\n content: \"\\f1ea\"; }\n\n.fa-nimblr:before {\n content: \"\\f5a8\"; }\n\n.fa-node:before {\n content: \"\\f419\"; }\n\n.fa-node-js:before {\n content: \"\\f3d3\"; }\n\n.fa-not-equal:before {\n content: \"\\f53e\"; }\n\n.fa-notes-medical:before {\n content: \"\\f481\"; }\n\n.fa-npm:before {\n content: \"\\f3d4\"; }\n\n.fa-ns8:before {\n content: \"\\f3d5\"; }\n\n.fa-nutritionix:before {\n content: \"\\f3d6\"; }\n\n.fa-object-group:before {\n content: \"\\f247\"; }\n\n.fa-object-ungroup:before {\n content: \"\\f248\"; }\n\n.fa-octopus-deploy:before {\n content: \"\\e082\"; }\n\n.fa-odnoklassniki:before {\n content: \"\\f263\"; }\n\n.fa-odnoklassniki-square:before {\n content: \"\\f264\"; }\n\n.fa-oil-can:before {\n content: \"\\f613\"; }\n\n.fa-old-republic:before {\n content: \"\\f510\"; }\n\n.fa-om:before {\n content: \"\\f679\"; }\n\n.fa-opencart:before {\n content: \"\\f23d\"; }\n\n.fa-openid:before {\n content: \"\\f19b\"; }\n\n.fa-opera:before {\n content: \"\\f26a\"; }\n\n.fa-optin-monster:before {\n content: \"\\f23c\"; }\n\n.fa-orcid:before {\n content: \"\\f8d2\"; }\n\n.fa-osi:before {\n content: \"\\f41a\"; }\n\n.fa-otter:before {\n content: \"\\f700\"; }\n\n.fa-outdent:before {\n content: \"\\f03b\"; }\n\n.fa-page4:before {\n content: \"\\f3d7\"; }\n\n.fa-pagelines:before {\n content: \"\\f18c\"; }\n\n.fa-pager:before {\n content: \"\\f815\"; }\n\n.fa-paint-brush:before {\n content: \"\\f1fc\"; }\n\n.fa-paint-roller:before {\n content: \"\\f5aa\"; }\n\n.fa-palette:before {\n content: \"\\f53f\"; }\n\n.fa-palfed:before {\n content: \"\\f3d8\"; }\n\n.fa-pallet:before {\n content: \"\\f482\"; }\n\n.fa-paper-plane:before {\n content: \"\\f1d8\"; }\n\n.fa-paperclip:before {\n content: \"\\f0c6\"; }\n\n.fa-parachute-box:before {\n content: \"\\f4cd\"; }\n\n.fa-paragraph:before {\n content: \"\\f1dd\"; }\n\n.fa-parking:before {\n content: \"\\f540\"; }\n\n.fa-passport:before {\n content: \"\\f5ab\"; }\n\n.fa-pastafarianism:before {\n content: \"\\f67b\"; }\n\n.fa-paste:before {\n content: \"\\f0ea\"; }\n\n.fa-patreon:before {\n content: \"\\f3d9\"; }\n\n.fa-pause:before {\n content: \"\\f04c\"; }\n\n.fa-pause-circle:before {\n content: \"\\f28b\"; }\n\n.fa-paw:before {\n content: \"\\f1b0\"; }\n\n.fa-paypal:before {\n content: \"\\f1ed\"; }\n\n.fa-peace:before {\n content: \"\\f67c\"; }\n\n.fa-pen:before {\n content: \"\\f304\"; }\n\n.fa-pen-alt:before {\n content: \"\\f305\"; }\n\n.fa-pen-fancy:before {\n content: \"\\f5ac\"; }\n\n.fa-pen-nib:before {\n content: \"\\f5ad\"; }\n\n.fa-pen-square:before {\n content: \"\\f14b\"; }\n\n.fa-pencil-alt:before {\n content: \"\\f303\"; }\n\n.fa-pencil-ruler:before {\n content: \"\\f5ae\"; }\n\n.fa-penny-arcade:before {\n content: \"\\f704\"; }\n\n.fa-people-arrows:before {\n content: \"\\e068\"; }\n\n.fa-people-carry:before {\n content: \"\\f4ce\"; }\n\n.fa-pepper-hot:before {\n content: \"\\f816\"; }\n\n.fa-perbyte:before {\n content: \"\\e083\"; }\n\n.fa-percent:before {\n content: \"\\f295\"; }\n\n.fa-percentage:before {\n content: \"\\f541\"; }\n\n.fa-periscope:before {\n content: \"\\f3da\"; }\n\n.fa-person-booth:before {\n content: \"\\f756\"; }\n\n.fa-phabricator:before {\n content: \"\\f3db\"; }\n\n.fa-phoenix-framework:before {\n content: \"\\f3dc\"; }\n\n.fa-phoenix-squadron:before {\n content: \"\\f511\"; }\n\n.fa-phone:before {\n content: \"\\f095\"; }\n\n.fa-phone-alt:before {\n content: \"\\f879\"; }\n\n.fa-phone-slash:before {\n content: \"\\f3dd\"; }\n\n.fa-phone-square:before {\n content: \"\\f098\"; }\n\n.fa-phone-square-alt:before {\n content: \"\\f87b\"; }\n\n.fa-phone-volume:before {\n content: \"\\f2a0\"; }\n\n.fa-photo-video:before {\n content: \"\\f87c\"; }\n\n.fa-php:before {\n content: \"\\f457\"; }\n\n.fa-pied-piper:before {\n content: \"\\f2ae\"; }\n\n.fa-pied-piper-alt:before {\n content: \"\\f1a8\"; }\n\n.fa-pied-piper-hat:before {\n content: \"\\f4e5\"; }\n\n.fa-pied-piper-pp:before {\n content: \"\\f1a7\"; }\n\n.fa-pied-piper-square:before {\n content: \"\\e01e\"; }\n\n.fa-piggy-bank:before {\n content: \"\\f4d3\"; }\n\n.fa-pills:before {\n content: \"\\f484\"; }\n\n.fa-pinterest:before {\n content: \"\\f0d2\"; }\n\n.fa-pinterest-p:before {\n content: \"\\f231\"; }\n\n.fa-pinterest-square:before {\n content: \"\\f0d3\"; }\n\n.fa-pizza-slice:before {\n content: \"\\f818\"; }\n\n.fa-place-of-worship:before {\n content: \"\\f67f\"; }\n\n.fa-plane:before {\n content: \"\\f072\"; }\n\n.fa-plane-arrival:before {\n content: \"\\f5af\"; }\n\n.fa-plane-departure:before {\n content: \"\\f5b0\"; }\n\n.fa-plane-slash:before {\n content: \"\\e069\"; }\n\n.fa-play:before {\n content: \"\\f04b\"; }\n\n.fa-play-circle:before {\n content: \"\\f144\"; }\n\n.fa-playstation:before {\n content: \"\\f3df\"; }\n\n.fa-plug:before {\n content: \"\\f1e6\"; }\n\n.fa-plus:before {\n content: \"\\f067\"; }\n\n.fa-plus-circle:before {\n content: \"\\f055\"; }\n\n.fa-plus-square:before {\n content: \"\\f0fe\"; }\n\n.fa-podcast:before {\n content: \"\\f2ce\"; }\n\n.fa-poll:before {\n content: \"\\f681\"; }\n\n.fa-poll-h:before {\n content: \"\\f682\"; }\n\n.fa-poo:before {\n content: \"\\f2fe\"; }\n\n.fa-poo-storm:before {\n content: \"\\f75a\"; }\n\n.fa-poop:before {\n content: \"\\f619\"; }\n\n.fa-portrait:before {\n content: \"\\f3e0\"; }\n\n.fa-pound-sign:before {\n content: \"\\f154\"; }\n\n.fa-power-off:before {\n content: \"\\f011\"; }\n\n.fa-pray:before {\n content: \"\\f683\"; }\n\n.fa-praying-hands:before {\n content: \"\\f684\"; }\n\n.fa-prescription:before {\n content: \"\\f5b1\"; }\n\n.fa-prescription-bottle:before {\n content: \"\\f485\"; }\n\n.fa-prescription-bottle-alt:before {\n content: \"\\f486\"; }\n\n.fa-print:before {\n content: \"\\f02f\"; }\n\n.fa-procedures:before {\n content: \"\\f487\"; }\n\n.fa-product-hunt:before {\n content: \"\\f288\"; }\n\n.fa-project-diagram:before {\n content: \"\\f542\"; }\n\n.fa-pump-medical:before {\n content: \"\\e06a\"; }\n\n.fa-pump-soap:before {\n content: \"\\e06b\"; }\n\n.fa-pushed:before {\n content: \"\\f3e1\"; }\n\n.fa-puzzle-piece:before {\n content: \"\\f12e\"; }\n\n.fa-python:before {\n content: \"\\f3e2\"; }\n\n.fa-qq:before {\n content: \"\\f1d6\"; }\n\n.fa-qrcode:before {\n content: \"\\f029\"; }\n\n.fa-question:before {\n content: \"\\f128\"; }\n\n.fa-question-circle:before {\n content: \"\\f059\"; }\n\n.fa-quidditch:before {\n content: \"\\f458\"; }\n\n.fa-quinscape:before {\n content: \"\\f459\"; }\n\n.fa-quora:before {\n content: \"\\f2c4\"; }\n\n.fa-quote-left:before {\n content: \"\\f10d\"; }\n\n.fa-quote-right:before {\n content: \"\\f10e\"; }\n\n.fa-quran:before {\n content: \"\\f687\"; }\n\n.fa-r-project:before {\n content: \"\\f4f7\"; }\n\n.fa-radiation:before {\n content: \"\\f7b9\"; }\n\n.fa-radiation-alt:before {\n content: \"\\f7ba\"; }\n\n.fa-rainbow:before {\n content: \"\\f75b\"; }\n\n.fa-random:before {\n content: \"\\f074\"; }\n\n.fa-raspberry-pi:before {\n content: \"\\f7bb\"; }\n\n.fa-ravelry:before {\n content: \"\\f2d9\"; }\n\n.fa-react:before {\n content: \"\\f41b\"; }\n\n.fa-reacteurope:before {\n content: \"\\f75d\"; }\n\n.fa-readme:before {\n content: \"\\f4d5\"; }\n\n.fa-rebel:before {\n content: \"\\f1d0\"; }\n\n.fa-receipt:before {\n content: \"\\f543\"; }\n\n.fa-record-vinyl:before {\n content: \"\\f8d9\"; }\n\n.fa-recycle:before {\n content: \"\\f1b8\"; }\n\n.fa-red-river:before {\n content: \"\\f3e3\"; }\n\n.fa-reddit:before {\n content: \"\\f1a1\"; }\n\n.fa-reddit-alien:before {\n content: \"\\f281\"; }\n\n.fa-reddit-square:before {\n content: \"\\f1a2\"; }\n\n.fa-redhat:before {\n content: \"\\f7bc\"; }\n\n.fa-redo:before {\n content: \"\\f01e\"; }\n\n.fa-redo-alt:before {\n content: \"\\f2f9\"; }\n\n.fa-registered:before {\n content: \"\\f25d\"; }\n\n.fa-remove-format:before {\n content: \"\\f87d\"; }\n\n.fa-renren:before {\n content: \"\\f18b\"; }\n\n.fa-reply:before {\n content: \"\\f3e5\"; }\n\n.fa-reply-all:before {\n content: \"\\f122\"; }\n\n.fa-replyd:before {\n content: \"\\f3e6\"; }\n\n.fa-republican:before {\n content: \"\\f75e\"; }\n\n.fa-researchgate:before {\n content: \"\\f4f8\"; }\n\n.fa-resolving:before {\n content: \"\\f3e7\"; }\n\n.fa-restroom:before {\n content: \"\\f7bd\"; }\n\n.fa-retweet:before {\n content: \"\\f079\"; }\n\n.fa-rev:before {\n content: \"\\f5b2\"; }\n\n.fa-ribbon:before {\n content: \"\\f4d6\"; }\n\n.fa-ring:before {\n content: \"\\f70b\"; }\n\n.fa-road:before {\n content: \"\\f018\"; }\n\n.fa-robot:before {\n content: \"\\f544\"; }\n\n.fa-rocket:before {\n content: \"\\f135\"; }\n\n.fa-rocketchat:before {\n content: \"\\f3e8\"; }\n\n.fa-rockrms:before {\n content: \"\\f3e9\"; }\n\n.fa-route:before {\n content: \"\\f4d7\"; }\n\n.fa-rss:before {\n content: \"\\f09e\"; }\n\n.fa-rss-square:before {\n content: \"\\f143\"; }\n\n.fa-ruble-sign:before {\n content: \"\\f158\"; }\n\n.fa-ruler:before {\n content: \"\\f545\"; }\n\n.fa-ruler-combined:before {\n content: \"\\f546\"; }\n\n.fa-ruler-horizontal:before {\n content: \"\\f547\"; }\n\n.fa-ruler-vertical:before {\n content: \"\\f548\"; }\n\n.fa-running:before {\n content: \"\\f70c\"; }\n\n.fa-rupee-sign:before {\n content: \"\\f156\"; }\n\n.fa-rust:before {\n content: \"\\e07a\"; }\n\n.fa-sad-cry:before {\n content: \"\\f5b3\"; }\n\n.fa-sad-tear:before {\n content: \"\\f5b4\"; }\n\n.fa-safari:before {\n content: \"\\f267\"; }\n\n.fa-salesforce:before {\n content: \"\\f83b\"; }\n\n.fa-sass:before {\n content: \"\\f41e\"; }\n\n.fa-satellite:before {\n content: \"\\f7bf\"; }\n\n.fa-satellite-dish:before {\n content: \"\\f7c0\"; }\n\n.fa-save:before {\n content: \"\\f0c7\"; }\n\n.fa-schlix:before {\n content: \"\\f3ea\"; }\n\n.fa-school:before {\n content: \"\\f549\"; }\n\n.fa-screwdriver:before {\n content: \"\\f54a\"; }\n\n.fa-scribd:before {\n content: \"\\f28a\"; }\n\n.fa-scroll:before {\n content: \"\\f70e\"; }\n\n.fa-sd-card:before {\n content: \"\\f7c2\"; }\n\n.fa-search:before {\n content: \"\\f002\"; }\n\n.fa-search-dollar:before {\n content: \"\\f688\"; }\n\n.fa-search-location:before {\n content: \"\\f689\"; }\n\n.fa-search-minus:before {\n content: \"\\f010\"; }\n\n.fa-search-plus:before {\n content: \"\\f00e\"; }\n\n.fa-searchengin:before {\n content: \"\\f3eb\"; }\n\n.fa-seedling:before {\n content: \"\\f4d8\"; }\n\n.fa-sellcast:before {\n content: \"\\f2da\"; }\n\n.fa-sellsy:before {\n content: \"\\f213\"; }\n\n.fa-server:before {\n content: \"\\f233\"; }\n\n.fa-servicestack:before {\n content: \"\\f3ec\"; }\n\n.fa-shapes:before {\n content: \"\\f61f\"; }\n\n.fa-share:before {\n content: \"\\f064\"; }\n\n.fa-share-alt:before {\n content: \"\\f1e0\"; }\n\n.fa-share-alt-square:before {\n content: \"\\f1e1\"; }\n\n.fa-share-square:before {\n content: \"\\f14d\"; }\n\n.fa-shekel-sign:before {\n content: \"\\f20b\"; }\n\n.fa-shield-alt:before {\n content: \"\\f3ed\"; }\n\n.fa-shield-virus:before {\n content: \"\\e06c\"; }\n\n.fa-ship:before {\n content: \"\\f21a\"; }\n\n.fa-shipping-fast:before {\n content: \"\\f48b\"; }\n\n.fa-shirtsinbulk:before {\n content: \"\\f214\"; }\n\n.fa-shoe-prints:before {\n content: \"\\f54b\"; }\n\n.fa-shopify:before {\n content: \"\\e057\"; }\n\n.fa-shopping-bag:before {\n content: \"\\f290\"; }\n\n.fa-shopping-basket:before {\n content: \"\\f291\"; }\n\n.fa-shopping-cart:before {\n content: \"\\f07a\"; }\n\n.fa-shopware:before {\n content: \"\\f5b5\"; }\n\n.fa-shower:before {\n content: \"\\f2cc\"; }\n\n.fa-shuttle-van:before {\n content: \"\\f5b6\"; }\n\n.fa-sign:before {\n content: \"\\f4d9\"; }\n\n.fa-sign-in-alt:before {\n content: \"\\f2f6\"; }\n\n.fa-sign-language:before {\n content: \"\\f2a7\"; }\n\n.fa-sign-out-alt:before {\n content: \"\\f2f5\"; }\n\n.fa-signal:before {\n content: \"\\f012\"; }\n\n.fa-signature:before {\n content: \"\\f5b7\"; }\n\n.fa-sim-card:before {\n content: \"\\f7c4\"; }\n\n.fa-simplybuilt:before {\n content: \"\\f215\"; }\n\n.fa-sink:before {\n content: \"\\e06d\"; }\n\n.fa-sistrix:before {\n content: \"\\f3ee\"; }\n\n.fa-sitemap:before {\n content: \"\\f0e8\"; }\n\n.fa-sith:before {\n content: \"\\f512\"; }\n\n.fa-skating:before {\n content: \"\\f7c5\"; }\n\n.fa-sketch:before {\n content: \"\\f7c6\"; }\n\n.fa-skiing:before {\n content: \"\\f7c9\"; }\n\n.fa-skiing-nordic:before {\n content: \"\\f7ca\"; }\n\n.fa-skull:before {\n content: \"\\f54c\"; }\n\n.fa-skull-crossbones:before {\n content: \"\\f714\"; }\n\n.fa-skyatlas:before {\n content: \"\\f216\"; }\n\n.fa-skype:before {\n content: \"\\f17e\"; }\n\n.fa-slack:before {\n content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n content: \"\\f3ef\"; }\n\n.fa-slash:before {\n content: \"\\f715\"; }\n\n.fa-sleigh:before {\n content: \"\\f7cc\"; }\n\n.fa-sliders-h:before {\n content: \"\\f1de\"; }\n\n.fa-slideshare:before {\n content: \"\\f1e7\"; }\n\n.fa-smile:before {\n content: \"\\f118\"; }\n\n.fa-smile-beam:before {\n content: \"\\f5b8\"; }\n\n.fa-smile-wink:before {\n content: \"\\f4da\"; }\n\n.fa-smog:before {\n content: \"\\f75f\"; }\n\n.fa-smoking:before {\n content: \"\\f48d\"; }\n\n.fa-smoking-ban:before {\n content: \"\\f54d\"; }\n\n.fa-sms:before {\n content: \"\\f7cd\"; }\n\n.fa-snapchat:before {\n content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n content: \"\\f2ac\"; }\n\n.fa-snapchat-square:before {\n content: \"\\f2ad\"; }\n\n.fa-snowboarding:before {\n content: \"\\f7ce\"; }\n\n.fa-snowflake:before {\n content: \"\\f2dc\"; }\n\n.fa-snowman:before {\n content: \"\\f7d0\"; }\n\n.fa-snowplow:before {\n content: \"\\f7d2\"; }\n\n.fa-soap:before {\n content: \"\\e06e\"; }\n\n.fa-socks:before {\n content: \"\\f696\"; }\n\n.fa-solar-panel:before {\n content: \"\\f5ba\"; }\n\n.fa-sort:before {\n content: \"\\f0dc\"; }\n\n.fa-sort-alpha-down:before {\n content: \"\\f15d\"; }\n\n.fa-sort-alpha-down-alt:before {\n content: \"\\f881\"; }\n\n.fa-sort-alpha-up:before {\n content: \"\\f15e\"; }\n\n.fa-sort-alpha-up-alt:before {\n content: \"\\f882\"; }\n\n.fa-sort-amount-down:before {\n content: \"\\f160\"; }\n\n.fa-sort-amount-down-alt:before {\n content: \"\\f884\"; }\n\n.fa-sort-amount-up:before {\n content: \"\\f161\"; }\n\n.fa-sort-amount-up-alt:before {\n content: \"\\f885\"; }\n\n.fa-sort-down:before {\n content: \"\\f0dd\"; }\n\n.fa-sort-numeric-down:before {\n content: \"\\f162\"; }\n\n.fa-sort-numeric-down-alt:before {\n content: \"\\f886\"; }\n\n.fa-sort-numeric-up:before {\n content: \"\\f163\"; }\n\n.fa-sort-numeric-up-alt:before {\n content: \"\\f887\"; }\n\n.fa-sort-up:before {\n content: \"\\f0de\"; }\n\n.fa-soundcloud:before {\n content: \"\\f1be\"; }\n\n.fa-sourcetree:before {\n content: \"\\f7d3\"; }\n\n.fa-spa:before {\n content: \"\\f5bb\"; }\n\n.fa-space-shuttle:before {\n content: \"\\f197\"; }\n\n.fa-speakap:before {\n content: \"\\f3f3\"; }\n\n.fa-speaker-deck:before {\n content: \"\\f83c\"; }\n\n.fa-spell-check:before {\n content: \"\\f891\"; }\n\n.fa-spider:before {\n content: \"\\f717\"; }\n\n.fa-spinner:before {\n content: \"\\f110\"; }\n\n.fa-splotch:before {\n content: \"\\f5bc\"; }\n\n.fa-spotify:before {\n content: \"\\f1bc\"; }\n\n.fa-spray-can:before {\n content: \"\\f5bd\"; }\n\n.fa-square:before {\n content: \"\\f0c8\"; }\n\n.fa-square-full:before {\n content: \"\\f45c\"; }\n\n.fa-square-root-alt:before {\n content: \"\\f698\"; }\n\n.fa-squarespace:before {\n content: \"\\f5be\"; }\n\n.fa-stack-exchange:before {\n content: \"\\f18d\"; }\n\n.fa-stack-overflow:before {\n content: \"\\f16c\"; }\n\n.fa-stackpath:before {\n content: \"\\f842\"; }\n\n.fa-stamp:before {\n content: \"\\f5bf\"; }\n\n.fa-star:before {\n content: \"\\f005\"; }\n\n.fa-star-and-crescent:before {\n content: \"\\f699\"; }\n\n.fa-star-half:before {\n content: \"\\f089\"; }\n\n.fa-star-half-alt:before {\n content: \"\\f5c0\"; }\n\n.fa-star-of-david:before {\n content: \"\\f69a\"; }\n\n.fa-star-of-life:before {\n content: \"\\f621\"; }\n\n.fa-staylinked:before {\n content: \"\\f3f5\"; }\n\n.fa-steam:before {\n content: \"\\f1b6\"; }\n\n.fa-steam-square:before {\n content: \"\\f1b7\"; }\n\n.fa-steam-symbol:before {\n content: \"\\f3f6\"; }\n\n.fa-step-backward:before {\n content: \"\\f048\"; }\n\n.fa-step-forward:before {\n content: \"\\f051\"; }\n\n.fa-stethoscope:before {\n content: \"\\f0f1\"; }\n\n.fa-sticker-mule:before {\n content: \"\\f3f7\"; }\n\n.fa-sticky-note:before {\n content: \"\\f249\"; }\n\n.fa-stop:before {\n content: \"\\f04d\"; }\n\n.fa-stop-circle:before {\n content: \"\\f28d\"; }\n\n.fa-stopwatch:before {\n content: \"\\f2f2\"; }\n\n.fa-stopwatch-20:before {\n content: \"\\e06f\"; }\n\n.fa-store:before {\n content: \"\\f54e\"; }\n\n.fa-store-alt:before {\n content: \"\\f54f\"; }\n\n.fa-store-alt-slash:before {\n content: \"\\e070\"; }\n\n.fa-store-slash:before {\n content: \"\\e071\"; }\n\n.fa-strava:before {\n content: \"\\f428\"; }\n\n.fa-stream:before {\n content: \"\\f550\"; }\n\n.fa-street-view:before {\n content: \"\\f21d\"; }\n\n.fa-strikethrough:before {\n content: \"\\f0cc\"; }\n\n.fa-stripe:before {\n content: \"\\f429\"; }\n\n.fa-stripe-s:before {\n content: \"\\f42a\"; }\n\n.fa-stroopwafel:before {\n content: \"\\f551\"; }\n\n.fa-studiovinari:before {\n content: \"\\f3f8\"; }\n\n.fa-stumbleupon:before {\n content: \"\\f1a4\"; }\n\n.fa-stumbleupon-circle:before {\n content: \"\\f1a3\"; }\n\n.fa-subscript:before {\n content: \"\\f12c\"; }\n\n.fa-subway:before {\n content: \"\\f239\"; }\n\n.fa-suitcase:before {\n content: \"\\f0f2\"; }\n\n.fa-suitcase-rolling:before {\n content: \"\\f5c1\"; }\n\n.fa-sun:before {\n content: \"\\f185\"; }\n\n.fa-superpowers:before {\n content: \"\\f2dd\"; }\n\n.fa-superscript:before {\n content: \"\\f12b\"; }\n\n.fa-supple:before {\n content: \"\\f3f9\"; }\n\n.fa-surprise:before {\n content: \"\\f5c2\"; }\n\n.fa-suse:before {\n content: \"\\f7d6\"; }\n\n.fa-swatchbook:before {\n content: \"\\f5c3\"; }\n\n.fa-swift:before {\n content: \"\\f8e1\"; }\n\n.fa-swimmer:before {\n content: \"\\f5c4\"; }\n\n.fa-swimming-pool:before {\n content: \"\\f5c5\"; }\n\n.fa-symfony:before {\n content: \"\\f83d\"; }\n\n.fa-synagogue:before {\n content: \"\\f69b\"; }\n\n.fa-sync:before {\n content: \"\\f021\"; }\n\n.fa-sync-alt:before {\n content: \"\\f2f1\"; }\n\n.fa-syringe:before {\n content: \"\\f48e\"; }\n\n.fa-table:before {\n content: \"\\f0ce\"; }\n\n.fa-table-tennis:before {\n content: \"\\f45d\"; }\n\n.fa-tablet:before {\n content: \"\\f10a\"; }\n\n.fa-tablet-alt:before {\n content: \"\\f3fa\"; }\n\n.fa-tablets:before {\n content: \"\\f490\"; }\n\n.fa-tachometer-alt:before {\n content: \"\\f3fd\"; }\n\n.fa-tag:before {\n content: \"\\f02b\"; }\n\n.fa-tags:before {\n content: \"\\f02c\"; }\n\n.fa-tape:before {\n content: \"\\f4db\"; }\n\n.fa-tasks:before {\n content: \"\\f0ae\"; }\n\n.fa-taxi:before {\n content: \"\\f1ba\"; }\n\n.fa-teamspeak:before {\n content: \"\\f4f9\"; }\n\n.fa-teeth:before {\n content: \"\\f62e\"; }\n\n.fa-teeth-open:before {\n content: \"\\f62f\"; }\n\n.fa-telegram:before {\n content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n content: \"\\f3fe\"; }\n\n.fa-temperature-high:before {\n content: \"\\f769\"; }\n\n.fa-temperature-low:before {\n content: \"\\f76b\"; }\n\n.fa-tencent-weibo:before {\n content: \"\\f1d5\"; }\n\n.fa-tenge:before {\n content: \"\\f7d7\"; }\n\n.fa-terminal:before {\n content: \"\\f120\"; }\n\n.fa-text-height:before {\n content: \"\\f034\"; }\n\n.fa-text-width:before {\n content: \"\\f035\"; }\n\n.fa-th:before {\n content: \"\\f00a\"; }\n\n.fa-th-large:before {\n content: \"\\f009\"; }\n\n.fa-th-list:before {\n content: \"\\f00b\"; }\n\n.fa-the-red-yeti:before {\n content: \"\\f69d\"; }\n\n.fa-theater-masks:before {\n content: \"\\f630\"; }\n\n.fa-themeco:before {\n content: \"\\f5c6\"; }\n\n.fa-themeisle:before {\n content: \"\\f2b2\"; }\n\n.fa-thermometer:before {\n content: \"\\f491\"; }\n\n.fa-thermometer-empty:before {\n content: \"\\f2cb\"; }\n\n.fa-thermometer-full:before {\n content: \"\\f2c7\"; }\n\n.fa-thermometer-half:before {\n content: \"\\f2c9\"; }\n\n.fa-thermometer-quarter:before {\n content: \"\\f2ca\"; }\n\n.fa-thermometer-three-quarters:before {\n content: \"\\f2c8\"; }\n\n.fa-think-peaks:before {\n content: \"\\f731\"; }\n\n.fa-thumbs-down:before {\n content: \"\\f165\"; }\n\n.fa-thumbs-up:before {\n content: \"\\f164\"; }\n\n.fa-thumbtack:before {\n content: \"\\f08d\"; }\n\n.fa-ticket-alt:before {\n content: \"\\f3ff\"; }\n\n.fa-tiktok:before {\n content: \"\\e07b\"; }\n\n.fa-times:before {\n content: \"\\f00d\"; }\n\n.fa-times-circle:before {\n content: \"\\f057\"; }\n\n.fa-tint:before {\n content: \"\\f043\"; }\n\n.fa-tint-slash:before {\n content: \"\\f5c7\"; }\n\n.fa-tired:before {\n content: \"\\f5c8\"; }\n\n.fa-toggle-off:before {\n content: \"\\f204\"; }\n\n.fa-toggle-on:before {\n content: \"\\f205\"; }\n\n.fa-toilet:before {\n content: \"\\f7d8\"; }\n\n.fa-toilet-paper:before {\n content: \"\\f71e\"; }\n\n.fa-toilet-paper-slash:before {\n content: \"\\e072\"; }\n\n.fa-toolbox:before {\n content: \"\\f552\"; }\n\n.fa-tools:before {\n content: \"\\f7d9\"; }\n\n.fa-tooth:before {\n content: \"\\f5c9\"; }\n\n.fa-torah:before {\n content: \"\\f6a0\"; }\n\n.fa-torii-gate:before {\n content: \"\\f6a1\"; }\n\n.fa-tractor:before {\n content: \"\\f722\"; }\n\n.fa-trade-federation:before {\n content: \"\\f513\"; }\n\n.fa-trademark:before {\n content: \"\\f25c\"; }\n\n.fa-traffic-light:before {\n content: \"\\f637\"; }\n\n.fa-trailer:before {\n content: \"\\e041\"; }\n\n.fa-train:before {\n content: \"\\f238\"; }\n\n.fa-tram:before {\n content: \"\\f7da\"; }\n\n.fa-transgender:before {\n content: \"\\f224\"; }\n\n.fa-transgender-alt:before {\n content: \"\\f225\"; }\n\n.fa-trash:before {\n content: \"\\f1f8\"; }\n\n.fa-trash-alt:before {\n content: \"\\f2ed\"; }\n\n.fa-trash-restore:before {\n content: \"\\f829\"; }\n\n.fa-trash-restore-alt:before {\n content: \"\\f82a\"; }\n\n.fa-tree:before {\n content: \"\\f1bb\"; }\n\n.fa-trello:before {\n content: \"\\f181\"; }\n\n.fa-tripadvisor:before {\n content: \"\\f262\"; }\n\n.fa-trophy:before {\n content: \"\\f091\"; }\n\n.fa-truck:before {\n content: \"\\f0d1\"; }\n\n.fa-truck-loading:before {\n content: \"\\f4de\"; }\n\n.fa-truck-monster:before {\n content: \"\\f63b\"; }\n\n.fa-truck-moving:before {\n content: \"\\f4df\"; }\n\n.fa-truck-pickup:before {\n content: \"\\f63c\"; }\n\n.fa-tshirt:before {\n content: \"\\f553\"; }\n\n.fa-tty:before {\n content: \"\\f1e4\"; }\n\n.fa-tumblr:before {\n content: \"\\f173\"; }\n\n.fa-tumblr-square:before {\n content: \"\\f174\"; }\n\n.fa-tv:before {\n content: \"\\f26c\"; }\n\n.fa-twitch:before {\n content: \"\\f1e8\"; }\n\n.fa-twitter:before {\n content: \"\\f099\"; }\n\n.fa-twitter-square:before {\n content: \"\\f081\"; }\n\n.fa-typo3:before {\n content: \"\\f42b\"; }\n\n.fa-uber:before {\n content: \"\\f402\"; }\n\n.fa-ubuntu:before {\n content: \"\\f7df\"; }\n\n.fa-uikit:before {\n content: \"\\f403\"; }\n\n.fa-umbraco:before {\n content: \"\\f8e8\"; }\n\n.fa-umbrella:before {\n content: \"\\f0e9\"; }\n\n.fa-umbrella-beach:before {\n content: \"\\f5ca\"; }\n\n.fa-uncharted:before {\n content: \"\\e084\"; }\n\n.fa-underline:before {\n content: \"\\f0cd\"; }\n\n.fa-undo:before {\n content: \"\\f0e2\"; }\n\n.fa-undo-alt:before {\n content: \"\\f2ea\"; }\n\n.fa-uniregistry:before {\n content: \"\\f404\"; }\n\n.fa-unity:before {\n content: \"\\e049\"; }\n\n.fa-universal-access:before {\n content: \"\\f29a\"; }\n\n.fa-university:before {\n content: \"\\f19c\"; }\n\n.fa-unlink:before {\n content: \"\\f127\"; }\n\n.fa-unlock:before {\n content: \"\\f09c\"; }\n\n.fa-unlock-alt:before {\n content: \"\\f13e\"; }\n\n.fa-unsplash:before {\n content: \"\\e07c\"; }\n\n.fa-untappd:before {\n content: \"\\f405\"; }\n\n.fa-upload:before {\n content: \"\\f093\"; }\n\n.fa-ups:before {\n content: \"\\f7e0\"; }\n\n.fa-usb:before {\n content: \"\\f287\"; }\n\n.fa-user:before {\n content: \"\\f007\"; }\n\n.fa-user-alt:before {\n content: \"\\f406\"; }\n\n.fa-user-alt-slash:before {\n content: \"\\f4fa\"; }\n\n.fa-user-astronaut:before {\n content: \"\\f4fb\"; }\n\n.fa-user-check:before {\n content: \"\\f4fc\"; }\n\n.fa-user-circle:before {\n content: \"\\f2bd\"; }\n\n.fa-user-clock:before {\n content: \"\\f4fd\"; }\n\n.fa-user-cog:before {\n content: \"\\f4fe\"; }\n\n.fa-user-edit:before {\n content: \"\\f4ff\"; }\n\n.fa-user-friends:before {\n content: \"\\f500\"; }\n\n.fa-user-graduate:before {\n content: \"\\f501\"; }\n\n.fa-user-injured:before {\n content: \"\\f728\"; }\n\n.fa-user-lock:before {\n content: \"\\f502\"; }\n\n.fa-user-md:before {\n content: \"\\f0f0\"; }\n\n.fa-user-minus:before {\n content: \"\\f503\"; }\n\n.fa-user-ninja:before {\n content: \"\\f504\"; }\n\n.fa-user-nurse:before {\n content: \"\\f82f\"; }\n\n.fa-user-plus:before {\n content: \"\\f234\"; }\n\n.fa-user-secret:before {\n content: \"\\f21b\"; }\n\n.fa-user-shield:before {\n content: \"\\f505\"; }\n\n.fa-user-slash:before {\n content: \"\\f506\"; }\n\n.fa-user-tag:before {\n content: \"\\f507\"; }\n\n.fa-user-tie:before {\n content: \"\\f508\"; }\n\n.fa-user-times:before {\n content: \"\\f235\"; }\n\n.fa-users:before {\n content: \"\\f0c0\"; }\n\n.fa-users-cog:before {\n content: \"\\f509\"; }\n\n.fa-users-slash:before {\n content: \"\\e073\"; }\n\n.fa-usps:before {\n content: \"\\f7e1\"; }\n\n.fa-ussunnah:before {\n content: \"\\f407\"; }\n\n.fa-utensil-spoon:before {\n content: \"\\f2e5\"; }\n\n.fa-utensils:before {\n content: \"\\f2e7\"; }\n\n.fa-vaadin:before {\n content: \"\\f408\"; }\n\n.fa-vector-square:before {\n content: \"\\f5cb\"; }\n\n.fa-venus:before {\n content: \"\\f221\"; }\n\n.fa-venus-double:before {\n content: \"\\f226\"; }\n\n.fa-venus-mars:before {\n content: \"\\f228\"; }\n\n.fa-vest:before {\n content: \"\\e085\"; }\n\n.fa-vest-patches:before {\n content: \"\\e086\"; }\n\n.fa-viacoin:before {\n content: \"\\f237\"; }\n\n.fa-viadeo:before {\n content: \"\\f2a9\"; }\n\n.fa-viadeo-square:before {\n content: \"\\f2aa\"; }\n\n.fa-vial:before {\n content: \"\\f492\"; }\n\n.fa-vials:before {\n content: \"\\f493\"; }\n\n.fa-viber:before {\n content: \"\\f409\"; }\n\n.fa-video:before {\n content: \"\\f03d\"; }\n\n.fa-video-slash:before {\n content: \"\\f4e2\"; }\n\n.fa-vihara:before {\n content: \"\\f6a7\"; }\n\n.fa-vimeo:before {\n content: \"\\f40a\"; }\n\n.fa-vimeo-square:before {\n content: \"\\f194\"; }\n\n.fa-vimeo-v:before {\n content: \"\\f27d\"; }\n\n.fa-vine:before {\n content: \"\\f1ca\"; }\n\n.fa-virus:before {\n content: \"\\e074\"; }\n\n.fa-virus-slash:before {\n content: \"\\e075\"; }\n\n.fa-viruses:before {\n content: \"\\e076\"; }\n\n.fa-vk:before {\n content: \"\\f189\"; }\n\n.fa-vnv:before {\n content: \"\\f40b\"; }\n\n.fa-voicemail:before {\n content: \"\\f897\"; }\n\n.fa-volleyball-ball:before {\n content: \"\\f45f\"; }\n\n.fa-volume-down:before {\n content: \"\\f027\"; }\n\n.fa-volume-mute:before {\n content: \"\\f6a9\"; }\n\n.fa-volume-off:before {\n content: \"\\f026\"; }\n\n.fa-volume-up:before {\n content: \"\\f028\"; }\n\n.fa-vote-yea:before {\n content: \"\\f772\"; }\n\n.fa-vr-cardboard:before {\n content: \"\\f729\"; }\n\n.fa-vuejs:before {\n content: \"\\f41f\"; }\n\n.fa-walking:before {\n content: \"\\f554\"; }\n\n.fa-wallet:before {\n content: \"\\f555\"; }\n\n.fa-warehouse:before {\n content: \"\\f494\"; }\n\n.fa-watchman-monitoring:before {\n content: \"\\e087\"; }\n\n.fa-water:before {\n content: \"\\f773\"; }\n\n.fa-wave-square:before {\n content: \"\\f83e\"; }\n\n.fa-waze:before {\n content: \"\\f83f\"; }\n\n.fa-weebly:before {\n content: \"\\f5cc\"; }\n\n.fa-weibo:before {\n content: \"\\f18a\"; }\n\n.fa-weight:before {\n content: \"\\f496\"; }\n\n.fa-weight-hanging:before {\n content: \"\\f5cd\"; }\n\n.fa-weixin:before {\n content: \"\\f1d7\"; }\n\n.fa-whatsapp:before {\n content: \"\\f232\"; }\n\n.fa-whatsapp-square:before {\n content: \"\\f40c\"; }\n\n.fa-wheelchair:before {\n content: \"\\f193\"; }\n\n.fa-whmcs:before {\n content: \"\\f40d\"; }\n\n.fa-wifi:before {\n content: \"\\f1eb\"; }\n\n.fa-wikipedia-w:before {\n content: \"\\f266\"; }\n\n.fa-wind:before {\n content: \"\\f72e\"; }\n\n.fa-window-close:before {\n content: \"\\f410\"; }\n\n.fa-window-maximize:before {\n content: \"\\f2d0\"; }\n\n.fa-window-minimize:before {\n content: \"\\f2d1\"; }\n\n.fa-window-restore:before {\n content: \"\\f2d2\"; }\n\n.fa-windows:before {\n content: \"\\f17a\"; }\n\n.fa-wine-bottle:before {\n content: \"\\f72f\"; }\n\n.fa-wine-glass:before {\n content: \"\\f4e3\"; }\n\n.fa-wine-glass-alt:before {\n content: \"\\f5ce\"; }\n\n.fa-wix:before {\n content: \"\\f5cf\"; }\n\n.fa-wizards-of-the-coast:before {\n content: \"\\f730\"; }\n\n.fa-wodu:before {\n content: \"\\e088\"; }\n\n.fa-wolf-pack-battalion:before {\n content: \"\\f514\"; }\n\n.fa-won-sign:before {\n content: \"\\f159\"; }\n\n.fa-wordpress:before {\n content: \"\\f19a\"; }\n\n.fa-wordpress-simple:before {\n content: \"\\f411\"; }\n\n.fa-wpbeginner:before {\n content: \"\\f297\"; }\n\n.fa-wpexplorer:before {\n content: \"\\f2de\"; }\n\n.fa-wpforms:before {\n content: \"\\f298\"; }\n\n.fa-wpressr:before {\n content: \"\\f3e4\"; }\n\n.fa-wrench:before {\n content: \"\\f0ad\"; }\n\n.fa-x-ray:before {\n content: \"\\f497\"; }\n\n.fa-xbox:before {\n content: \"\\f412\"; }\n\n.fa-xing:before {\n content: \"\\f168\"; }\n\n.fa-xing-square:before {\n content: \"\\f169\"; }\n\n.fa-y-combinator:before {\n content: \"\\f23b\"; }\n\n.fa-yahoo:before {\n content: \"\\f19e\"; }\n\n.fa-yammer:before {\n content: \"\\f840\"; }\n\n.fa-yandex:before {\n content: \"\\f413\"; }\n\n.fa-yandex-international:before {\n content: \"\\f414\"; }\n\n.fa-yarn:before {\n content: \"\\f7e3\"; }\n\n.fa-yelp:before {\n content: \"\\f1e9\"; }\n\n.fa-yen-sign:before {\n content: \"\\f157\"; }\n\n.fa-yin-yang:before {\n content: \"\\f6ad\"; }\n\n.fa-yoast:before {\n content: \"\\f2b1\"; }\n\n.fa-youtube:before {\n content: \"\\f167\"; }\n\n.fa-youtube-square:before {\n content: \"\\f431\"; }\n\n.fa-zhihu:before {\n content: \"\\f63f\"; }\n\n.sr-only {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto; }\n@font-face {\n font-family: 'Font Awesome 5 Brands';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(\"../webfonts/fa-brands-400.eot\");\n src: url(\"../webfonts/fa-brands-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.woff\") format(\"woff\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-brands-400.svg#fontawesome\") format(\"svg\"); }\n\n.fab {\n font-family: 'Font Awesome 5 Brands';\n font-weight: 400; }\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(\"../webfonts/fa-regular-400.eot\");\n src: url(\"../webfonts/fa-regular-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.woff\") format(\"woff\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-regular-400.svg#fontawesome\") format(\"svg\"); }\n\n.far {\n font-family: 'Font Awesome 5 Free';\n font-weight: 400; }\n@font-face {\n font-family: 'Font Awesome 5 Free';\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url(\"../webfonts/fa-solid-900.eot\");\n src: url(\"../webfonts/fa-solid-900.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.woff\") format(\"woff\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"), url(\"../webfonts/fa-solid-900.svg#fontawesome\") format(\"svg\"); }\n\n.fa,\n.fas {\n font-family: 'Font Awesome 5 Free';\n font-weight: 900; }\n","/*!\r\n * OverlayScrollbars\r\n * https://github.com/KingSora/OverlayScrollbars\r\n *\r\n * Version: 1.13.0\r\n *\r\n * Copyright KingSora | Rene Haas.\r\n * https://github.com/KingSora\r\n *\r\n * Released under the MIT license.\r\n * Date: 02.08.2020\r\n */\r\n\r\n/*\r\nOVERLAY SCROLLBARS CORE:\r\n*/\r\n\r\nhtml.os-html,\r\nhtml.os-html > .os-host {\r\n display: block;\r\n overflow: hidden;\r\n box-sizing: border-box;\r\n height: 100% !important;\r\n width: 100% !important;\r\n min-width: 100% !important;\r\n min-height: 100% !important;\r\n margin: 0 !important;\r\n position: absolute !important; /* could be position: fixed; but it causes issues on iOS (-webkit-overflow-scrolling: touch) */\r\n}\r\nhtml.os-html > .os-host > .os-padding {\r\n position: absolute; /* could be position: fixed; but it causes issues on iOS (-webkit-overflow-scrolling: touch) */\r\n}\r\nbody.os-dragging,\r\nbody.os-dragging * {\r\n cursor: default;\r\n}\r\n.os-host,\r\n.os-host-textarea {\r\n position: relative;\r\n overflow: visible !important;\r\n -webkit-box-orient: vertical;\r\n -webkit-box-direction: normal;\r\n -ms-flex-direction: column;\r\n flex-direction: column;\r\n -ms-flex-wrap: nowrap;\r\n flex-wrap: nowrap;\r\n -webkit-box-pack: start;\r\n -ms-flex-pack: start;\r\n justify-content: flex-start;\r\n -ms-flex-line-pack: start;\r\n align-content: flex-start;\r\n -webkit-box-align: start;\r\n -ms-flex-align: start;\r\n -ms-grid-row-align: flex-start;\r\n align-items: flex-start;\r\n}\r\n.os-host-flexbox {\r\n overflow: hidden !important;\r\n display: -webkit-box;\r\n display: -ms-flexbox;\r\n display: flex;\r\n}\r\n.os-host-flexbox > .os-size-auto-observer {\r\n height: inherit !important;\r\n}\r\n.os-host-flexbox > .os-content-glue {\r\n -webkit-box-flex: 1;\r\n -ms-flex-positive: 1;\r\n flex-grow: 1;\r\n -ms-flex-negative: 0;\r\n flex-shrink: 0;\r\n}\r\n.os-host-flexbox > .os-size-auto-observer,\r\n.os-host-flexbox > .os-content-glue {\r\n min-height: 0;\r\n min-width: 0;\r\n -webkit-box-flex: 0;\r\n -ms-flex-positive: 0;\r\n flex-grow: 0;\r\n -ms-flex-negative: 1;\r\n flex-shrink: 1;\r\n -ms-flex-preferred-size: auto;\r\n flex-basis: auto;\r\n}\r\n#os-dummy-scrollbar-size {\r\n position: fixed;\r\n opacity: 0;\r\n -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';\r\n visibility: hidden;\r\n overflow: scroll;\r\n height: 500px;\r\n width: 500px;\r\n}\r\n#os-dummy-scrollbar-size > div {\r\n width: 200%;\r\n height: 200%; \r\n margin: 10px 0;\r\n}\r\n/* fix restricted measuring */\r\n#os-dummy-scrollbar-size:before,\r\n#os-dummy-scrollbar-size:after,\r\n.os-content:before,\r\n.os-content:after {\r\n content: '';\r\n display: table;\r\n width: 0.01px;\r\n height: 0.01px;\r\n line-height: 0;\r\n font-size: 0;\r\n flex-grow: 0;\r\n flex-shrink: 0;\r\n visibility: hidden;\r\n}\r\n#os-dummy-scrollbar-size,\r\n.os-viewport {\r\n -ms-overflow-style: scrollbar !important;\r\n}\r\n.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size,\r\n.os-viewport-native-scrollbars-invisible.os-viewport {\r\n scrollbar-width: none !important;\r\n}\r\n.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size::-webkit-scrollbar,\r\n.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar,\r\n.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size::-webkit-scrollbar-corner,\r\n.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar-corner {\r\n display: none !important;\r\n width: 0px !important;\r\n height: 0px !important;\r\n visibility: hidden !important;\r\n background: transparent !important;\r\n}\r\n.os-content-glue {\r\n box-sizing: inherit;\r\n max-height: 100%;\r\n max-width: 100%;\r\n width: 100%;\r\n pointer-events: none;\r\n}\r\n.os-padding {\r\n box-sizing: inherit;\r\n direction: inherit;\r\n position: absolute;\r\n overflow: visible;\r\n padding: 0;\r\n margin: 0;\r\n left: 0;\r\n top: 0;\r\n bottom: 0;\r\n right: 0;\r\n width: auto !important;\r\n height: auto !important;\r\n\tz-index: 0;\r\n}\r\n.os-host-overflow > .os-padding {\r\n overflow: hidden;\r\n}\r\n.os-viewport {\r\n direction: inherit !important;\r\n box-sizing: inherit !important;\r\n resize: none !important;\r\n outline: none !important;\r\n position: absolute;\r\n overflow: hidden;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n padding: 0;\r\n margin: 0;\r\n -webkit-overflow-scrolling: touch;\r\n}\r\n.os-content-arrange {\r\n position: absolute;\r\n z-index: -1;\r\n min-height: 1px;\r\n min-width: 1px;\r\n pointer-events: none;\r\n}\r\n.os-content {\r\n direction: inherit;\r\n box-sizing: border-box !important;\r\n position: relative;\r\n display: block;\r\n height: 100%;\r\n width: 100%;\r\n height: 100%;\r\n width: 100%;\r\n visibility: visible;\r\n}\r\n.os-content > .os-textarea {\r\n box-sizing: border-box !important;\r\n direction: inherit !important;\r\n background: transparent !important;\r\n outline: 0px none transparent !important;\r\n overflow: hidden !important;\r\n position: absolute !important;\r\n display: block !important;\r\n top: 0 !important;\r\n left: 0 !important;\r\n margin: 0 !important;\r\n border-radius: 0px !important;\r\n float: none !important;\r\n -webkit-filter: none !important;\r\n filter: none !important;\r\n border: none !important;\r\n resize: none !important;\r\n -webkit-transform: none !important;\r\n transform: none !important;\r\n max-width: none !important;\r\n max-height: none !important;\r\n box-shadow: none !important;\r\n -webkit-perspective: none !important;\r\n perspective: none !important;\r\n opacity: 1 !important;\r\n z-index: 1 !important;\r\n clip: auto !important;\r\n vertical-align: baseline !important;\r\n padding: 0px;\r\n}\r\n.os-host-rtl > .os-padding > .os-viewport > .os-content > .os-textarea {\r\n right: 0 !important;\r\n}\r\n.os-content > .os-textarea-cover {\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n.os-content > .os-textarea[wrap='off'] {\r\n white-space: pre !important;\r\n margin: 0px !important;\r\n}\r\n.os-text-inherit {\r\n font-family: inherit;\r\n font-size: inherit;\r\n font-weight: inherit;\r\n font-style: inherit;\r\n font-variant: inherit;\r\n text-transform: inherit;\r\n text-decoration: inherit;\r\n text-indent: inherit;\r\n text-align: inherit;\r\n text-shadow: inherit;\r\n text-overflow: inherit;\r\n letter-spacing: inherit;\r\n word-spacing: inherit;\r\n line-height: inherit;\r\n unicode-bidi: inherit;\r\n direction: inherit;\r\n color: inherit;\r\n cursor: text;\r\n}\r\n.os-resize-observer,\r\n.os-resize-observer-host {\r\n box-sizing: inherit;\r\n display: block;\r\n visibility: hidden;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n pointer-events: none;\r\n z-index: -1;\r\n}\r\n.os-resize-observer-host {\r\n padding: inherit;\r\n border: inherit;\r\n border-color: transparent;\r\n border-style: solid;\r\n box-sizing: border-box;\r\n}\r\n.os-resize-observer-host.observed {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-start;\r\n align-items: flex-start;\r\n}\r\n.os-resize-observer-host > .os-resize-observer,\r\n.os-resize-observer-host.observed > .os-resize-observer {\r\n height: 200%;\r\n width: 200%;\r\n padding: inherit;\r\n border: inherit;\r\n margin: 0;\r\n display: block;\r\n box-sizing: content-box;\r\n}\r\n.os-resize-observer-host.observed > .os-resize-observer,\r\n.os-resize-observer-host.observed > .os-resize-observer:before {\r\n display: flex;\r\n position: relative;\r\n flex-grow: 1;\r\n flex-shrink: 0;\r\n flex-basis: auto;\r\n box-sizing: border-box;\r\n}\r\n.os-resize-observer-host.observed > .os-resize-observer:before {\r\n content: '';\r\n box-sizing: content-box;\r\n padding: inherit;\r\n border: inherit;\r\n margin: 0;\r\n}\r\n.os-size-auto-observer {\r\n box-sizing: inherit !important;\r\n height: 100%;\r\n width: inherit;\r\n max-width: 1px;\r\n position: relative;\r\n float: left;\r\n max-height: 1px;\r\n overflow: hidden;\r\n z-index: -1;\r\n padding: 0;\r\n margin: 0;\r\n pointer-events: none;\r\n -webkit-box-flex: inherit;\r\n -ms-flex-positive: inherit;\r\n flex-grow: inherit;\r\n -ms-flex-negative: 0;\r\n flex-shrink: 0;\r\n -ms-flex-preferred-size: 0;\r\n flex-basis: 0;\r\n}\r\n.os-size-auto-observer > .os-resize-observer {\r\n width: 1000%;\r\n height: 1000%;\r\n min-height: 1px;\r\n min-width: 1px;\r\n}\r\n.os-resize-observer-item {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n overflow: hidden;\r\n z-index: -1;\r\n opacity: 0;\r\n direction: ltr !important;\r\n -webkit-box-flex: 0 !important;\r\n -ms-flex: none !important;\r\n flex: none !important;\r\n}\r\n.os-resize-observer-item-final {\r\n position: absolute;\r\n left: 0;\r\n top: 0;\r\n -webkit-transition: none !important;\r\n transition: none !important;\r\n -webkit-box-flex: 0 !important;\r\n -ms-flex: none !important;\r\n flex: none !important;\r\n}\r\n.os-resize-observer {\r\n -webkit-animation-duration: 0.001s;\r\n animation-duration: 0.001s;\r\n -webkit-animation-name: os-resize-observer-dummy-animation;\r\n animation-name: os-resize-observer-dummy-animation;\r\n}\r\nobject.os-resize-observer {\r\n box-sizing: border-box !important;\r\n}\r\n@-webkit-keyframes os-resize-observer-dummy-animation {\r\n from {\r\n z-index: 0;\r\n }\r\n to {\r\n z-index: -1;\r\n }\r\n}\r\n@keyframes os-resize-observer-dummy-animation {\r\n from {\r\n z-index: 0;\r\n }\r\n to {\r\n z-index: -1;\r\n }\r\n}\r\n\r\n/*\r\nCUSTOM SCROLLBARS AND CORNER CORE:\r\n*/\r\n\r\n.os-host-transition > .os-scrollbar,\r\n.os-host-transition > .os-scrollbar-corner {\r\n -webkit-transition: opacity 0.3s, visibility 0.3s, top 0.3s, right 0.3s, bottom 0.3s, left 0.3s;\r\n transition: opacity 0.3s, visibility 0.3s, top 0.3s, right 0.3s, bottom 0.3s, left 0.3s;\r\n}\r\nhtml.os-html > .os-host > .os-scrollbar {\r\n position: absolute; /* could be position: fixed; but it causes issues on iOS (-webkit-overflow-scrolling: touch) */\r\n z-index: 999999; /* highest z-index of the page */\r\n}\r\n.os-scrollbar,\r\n.os-scrollbar-corner {\r\n position: absolute;\r\n opacity: 1;\r\n -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';\r\n z-index: 1;\r\n}\r\n.os-scrollbar-corner {\r\n bottom: 0;\r\n right: 0;\r\n}\r\n.os-scrollbar {\r\n pointer-events: none;\r\n}\r\n.os-scrollbar-track {\r\n pointer-events: auto;\r\n position: relative;\r\n height: 100%;\r\n width: 100%;\r\n padding: 0 !important;\r\n border: none !important;\r\n}\r\n.os-scrollbar-handle {\r\n pointer-events: auto;\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n.os-scrollbar-handle-off,\r\n.os-scrollbar-track-off {\r\n pointer-events: none;\r\n}\r\n.os-scrollbar.os-scrollbar-unusable,\r\n.os-scrollbar.os-scrollbar-unusable * {\r\n pointer-events: none !important;\r\n}\r\n.os-scrollbar.os-scrollbar-unusable .os-scrollbar-handle {\r\n opacity: 0 !important;\r\n}\r\n.os-scrollbar-horizontal {\r\n bottom: 0;\r\n left: 0;\r\n}\r\n.os-scrollbar-vertical {\r\n top: 0;\r\n right: 0;\r\n}\r\n.os-host-rtl > .os-scrollbar-horizontal {\r\n right: 0;\r\n}\r\n.os-host-rtl > .os-scrollbar-vertical {\r\n right: auto;\r\n left: 0;\r\n}\r\n.os-host-rtl > .os-scrollbar-corner {\r\n right: auto;\r\n left: 0;\r\n}\r\n.os-scrollbar-auto-hidden,\r\n.os-padding + .os-scrollbar-corner,\r\n.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden > .os-scrollbar-corner,\r\n.os-host-scrollbar-horizontal-hidden > .os-scrollbar-horizontal,\r\n.os-host-resize-disabled.os-host-scrollbar-vertical-hidden > .os-scrollbar-corner,\r\n.os-host-scrollbar-vertical-hidden > .os-scrollbar-vertical,\r\n.os-scrollbar-horizontal.os-scrollbar-auto-hidden + .os-scrollbar-vertical + .os-scrollbar-corner,\r\n.os-scrollbar-horizontal + .os-scrollbar-vertical.os-scrollbar-auto-hidden + .os-scrollbar-corner,\r\n.os-scrollbar-horizontal.os-scrollbar-auto-hidden + .os-scrollbar-vertical.os-scrollbar-auto-hidden + .os-scrollbar-corner {\r\n opacity: 0;\r\n visibility: hidden;\r\n pointer-events: none;\r\n}\r\n.os-scrollbar-corner-resize-both {\r\n cursor: nwse-resize;\r\n}\r\n.os-host-rtl > .os-scrollbar-corner-resize-both {\r\n cursor: nesw-resize;\r\n}\r\n.os-scrollbar-corner-resize-horizontal {\r\n cursor: ew-resize;\r\n}\r\n.os-scrollbar-corner-resize-vertical {\r\n cursor: ns-resize;\r\n}\r\n.os-dragging .os-scrollbar-corner.os-scrollbar-corner-resize {\r\n cursor: default;\r\n}\r\n.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden > .os-scrollbar-vertical {\r\n top: 0;\r\n bottom: 0;\r\n}\r\n.os-host-resize-disabled.os-host-scrollbar-vertical-hidden > .os-scrollbar-horizontal,\r\n.os-host-rtl.os-host-resize-disabled.os-host-scrollbar-vertical-hidden > .os-scrollbar-horizontal {\r\n right: 0;\r\n left: 0;\r\n}\r\n.os-scrollbar:hover,\r\n.os-scrollbar-corner.os-scrollbar-corner-resize {\r\n opacity: 1 !important;\r\n visibility: visible !important;\r\n}\r\n.os-scrollbar-corner.os-scrollbar-corner-resize {\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB3aWR0aD0iMTAiICAgaGVpZ2h0PSIxMCIgICB2ZXJzaW9uPSIxLjEiPiAgPGcgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEwNDIuMzYyMikiICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQ5NDExNzY1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDcuNDI0MjE4NywxMDQyLjM2MjIgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjYgLTEuMzEwMTU2MiwxLjMxMDIgMCwwLjI5OSAwLjEwNDM0MTksMC41NzEgMC4yNzI5NDkyLDAuNzkxNSAwLjIwOTEwMjQsMC4xNDEzIDAuNDY1NjIwNiwwLjIxODQgMC43MzY5NjI5LDAuMjE4NCAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NiAxLjMxMDE1NjMsLTEuMzEwMiAwLC0wLjI3MTMgLTAuMDc3MDkzLC0wLjUyNzggLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0MSwtMC4xNjg2IC0wLjQ5MjU0NDMsLTAuMjcyOSAtMC43OTE1NTI4LC0wLjI3MjkgeiBtIDAsMy4wODQzIGMgLTAuNzIzNTc5MiwwIC0xLjMxMDE1NjIsMC41ODY2IC0xLjMxMDE1NjIsMS4zMTAyIDAsMC4yOTkgMC4xMDQzNDE5LDAuNTcxIDAuMjcyOTQ5MiwwLjc5MTUgMC4yMDkxMDI0LDAuMTQxMyAwLjQ2NTYyMDYsMC4yMTg0IDAuNzM2OTYyOSwwLjIxODQgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjYgMS4zMTAxNTYzLC0xLjMxMDIgMCwtMC4yNzEzIC0wLjA3NzA5MywtMC41Mjc4IC0wLjIxODM1OTQsLTAuNzM2OSAtMC4yMjA0OTQxLC0wLjE2ODYgLTAuNDkyNTQ0MywtMC4yNzMgLTAuNzkxNTUyOCwtMC4yNzMgeiBtIC0zLjA4NDMyNjEsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NiAtMS4zMTAxNTYzLDEuMzEwMiAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MSAwLjI3Mjk0OTIsMC43OTE1IDAuMjA5MTAyNCwwLjE0MTMgMC40NjU2MjA3LDAuMjE4NCAwLjczNjk2MjksMC4yMTg0IDAuNzIzNTc5MywwIDEuMzEwMTU2MywtMC41ODY2IDEuMzEwMTU2MywtMS4zMTAyIDAsLTAuMjcxMyAtMC4wNzcwOTMsLTAuNTI3OCAtMC4yMTgzNTk0LC0wLjczNjkgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzMgLTAuNzkxNTUyNywtMC4yNzMgeiBtIC0zLjAyOTczNjQsMy4wMjk4IEMgMC41ODY1NzY5MywxMDQ4LjQ3NjMgMCwxMDQ5LjA2MjggMCwxMDQ5Ljc4NjQgYyAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyMiwwLjc5MTYgMC4yMDkxMDIyOSwwLjE0MTIgMC40NjU2MjA2NSwwLjIxODMgMC43MzY5NjI4OCwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHogbSAzLjAyOTczNjQsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NSAtMS4zMTAxNTYzLDEuMzEwMSAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyLDAuNzkxNiAwLjIwOTEwMjQsMC4xNDEyIDAuNDY1NjIwNywwLjIxODMgMC43MzY5NjI5LDAuMjE4MyAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NSAxLjMxMDE1NjMsLTEuMzEwMSAwLC0wLjI3MTQgLTAuMDc3MDkzLC0wLjUyNzkgLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzI5IC0wLjc5MTU1MjcsLTAuMjcyOSB6IG0gMy4wODQzMjYxLDAgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjUgLTEuMzEwMTU2MiwxLjMxMDEgMCwwLjI5OSAwLjEwNDM0MTksMC41NzExIDAuMjcyOTQ5MiwwLjc5MTYgMC4yMDkxMDI0LDAuMTQxMiAwLjQ2NTYyMDYsMC4yMTgzIDAuNzM2OTYyOSwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHoiLz4gIDwvZz4gIDxnICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDguMjE1NzcxNSwwLjI3Mjk0OTIyIGMgMC4xNDEyNjY3LDAuMjA5MTAyMjkgMC4yMTgzNTk0LDAuNDY1NjIwNjUgMC4yMTgzNTk0LDAuNzM2OTYyODggMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDc2IC0wLjIwNTUxNzYsLTAuNzk3Nzk2NTkgLTAuNTE4NjAzNSwtMS4wMzcyMDY5OCB6IG0gMCwzLjA4NDMyNjE4IGMgMC4xNDEyNjY3LDAuMjA5MTAyMyAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MiAtMS4zMTAxNTYzLDEuMzEwMTU2MiAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTkzIDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAtMy4wODQzMjYyLDAgYyAwLjE0MTI2NjcsMC4yMDkxMDIzIDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYyIC0xLjMxMDE1NjMsMS4zMTAxNTYyIC0wLjI3MTM0MjIsMCAtMC41Mjc4NjA1LC0wLjA3NzA5MyAtMC43MzY5NjI5LC0wLjIxODM1OTMgMC4yMzk0MTA0LDAuMzEzMDg1OSAwLjYxMjYzNjMsMC41MTg2MDM1IDEuMDM3MjA3MSwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYyLC0wLjU4NjU3NyAxLjMxMDE1NjIsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NSwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogTSAyLjEwMTcwOSw2LjM4NzAxMTcgYyAwLjE0MTI2NjcsMC4yMDkxMDI0IDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYzIC0xLjMxMDE1NjMsMS4zMTAxNTYzIC0wLjI3MTM0MjIzLDAgLTAuNTI3ODYwNTksLTAuMDc3MDkzIC0wLjczNjk2Mjg4LC0wLjIxODM1OTQgMC4yMzk0MTAzOSwwLjMxMzA4NTkgMC42MTI2MzYyMiwwLjUxODYwMzUgMS4wMzcyMDY5OCwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAzLjAyOTczNjMsMCBjIDAuMTQxMjY2NywwLjIwOTEwMjQgMC4yMTgzNTk0LDAuNDY1NjIwNiAwLjIxODM1OTQsMC43MzY5NjI5IDAsMC43MjM1NzkzIC0wLjU4NjU3NywxLjMxMDE1NjMgLTEuMzEwMTU2MywxLjMxMDE1NjMgLTAuMjcxMzQyMiwwIC0wLjUyNzg2MDUsLTAuMDc3MDkzIC0wLjczNjk2MjksLTAuMjE4MzU5NCAwLjIzOTQxMDQsMC4zMTMwODU5IDAuNjEyNjM2MywwLjUxODYwMzUgMS4wMzcyMDcxLDAuNTE4NjAzNSAwLjcyMzU3OTMsMCAxLjMxMDE1NjIsLTAuNTg2NTc3IDEuMzEwMTU2MiwtMS4zMTAxNTYzIDAsLTAuNDI0NTcwOCAtMC4yMDU1MTc1LC0wLjc5Nzc5NjYgLTAuNTE4NjAzNSwtMS4wMzcyMDcgeiBtIDMuMDg0MzI2MiwwIGMgMC4xNDEyNjY3LDAuMjA5MTAyNCAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHoiIC8+ICA8L2c+PC9zdmc+);\r\n background-repeat: no-repeat;\r\n background-position: 100% 100%;\r\n pointer-events: auto !important;\r\n}\r\n.os-host-rtl > .os-scrollbar-corner.os-scrollbar-corner-resize {\r\n -webkit-transform: scale(-1, 1);\r\n transform: scale(-1, 1);\r\n}\r\n.os-host-overflow {\r\n overflow: hidden !important;\r\n}\r\n.os-host-overflow-x {\r\n} \r\n.os-host-overflow-y {\r\n} \r\n\r\n/*\r\nTHEMES:\r\n*/\r\n\r\n/* NONE THEME: */\r\n.os-theme-none > .os-scrollbar-horizontal,\r\n.os-theme-none > .os-scrollbar-vertical,\r\n.os-theme-none > .os-scrollbar-corner {\r\n display: none !important;\r\n}\r\n.os-theme-none > .os-scrollbar-corner-resize {\r\n display: block !important;\r\n min-width: 10px;\r\n min-height: 10px;\r\n}\r\n/* DARK & LIGHT THEME: */\r\n.os-theme-dark > .os-scrollbar-horizontal,\r\n.os-theme-light > .os-scrollbar-horizontal {\r\n right: 10px;\r\n height: 10px;\r\n}\r\n.os-theme-dark > .os-scrollbar-vertical,\r\n.os-theme-light > .os-scrollbar-vertical {\r\n bottom: 10px;\r\n width: 10px;\r\n}\r\n.os-theme-dark.os-host-rtl > .os-scrollbar-horizontal,\r\n.os-theme-light.os-host-rtl > .os-scrollbar-horizontal {\r\n left: 10px;\r\n right: 0;\r\n}\r\n.os-theme-dark > .os-scrollbar-corner,\r\n.os-theme-light > .os-scrollbar-corner {\r\n height: 10px;\r\n width: 10px;\r\n}\r\n.os-theme-dark > .os-scrollbar-corner,\r\n.os-theme-light > .os-scrollbar-corner {\r\n background-color: transparent;\r\n}\r\n.os-theme-dark > .os-scrollbar,\r\n.os-theme-light > .os-scrollbar {\r\n padding: 2px;\r\n box-sizing: border-box;\r\n background: transparent;\r\n}\r\n.os-theme-dark > .os-scrollbar.os-scrollbar-unusable,\r\n.os-theme-light > .os-scrollbar.os-scrollbar-unusable {\r\n background: transparent;\r\n}\r\n.os-theme-dark > .os-scrollbar > .os-scrollbar-track,\r\n.os-theme-light > .os-scrollbar > .os-scrollbar-track {\r\n background: transparent;\r\n}\r\n.os-theme-dark > .os-scrollbar-horizontal > .os-scrollbar-track > .os-scrollbar-handle,\r\n.os-theme-light > .os-scrollbar-horizontal > .os-scrollbar-track > .os-scrollbar-handle {\r\n min-width: 30px;\r\n}\r\n.os-theme-dark > .os-scrollbar-vertical > .os-scrollbar-track > .os-scrollbar-handle,\r\n.os-theme-light > .os-scrollbar-vertical > .os-scrollbar-track > .os-scrollbar-handle {\r\n min-height: 30px;\r\n}\r\n.os-theme-dark.os-host-transition > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle,\r\n.os-theme-light.os-host-transition > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {\r\n -webkit-transition: background-color 0.3s;\r\n transition: background-color 0.3s;\r\n}\r\n.os-theme-dark > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle,\r\n.os-theme-light > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle,\r\n.os-theme-dark > .os-scrollbar > .os-scrollbar-track,\r\n.os-theme-light > .os-scrollbar > .os-scrollbar-track {\r\n border-radius: 10px;\r\n}\r\n.os-theme-dark > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {\r\n background: rgba(0, 0, 0, 0.4);\r\n}\r\n.os-theme-light > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {\r\n background: rgba(255, 255, 255, 0.4);\r\n}\r\n.os-theme-dark > .os-scrollbar:hover > .os-scrollbar-track > .os-scrollbar-handle {\r\n background: rgba(0, 0, 0, .55);\r\n}\r\n.os-theme-light > .os-scrollbar:hover > .os-scrollbar-track > .os-scrollbar-handle {\r\n background: rgba(255, 255, 255, .55);\r\n}\r\n.os-theme-dark > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle.active {\r\n background: rgba(0, 0, 0, .7);\r\n}\r\n.os-theme-light > .os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle.active {\r\n background: rgba(255, 255, 255, .7);\r\n}\r\n.os-theme-dark > .os-scrollbar-horizontal .os-scrollbar-handle:before,\r\n.os-theme-dark > .os-scrollbar-vertical .os-scrollbar-handle:before,\r\n.os-theme-light > .os-scrollbar-horizontal .os-scrollbar-handle:before,\r\n.os-theme-light > .os-scrollbar-vertical .os-scrollbar-handle:before {\r\n content: '';\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n display: block;\r\n}\r\n.os-theme-dark.os-host-scrollbar-horizontal-hidden > .os-scrollbar-horizontal .os-scrollbar-handle:before,\r\n.os-theme-dark.os-host-scrollbar-vertical-hidden > .os-scrollbar-vertical .os-scrollbar-handle:before,\r\n.os-theme-light.os-host-scrollbar-horizontal-hidden > .os-scrollbar-horizontal .os-scrollbar-handle:before,\r\n.os-theme-light.os-host-scrollbar-vertical-hidden > .os-scrollbar-vertical .os-scrollbar-handle:before {\r\n display: none;\r\n}\r\n.os-theme-dark > .os-scrollbar-horizontal .os-scrollbar-handle:before,\r\n.os-theme-light > .os-scrollbar-horizontal .os-scrollbar-handle:before {\r\n top: -6px;\r\n bottom: -2px;\r\n}\r\n.os-theme-dark > .os-scrollbar-vertical .os-scrollbar-handle:before,\r\n.os-theme-light > .os-scrollbar-vertical .os-scrollbar-handle:before {\r\n left: -6px;\r\n right: -2px;\r\n}\r\n.os-host-rtl.os-theme-dark > .os-scrollbar-vertical .os-scrollbar-handle:before,\r\n.os-host-rtl.os-theme-light > .os-scrollbar-vertical .os-scrollbar-handle:before {\r\n right: -6px;\r\n left: -2px;\r\n}\r\n","/*!\r\n * icheck-bootstrap v3.0.1 (https://github.com/bantikyan/icheck-bootstrap)\r\n * Copyright 2018 Hovhannes Bantikyan.\r\n * Licensed under MIT (https://github.com/bantikyan/icheck-bootstrap/blob/master/LICENSE)\r\n */\r\n\r\n [class*=\"icheck-\"] {\r\n min-height: 22px;\r\n margin-top: 6px !important;\r\n margin-bottom: 6px !important;\r\n padding-left: 0px;\r\n}\r\n\r\n.icheck-inline {\r\n display: inline-block;\r\n}\r\n\r\n .icheck-inline + .icheck-inline {\r\n margin-left: .75rem;\r\n margin-top: 6px;\r\n }\r\n\r\n[class*=\"icheck-\"] > label {\r\n padding-left: 29px !important;\r\n min-height: 22px;\r\n line-height: 22px;\r\n display: inline-block;\r\n position: relative;\r\n vertical-align: top;\r\n margin-bottom: 0;\r\n font-weight: normal;\r\n cursor: pointer;\r\n}\r\n\r\n[class*=\"icheck-\"] > input:first-child {\r\n position: absolute !important;\r\n opacity: 0;\r\n margin: 0;\r\n}\r\n\r\n [class*=\"icheck-\"] > input:first-child:disabled {\r\n cursor: default;\r\n }\r\n\r\n [class*=\"icheck-\"] > input:first-child + label::before,\r\n [class*=\"icheck-\"] > input:first-child + input[type=\"hidden\"] + label::before {\r\n content: \"\";\r\n display: inline-block;\r\n position: absolute;\r\n width: 22px;\r\n height: 22px;\r\n border: 1px solid #D3CFC8;\r\n border-radius: 0px;\r\n margin-left: -29px;\r\n }\r\n\r\n [class*=\"icheck-\"] > input:first-child:checked + label::after,\r\n [class*=\"icheck-\"] > input:first-child:checked + input[type=\"hidden\"] + label::after {\r\n content: \"\";\r\n display: inline-block;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 7px;\r\n height: 10px;\r\n border: solid 2px #fff;\r\n border-left: none;\r\n border-top: none;\r\n transform: translate(7.75px, 4.5px) rotate(45deg);\r\n -ms-transform: translate(7.75px, 4.5px) rotate(45deg);\r\n }\r\n\r\n[class*=\"icheck-\"] > input[type=\"radio\"]:first-child + label::before,\r\n[class*=\"icheck-\"] > input[type=\"radio\"]:first-child + input[type=\"hidden\"] + label::before {\r\n border-radius: 50%;\r\n}\r\n\r\n[class*=\"icheck-\"] > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n[class*=\"icheck-\"] > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-width: 2px;\r\n}\r\n\r\n[class*=\"icheck-\"] > input:first-child:disabled + label,\r\n[class*=\"icheck-\"] > input:first-child:disabled + input[type=\"hidden\"] + label,\r\n[class*=\"icheck-\"] > input:first-child:disabled + label::before,\r\n[class*=\"icheck-\"] > input:first-child:disabled + input[type=\"hidden\"] + label::before {\r\n pointer-events: none;\r\n cursor: default;\r\n filter: alpha(opacity=65);\r\n -webkit-box-shadow: none;\r\n box-shadow: none;\r\n opacity: .65;\r\n}\r\n\r\n.icheck-default > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-default > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #adadad;\r\n}\r\n\r\n.icheck-default > input:first-child:checked + label::before,\r\n.icheck-default > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #e6e6e6;\r\n border-color: #adadad;\r\n}\r\n\r\n.icheck-default > input:first-child:checked + label::after,\r\n.icheck-default > input:first-child:checked + input[type=\"hidden\"] + label::after {\r\n border-bottom-color: #333;\r\n border-right-color: #333;\r\n}\r\n\r\n.icheck-primary > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-primary > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #2e6da4;\r\n}\r\n\r\n.icheck-primary > input:first-child:checked + label::before,\r\n.icheck-primary > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #337ab7;\r\n border-color: #2e6da4;\r\n}\r\n\r\n.icheck-success > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-success > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #4cae4c;\r\n}\r\n\r\n.icheck-success > input:first-child:checked + label::before,\r\n.icheck-success > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #5cb85c;\r\n border-color: #4cae4c;\r\n}\r\n\r\n.icheck-info > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-info > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #46b8da;\r\n}\r\n\r\n.icheck-info > input:first-child:checked + label::before,\r\n.icheck-info > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #5bc0de;\r\n border-color: #46b8da;\r\n}\r\n\r\n.icheck-warning > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-warning > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #eea236;\r\n}\r\n\r\n.icheck-warning > input:first-child:checked + label::before,\r\n.icheck-warning > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #f0ad4e;\r\n border-color: #eea236;\r\n}\r\n\r\n.icheck-danger > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-danger > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #d43f3a;\r\n}\r\n\r\n.icheck-danger > input:first-child:checked + label::before,\r\n.icheck-danger > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #d9534f;\r\n border-color: #d43f3a;\r\n}\r\n\r\n.icheck-turquoise > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-turquoise > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #1abc9c;\r\n}\r\n\r\n.icheck-turquoise > input:first-child:checked + label::before,\r\n.icheck-turquoise > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #1abc9c;\r\n border-color: #1abc9c;\r\n}\r\n\r\n.icheck-emerland > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-emerland > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #2ecc71;\r\n}\r\n\r\n.icheck-emerland > input:first-child:checked + label::before,\r\n.icheck-emerland > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #2ecc71;\r\n border-color: #2ecc71;\r\n}\r\n\r\n.icheck-peterriver > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-peterriver > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #3498db;\r\n}\r\n\r\n.icheck-peterriver > input:first-child:checked + label::before,\r\n.icheck-peterriver > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #3498db;\r\n border-color: #3498db;\r\n}\r\n\r\n.icheck-amethyst > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-amethyst > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #9b59b6;\r\n}\r\n\r\n.icheck-amethyst > input:first-child:checked + label::before,\r\n.icheck-amethyst > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #9b59b6;\r\n border-color: #9b59b6;\r\n}\r\n\r\n.icheck-wetasphalt > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-wetasphalt > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #34495e;\r\n}\r\n\r\n.icheck-wetasphalt > input:first-child:checked + label::before,\r\n.icheck-wetasphalt > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #34495e;\r\n border-color: #34495e;\r\n}\r\n\r\n.icheck-greensea > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-greensea > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #16a085;\r\n}\r\n\r\n.icheck-greensea > input:first-child:checked + label::before,\r\n.icheck-greensea > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #16a085;\r\n border-color: #16a085;\r\n}\r\n\r\n.icheck-nephritis > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-nephritis > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #27ae60;\r\n}\r\n\r\n.icheck-nephritis > input:first-child:checked + label::before,\r\n.icheck-nephritis > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #27ae60;\r\n border-color: #27ae60;\r\n}\r\n\r\n.icheck-belizehole > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-belizehole > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #2980b9;\r\n}\r\n\r\n.icheck-belizehole > input:first-child:checked + label::before,\r\n.icheck-belizehole > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #2980b9;\r\n border-color: #2980b9;\r\n}\r\n\r\n.icheck-wisteria > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-wisteria > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #8e44ad;\r\n}\r\n\r\n.icheck-wisteria > input:first-child:checked + label::before,\r\n.icheck-wisteria > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #8e44ad;\r\n border-color: #8e44ad;\r\n}\r\n\r\n.icheck-midnightblue > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-midnightblue > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #2c3e50;\r\n}\r\n\r\n.icheck-midnightblue > input:first-child:checked + label::before,\r\n.icheck-midnightblue > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #2c3e50;\r\n border-color: #2c3e50;\r\n}\r\n\r\n.icheck-sunflower > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-sunflower > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #f1c40f;\r\n}\r\n\r\n.icheck-sunflower > input:first-child:checked + label::before,\r\n.icheck-sunflower > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #f1c40f;\r\n border-color: #f1c40f;\r\n}\r\n\r\n.icheck-carrot > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-carrot > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #e67e22;\r\n}\r\n\r\n.icheck-carrot > input:first-child:checked + label::before,\r\n.icheck-carrot > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #e67e22;\r\n border-color: #e67e22;\r\n}\r\n\r\n.icheck-alizarin > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-alizarin > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #e74c3c;\r\n}\r\n\r\n.icheck-alizarin > input:first-child:checked + label::before,\r\n.icheck-alizarin > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #e74c3c;\r\n border-color: #e74c3c;\r\n}\r\n\r\n.icheck-clouds > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-clouds > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #ecf0f1;\r\n}\r\n\r\n.icheck-clouds > input:first-child:checked + label::before,\r\n.icheck-clouds > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #ecf0f1;\r\n border-color: #ecf0f1;\r\n}\r\n\r\n.icheck-clouds > input:first-child:checked + label::after,\r\n.icheck-clouds > input:first-child:checked + input[type=\"hidden\"] + label::after {\r\n border-bottom-color: #95a5a6;\r\n border-right-color: #95a5a6;\r\n}\r\n\r\n.icheck-concrete > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-concrete > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #95a5a6;\r\n}\r\n\r\n.icheck-concrete > input:first-child:checked + label::before,\r\n.icheck-concrete > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #95a5a6;\r\n border-color: #95a5a6;\r\n}\r\n\r\n.icheck-orange > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-orange > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #f39c12;\r\n}\r\n\r\n.icheck-orange > input:first-child:checked + label::before,\r\n.icheck-orange > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #f39c12;\r\n border-color: #f39c12;\r\n}\r\n\r\n.icheck-pumpkin > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-pumpkin > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #d35400;\r\n}\r\n\r\n.icheck-pumpkin > input:first-child:checked + label::before,\r\n.icheck-pumpkin > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #d35400;\r\n border-color: #d35400;\r\n}\r\n\r\n.icheck-pomegranate > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-pomegranate > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #c0392b;\r\n}\r\n\r\n.icheck-pomegranate > input:first-child:checked + label::before,\r\n.icheck-pomegranate > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #c0392b;\r\n border-color: #c0392b;\r\n}\r\n\r\n.icheck-silver > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-silver > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #bdc3c7;\r\n}\r\n\r\n.icheck-silver > input:first-child:checked + label::before,\r\n.icheck-silver > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #bdc3c7;\r\n border-color: #bdc3c7;\r\n}\r\n\r\n.icheck-asbestos > input:first-child:not(:checked):not(:disabled):hover + label::before,\r\n.icheck-asbestos > input:first-child:not(:checked):not(:disabled):hover + input[type=\"hidden\"] + label::before {\r\n border-color: #7f8c8d;\r\n}\r\n\r\n.icheck-asbestos > input:first-child:checked + label::before,\r\n.icheck-asbestos > input:first-child:checked + input[type=\"hidden\"] + label::before {\r\n background-color: #7f8c8d;\r\n border-color: #7f8c8d;\r\n}","// stylelint-disable selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","/*!\n * app.scss\n * Copyright (c) 2020 james@firefly-iii.org\n *\n * This file is part of Firefly III (https://github.com/firefly-iii).\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n */\n\n// Fonts\n@import '~@fortawesome/fontawesome-free/css/all.css';\n// OverlayScrollbars\n@import '~overlayscrollbars/css/OverlayScrollbars.css';\n// iCheck\n@import '~icheck-bootstrap/icheck-bootstrap.css';\n// AdminLTE\n//@import 'dist/css/adminlte.css';\n\n//@import 'adminlte/scss/adminlte.css'\n\n//@import '~admin-lte/build/scss/AdminLTE';\n\n// ADMIN LTE\n@import '~bootstrap/scss/functions';\n@import '~admin-lte/build/scss/bootstrap-variables';\n@import '~bootstrap/scss/bootstrap';\n\n// Variables and Mixins\n// ---------------------------------------------------\n@import '~admin-lte/build/scss/variables';\n\n// Firefly III colors (?)\n@import 'scss/variables';\n\n@import '~admin-lte/build/scss/mixins';\n@import '~admin-lte/build/scss/parts/core';\n\n// admin LTE components\n@import '~admin-lte/build/scss/forms';\n@import '~admin-lte/build/scss/progress-bars';\n@import '~admin-lte/build/scss/cards';\n@import '~admin-lte/build/scss/modals';\n//@import '../toasts';\n@import '~admin-lte/build/scss/buttons';\n//@import '../callout';\n@import '~admin-lte/build/scss/alerts';\n@import '~admin-lte/build/scss/table';\n//@import '../carousel';\n\n// admin LTE extra components\n//@import '../small-box';\n@import '~admin-lte/build/scss/info-box';\n//@import '../timeline';\n//@import '../products';\n//@import '../direct-chat';\n//@import '../users-list';\n//@import '../social-widgets';\n\n// admin LTE pages (unused)\n// @import 'parts/pages';\n\n// admin LTE plugins (unused)\n// @import 'parts/plugins';\n\n// admin LTE misc\n@import '~admin-lte/build/scss/miscellaneous';\n@import '~admin-lte/build/scss/print';\n@import '~admin-lte/build/scss/text';\n@import '~admin-lte/build/scss/elevation';\n@import '~admin-lte/build/scss/colors';\n\n\n","/*!\n * Bootstrap v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`