gnucash master: Multiple changes pushed
Christopher Lam
clam at code.gnucash.org
Fri May 14 09:17:36 EDT 2021
Updated via https://github.com/Gnucash/gnucash/commit/b25a4441 (commit)
via https://github.com/Gnucash/gnucash/commit/ce34d0a4 (commit)
via https://github.com/Gnucash/gnucash/commit/b42d2c43 (commit)
via https://github.com/Gnucash/gnucash/commit/6dcf8f8e (commit)
via https://github.com/Gnucash/gnucash/commit/3bd251a0 (commit)
via https://github.com/Gnucash/gnucash/commit/f10b0339 (commit)
via https://github.com/Gnucash/gnucash/commit/da3c511b (commit)
via https://github.com/Gnucash/gnucash/commit/4f030aac (commit)
via https://github.com/Gnucash/gnucash/commit/18c72bad (commit)
via https://github.com/Gnucash/gnucash/commit/d2a4aef3 (commit)
via https://github.com/Gnucash/gnucash/commit/e5719437 (commit)
via https://github.com/Gnucash/gnucash/commit/f6d0c3d9 (commit)
via https://github.com/Gnucash/gnucash/commit/272278dd (commit)
via https://github.com/Gnucash/gnucash/commit/00afdf56 (commit)
via https://github.com/Gnucash/gnucash/commit/a6064185 (commit)
via https://github.com/Gnucash/gnucash/commit/8124ab0a (commit)
via https://github.com/Gnucash/gnucash/commit/85a4baeb (commit)
via https://github.com/Gnucash/gnucash/commit/45cb454b (commit)
via https://github.com/Gnucash/gnucash/commit/f6b1d3c1 (commit)
via https://github.com/Gnucash/gnucash/commit/9a58dd15 (commit)
via https://github.com/Gnucash/gnucash/commit/90ae8e8b (commit)
via https://github.com/Gnucash/gnucash/commit/cf00dfed (commit)
via https://github.com/Gnucash/gnucash/commit/a3174f89 (commit)
via https://github.com/Gnucash/gnucash/commit/662048ba (commit)
via https://github.com/Gnucash/gnucash/commit/2b48fd37 (commit)
via https://github.com/Gnucash/gnucash/commit/a60471c9 (commit)
via https://github.com/Gnucash/gnucash/commit/6cbc650d (commit)
via https://github.com/Gnucash/gnucash/commit/ac1abcb8 (commit)
via https://github.com/Gnucash/gnucash/commit/ca6fcf8a (commit)
via https://github.com/Gnucash/gnucash/commit/185eb446 (commit)
via https://github.com/Gnucash/gnucash/commit/254ccaca (commit)
via https://github.com/Gnucash/gnucash/commit/3168347a (commit)
via https://github.com/Gnucash/gnucash/commit/14c523e4 (commit)
via https://github.com/Gnucash/gnucash/commit/c38740fc (commit)
via https://github.com/Gnucash/gnucash/commit/e3d4bd2e (commit)
via https://github.com/Gnucash/gnucash/commit/13871595 (commit)
via https://github.com/Gnucash/gnucash/commit/b485f42f (commit)
via https://github.com/Gnucash/gnucash/commit/705db5aa (commit)
via https://github.com/Gnucash/gnucash/commit/b8e22b36 (commit)
via https://github.com/Gnucash/gnucash/commit/888676eb (commit)
via https://github.com/Gnucash/gnucash/commit/37afd65f (commit)
via https://github.com/Gnucash/gnucash/commit/d60d5c30 (commit)
via https://github.com/Gnucash/gnucash/commit/6bb4faac (commit)
via https://github.com/Gnucash/gnucash/commit/2392bc24 (commit)
via https://github.com/Gnucash/gnucash/commit/42a41c79 (commit)
via https://github.com/Gnucash/gnucash/commit/58abf252 (commit)
via https://github.com/Gnucash/gnucash/commit/ae7eb9b3 (commit)
via https://github.com/Gnucash/gnucash/commit/a2f52231 (commit)
via https://github.com/Gnucash/gnucash/commit/a37060c9 (commit)
via https://github.com/Gnucash/gnucash/commit/973a0bb7 (commit)
via https://github.com/Gnucash/gnucash/commit/b168de77 (commit)
via https://github.com/Gnucash/gnucash/commit/a4fd8e8b (commit)
via https://github.com/Gnucash/gnucash/commit/1b57c297 (commit)
via https://github.com/Gnucash/gnucash/commit/6103723d (commit)
via https://github.com/Gnucash/gnucash/commit/46582a66 (commit)
via https://github.com/Gnucash/gnucash/commit/2e78ffdc (commit)
via https://github.com/Gnucash/gnucash/commit/be1c67e5 (commit)
via https://github.com/Gnucash/gnucash/commit/9ec6e58c (commit)
via https://github.com/Gnucash/gnucash/commit/92521c86 (commit)
via https://github.com/Gnucash/gnucash/commit/ed486a58 (commit)
via https://github.com/Gnucash/gnucash/commit/2258e7a4 (commit)
from https://github.com/Gnucash/gnucash/commit/e6355be7 (commit)
commit b25a444140bbee819440effa3bd5779f48ad72d1
Merge: e6355be75 ce34d0a4b
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Fri May 14 21:16:48 2021 +0800
Merge branch 'maint'
commit ce34d0a4beaf6e2a5f2b0106a00ce39c75fc1781
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu May 13 20:06:11 2021 +0800
[gnc-plugin-page-register.c] plug leaks
* g_free where appropriate
* remove unnecessary g_strdup
* don't use the string returned by g_strdelimit; it modifies the
argument
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index fcf312599..80772c5c5 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -1414,6 +1414,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
{
gchar** filter;
+ gchar* filter_str;
guint filtersize = 0;
/* Set the sort order for the split register and status of save order button */
priv->sd.save_order = FALSE;
@@ -1440,9 +1441,10 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
/* Set the filter for the split register and status of save filter button */
priv->fd.save_filter = FALSE;
- filter = g_strsplit (gnc_plugin_page_register_get_filter (plugin_page), ",",
- -1);
+ filter_str = gnc_plugin_page_register_get_filter (plugin_page);
+ filter = g_strsplit (filter_str, ",", -1);
filtersize = g_strv_length (filter);
+ g_free (filter_str);
PINFO ("Loaded Filter Status is %s", filter[0]);
@@ -1974,7 +1976,7 @@ gnc_plugin_page_register_finish_pending (GncPluginPage* page)
GncPluginPageRegister* reg_page;
SplitRegister* reg;
GtkWidget* dialog, *window;
- const gchar* name;
+ gchar* name;
gint response;
if (is_scrubbing && show_abort_verify)
@@ -1999,6 +2001,7 @@ gnc_plugin_page_register_finish_pending (GncPluginPage* page)
/* Translators: %s is the name
of the tab page */
_ ("Save changes to %s?"), name);
+ g_free (name);
gtk_message_dialog_format_secondary_text
(GTK_MESSAGE_DIALOG (dialog),
"%s",
@@ -2042,7 +2045,7 @@ gnc_plugin_page_register_get_tab_name (GncPluginPage* plugin_page)
Account* leader;
g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
- _ ("unknown"));
+ g_strdup (_("unknown")));
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
@@ -2090,7 +2093,7 @@ gnc_plugin_page_register_get_tab_color (GncPluginPage* plugin_page)
const char* color;
g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
- _ ("unknown"));
+ g_strdup (_("unknown")));
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
@@ -2116,7 +2119,7 @@ gnc_plugin_page_register_check_for_empty_group (GKeyFile *state_file, const gcha
g_strfreev (keys);
}
-static const gchar*
+static gchar*
gnc_plugin_page_register_get_filter_gcm (Account* leader)
{
GKeyFile* state_file = gnc_state_get_current();
@@ -2124,7 +2127,7 @@ gnc_plugin_page_register_get_filter_gcm (Account* leader)
gchar* filter_text;
gchar acct_guid[GUID_ENCODING_LENGTH + 1];
GError* error = NULL;
- const char* filter = NULL;
+ char* filter = NULL;
// get the filter from the .gcm file
guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -2135,11 +2138,8 @@ gnc_plugin_page_register_get_filter_gcm (Account* leader)
if (error)
g_clear_error (&error);
else
- {
- filter_text = g_strdelimit (filter_text, ";", ',');
- filter = g_strdup (filter_text);
- g_free (filter_text);
- }
+ g_strdelimit (filter_text, ";", ',');
+
g_free (state_section);
return filter;
}
@@ -2150,10 +2150,10 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
Account* leader;
- const char* filter = NULL;
+ char* filter = NULL;
g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
- _ ("unknown"));
+ g_strdup (_("unknown")));
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
@@ -2163,9 +2163,11 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
// load from gcm file
filter = gnc_plugin_page_register_get_filter_gcm (leader);
- return filter ? g_strdup (filter) : g_strdup_printf ("%s,%s,%s,%s",
- DEFAULT_FILTER,
- "0", "0", get_filter_default_num_of_days (ledger_type));
+ if (filter)
+ return filter;
+
+ return g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER,
+ "0", "0", get_filter_default_num_of_days (ledger_type));
}
static void
@@ -2190,8 +2192,7 @@ gnc_plugin_page_register_set_filter_gcm (Account* leader, const gchar* filter,
else
{
filter_text = g_strdup (filter);
- filter_text = g_strdelimit (filter_text, ",",
- ';'); // make it conform to .gcm file list
+ g_strdelimit (filter_text, ",", ';'); // make it conform to .gcm file list
g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
filter_text);
g_free (filter_text);
@@ -2223,7 +2224,7 @@ gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
return;
}
-static const gchar*
+static gchar*
gnc_plugin_page_register_get_sort_order_gcm (Account* leader)
{
GKeyFile* state_file = gnc_state_get_current();
@@ -2231,7 +2232,7 @@ gnc_plugin_page_register_get_sort_order_gcm (Account* leader)
gchar* sort_text;
gchar acct_guid[GUID_ENCODING_LENGTH + 1];
GError* error = NULL;
- const char* sort_order = NULL;
+ char* sort_order = NULL;
// get the sort_order from the .gcm file
guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
@@ -2255,7 +2256,7 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
{
GncPluginPageRegisterPrivate* priv;
Account* leader;
- const char* sort_order = NULL;
+ char* sort_order = NULL;
g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
_ ("unknown"));
@@ -2267,7 +2268,8 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
// load from gcm file
sort_order = gnc_plugin_page_register_get_sort_order_gcm (leader);
- return g_strdup (sort_order ? sort_order : DEFAULT_SORT_ORDER);
+
+ return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
}
static void
commit b42d2c43801c51b4a343a10b51bdb9ace98138c3
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu May 13 08:04:10 2021 +0800
[dialog-doclink-utils.c] don't use g_strdelimit return val
diff --git a/gnucash/gnome-utils/dialog-doclink-utils.c b/gnucash/gnome-utils/dialog-doclink-utils.c
index 3c00ea77f..038fbdeae 100644
--- a/gnucash/gnome-utils/dialog-doclink-utils.c
+++ b/gnucash/gnome-utils/dialog-doclink-utils.c
@@ -92,7 +92,7 @@ gnc_doclink_get_unescape_uri (const gchar *path_head, const gchar *uri, gchar *u
g_free (file_path);
#ifdef G_OS_WIN32 // make path look like a traditional windows path
- display_str = g_strdelimit (display_str, "/", '\\');
+ g_strdelimit (display_str, "/", '\\');
#endif
}
DEBUG("Return display string is '%s'", display_str);
commit 6dcf8f8e6ba96584f50a9683dc051cac34100945
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu May 13 08:03:50 2021 +0800
[gnc-split-reg.c] don't use g_strdelimit return val
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 456cd36e9..682979c24 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -428,8 +428,8 @@ gsr_move_sort_and_filter_to_state_file (GNCSplitReg *gsr, GKeyFile* state_file,
if (kvp_filter)
{
gchar *temp_filter_text = g_strdup (kvp_filter);
- temp_filter_text = g_strdelimit (temp_filter_text, ",",
- ';'); // make it conform to .gcm file list
+ // make it conform to .gcm file list
+ g_strdelimit (temp_filter_text, ",", ';');
g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
temp_filter_text);
g_free (temp_filter_text);
commit 3bd251a096161531e8a1d615554978a3c1700734
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu May 13 08:03:15 2021 +0800
[combocell-gnome.c] simplify, more explicit assignments
diff --git a/gnucash/register/register-gnome/combocell-gnome.c b/gnucash/register/register-gnome/combocell-gnome.c
index e169416c4..7e4e243a3 100644
--- a/gnucash/register/register-gnome/combocell-gnome.c
+++ b/gnucash/register/register-gnome/combocell-gnome.c
@@ -327,13 +327,7 @@ gnc_combo_cell_destroy (BasicCell* bcell)
box->qf = NULL;
}
- for (node = box->ignore_strings; node; node = node->next)
- {
- g_free (node->data);
- node->data = NULL;
- }
-
- g_list_free (box->ignore_strings);
+ g_list_free_full (box->ignore_strings, g_free);
box->ignore_strings = NULL;
g_free (box);
@@ -462,7 +456,6 @@ void
gnc_combo_cell_add_account_menu_item (ComboCell* cell, char* menustr)
{
PopBox* box;
- gchar* menu_copy, *value_copy;
if (cell == NULL)
return;
@@ -478,9 +471,10 @@ gnc_combo_cell_add_account_menu_item (ComboCell* cell, char* menustr)
gnc_item_list_append (box->item_list, menustr);
if (cell->cell.value)
{
- menu_copy = g_strdelimit (g_strdup (menustr), "-:/\\.", ' ');
- value_copy =
- g_strdelimit (g_strdup (cell->cell.value), "-:/\\.", ' ');
+ gchar* menu_copy = g_strdup (menustr);
+ gchar* value_copy = g_strdup (cell->cell.value);
+ g_strdelimit (menu_copy, "-:/\\.", ' ');
+ g_strdelimit (value_copy, "-:/\\.", ' ');
if (strcmp (menu_copy, value_copy) == 0)
{
gnc_combo_cell_set_value (cell, menustr);
commit f10b0339fbe7ce2a5c071b049e42ed6f07aa8075
Merge: d2a4aef3b da3c511b6
Author: John Ralls <jralls at ceridwen.us>
Date: Wed May 12 09:01:32 2021 -0700
Merge John Ralls's 'bug798093bis' into maint.
commit da3c511b6c8f332ae883ab8fccdfec868f42d425
Author: John Ralls <jralls at ceridwen.us>
Date: Tue May 11 14:42:21 2021 -0700
Remove trading splits instead of trying to adjust them.
diff --git a/libgnucash/engine/Scrub.c b/libgnucash/engine/Scrub.c
index 3e4c97280..340cd3431 100644
--- a/libgnucash/engine/Scrub.c
+++ b/libgnucash/engine/Scrub.c
@@ -530,50 +530,6 @@ get_trading_split (Transaction *trans, Account *base,
return balance_split;
}
-/* Find the trading split for a commodity, but don't create any splits
- or accounts if they don't already exist. */
-static Split *
-find_trading_split (Transaction *trans, Account *root,
- gnc_commodity *commodity)
-{
- Account *trading_account;
- Account *ns_account;
- Account *account;
-
- if (!root)
- {
- root = gnc_book_get_root_account (xaccTransGetBook (trans));
- if (NULL == root)
- {
- /* This can't occur, things should be in books */
- PERR ("Bad data corruption, no root account in book");
- return NULL;
- }
- }
-
- trading_account = gnc_account_lookup_by_name (root, _("Trading"));
- if (!trading_account)
- {
- return NULL;
- }
-
- ns_account = gnc_account_lookup_by_name (trading_account,
- gnc_commodity_get_namespace(commodity));
- if (!ns_account)
- {
- return NULL;
- }
-
- account = gnc_account_lookup_by_name (ns_account,
- gnc_commodity_get_mnemonic(commodity));
- if (!account)
- {
- return NULL;
- }
-
- return xaccTransFindSplitByAccount(trans, account);
-}
-
static void
add_balance_split (Transaction *trans, gnc_numeric imbalance,
Account *root, Account *account)
@@ -631,71 +587,6 @@ gnc_transaction_balance_no_trading (Transaction *trans, Account *root,
}
}
-/** If there are existing trading splits, adjust the price or exchange
- rate in each of them to agree with the non-trading splits for the
- same commodity. If there are multiple non-trading splits for the
- same commodity in the transaction this will use the exchange rate in
- the last such split. This shouldn't happen, and if it does then there's
- not much we can do about it anyway.
-
- While we're at it, compute the value imbalance ignoring existing
- trading splits. */
-
-static gnc_numeric
-gnc_transaction_adjust_trading_splits (Transaction* trans, Account *root)
-{
- GList* splits;
- gnc_numeric imbalance = gnc_numeric_zero();
- for (splits = trans->splits; splits; splits = splits->next)
- {
- Split *split = splits->data;
- Split *balance_split = NULL;
- gnc_numeric value, amount;
- gnc_commodity *commodity, *txn_curr = xaccTransGetCurrency (trans);
-
- if (! xaccTransStillHasSplit (trans, split)) continue;
-
- commodity = xaccAccountGetCommodity (xaccSplitGetAccount(split));
- if (!commodity)
- {
- PERR("Split has no commodity");
- continue;
- }
-
- balance_split = find_trading_split (trans, root, commodity);
-
- if (balance_split != split)
- /* this is not a trading split */
- imbalance = gnc_numeric_add(imbalance, xaccSplitGetValue (split),
- GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT);
-
- /* Ignore splits where value or amount is zero */
- value = xaccSplitGetValue (split);
- amount = xaccSplitGetAmount (split);
- if (gnc_numeric_zero_p(amount) || gnc_numeric_zero_p(value))
- continue;
-
- if (balance_split && balance_split != split)
- {
- gnc_numeric convrate = gnc_numeric_div (amount, value,
- GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
- gnc_numeric old_value, new_value;
- old_value = xaccSplitGetValue(balance_split);
- new_value = gnc_numeric_div (xaccSplitGetAmount(balance_split),
- convrate,
- gnc_commodity_get_fraction(txn_curr),
- GNC_HOW_RND_ROUND_HALF_UP);
- if (! gnc_numeric_equal (old_value, new_value))
- {
- xaccTransBeginEdit (trans);
- xaccSplitSetValue (balance_split, new_value);
- xaccSplitScrub (balance_split);
- xaccTransCommitEdit (trans);
- }
- }
- }
- return imbalance;
-}
static gnc_numeric
gnc_transaction_get_commodity_imbalance (Transaction *trans,
@@ -719,6 +610,42 @@ gnc_transaction_get_commodity_imbalance (Transaction *trans,
return val_imbalance;
}
+/* GFunc wrapper for xaccSplitDestroy */
+static void
+destroy_split (void* ptr, void* data)
+{
+ Split *split = GNC_SPLIT (ptr);
+ if (split)
+ xaccSplitDestroy (split);
+}
+
+/* Balancing transactions with trading accounts works best when
+ * starting with no trading splits.
+ */
+static void
+xaccTransClearTradingSplits (Transaction *trans)
+{
+ GList *trading_splits = NULL;
+
+ for (GList* node = trans->splits; node; node = node->next)
+ {
+ Split* split = GNC_SPLIT(node->data);
+ Account* acc = NULL;
+ if (!split)
+ continue;
+ acc = xaccSplitGetAccount(split);
+ if (acc && xaccAccountGetType(acc) == ACCT_TYPE_TRADING)
+ trading_splits = g_list_prepend (trading_splits, node->data);
+ }
+
+ if (!trading_splits)
+ return;
+
+ xaccTransBeginEdit (trans);
+ g_list_foreach (trading_splits, destroy_split, NULL);
+ xaccTransCommitEdit (trans);
+}
+
static void
gnc_transaction_balance_trading (Transaction *trans, Account *root)
{
@@ -859,8 +786,11 @@ xaccTransScrubImbalance (Transaction *trans, Account *root,
ENTER ("()");
- /* Must look for orphan splits even if there is no imbalance. */
+ /* Must look for orphan splits and remove trading splits even if
+ * there is no imbalance and we're not using trading accounts.
+ */
xaccTransScrubSplits (trans);
+ xaccTransClearTradingSplits (trans);
/* Return immediately if things are balanced. */
if (xaccTransIsBalanced (trans))
@@ -876,9 +806,7 @@ xaccTransScrubImbalance (Transaction *trans, Account *root,
return;
}
- imbalance = gnc_transaction_adjust_trading_splits (trans, root);
-
- /* Balance the value, ignoring existing trading splits */
+ imbalance = xaccTransGetImbalanceValue (trans);
if (! gnc_numeric_zero_p (imbalance))
{
PINFO ("Value unbalanced transaction");
commit 4f030aac6e8bb64aa687f82f92e11ab875a9bfdb
Author: John Ralls <jralls at ceridwen.us>
Date: Tue May 4 10:11:59 2021 -0700
Bug 798093 - Changing the symbol/abbreviation of a security...
after the trading account was created breaks GnuCash.
Revisited. The original changeset looked for a top level trading account
and a namespace account in the transaction currency; if either of those
accounts had been created in a different currency it would duplicate
them.
This commit will accept any such account regardless of commodity. If
more than one exists it will prefer the one in the root currency if
there is one, otherwise it will select the first one found.
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index b82180d07..e828b661c 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -3120,26 +3120,31 @@ gnc_account_lookup_by_full_name (const Account *any_acc,
return found;
}
-Account*
+GList*
gnc_account_lookup_by_type_and_commodity (Account* root,
const char* name,
GNCAccountType acctype,
gnc_commodity* commodity)
{
+ GList *retval{};
auto rpriv{GET_PRIVATE(root)};
for (auto node = rpriv->children; node; node = node->next)
{
auto account{static_cast<Account*>(node->data)};
- if (xaccAccountGetType (account) == acctype &&
- gnc_commodity_equiv(xaccAccountGetCommodity (account), commodity))
+ if (xaccAccountGetType (account) == acctype)
{
+ if (commodity &&
+ !gnc_commodity_equiv(xaccAccountGetCommodity (account),
+ commodity))
+ continue;
+
if (name && strcmp(name, xaccAccountGetName(account)))
- continue; //name doesn't match so skip this one
+ continue;
- return account;
+ retval = g_list_prepend(retval, account);
}
}
- return nullptr;
+ return retval;
}
void
diff --git a/libgnucash/engine/Account.h b/libgnucash/engine/Account.h
index 1e2504f2e..04b6e6e07 100644
--- a/libgnucash/engine/Account.h
+++ b/libgnucash/engine/Account.h
@@ -938,24 +938,24 @@ Account *gnc_account_lookup_by_code (const Account *parent,
*/
Account *gnc_account_lookup_by_opening_balance (Account *account, gnc_commodity *commodity);
-/** Find a direct child account matching name, GNCAccountType, and commodity.
+/** Find a direct child account matching name, GNCAccountType, and/or commodity.
*
- * Note that commodity matching is by equivalence: If the
- * mnemonic/symbol and namespace are the same, it matches.
+ * Name and commodity may be nullptr in which case the accounts in the
+ * list may have any value for those properties. Note that commodity
+ * matching is by equivalence: If the mnemonic/symbol and namespace
+ * are the same, it matches.
*
* @param root The account among whose children one expects to find
* the account.
- * @param name The name of the account to look for. If nullptr the
- * returned account will match only on acctype and commodity.
+ * @param name The name of the account to look for or nullptr.
* @param acctype The GNCAccountType to match.
- * @param commodity The commodity in which the account should be denominated.
- * @return The book's trading account for the given commodity if
- * trading accounts are enabled and one exists; NULL otherwise.
+ * @param commodity The commodity in which the account should be denominated or nullptr.
+ * @return A GList of children matching the supplied parameters.
*/
-Account *gnc_account_lookup_by_type_and_commodity (Account* root,
- const char* name,
- GNCAccountType acctype,
- gnc_commodity* commodity);
+GList *gnc_account_lookup_by_type_and_commodity (Account* root,
+ const char* name,
+ GNCAccountType acctype,
+ gnc_commodity* commodity);
/** @} */
/* ------------------ */
diff --git a/libgnucash/engine/Scrub.c b/libgnucash/engine/Scrub.c
index 5e6e9c050..3e4c97280 100644
--- a/libgnucash/engine/Scrub.c
+++ b/libgnucash/engine/Scrub.c
@@ -51,6 +51,7 @@
#include "TransactionP.h"
#include "gnc-commodity.h"
#include "qofinstance-p.h"
+#include "gnc-session.h"
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "gnc.engine.scrub"
@@ -442,43 +443,46 @@ get_balance_split (Transaction *trans, Account *root, Account *account,
return balance_split;
}
+static gnc_commodity*
+find_root_currency(void)
+{
+ QofSession *sess = gnc_get_current_session ();
+ Account *root = gnc_book_get_root_account (qof_session_get_book (sess));
+ gnc_commodity *root_currency = xaccAccountGetCommodity (root);
+
+ /* Some older books may not have a currency set on the root
+ * account. In that case find the first top-level INCOME account
+ * and use its currency. */
+ if (!root_currency)
+ {
+ GList *children = gnc_account_get_children (root);
+ for (GList *node = children; node && !root_currency;
+ node = g_list_next (node))
+ {
+ Account *child = GNC_ACCOUNT (node->data);
+ if (xaccAccountGetType (child) == ACCT_TYPE_INCOME)
+ root_currency = xaccAccountGetCommodity (child);
+ }
+ g_free (children);
+ }
+ return root_currency;
+}
+
/* Get the trading split for a given commodity, creating it (and the
- necessary accounts) if it doesn't exist. */
+ necessary parent accounts) if it doesn't exist. */
static Split *
-get_trading_split (Transaction *trans, Account *root,
+get_trading_split (Transaction *trans, Account *base,
gnc_commodity *commodity)
{
Split *balance_split;
Account *trading_account;
Account *ns_account;
Account *account;
- gnc_commodity *default_currency = NULL;
-
- if (!root)
- {
- root = gnc_book_get_root_account (xaccTransGetBook (trans));
- if (NULL == root)
- {
- /* This can't occur, things should be in books */
- PERR ("Bad data corruption, no root account in book");
- return NULL;
- }
- }
-
- /* Get the default currency. This is harder than it seems. It's not
- possible to call gnc_default_currency() since it's a UI function. One
- might think that the currency of the root account would do, but the root
- account has no currency. Instead look for the Income placeholder account
- and use its currency. */
- default_currency = xaccAccountGetCommodity(gnc_account_lookup_by_name(root,
- _("Income")));
- if (! default_currency)
- {
- default_currency = commodity;
- }
+ Account* root = gnc_book_get_root_account (xaccTransGetBook (trans));
+ gnc_commodity *root_currency = find_root_currency ();
trading_account = xaccScrubUtilityGetOrMakeAccount (root,
- default_currency,
+ NULL,
_("Trading"),
ACCT_TYPE_TRADING,
TRUE, FALSE);
@@ -489,7 +493,7 @@ get_trading_split (Transaction *trans, Account *root,
}
ns_account = xaccScrubUtilityGetOrMakeAccount (trading_account,
- default_currency,
+ NULL,
gnc_commodity_get_namespace(commodity),
ACCT_TYPE_TRADING,
TRUE, TRUE);
@@ -1451,42 +1455,91 @@ xaccAccountScrubColorNotSet (QofBook *book)
/* ================================================================ */
+static Account*
+construct_account (Account *root, gnc_commodity *currency, const char *accname,
+ GNCAccountType acctype, gboolean placeholder)
+{
+ gnc_commodity* root_currency = find_root_currency ();
+ Account *acc = xaccMallocAccount(gnc_account_get_book (root));
+ xaccAccountBeginEdit (acc);
+ if (accname && *accname)
+ xaccAccountSetName (acc, accname);
+ if (currency || root_currency)
+ xaccAccountSetCommodity (acc, currency ? currency : root_currency);
+ xaccAccountSetType (acc, acctype);
+ xaccAccountSetPlaceholder (acc, placeholder);
+
+ /* Hang the account off the root. */
+ gnc_account_append_child (root, acc);
+ xaccAccountCommitEdit (acc);
+ return acc;
+}
+
+static Account*
+find_root_currency_account_in_list (GList *acc_list)
+{
+ gnc_commodity* root_currency = find_root_currency();
+ for (GList *node = acc_list; node; node = g_list_next (node))
+ {
+ Account *acc = GNC_ACCOUNT (node->data);
+ gnc_commodity *acc_commodity = NULL;
+ if (G_UNLIKELY (!acc)) continue;
+ acc_commodity = xaccAccountGetCommodity(acc);
+ if (gnc_commodity_equiv (acc_commodity, root_currency))
+ return acc;
+ }
+
+ return NULL;
+}
+
+static Account*
+find_account_matching_name_in_list (GList *acc_list, const char* accname)
+{
+ for (GList* node = acc_list; node; node = g_list_next(node))
+ {
+ Account *acc = GNC_ACCOUNT (node->data);
+ if (G_UNLIKELY (!acc)) continue;
+ if (g_strcmp0 (accname, xaccAccountGetName(acc)))
+ {
+ g_list_free (acc_list);
+ return acc;
+ }
+ }
+ return NULL;
+}
+
Account *
xaccScrubUtilityGetOrMakeAccount (Account *root, gnc_commodity * currency,
const char *accname, GNCAccountType acctype,
gboolean placeholder, gboolean checkname)
{
- Account * acc;
+ GList* acc_list;
+ Account *acc = NULL;
g_return_val_if_fail (root, NULL);
- /* build the account name */
- if (!currency)
- {
- PERR ("No currency specified!");
- return NULL;
- }
+ acc_list =
+ gnc_account_lookup_by_type_and_commodity (root,
+ checkname ? accname : NULL,
+ acctype, currency);
- /* See if we've got one of these going already ... */
- acc = gnc_account_lookup_by_type_and_commodity (root,
- checkname ? accname : NULL,
- acctype, currency);
+ if (!acc_list)
+ return construct_account (root, currency, accname,
+ acctype, placeholder);
- if (acc == NULL)
+ if (g_list_next(acc_list))
{
- /* Guess not. We'll have to build one. */
- acc = xaccMallocAccount(gnc_account_get_book (root));
- xaccAccountBeginEdit (acc);
- xaccAccountSetName (acc, accname);
- xaccAccountSetCommodity (acc, currency);
- xaccAccountSetType (acc, acctype);
- xaccAccountSetPlaceholder (acc, placeholder);
-
- /* Hang the account off the root. */
- gnc_account_append_child (root, acc);
- xaccAccountCommitEdit (acc);
+ if (!currency)
+ acc = find_root_currency_account_in_list (acc_list);
+
+ if (!acc)
+ acc = find_account_matching_name_in_list (acc_list, accname);
}
+ if (!acc)
+ acc = GNC_ACCOUNT (acc_list->data);
+
+ g_list_free (acc_list);
return acc;
}
commit 18c72baddf3c200252ffd5eac3274351fcec42a7
Author: John Ralls <jralls at ceridwen.us>
Date: Tue May 4 13:20:01 2021 -0700
Don't bother scrubbing for orphans if there's no transaction currency.
If it found one it would try to create an orphan account with no
currency which will crash later.
diff --git a/libgnucash/engine/Scrub.c b/libgnucash/engine/Scrub.c
index c2607fcb6..5e6e9c050 100644
--- a/libgnucash/engine/Scrub.c
+++ b/libgnucash/engine/Scrub.c
@@ -110,6 +110,7 @@ TransScrubOrphansFast (Transaction *trans, Account *root)
if (!trans) return;
g_return_if_fail (root);
+ g_return_if_fail (trans->common_currency);
for (node = trans->splits; node; node = node->next)
{
commit d2a4aef3bb2d89315b8c619e6218b1075885904e
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Tue May 11 18:43:11 2021 +0800
[chartjs] upgrade chartjs to 2.9.4
fixes CVE-2020-7746
diff --git a/borrowed/chartjs/Chart.bundle.js b/borrowed/chartjs/Chart.bundle.js
old mode 100644
new mode 100755
index 622703ebc..59e2b9621
--- a/borrowed/chartjs/Chart.bundle.js
+++ b/borrowed/chartjs/Chart.bundle.js
@@ -1,806 +1,1238 @@
/*!
- * Chart.js v2.8.0
+ * Chart.js v2.9.4
* https://www.chartjs.org
- * (c) 2019 Chart.js Contributors
+ * (c) 2020 Chart.js Contributors
* Released under the MIT License
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
-(global.Chart = factory());
+(global = global || self, global.Chart = factory());
}(this, (function () { 'use strict';
-/* MIT license */
+var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-var conversions = {
- rgb2hsl: rgb2hsl,
- rgb2hsv: rgb2hsv,
- rgb2hwb: rgb2hwb,
- rgb2cmyk: rgb2cmyk,
- rgb2keyword: rgb2keyword,
- rgb2xyz: rgb2xyz,
- rgb2lab: rgb2lab,
- rgb2lch: rgb2lch,
-
- hsl2rgb: hsl2rgb,
- hsl2hsv: hsl2hsv,
- hsl2hwb: hsl2hwb,
- hsl2cmyk: hsl2cmyk,
- hsl2keyword: hsl2keyword,
-
- hsv2rgb: hsv2rgb,
- hsv2hsl: hsv2hsl,
- hsv2hwb: hsv2hwb,
- hsv2cmyk: hsv2cmyk,
- hsv2keyword: hsv2keyword,
-
- hwb2rgb: hwb2rgb,
- hwb2hsl: hwb2hsl,
- hwb2hsv: hwb2hsv,
- hwb2cmyk: hwb2cmyk,
- hwb2keyword: hwb2keyword,
-
- cmyk2rgb: cmyk2rgb,
- cmyk2hsl: cmyk2hsl,
- cmyk2hsv: cmyk2hsv,
- cmyk2hwb: cmyk2hwb,
- cmyk2keyword: cmyk2keyword,
-
- keyword2rgb: keyword2rgb,
- keyword2hsl: keyword2hsl,
- keyword2hsv: keyword2hsv,
- keyword2hwb: keyword2hwb,
- keyword2cmyk: keyword2cmyk,
- keyword2lab: keyword2lab,
- keyword2xyz: keyword2xyz,
-
- xyz2rgb: xyz2rgb,
- xyz2lab: xyz2lab,
- xyz2lch: xyz2lch,
-
- lab2xyz: lab2xyz,
- lab2rgb: lab2rgb,
- lab2lch: lab2lch,
-
- lch2lab: lch2lab,
- lch2xyz: lch2xyz,
- lch2rgb: lch2rgb
+function commonjsRequire () {
+ throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
+}
+
+function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+}
+
+function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+}
+
+var colorName = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
};
+var conversions = createCommonjsModule(function (module) {
+/* MIT license */
-function rgb2hsl(rgb) {
- var r = rgb[0]/255,
- g = rgb[1]/255,
- b = rgb[2]/255,
- min = Math.min(r, g, b),
- max = Math.max(r, g, b),
- delta = max - min,
- h, s, l;
- if (max == min)
- h = 0;
- else if (r == max)
- h = (g - b) / delta;
- else if (g == max)
- h = 2 + (b - r) / delta;
- else if (b == max)
- h = 4 + (r - g)/ delta;
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+// values that give correct `typeof` results).
+// do not use box values types (i.e. Number(), String(), etc.)
- h = Math.min(h * 60, 360);
+var reverseKeywords = {};
+for (var key in colorName) {
+ if (colorName.hasOwnProperty(key)) {
+ reverseKeywords[colorName[key]] = key;
+ }
+}
- if (h < 0)
- h += 360;
+var convert = module.exports = {
+ rgb: {channels: 3, labels: 'rgb'},
+ hsl: {channels: 3, labels: 'hsl'},
+ hsv: {channels: 3, labels: 'hsv'},
+ hwb: {channels: 3, labels: 'hwb'},
+ cmyk: {channels: 4, labels: 'cmyk'},
+ xyz: {channels: 3, labels: 'xyz'},
+ lab: {channels: 3, labels: 'lab'},
+ lch: {channels: 3, labels: 'lch'},
+ hex: {channels: 1, labels: ['hex']},
+ keyword: {channels: 1, labels: ['keyword']},
+ ansi16: {channels: 1, labels: ['ansi16']},
+ ansi256: {channels: 1, labels: ['ansi256']},
+ hcg: {channels: 3, labels: ['h', 'c', 'g']},
+ apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+ gray: {channels: 1, labels: ['gray']}
+};
- l = (min + max) / 2;
+// hide .channels and .labels properties
+for (var model in convert) {
+ if (convert.hasOwnProperty(model)) {
+ if (!('channels' in convert[model])) {
+ throw new Error('missing channels property: ' + model);
+ }
- if (max == min)
- s = 0;
- else if (l <= 0.5)
- s = delta / (max + min);
- else
- s = delta / (2 - max - min);
+ if (!('labels' in convert[model])) {
+ throw new Error('missing channel labels property: ' + model);
+ }
- return [h, s * 100, l * 100];
-}
+ if (convert[model].labels.length !== convert[model].channels) {
+ throw new Error('channel and label counts mismatch: ' + model);
+ }
-function rgb2hsv(rgb) {
- var r = rgb[0],
- g = rgb[1],
- b = rgb[2],
- min = Math.min(r, g, b),
- max = Math.max(r, g, b),
- delta = max - min,
- h, s, v;
-
- if (max == 0)
- s = 0;
- else
- s = (delta/max * 1000)/10;
-
- if (max == min)
- h = 0;
- else if (r == max)
- h = (g - b) / delta;
- else if (g == max)
- h = 2 + (b - r) / delta;
- else if (b == max)
- h = 4 + (r - g) / delta;
-
- h = Math.min(h * 60, 360);
-
- if (h < 0)
- h += 360;
-
- v = ((max / 255) * 1000) / 10;
-
- return [h, s, v];
+ var channels = convert[model].channels;
+ var labels = convert[model].labels;
+ delete convert[model].channels;
+ delete convert[model].labels;
+ Object.defineProperty(convert[model], 'channels', {value: channels});
+ Object.defineProperty(convert[model], 'labels', {value: labels});
+ }
}
-function rgb2hwb(rgb) {
- var r = rgb[0],
- g = rgb[1],
- b = rgb[2],
- h = rgb2hsl(rgb)[0],
- w = 1/255 * Math.min(r, Math.min(g, b)),
- b = 1 - 1/255 * Math.max(r, Math.max(g, b));
+convert.rgb.hsl = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var min = Math.min(r, g, b);
+ var max = Math.max(r, g, b);
+ var delta = max - min;
+ var h;
+ var s;
+ var l;
+
+ if (max === min) {
+ h = 0;
+ } else if (r === max) {
+ h = (g - b) / delta;
+ } else if (g === max) {
+ h = 2 + (b - r) / delta;
+ } else if (b === max) {
+ h = 4 + (r - g) / delta;
+ }
- return [h, w * 100, b * 100];
-}
+ h = Math.min(h * 60, 360);
-function rgb2cmyk(rgb) {
- var r = rgb[0] / 255,
- g = rgb[1] / 255,
- b = rgb[2] / 255,
- c, m, y, k;
-
- k = Math.min(1 - r, 1 - g, 1 - b);
- c = (1 - r - k) / (1 - k) || 0;
- m = (1 - g - k) / (1 - k) || 0;
- y = (1 - b - k) / (1 - k) || 0;
- return [c * 100, m * 100, y * 100, k * 100];
-}
+ if (h < 0) {
+ h += 360;
+ }
-function rgb2keyword(rgb) {
- return reverseKeywords[JSON.stringify(rgb)];
-}
+ l = (min + max) / 2;
-function rgb2xyz(rgb) {
- var r = rgb[0] / 255,
- g = rgb[1] / 255,
- b = rgb[2] / 255;
+ if (max === min) {
+ s = 0;
+ } else if (l <= 0.5) {
+ s = delta / (max + min);
+ } else {
+ s = delta / (2 - max - min);
+ }
- // assume sRGB
- r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
- g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
- b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
+ return [h, s * 100, l * 100];
+};
- var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
- var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
- var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+convert.rgb.hsv = function (rgb) {
+ var rdif;
+ var gdif;
+ var bdif;
+ var h;
+ var s;
+
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var v = Math.max(r, g, b);
+ var diff = v - Math.min(r, g, b);
+ var diffc = function (c) {
+ return (v - c) / 6 / diff + 1 / 2;
+ };
- return [x * 100, y *100, z * 100];
-}
+ if (diff === 0) {
+ h = s = 0;
+ } else {
+ s = diff / v;
+ rdif = diffc(r);
+ gdif = diffc(g);
+ bdif = diffc(b);
+
+ if (r === v) {
+ h = bdif - gdif;
+ } else if (g === v) {
+ h = (1 / 3) + rdif - bdif;
+ } else if (b === v) {
+ h = (2 / 3) + gdif - rdif;
+ }
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ }
-function rgb2lab(rgb) {
- var xyz = rgb2xyz(rgb),
- x = xyz[0],
- y = xyz[1],
- z = xyz[2],
- l, a, b;
+ return [
+ h * 360,
+ s * 100,
+ v * 100
+ ];
+};
- x /= 95.047;
- y /= 100;
- z /= 108.883;
+convert.rgb.hwb = function (rgb) {
+ var r = rgb[0];
+ var g = rgb[1];
+ var b = rgb[2];
+ var h = convert.rgb.hsl(rgb)[0];
+ var w = 1 / 255 * Math.min(r, Math.min(g, b));
- x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
+ return [h, w * 100, b * 100];
+};
- return [l, a, b];
-}
+convert.rgb.cmyk = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var c;
+ var m;
+ var y;
+ var k;
+
+ k = Math.min(1 - r, 1 - g, 1 - b);
+ c = (1 - r - k) / (1 - k) || 0;
+ m = (1 - g - k) / (1 - k) || 0;
+ y = (1 - b - k) / (1 - k) || 0;
+
+ return [c * 100, m * 100, y * 100, k * 100];
+};
-function rgb2lch(args) {
- return lab2lch(rgb2lab(args));
+/**
+ * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+ * */
+function comparativeDistance(x, y) {
+ return (
+ Math.pow(x[0] - y[0], 2) +
+ Math.pow(x[1] - y[1], 2) +
+ Math.pow(x[2] - y[2], 2)
+ );
}
-function hsl2rgb(hsl) {
- var h = hsl[0] / 360,
- s = hsl[1] / 100,
- l = hsl[2] / 100,
- t1, t2, t3, rgb, val;
-
- if (s == 0) {
- val = l * 255;
- return [val, val, val];
- }
-
- if (l < 0.5)
- t2 = l * (1 + s);
- else
- t2 = l + s - l * s;
- t1 = 2 * l - t2;
-
- rgb = [0, 0, 0];
- for (var i = 0; i < 3; i++) {
- t3 = h + 1 / 3 * - (i - 1);
- t3 < 0 && t3++;
- t3 > 1 && t3--;
-
- if (6 * t3 < 1)
- val = t1 + (t2 - t1) * 6 * t3;
- else if (2 * t3 < 1)
- val = t2;
- else if (3 * t3 < 2)
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
- else
- val = t1;
-
- rgb[i] = val * 255;
- }
-
- return rgb;
-}
+convert.rgb.keyword = function (rgb) {
+ var reversed = reverseKeywords[rgb];
+ if (reversed) {
+ return reversed;
+ }
-function hsl2hsv(hsl) {
- var h = hsl[0],
- s = hsl[1] / 100,
- l = hsl[2] / 100,
- sv, v;
-
- if(l === 0) {
- // no need to do calc on black
- // also avoids divide by 0 error
- return [0, 0, 0];
- }
-
- l *= 2;
- s *= (l <= 1) ? l : 2 - l;
- v = (l + s) / 2;
- sv = (2 * s) / (l + s);
- return [h, sv * 100, v * 100];
-}
+ var currentClosestDistance = Infinity;
+ var currentClosestKeyword;
-function hsl2hwb(args) {
- return rgb2hwb(hsl2rgb(args));
-}
+ for (var keyword in colorName) {
+ if (colorName.hasOwnProperty(keyword)) {
+ var value = colorName[keyword];
-function hsl2cmyk(args) {
- return rgb2cmyk(hsl2rgb(args));
-}
+ // Compute comparative distance
+ var distance = comparativeDistance(rgb, value);
-function hsl2keyword(args) {
- return rgb2keyword(hsl2rgb(args));
-}
+ // Check if its less, if so set as closest
+ if (distance < currentClosestDistance) {
+ currentClosestDistance = distance;
+ currentClosestKeyword = keyword;
+ }
+ }
+ }
+ return currentClosestKeyword;
+};
-function hsv2rgb(hsv) {
- var h = hsv[0] / 60,
- s = hsv[1] / 100,
- v = hsv[2] / 100,
- hi = Math.floor(h) % 6;
-
- var f = h - Math.floor(h),
- p = 255 * v * (1 - s),
- q = 255 * v * (1 - (s * f)),
- t = 255 * v * (1 - (s * (1 - f))),
- v = 255 * v;
-
- switch(hi) {
- case 0:
- return [v, t, p];
- case 1:
- return [q, v, p];
- case 2:
- return [p, v, t];
- case 3:
- return [p, q, v];
- case 4:
- return [t, p, v];
- case 5:
- return [v, p, q];
- }
-}
+convert.keyword.rgb = function (keyword) {
+ return colorName[keyword];
+};
-function hsv2hsl(hsv) {
- var h = hsv[0],
- s = hsv[1] / 100,
- v = hsv[2] / 100,
- sl, l;
-
- l = (2 - s) * v;
- sl = s * v;
- sl /= (l <= 1) ? l : 2 - l;
- sl = sl || 0;
- l /= 2;
- return [h, sl * 100, l * 100];
-}
+convert.rgb.xyz = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
-function hsv2hwb(args) {
- return rgb2hwb(hsv2rgb(args))
-}
+ // assume sRGB
+ r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
+ g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
+ b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
-function hsv2cmyk(args) {
- return rgb2cmyk(hsv2rgb(args));
-}
+ var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+ var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+ var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
-function hsv2keyword(args) {
- return rgb2keyword(hsv2rgb(args));
-}
+ return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+ var xyz = convert.rgb.xyz(rgb);
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+ var h = hsl[0] / 360;
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var t1;
+ var t2;
+ var t3;
+ var rgb;
+ var val;
+
+ if (s === 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
+
+ if (l < 0.5) {
+ t2 = l * (1 + s);
+ } else {
+ t2 = l + s - l * s;
+ }
+
+ t1 = 2 * l - t2;
+
+ rgb = [0, 0, 0];
+ for (var i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ if (t3 < 0) {
+ t3++;
+ }
+ if (t3 > 1) {
+ t3--;
+ }
+
+ if (6 * t3 < 1) {
+ val = t1 + (t2 - t1) * 6 * t3;
+ } else if (2 * t3 < 1) {
+ val = t2;
+ } else if (3 * t3 < 2) {
+ val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+ } else {
+ val = t1;
+ }
+
+ rgb[i] = val * 255;
+ }
+
+ return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+ var h = hsl[0];
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var smin = s;
+ var lmin = Math.max(l, 0.01);
+ var sv;
+ var v;
+
+ l *= 2;
+ s *= (l <= 1) ? l : 2 - l;
+ smin *= lmin <= 1 ? lmin : 2 - lmin;
+ v = (l + s) / 2;
+ sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+ return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+ var h = hsv[0] / 60;
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var hi = Math.floor(h) % 6;
+
+ var f = h - Math.floor(h);
+ var p = 255 * v * (1 - s);
+ var q = 255 * v * (1 - (s * f));
+ var t = 255 * v * (1 - (s * (1 - f)));
+ v *= 255;
+
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+};
+
+convert.hsv.hsl = function (hsv) {
+ var h = hsv[0];
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var vmin = Math.max(v, 0.01);
+ var lmin;
+ var sl;
+ var l;
+
+ l = (2 - s) * v;
+ lmin = (2 - s) * vmin;
+ sl = s * vmin;
+ sl /= (lmin <= 1) ? lmin : 2 - lmin;
+ sl = sl || 0;
+ l /= 2;
+
+ return [h, sl * 100, l * 100];
+};
// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
-function hwb2rgb(hwb) {
- var h = hwb[0] / 360,
- wh = hwb[1] / 100,
- bl = hwb[2] / 100,
- ratio = wh + bl,
- i, v, f, n;
-
- // wh + bl cant be > 1
- if (ratio > 1) {
- wh /= ratio;
- bl /= ratio;
- }
-
- i = Math.floor(6 * h);
- v = 1 - bl;
- f = 6 * h - i;
- if ((i & 0x01) != 0) {
- f = 1 - f;
- }
- n = wh + f * (v - wh); // linear interpolation
-
- switch (i) {
- default:
- case 6:
- case 0: r = v; g = n; b = wh; break;
- case 1: r = n; g = v; b = wh; break;
- case 2: r = wh; g = v; b = n; break;
- case 3: r = wh; g = n; b = v; break;
- case 4: r = n; g = wh; b = v; break;
- case 5: r = v; g = wh; b = n; break;
- }
-
- return [r * 255, g * 255, b * 255];
-}
+convert.hwb.rgb = function (hwb) {
+ var h = hwb[0] / 360;
+ var wh = hwb[1] / 100;
+ var bl = hwb[2] / 100;
+ var ratio = wh + bl;
+ var i;
+ var v;
+ var f;
+ var n;
+
+ // wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
-function hwb2hsl(args) {
- return rgb2hsl(hwb2rgb(args));
-}
+ i = Math.floor(6 * h);
+ v = 1 - bl;
+ f = 6 * h - i;
-function hwb2hsv(args) {
- return rgb2hsv(hwb2rgb(args));
-}
+ if ((i & 0x01) !== 0) {
+ f = 1 - f;
+ }
-function hwb2cmyk(args) {
- return rgb2cmyk(hwb2rgb(args));
-}
+ n = wh + f * (v - wh); // linear interpolation
-function hwb2keyword(args) {
- return rgb2keyword(hwb2rgb(args));
-}
+ var r;
+ var g;
+ var b;
+ switch (i) {
+ default:
+ case 6:
+ case 0: r = v; g = n; b = wh; break;
+ case 1: r = n; g = v; b = wh; break;
+ case 2: r = wh; g = v; b = n; break;
+ case 3: r = wh; g = n; b = v; break;
+ case 4: r = n; g = wh; b = v; break;
+ case 5: r = v; g = wh; b = n; break;
+ }
-function cmyk2rgb(cmyk) {
- var c = cmyk[0] / 100,
- m = cmyk[1] / 100,
- y = cmyk[2] / 100,
- k = cmyk[3] / 100,
- r, g, b;
-
- r = 1 - Math.min(1, c * (1 - k) + k);
- g = 1 - Math.min(1, m * (1 - k) + k);
- b = 1 - Math.min(1, y * (1 - k) + k);
- return [r * 255, g * 255, b * 255];
-}
+ return [r * 255, g * 255, b * 255];
+};
-function cmyk2hsl(args) {
- return rgb2hsl(cmyk2rgb(args));
-}
+convert.cmyk.rgb = function (cmyk) {
+ var c = cmyk[0] / 100;
+ var m = cmyk[1] / 100;
+ var y = cmyk[2] / 100;
+ var k = cmyk[3] / 100;
+ var r;
+ var g;
+ var b;
-function cmyk2hsv(args) {
- return rgb2hsv(cmyk2rgb(args));
-}
+ r = 1 - Math.min(1, c * (1 - k) + k);
+ g = 1 - Math.min(1, m * (1 - k) + k);
+ b = 1 - Math.min(1, y * (1 - k) + k);
-function cmyk2hwb(args) {
- return rgb2hwb(cmyk2rgb(args));
-}
+ return [r * 255, g * 255, b * 255];
+};
-function cmyk2keyword(args) {
- return rgb2keyword(cmyk2rgb(args));
-}
+convert.xyz.rgb = function (xyz) {
+ var x = xyz[0] / 100;
+ var y = xyz[1] / 100;
+ var z = xyz[2] / 100;
+ var r;
+ var g;
+ var b;
+ r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+ g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+ b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
-function xyz2rgb(xyz) {
- var x = xyz[0] / 100,
- y = xyz[1] / 100,
- z = xyz[2] / 100,
- r, g, b;
+ // assume sRGB
+ r = r > 0.0031308
+ ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
+ : r * 12.92;
- r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
- g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
- b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+ g = g > 0.0031308
+ ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
+ : g * 12.92;
- // assume sRGB
- r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
- : r = (r * 12.92);
+ b = b > 0.0031308
+ ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
+ : b * 12.92;
- g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
- : g = (g * 12.92);
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
- b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
- : b = (b * 12.92);
+ return [r * 255, g * 255, b * 255];
+};
- r = Math.min(Math.max(0, r), 1);
- g = Math.min(Math.max(0, g), 1);
- b = Math.min(Math.max(0, b), 1);
+convert.xyz.lab = function (xyz) {
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
- return [r * 255, g * 255, b * 255];
-}
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
-function xyz2lab(xyz) {
- var x = xyz[0],
- y = xyz[1],
- z = xyz[2],
- l, a, b;
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
- x /= 95.047;
- y /= 100;
- z /= 108.883;
+ return [l, a, b];
+};
- x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
+convert.lab.xyz = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var x;
+ var y;
+ var z;
+
+ y = (l + 16) / 116;
+ x = a / 500 + y;
+ z = y - b / 200;
+
+ var y2 = Math.pow(y, 3);
+ var x2 = Math.pow(x, 3);
+ var z2 = Math.pow(z, 3);
+ y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+ x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+ z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+ x *= 95.047;
+ y *= 100;
+ z *= 108.883;
+
+ return [x, y, z];
+};
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
+convert.lab.lch = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var hr;
+ var h;
+ var c;
- return [l, a, b];
-}
+ hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
-function xyz2lch(args) {
- return lab2lch(xyz2lab(args));
-}
+ if (h < 0) {
+ h += 360;
+ }
-function lab2xyz(lab) {
- var l = lab[0],
- a = lab[1],
- b = lab[2],
- x, y, z, y2;
+ c = Math.sqrt(a * a + b * b);
- if (l <= 8) {
- y = (l * 100) / 903.3;
- y2 = (7.787 * (y / 100)) + (16 / 116);
- } else {
- y = 100 * Math.pow((l + 16) / 116, 3);
- y2 = Math.pow(y / 100, 1/3);
- }
+ return [l, c, h];
+};
- x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);
+convert.lch.lab = function (lch) {
+ var l = lch[0];
+ var c = lch[1];
+ var h = lch[2];
+ var a;
+ var b;
+ var hr;
- z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);
+ hr = h / 360 * 2 * Math.PI;
+ a = c * Math.cos(hr);
+ b = c * Math.sin(hr);
- return [x, y, z];
-}
+ return [l, a, b];
+};
-function lab2lch(lab) {
- var l = lab[0],
- a = lab[1],
- b = lab[2],
- hr, h, c;
-
- hr = Math.atan2(b, a);
- h = hr * 360 / 2 / Math.PI;
- if (h < 0) {
- h += 360;
- }
- c = Math.sqrt(a * a + b * b);
- return [l, c, h];
-}
+convert.rgb.ansi16 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+ var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
-function lab2rgb(args) {
- return xyz2rgb(lab2xyz(args));
-}
+ value = Math.round(value / 50);
+
+ if (value === 0) {
+ return 30;
+ }
+
+ var ansi = 30
+ + ((Math.round(b / 255) << 2)
+ | (Math.round(g / 255) << 1)
+ | Math.round(r / 255));
+
+ if (value === 2) {
+ ansi += 60;
+ }
+
+ return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+ // optimization here; we already know the value and don't need to get
+ // it converted for us.
+ return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+
+ // we use the extended greyscale palette here, with the exception of
+ // black and white. normal palette only has 4 greyscale shades.
+ if (r === g && g === b) {
+ if (r < 8) {
+ return 16;
+ }
+
+ if (r > 248) {
+ return 231;
+ }
+
+ return Math.round(((r - 8) / 247) * 24) + 232;
+ }
+
+ var ansi = 16
+ + (36 * Math.round(r / 255 * 5))
+ + (6 * Math.round(g / 255 * 5))
+ + Math.round(b / 255 * 5);
+
+ return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+ var color = args % 10;
+
+ // handle greyscale
+ if (color === 0 || color === 7) {
+ if (args > 50) {
+ color += 3.5;
+ }
+
+ color = color / 10.5 * 255;
+
+ return [color, color, color];
+ }
+
+ var mult = (~~(args > 50) + 1) * 0.5;
+ var r = ((color & 1) * mult) * 255;
+ var g = (((color >> 1) & 1) * mult) * 255;
+ var b = (((color >> 2) & 1) * mult) * 255;
+
+ return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+ // handle greyscale
+ if (args >= 232) {
+ var c = (args - 232) * 10 + 8;
+ return [c, c, c];
+ }
+
+ args -= 16;
+
+ var rem;
+ var r = Math.floor(args / 36) / 5 * 255;
+ var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+ var b = (rem % 6) / 5 * 255;
+
+ return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+ var integer = ((Math.round(args[0]) & 0xFF) << 16)
+ + ((Math.round(args[1]) & 0xFF) << 8)
+ + (Math.round(args[2]) & 0xFF);
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+ var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+ if (!match) {
+ return [0, 0, 0];
+ }
+
+ var colorString = match[0];
+
+ if (match[0].length === 3) {
+ colorString = colorString.split('').map(function (char) {
+ return char + char;
+ }).join('');
+ }
+
+ var integer = parseInt(colorString, 16);
+ var r = (integer >> 16) & 0xFF;
+ var g = (integer >> 8) & 0xFF;
+ var b = integer & 0xFF;
+
+ return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var max = Math.max(Math.max(r, g), b);
+ var min = Math.min(Math.min(r, g), b);
+ var chroma = (max - min);
+ var grayscale;
+ var hue;
+
+ if (chroma < 1) {
+ grayscale = min / (1 - chroma);
+ } else {
+ grayscale = 0;
+ }
+
+ if (chroma <= 0) {
+ hue = 0;
+ } else
+ if (max === r) {
+ hue = ((g - b) / chroma) % 6;
+ } else
+ if (max === g) {
+ hue = 2 + (b - r) / chroma;
+ } else {
+ hue = 4 + (r - g) / chroma + 4;
+ }
+
+ hue /= 6;
+ hue %= 1;
+
+ return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var c = 1;
+ var f = 0;
+
+ if (l < 0.5) {
+ c = 2.0 * s * l;
+ } else {
+ c = 2.0 * s * (1.0 - l);
+ }
+
+ if (c < 1.0) {
+ f = (l - 0.5 * c) / (1.0 - c);
+ }
+
+ return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+
+ var c = s * v;
+ var f = 0;
+
+ if (c < 1.0) {
+ f = (v - c) / (1 - c);
+ }
+
+ return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+ var h = hcg[0] / 360;
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ if (c === 0.0) {
+ return [g * 255, g * 255, g * 255];
+ }
+
+ var pure = [0, 0, 0];
+ var hi = (h % 1) * 6;
+ var v = hi % 1;
+ var w = 1 - v;
+ var mg = 0;
+
+ switch (Math.floor(hi)) {
+ case 0:
+ pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+ case 1:
+ pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+ case 2:
+ pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+ case 3:
+ pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+ case 4:
+ pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+ default:
+ pure[0] = 1; pure[1] = 0; pure[2] = w;
+ }
+
+ mg = (1.0 - c) * g;
+
+ return [
+ (c * pure[0] + mg) * 255,
+ (c * pure[1] + mg) * 255,
+ (c * pure[2] + mg) * 255
+ ];
+};
+
+convert.hcg.hsv = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var v = c + g * (1.0 - c);
+ var f = 0;
+
+ if (v > 0.0) {
+ f = c / v;
+ }
+
+ return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var l = g * (1.0 - c) + 0.5 * c;
+ var s = 0;
+
+ if (l > 0.0 && l < 0.5) {
+ s = c / (2 * l);
+ } else
+ if (l >= 0.5 && l < 1.0) {
+ s = c / (2 * (1 - l));
+ }
+
+ return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+ var v = c + g * (1.0 - c);
+ return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+ var w = hwb[1] / 100;
+ var b = hwb[2] / 100;
+ var v = 1 - b;
+ var c = v - w;
+ var g = 0;
-function lch2lab(lch) {
- var l = lch[0],
- c = lch[1],
- h = lch[2],
- a, b, hr;
+ if (c < 1) {
+ g = (v - c) / (1 - c);
+ }
+
+ return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+ return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+ return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+ return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = convert.gray.hsv = function (args) {
+ return [0, 0, args[0]];
+};
+
+convert.gray.hwb = function (gray) {
+ return [0, 100, gray[0]];
+};
- hr = h / 360 * 2 * Math.PI;
- a = c * Math.cos(hr);
- b = c * Math.sin(hr);
- return [l, a, b];
+convert.gray.cmyk = function (gray) {
+ return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+ return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+ var val = Math.round(gray[0] / 100 * 255) & 0xFF;
+ var integer = (val << 16) + (val << 8) + val;
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+ var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+ return [val / 255 * 100];
+};
+});
+var conversions_1 = conversions.rgb;
+var conversions_2 = conversions.hsl;
+var conversions_3 = conversions.hsv;
+var conversions_4 = conversions.hwb;
+var conversions_5 = conversions.cmyk;
+var conversions_6 = conversions.xyz;
+var conversions_7 = conversions.lab;
+var conversions_8 = conversions.lch;
+var conversions_9 = conversions.hex;
+var conversions_10 = conversions.keyword;
+var conversions_11 = conversions.ansi16;
+var conversions_12 = conversions.ansi256;
+var conversions_13 = conversions.hcg;
+var conversions_14 = conversions.apple;
+var conversions_15 = conversions.gray;
+
+/*
+ this function routes a model to all other models.
+
+ all functions that are routed have a property `.conversion` attached
+ to the returned synthetic function. This property is an array
+ of strings, each with the steps in between the 'from' and 'to'
+ color models (inclusive).
+
+ conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+ var graph = {};
+ // https://jsperf.com/object-keys-vs-for-in-with-closure/3
+ var models = Object.keys(conversions);
+
+ for (var len = models.length, i = 0; i < len; i++) {
+ graph[models[i]] = {
+ // http://jsperf.com/1-vs-infinity
+ // micro-opt, but this is simple.
+ distance: -1,
+ parent: null
+ };
+ }
+
+ return graph;
}
-function lch2xyz(args) {
- return lab2xyz(lch2lab(args));
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+ var graph = buildGraph();
+ var queue = [fromModel]; // unshift -> queue -> pop
+
+ graph[fromModel].distance = 0;
+
+ while (queue.length) {
+ var current = queue.pop();
+ var adjacents = Object.keys(conversions[current]);
+
+ for (var len = adjacents.length, i = 0; i < len; i++) {
+ var adjacent = adjacents[i];
+ var node = graph[adjacent];
+
+ if (node.distance === -1) {
+ node.distance = graph[current].distance + 1;
+ node.parent = current;
+ queue.unshift(adjacent);
+ }
+ }
+ }
+
+ return graph;
}
-function lch2rgb(args) {
- return lab2rgb(lch2lab(args));
+function link(from, to) {
+ return function (args) {
+ return to(from(args));
+ };
}
-function keyword2rgb(keyword) {
- return cssKeywords[keyword];
+function wrapConversion(toModel, graph) {
+ var path = [graph[toModel].parent, toModel];
+ var fn = conversions[graph[toModel].parent][toModel];
+
+ var cur = graph[toModel].parent;
+ while (graph[cur].parent) {
+ path.unshift(graph[cur].parent);
+ fn = link(conversions[graph[cur].parent][cur], fn);
+ cur = graph[cur].parent;
+ }
+
+ fn.conversion = path;
+ return fn;
}
-function keyword2hsl(args) {
- return rgb2hsl(keyword2rgb(args));
-}
+var route = function (fromModel) {
+ var graph = deriveBFS(fromModel);
+ var conversion = {};
+
+ var models = Object.keys(graph);
+ for (var len = models.length, i = 0; i < len; i++) {
+ var toModel = models[i];
+ var node = graph[toModel];
+
+ if (node.parent === null) {
+ // no possible conversion, or this node is the source model.
+ continue;
+ }
+
+ conversion[toModel] = wrapConversion(toModel, graph);
+ }
+
+ return conversion;
+};
+
+var convert = {};
+
+var models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
+
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
+
+ return fn(args);
+ };
-function keyword2hsv(args) {
- return rgb2hsv(keyword2rgb(args));
-}
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
-function keyword2hwb(args) {
- return rgb2hwb(keyword2rgb(args));
+ return wrappedFn;
}
-function keyword2cmyk(args) {
- return rgb2cmyk(keyword2rgb(args));
-}
+function wrapRounded(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
-function keyword2lab(args) {
- return rgb2lab(keyword2rgb(args));
-}
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
-function keyword2xyz(args) {
- return rgb2xyz(keyword2rgb(args));
-}
+ var result = fn(args);
-var cssKeywords = {
- aliceblue: [240,248,255],
- antiquewhite: [250,235,215],
- aqua: [0,255,255],
- aquamarine: [127,255,212],
- azure: [240,255,255],
- beige: [245,245,220],
- bisque: [255,228,196],
- black: [0,0,0],
- blanchedalmond: [255,235,205],
- blue: [0,0,255],
- blueviolet: [138,43,226],
- brown: [165,42,42],
- burlywood: [222,184,135],
- cadetblue: [95,158,160],
- chartreuse: [127,255,0],
- chocolate: [210,105,30],
- coral: [255,127,80],
- cornflowerblue: [100,149,237],
- cornsilk: [255,248,220],
- crimson: [220,20,60],
- cyan: [0,255,255],
- darkblue: [0,0,139],
- darkcyan: [0,139,139],
- darkgoldenrod: [184,134,11],
- darkgray: [169,169,169],
- darkgreen: [0,100,0],
- darkgrey: [169,169,169],
- darkkhaki: [189,183,107],
- darkmagenta: [139,0,139],
- darkolivegreen: [85,107,47],
- darkorange: [255,140,0],
- darkorchid: [153,50,204],
- darkred: [139,0,0],
- darksalmon: [233,150,122],
- darkseagreen: [143,188,143],
- darkslateblue: [72,61,139],
- darkslategray: [47,79,79],
- darkslategrey: [47,79,79],
- darkturquoise: [0,206,209],
- darkviolet: [148,0,211],
- deeppink: [255,20,147],
- deepskyblue: [0,191,255],
- dimgray: [105,105,105],
- dimgrey: [105,105,105],
- dodgerblue: [30,144,255],
- firebrick: [178,34,34],
- floralwhite: [255,250,240],
- forestgreen: [34,139,34],
- fuchsia: [255,0,255],
- gainsboro: [220,220,220],
- ghostwhite: [248,248,255],
- gold: [255,215,0],
- goldenrod: [218,165,32],
- gray: [128,128,128],
- green: [0,128,0],
- greenyellow: [173,255,47],
- grey: [128,128,128],
- honeydew: [240,255,240],
- hotpink: [255,105,180],
- indianred: [205,92,92],
- indigo: [75,0,130],
- ivory: [255,255,240],
- khaki: [240,230,140],
- lavender: [230,230,250],
- lavenderblush: [255,240,245],
- lawngreen: [124,252,0],
- lemonchiffon: [255,250,205],
- lightblue: [173,216,230],
- lightcoral: [240,128,128],
- lightcyan: [224,255,255],
- lightgoldenrodyellow: [250,250,210],
- lightgray: [211,211,211],
- lightgreen: [144,238,144],
- lightgrey: [211,211,211],
- lightpink: [255,182,193],
- lightsalmon: [255,160,122],
- lightseagreen: [32,178,170],
- lightskyblue: [135,206,250],
- lightslategray: [119,136,153],
- lightslategrey: [119,136,153],
- lightsteelblue: [176,196,222],
- lightyellow: [255,255,224],
- lime: [0,255,0],
- limegreen: [50,205,50],
- linen: [250,240,230],
- magenta: [255,0,255],
- maroon: [128,0,0],
- mediumaquamarine: [102,205,170],
- mediumblue: [0,0,205],
- mediumorchid: [186,85,211],
- mediumpurple: [147,112,219],
- mediumseagreen: [60,179,113],
- mediumslateblue: [123,104,238],
- mediumspringgreen: [0,250,154],
- mediumturquoise: [72,209,204],
- mediumvioletred: [199,21,133],
- midnightblue: [25,25,112],
- mintcream: [245,255,250],
- mistyrose: [255,228,225],
- moccasin: [255,228,181],
- navajowhite: [255,222,173],
- navy: [0,0,128],
- oldlace: [253,245,230],
- olive: [128,128,0],
- olivedrab: [107,142,35],
- orange: [255,165,0],
- orangered: [255,69,0],
- orchid: [218,112,214],
- palegoldenrod: [238,232,170],
- palegreen: [152,251,152],
- paleturquoise: [175,238,238],
- palevioletred: [219,112,147],
- papayawhip: [255,239,213],
- peachpuff: [255,218,185],
- peru: [205,133,63],
- pink: [255,192,203],
- plum: [221,160,221],
- powderblue: [176,224,230],
- purple: [128,0,128],
- rebeccapurple: [102, 51, 153],
- red: [255,0,0],
- rosybrown: [188,143,143],
- royalblue: [65,105,225],
- saddlebrown: [139,69,19],
- salmon: [250,128,114],
- sandybrown: [244,164,96],
- seagreen: [46,139,87],
- seashell: [255,245,238],
- sienna: [160,82,45],
- silver: [192,192,192],
- skyblue: [135,206,235],
- slateblue: [106,90,205],
- slategray: [112,128,144],
- slategrey: [112,128,144],
- snow: [255,250,250],
- springgreen: [0,255,127],
- steelblue: [70,130,180],
- tan: [210,180,140],
- teal: [0,128,128],
- thistle: [216,191,216],
- tomato: [255,99,71],
- turquoise: [64,224,208],
- violet: [238,130,238],
- wheat: [245,222,179],
- white: [255,255,255],
- whitesmoke: [245,245,245],
- yellow: [255,255,0],
- yellowgreen: [154,205,50]
-};
+ // we're assuming the result is an array here.
+ // see notice in conversions.js; don't use box types
+ // in conversion functions.
+ if (typeof result === 'object') {
+ for (var len = result.length, i = 0; i < len; i++) {
+ result[i] = Math.round(result[i]);
+ }
+ }
-var reverseKeywords = {};
-for (var key in cssKeywords) {
- reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
-}
+ return result;
+ };
-var convert = function() {
- return new Converter();
-};
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
-for (var func in conversions) {
- // export Raw versions
- convert[func + "Raw"] = (function(func) {
- // accept array or plain args
- return function(arg) {
- if (typeof arg == "number")
- arg = Array.prototype.slice.call(arguments);
- return conversions[func](arg);
- }
- })(func);
-
- var pair = /(\w+)2(\w+)/.exec(func),
- from = pair[1],
- to = pair[2];
-
- // export rgb2hsl and ["rgb"]["hsl"]
- convert[from] = convert[from] || {};
-
- convert[from][to] = convert[func] = (function(func) {
- return function(arg) {
- if (typeof arg == "number")
- arg = Array.prototype.slice.call(arguments);
-
- var val = conversions[func](arg);
- if (typeof val == "string" || val === undefined)
- return val; // keyword
-
- for (var i = 0; i < val.length; i++)
- val[i] = Math.round(val[i]);
- return val;
- }
- })(func);
+ return wrappedFn;
}
+models.forEach(function (fromModel) {
+ convert[fromModel] = {};
-/* Converter does lazy conversion and caching */
-var Converter = function() {
- this.convs = {};
-};
-
-/* Either get the values for a space or
- set the values for a space, depending on args */
-Converter.prototype.routeSpace = function(space, args) {
- var values = args[0];
- if (values === undefined) {
- // color.rgb()
- return this.getValues(space);
- }
- // color.rgb(10, 10, 10)
- if (typeof values == "number") {
- values = Array.prototype.slice.call(args);
- }
+ Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+ Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
- return this.setValues(space, values);
-};
-
-/* Set the values for a space, invalidating cache */
-Converter.prototype.setValues = function(space, values) {
- this.space = space;
- this.convs = {};
- this.convs[space] = values;
- return this;
-};
+ var routes = route(fromModel);
+ var routeModels = Object.keys(routes);
-/* Get the values for a space. If there's already
- a conversion for the space, fetch it, otherwise
- compute it */
-Converter.prototype.getValues = function(space) {
- var vals = this.convs[space];
- if (!vals) {
- var fspace = this.space,
- from = this.convs[fspace];
- vals = convert[fspace][space](from);
-
- this.convs[space] = vals;
- }
- return vals;
-};
+ routeModels.forEach(function (toModel) {
+ var fn = routes[toModel];
-["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) {
- Converter.prototype[space] = function(vals) {
- return this.routeSpace(space, arguments);
- };
+ convert[fromModel][toModel] = wrapRounded(fn);
+ convert[fromModel][toModel].raw = wrapRaw(fn);
+ });
});
var colorConvert = convert;
-var colorName = {
+var colorName$1 = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
@@ -1023,7 +1455,7 @@ function getRgba(string) {
if (match[1] == "transparent") {
return [0, 0, 0, 0];
}
- rgb = colorName[match[1]];
+ rgb = colorName$1[match[1]];
if (!rgb) {
return;
}
@@ -1185,8 +1617,8 @@ function hexDouble(num) {
//create a list of reverse color names
var reverseNames = {};
-for (var name in colorName) {
- reverseNames[colorName[name]] = name;
+for (var name in colorName$1) {
+ reverseNames[colorName$1[name]] = name;
}
/* MIT license */
@@ -1675,6 +2107,10 @@ if (typeof window !== 'undefined') {
var chartjsColor = Color;
+function isValidKey(key) {
+ return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;
+}
+
/**
* @namespace Chart.helpers
*/
@@ -1850,7 +2286,7 @@ var helpers = {
}
if (helpers.isObject(source)) {
- var target = {};
+ var target = Object.create(source);
var keys = Object.keys(source);
var klen = keys.length;
var k = 0;
@@ -1871,6 +2307,12 @@ var helpers = {
* @private
*/
_merger: function(key, target, source, options) {
+ if (!isValidKey(key)) {
+ // We want to ensure we do not copy prototypes over
+ // as this can pollute global namespaces
+ return;
+ }
+
var tval = target[key];
var sval = source[key];
@@ -1886,6 +2328,12 @@ var helpers = {
* @private
*/
_mergerIf: function(key, target, source) {
+ if (!isValidKey(key)) {
+ // We want to ensure we do not copy prototypes over
+ // as this can pollute global namespaces
+ return;
+ }
+
var tval = target[key];
var sval = source[key];
@@ -1950,14 +2398,12 @@ var helpers = {
* @param {object} argN - Additional objects containing properties to merge in target.
* @returns {object} The `target` object.
*/
- extend: function(target) {
- var setFn = function(value, key) {
- target[key] = value;
- };
- for (var i = 1, ilen = arguments.length; i < ilen; ++i) {
- helpers.each(arguments[i], setFn);
- }
- return target;
+ extend: Object.assign || function(target) {
+ return helpers.merge(target, [].slice.call(arguments, 1), {
+ merger: function(key, dst, src) {
+ dst[key] = src[key];
+ }
+ });
},
/**
@@ -1983,6 +2429,13 @@ var helpers = {
ChartElement.__super__ = me.prototype;
return ChartElement;
+ },
+
+ _deprecated: function(scope, value, previous, current) {
+ if (value !== undefined) {
+ console.warn(scope + ': "' + previous +
+ '" is deprecated. Please use "' + current + '" instead');
+ }
}
};
@@ -2344,7 +2797,11 @@ var exports$1 = {
if (style && typeof style === 'object') {
type = style.toString();
if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
- ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);
+ ctx.save();
+ ctx.translate(x, y);
+ ctx.rotate(rad);
+ ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);
+ ctx.restore();
return;
}
}
@@ -2536,6 +2993,8 @@ var defaults = {
}
};
+// TODO(v3): remove 'global' from namespace. all default are global and
+// there's inconsistency around which options are under 'global'
defaults._set('global', {
defaultColor: 'rgba(0,0,0,0.1)',
defaultFontColor: '#666',
@@ -2594,8 +3053,6 @@ var helpers_options = {
case '%':
value /= 100;
break;
- default:
- break;
}
return size * value;
@@ -2660,9 +3117,12 @@ var helpers_options = {
* is called with `context` as first argument and the result becomes the new input.
* @param {number} [index] - If defined and the current value is an array, the value
* at `index` become the new input.
+ * @param {object} [info] - object to return information about resolution in
+ * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable.
* @since 2.7.0
*/
- resolve: function(inputs, context, index) {
+ resolve: function(inputs, context, index, info) {
+ var cacheable = true;
var i, ilen, value;
for (i = 0, ilen = inputs.length; i < ilen; ++i) {
@@ -2672,24 +3132,161 @@ var helpers_options = {
}
if (context !== undefined && typeof value === 'function') {
value = value(context);
+ cacheable = false;
}
if (index !== undefined && helpers_core.isArray(value)) {
value = value[index];
+ cacheable = false;
}
if (value !== undefined) {
+ if (info && !cacheable) {
+ info.cacheable = false;
+ }
return value;
}
}
}
};
+/**
+ * @alias Chart.helpers.math
+ * @namespace
+ */
+var exports$2 = {
+ /**
+ * Returns an array of factors sorted from 1 to sqrt(value)
+ * @private
+ */
+ _factorize: function(value) {
+ var result = [];
+ var sqrt = Math.sqrt(value);
+ var i;
+
+ for (i = 1; i < sqrt; i++) {
+ if (value % i === 0) {
+ result.push(i);
+ result.push(value / i);
+ }
+ }
+ if (sqrt === (sqrt | 0)) { // if value is a square number
+ result.push(sqrt);
+ }
+
+ result.sort(function(a, b) {
+ return a - b;
+ }).pop();
+ return result;
+ },
+
+ log10: Math.log10 || function(x) {
+ var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.
+ // Check for whole powers of 10,
+ // which due to floating point rounding error should be corrected.
+ var powerOf10 = Math.round(exponent);
+ var isPowerOf10 = x === Math.pow(10, powerOf10);
+
+ return isPowerOf10 ? powerOf10 : exponent;
+ }
+};
+
+var helpers_math = exports$2;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.math.log10 instead.
+ * @namespace Chart.helpers.log10
+ * @deprecated since version 2.9.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers_core.log10 = exports$2.log10;
+
+var getRtlAdapter = function(rectX, width) {
+ return {
+ x: function(x) {
+ return rectX + rectX + width - x;
+ },
+ setWidth: function(w) {
+ width = w;
+ },
+ textAlign: function(align) {
+ if (align === 'center') {
+ return align;
+ }
+ return align === 'right' ? 'left' : 'right';
+ },
+ xPlus: function(x, value) {
+ return x - value;
+ },
+ leftForLtr: function(x, itemWidth) {
+ return x - itemWidth;
+ },
+ };
+};
+
+var getLtrAdapter = function() {
+ return {
+ x: function(x) {
+ return x;
+ },
+ setWidth: function(w) { // eslint-disable-line no-unused-vars
+ },
+ textAlign: function(align) {
+ return align;
+ },
+ xPlus: function(x, value) {
+ return x + value;
+ },
+ leftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars
+ return x;
+ },
+ };
+};
+
+var getAdapter = function(rtl, rectX, width) {
+ return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();
+};
+
+var overrideTextDirection = function(ctx, direction) {
+ var style, original;
+ if (direction === 'ltr' || direction === 'rtl') {
+ style = ctx.canvas.style;
+ original = [
+ style.getPropertyValue('direction'),
+ style.getPropertyPriority('direction'),
+ ];
+
+ style.setProperty('direction', direction, 'important');
+ ctx.prevTextDirection = original;
+ }
+};
+
+var restoreTextDirection = function(ctx) {
+ var original = ctx.prevTextDirection;
+ if (original !== undefined) {
+ delete ctx.prevTextDirection;
+ ctx.canvas.style.setProperty('direction', original[0], original[1]);
+ }
+};
+
+var helpers_rtl = {
+ getRtlAdapter: getAdapter,
+ overrideTextDirection: overrideTextDirection,
+ restoreTextDirection: restoreTextDirection,
+};
+
var helpers$1 = helpers_core;
var easing = helpers_easing;
var canvas = helpers_canvas;
var options = helpers_options;
+var math = helpers_math;
+var rtl = helpers_rtl;
helpers$1.easing = easing;
helpers$1.canvas = canvas;
helpers$1.options = options;
+helpers$1.math = math;
+helpers$1.rtl = rtl;
function interpolate(start, view, model, ease) {
var keys = Object.keys(model);
@@ -2746,6 +3343,7 @@ var Element = function(configuration) {
};
helpers$1.extend(Element.prototype, {
+ _type: undefined,
initialize: function() {
this.hidden = false;
@@ -2754,7 +3352,7 @@ helpers$1.extend(Element.prototype, {
pivot: function() {
var me = this;
if (!me._view) {
- me._view = helpers$1.clone(me._model);
+ me._view = helpers$1.extend({}, me._model);
}
me._start = {};
return me;
@@ -2768,7 +3366,7 @@ helpers$1.extend(Element.prototype, {
// No animation -> No Transition
if (!model || ease === 1) {
- me._view = model;
+ me._view = helpers$1.extend({}, model);
me._start = null;
return me;
}
@@ -2802,7 +3400,7 @@ Element.extend = helpers$1.inherits;
var core_element = Element;
-var exports$2 = core_element.extend({
+var exports$3 = core_element.extend({
chart: null, // the animation associated chart instance
currentStep: 0, // the current animation step
numSteps: 60, // default number of steps
@@ -2813,7 +3411,7 @@ var exports$2 = core_element.extend({
onAnimationComplete: null, // user specified callback to fire when the animation finishes
});
-var core_animation = exports$2;
+var core_animation = exports$3;
// DEPRECATIONS
@@ -2823,7 +3421,7 @@ var core_animation = exports$2;
* @deprecated since version 2.6.0
* @todo remove at version 3
*/
-Object.defineProperty(exports$2.prototype, 'animationObject', {
+Object.defineProperty(exports$3.prototype, 'animationObject', {
get: function() {
return this;
}
@@ -2835,7 +3433,7 @@ Object.defineProperty(exports$2.prototype, 'animationObject', {
* @deprecated since version 2.6.0
* @todo remove at version 3
*/
-Object.defineProperty(exports$2.prototype, 'chartInstance', {
+Object.defineProperty(exports$3.prototype, 'chartInstance', {
get: function() {
return this.chart;
},
@@ -3053,12 +3651,42 @@ helpers$1.extend(DatasetController.prototype, {
*/
dataElementType: null,
+ /**
+ * Dataset element option keys to be resolved in _resolveDatasetElementOptions.
+ * A derived controller may override this to resolve controller-specific options.
+ * The keys defined here are for backward compatibility for legend styles.
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderCapStyle',
+ 'borderColor',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'borderWidth'
+ ],
+
+ /**
+ * Data element option keys to be resolved in _resolveDataElementOptions.
+ * A derived controller may override this to resolve controller-specific options.
+ * The keys defined here are for backward compatibility for legend styles.
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'pointStyle'
+ ],
+
initialize: function(chart, datasetIndex) {
var me = this;
me.chart = chart;
me.index = datasetIndex;
me.linkScales();
me.addElements();
+ me._type = me.getMeta().type;
},
updateIndex: function(datasetIndex) {
@@ -3068,13 +3696,16 @@ helpers$1.extend(DatasetController.prototype, {
linkScales: function() {
var me = this;
var meta = me.getMeta();
+ var chart = me.chart;
+ var scales = chart.scales;
var dataset = me.getDataset();
+ var scalesOpts = chart.options.scales;
- if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {
- meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;
+ if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {
+ meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;
}
- if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {
- meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;
+ if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {
+ meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;
}
},
@@ -3119,7 +3750,7 @@ helpers$1.extend(DatasetController.prototype, {
},
reset: function() {
- this.update(true);
+ this._update(true);
},
/**
@@ -3195,6 +3826,31 @@ helpers$1.extend(DatasetController.prototype, {
me.resyncElements();
},
+ /**
+ * Returns the merged user-supplied and default dataset-level options
+ * @private
+ */
+ _configure: function() {
+ var me = this;
+ me._config = helpers$1.merge(Object.create(null), [
+ me.chart.options.datasets[me._type],
+ me.getDataset(),
+ ], {
+ merger: function(key, target, source) {
+ if (key !== '_meta' && key !== 'data') {
+ helpers$1._merger(key, target, source);
+ }
+ }
+ });
+ },
+
+ _update: function(reset) {
+ var me = this;
+ me._configure();
+ me._cachedDataOpts = null;
+ me.update(reset);
+ },
+
update: helpers$1.noop,
transition: function(easingValue) {
@@ -3227,6 +3883,127 @@ helpers$1.extend(DatasetController.prototype, {
}
},
+ /**
+ * Returns a set of predefined style properties that should be used to represent the dataset
+ * or the data if the index is specified
+ * @param {number} index - data index
+ * @return {IStyleInterface} style object
+ */
+ getStyle: function(index) {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = meta.dataset;
+ var style;
+
+ me._configure();
+ if (dataset && index === undefined) {
+ style = me._resolveDatasetElementOptions(dataset || {});
+ } else {
+ index = index || 0;
+ style = me._resolveDataElementOptions(meta.data[index] || {}, index);
+ }
+
+ if (style.fill === false || style.fill === null) {
+ style.backgroundColor = style.borderColor;
+ }
+
+ return style;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDatasetElementOptions: function(element, hover) {
+ var me = this;
+ var chart = me.chart;
+ var datasetOpts = me._config;
+ var custom = element.custom || {};
+ var options = chart.options.elements[me.datasetElementType.prototype._type] || {};
+ var elementOptions = me._datasetElementOptions;
+ var values = {};
+ var i, ilen, key, readKey;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataset: me.getDataset(),
+ datasetIndex: me.index,
+ hover: hover
+ };
+
+ for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
+ key = elementOptions[i];
+ readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;
+ values[key] = resolve([
+ custom[readKey],
+ datasetOpts[readKey],
+ options[readKey]
+ ], context);
+ }
+
+ return values;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDataElementOptions: function(element, index) {
+ var me = this;
+ var custom = element && element.custom;
+ var cached = me._cachedDataOpts;
+ if (cached && !custom) {
+ return cached;
+ }
+ var chart = me.chart;
+ var datasetOpts = me._config;
+ var options = chart.options.elements[me.dataElementType.prototype._type] || {};
+ var elementOptions = me._dataElementOptions;
+ var values = {};
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: me.getDataset(),
+ datasetIndex: me.index
+ };
+
+ // `resolve` sets cacheable to `false` if any option is indexed or scripted
+ var info = {cacheable: !custom};
+
+ var keys, i, ilen, key;
+
+ custom = custom || {};
+
+ if (helpers$1.isArray(elementOptions)) {
+ for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
+ key = elementOptions[i];
+ values[key] = resolve([
+ custom[key],
+ datasetOpts[key],
+ options[key]
+ ], context, index, info);
+ }
+ } else {
+ keys = Object.keys(elementOptions);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve([
+ custom[key],
+ datasetOpts[elementOptions[key]],
+ datasetOpts[key],
+ options[key]
+ ], context, index, info);
+ }
+ }
+
+ if (info.cacheable) {
+ me._cachedDataOpts = Object.freeze(values);
+ }
+
+ return values;
+ },
+
removeHoverStyle: function(element) {
helpers$1.merge(element._model, element.$previousStyle || {});
delete element.$previousStyle;
@@ -3250,6 +4027,42 @@ helpers$1.extend(DatasetController.prototype, {
model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
},
+ /**
+ * @private
+ */
+ _removeDatasetHoverStyle: function() {
+ var element = this.getMeta().dataset;
+
+ if (element) {
+ this.removeHoverStyle(element);
+ }
+ },
+
+ /**
+ * @private
+ */
+ _setDatasetHoverStyle: function() {
+ var element = this.getMeta().dataset;
+ var prev = {};
+ var i, ilen, key, keys, hoverOptions, model;
+
+ if (!element) {
+ return;
+ }
+
+ model = element._model;
+ hoverOptions = this._resolveDatasetElementOptions(element, true);
+
+ keys = Object.keys(hoverOptions);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ prev[key] = model[key];
+ model[key] = hoverOptions[key];
+ }
+
+ element.$previousStyle = prev;
+ },
+
/**
* @private
*/
@@ -3318,6 +4131,8 @@ DatasetController.extend = helpers$1.inherits;
var core_datasetController = DatasetController;
+var TAU = Math.PI * 2;
+
core_defaults._set('global', {
elements: {
arc: {
@@ -3329,7 +4144,84 @@ core_defaults._set('global', {
}
});
+function clipArc(ctx, arc) {
+ var startAngle = arc.startAngle;
+ var endAngle = arc.endAngle;
+ var pixelMargin = arc.pixelMargin;
+ var angleMargin = pixelMargin / arc.outerRadius;
+ var x = arc.x;
+ var y = arc.y;
+
+ // Draw an inner border by cliping the arc and drawing a double-width border
+ // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
+ ctx.beginPath();
+ ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);
+ if (arc.innerRadius > pixelMargin) {
+ angleMargin = pixelMargin / arc.innerRadius;
+ ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);
+ } else {
+ ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);
+ }
+ ctx.closePath();
+ ctx.clip();
+}
+
+function drawFullCircleBorders(ctx, vm, arc, inner) {
+ var endAngle = arc.endAngle;
+ var i;
+
+ if (inner) {
+ arc.endAngle = arc.startAngle + TAU;
+ clipArc(ctx, arc);
+ arc.endAngle = endAngle;
+ if (arc.endAngle === arc.startAngle && arc.fullCircles) {
+ arc.endAngle += TAU;
+ arc.fullCircles--;
+ }
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.stroke();
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.stroke();
+ }
+}
+
+function drawBorder(ctx, vm, arc) {
+ var inner = vm.borderAlign === 'inner';
+
+ if (inner) {
+ ctx.lineWidth = vm.borderWidth * 2;
+ ctx.lineJoin = 'round';
+ } else {
+ ctx.lineWidth = vm.borderWidth;
+ ctx.lineJoin = 'bevel';
+ }
+
+ if (arc.fullCircles) {
+ drawFullCircleBorders(ctx, vm, arc, inner);
+ }
+
+ if (inner) {
+ clipArc(ctx, arc);
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ ctx.stroke();
+}
+
var element_arc = core_element.extend({
+ _type: 'arc',
+
inLabelRange: function(mouseX) {
var vm = this._view;
@@ -3344,20 +4236,20 @@ var element_arc = core_element.extend({
if (vm) {
var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});
- var angle = pointRelativePosition.angle;
+ var angle = pointRelativePosition.angle;
var distance = pointRelativePosition.distance;
// Sanitise angle range
var startAngle = vm.startAngle;
var endAngle = vm.endAngle;
while (endAngle < startAngle) {
- endAngle += 2.0 * Math.PI;
+ endAngle += TAU;
}
while (angle > endAngle) {
- angle -= 2.0 * Math.PI;
+ angle -= TAU;
}
while (angle < startAngle) {
- angle += 2.0 * Math.PI;
+ angle += TAU;
}
// Check if within the range of the open/close angle
@@ -3398,51 +4290,44 @@ var element_arc = core_element.extend({
draw: function() {
var ctx = this._chart.ctx;
var vm = this._view;
- var sA = vm.startAngle;
- var eA = vm.endAngle;
var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;
- var angleMargin;
+ var arc = {
+ x: vm.x,
+ y: vm.y,
+ innerRadius: vm.innerRadius,
+ outerRadius: Math.max(vm.outerRadius - pixelMargin, 0),
+ pixelMargin: pixelMargin,
+ startAngle: vm.startAngle,
+ endAngle: vm.endAngle,
+ fullCircles: Math.floor(vm.circumference / TAU)
+ };
+ var i;
+
+ ctx.save();
+
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.strokeStyle = vm.borderColor;
- ctx.save();
+ if (arc.fullCircles) {
+ arc.endAngle = arc.startAngle + TAU;
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.fill();
+ }
+ arc.endAngle = arc.startAngle + vm.circumference % TAU;
+ }
ctx.beginPath();
- ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);
- ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
+ ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
ctx.closePath();
-
- ctx.fillStyle = vm.backgroundColor;
ctx.fill();
if (vm.borderWidth) {
- if (vm.borderAlign === 'inner') {
- // Draw an inner border by cliping the arc and drawing a double-width border
- // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
- ctx.beginPath();
- angleMargin = pixelMargin / vm.outerRadius;
- ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin);
- if (vm.innerRadius > pixelMargin) {
- angleMargin = pixelMargin / vm.innerRadius;
- ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true);
- } else {
- ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2);
- }
- ctx.closePath();
- ctx.clip();
-
- ctx.beginPath();
- ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);
- ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
- ctx.closePath();
-
- ctx.lineWidth = vm.borderWidth * 2;
- ctx.lineJoin = 'round';
- } else {
- ctx.lineWidth = vm.borderWidth;
- ctx.lineJoin = 'bevel';
- }
-
- ctx.strokeStyle = vm.borderColor;
- ctx.stroke();
+ drawBorder(ctx, vm, arc);
}
ctx.restore();
@@ -3471,6 +4356,8 @@ core_defaults._set('global', {
});
var element_line = core_element.extend({
+ _type: 'line',
+
draw: function() {
var me = this;
var vm = me._view;
@@ -3480,11 +4367,27 @@ var element_line = core_element.extend({
var globalDefaults = core_defaults.global;
var globalOptionLineElements = globalDefaults.elements.line;
var lastDrawnIndex = -1;
- var index, current, previous, currentVM;
+ var closePath = me._loop;
+ var index, previous, currentVM;
- // If we are looping, adding the first point again
- if (me._loop && points.length) {
- points.push(points[0]);
+ if (!points.length) {
+ return;
+ }
+
+ if (me._loop) {
+ for (index = 0; index < points.length; ++index) {
+ previous = helpers$1.previousItem(points, index);
+ // If the line has an open path, shift the point array
+ if (!points[index]._view.skip && previous._view.skip) {
+ points = points.slice(index).concat(points.slice(0, index));
+ closePath = spanGaps;
+ break;
+ }
+ }
+ // If the line has a close path, add the first point again
+ if (closePath) {
+ points.push(points[0]);
+ }
}
ctx.save();
@@ -3504,35 +4407,34 @@ var element_line = core_element.extend({
// Stroke Line
ctx.beginPath();
- lastDrawnIndex = -1;
- for (index = 0; index < points.length; ++index) {
- current = points[index];
- previous = helpers$1.previousItem(points, index);
- currentVM = current._view;
+ // First point moves to it's starting position no matter what
+ currentVM = points[0]._view;
+ if (!currentVM.skip) {
+ ctx.moveTo(currentVM.x, currentVM.y);
+ lastDrawnIndex = 0;
+ }
- // First point moves to it's starting position no matter what
- if (index === 0) {
- if (!currentVM.skip) {
- ctx.moveTo(currentVM.x, currentVM.y);
- lastDrawnIndex = index;
- }
- } else {
- previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];
+ for (index = 1; index < points.length; ++index) {
+ currentVM = points[index]._view;
+ previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];
- if (!currentVM.skip) {
- if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
- // There was a gap and this is the first point after the gap
- ctx.moveTo(currentVM.x, currentVM.y);
- } else {
- // Line to next point
- helpers$1.canvas.lineTo(ctx, previous._view, current._view);
- }
- lastDrawnIndex = index;
+ if (!currentVM.skip) {
+ if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
+ // There was a gap and this is the first point after the gap
+ ctx.moveTo(currentVM.x, currentVM.y);
+ } else {
+ // Line to next point
+ helpers$1.canvas.lineTo(ctx, previous._view, currentVM);
}
+ lastDrawnIndex = index;
}
}
+ if (closePath) {
+ ctx.closePath();
+ }
+
ctx.stroke();
ctx.restore();
}
@@ -3569,6 +4471,8 @@ function yRange(mouseY) {
}
var element_point = core_element.extend({
+ _type: 'point',
+
inRange: function(mouseX, mouseY) {
var vm = this._view;
return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;
@@ -3751,6 +4655,8 @@ function inRange(vm, x, y) {
}
var element_rectangle = core_element.extend({
+ _type: 'rectangle',
+
draw: function() {
var ctx = this._chart.ctx;
var vm = this._view;
@@ -3840,7 +4746,8 @@ elements.Line = Line;
elements.Point = Point;
elements.Rectangle = Rectangle;
-var resolve$1 = helpers$1.options.resolve;
+var deprecated = helpers$1._deprecated;
+var valueOrDefault$3 = helpers$1.valueOrDefault;
core_defaults._set('bar', {
hover: {
@@ -3850,8 +4757,6 @@ core_defaults._set('bar', {
scales: {
xAxes: [{
type: 'category',
- categoryPercentage: 0.8,
- barPercentage: 0.9,
offset: true,
gridLines: {
offsetGridLines: true
@@ -3864,22 +4769,30 @@ core_defaults._set('bar', {
}
});
+core_defaults._set('global', {
+ datasets: {
+ bar: {
+ categoryPercentage: 0.8,
+ barPercentage: 0.9
+ }
+ }
+});
+
/**
* Computes the "optimal" sample size to maintain bars equally sized while preventing overlap.
* @private
*/
function computeMinSampleSize(scale, pixels) {
- var min = scale.isHorizontal() ? scale.width : scale.height;
- var ticks = scale.getTicks();
+ var min = scale._length;
var prev, curr, i, ilen;
for (i = 1, ilen = pixels.length; i < ilen; ++i) {
min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));
}
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {
curr = scale.getPixelForTick(i);
- min = i > 0 ? Math.min(min, curr - prev) : min;
+ min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;
prev = curr;
}
@@ -3896,10 +4809,13 @@ function computeFitCategoryTraits(index, ruler, options) {
var thickness = options.barThickness;
var count = ruler.stackCount;
var curr = ruler.pixels[index];
+ var min = helpers$1.isNullOrUndef(thickness)
+ ? computeMinSampleSize(ruler.scale, ruler.pixels)
+ : -1;
var size, ratio;
if (helpers$1.isNullOrUndef(thickness)) {
- size = ruler.min * options.categoryPercentage;
+ size = min * options.categoryPercentage;
ratio = options.barPercentage;
} else {
// When bar thickness is enforced, category and bar percentages are ignored.
@@ -3955,15 +4871,37 @@ var controller_bar = core_datasetController.extend({
dataElementType: elements.Rectangle,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderSkipped',
+ 'borderWidth',
+ 'barPercentage',
+ 'barThickness',
+ 'categoryPercentage',
+ 'maxBarThickness',
+ 'minBarLength'
+ ],
+
initialize: function() {
var me = this;
- var meta;
+ var meta, scaleOpts;
core_datasetController.prototype.initialize.apply(me, arguments);
meta = me.getMeta();
meta.stack = me.getDataset().stack;
meta.bar = true;
+
+ scaleOpts = me._getIndexScale().options;
+ deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');
+ deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');
+ deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');
+ deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');
+ deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');
},
update: function(reset) {
@@ -3982,7 +4920,7 @@ var controller_bar = core_datasetController.extend({
var me = this;
var meta = me.getMeta();
var dataset = me.getDataset();
- var options = me._resolveElementOptions(rectangle, index);
+ var options = me._resolveDataElementOptions(rectangle, index);
rectangle._xScale = me.getScaleForId(meta.xAxisID);
rectangle._yScale = me.getScaleForId(meta.yAxisID);
@@ -3997,7 +4935,11 @@ var controller_bar = core_datasetController.extend({
label: me.chart.data.labels[index]
};
- me._updateElementGeometry(rectangle, index, reset);
+ if (helpers$1.isArray(dataset.data[index])) {
+ rectangle._model.borderSkipped = null;
+ }
+
+ me._updateElementGeometry(rectangle, index, reset, options);
rectangle.pivot();
},
@@ -4005,15 +4947,15 @@ var controller_bar = core_datasetController.extend({
/**
* @private
*/
- _updateElementGeometry: function(rectangle, index, reset) {
+ _updateElementGeometry: function(rectangle, index, reset, options) {
var me = this;
var model = rectangle._model;
var vscale = me._getValueScale();
var base = vscale.getBasePixel();
var horizontal = vscale.isHorizontal();
var ruler = me._ruler || me.getRuler();
- var vpixels = me.calculateBarValuePixels(me.index, index);
- var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);
+ var vpixels = me.calculateBarValuePixels(me.index, index, options);
+ var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);
model.horizontal = horizontal;
model.base = reset ? base : vpixels.base;
@@ -4031,21 +4973,27 @@ var controller_bar = core_datasetController.extend({
*/
_getStacks: function(last) {
var me = this;
- var chart = me.chart;
var scale = me._getIndexScale();
+ var metasets = scale._getMatchingVisibleMetas(me._type);
var stacked = scale.options.stacked;
- var ilen = last === undefined ? chart.data.datasets.length : last + 1;
+ var ilen = metasets.length;
var stacks = [];
var i, meta;
for (i = 0; i < ilen; ++i) {
- meta = chart.getDatasetMeta(i);
- if (meta.bar && chart.isDatasetVisible(i) &&
- (stacked === false ||
- (stacked === true && stacks.indexOf(meta.stack) === -1) ||
- (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {
+ meta = metasets[i];
+ // stacked | meta.stack
+ // | found | not found | undefined
+ // false | x | x | x
+ // true | | x |
+ // undefined | | x | x
+ if (stacked === false || stacks.indexOf(meta.stack) === -1 ||
+ (stacked === undefined && meta.stack === undefined)) {
stacks.push(meta.stack);
}
+ if (meta.index === last) {
+ break;
+ }
}
return stacks;
@@ -4083,28 +5031,18 @@ var controller_bar = core_datasetController.extend({
getRuler: function() {
var me = this;
var scale = me._getIndexScale();
- var stackCount = me.getStackCount();
- var datasetIndex = me.index;
- var isHorizontal = scale.isHorizontal();
- var start = isHorizontal ? scale.left : scale.top;
- var end = start + (isHorizontal ? scale.width : scale.height);
var pixels = [];
- var i, ilen, min;
+ var i, ilen;
for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
- pixels.push(scale.getPixelForValue(null, i, datasetIndex));
+ pixels.push(scale.getPixelForValue(null, i, me.index));
}
- min = helpers$1.isNullOrUndef(scale.options.barThickness)
- ? computeMinSampleSize(scale, pixels)
- : -1;
-
return {
- min: min,
pixels: pixels,
- start: start,
- end: end,
- stackCount: stackCount,
+ start: scale._startPixel,
+ end: scale._endPixel,
+ stackCount: me.getStackCount(),
scale: scale
};
},
@@ -4113,31 +5051,35 @@ var controller_bar = core_datasetController.extend({
* Note: pixel values are not clamped to the scale area.
* @private
*/
- calculateBarValuePixels: function(datasetIndex, index) {
+ calculateBarValuePixels: function(datasetIndex, index, options) {
var me = this;
var chart = me.chart;
- var meta = me.getMeta();
var scale = me._getValueScale();
var isHorizontal = scale.isHorizontal();
var datasets = chart.data.datasets;
- var value = +scale.getRightValue(datasets[datasetIndex].data[index]);
- var minBarLength = scale.options.minBarLength;
+ var metasets = scale._getMatchingVisibleMetas(me._type);
+ var value = scale._parseValue(datasets[datasetIndex].data[index]);
+ var minBarLength = options.minBarLength;
var stacked = scale.options.stacked;
- var stack = meta.stack;
- var start = 0;
- var i, imeta, ivalue, base, head, size;
+ var stack = me.getMeta().stack;
+ var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;
+ var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;
+ var ilen = metasets.length;
+ var i, imeta, ivalue, base, head, size, stackLength;
if (stacked || (stacked === undefined && stack !== undefined)) {
- for (i = 0; i < datasetIndex; ++i) {
- imeta = chart.getDatasetMeta(i);
+ for (i = 0; i < ilen; ++i) {
+ imeta = metasets[i];
+
+ if (imeta.index === datasetIndex) {
+ break;
+ }
- if (imeta.bar &&
- imeta.stack === stack &&
- imeta.controller._getValueScaleId() === scale.id &&
- chart.isDatasetVisible(i)) {
+ if (imeta.stack === stack) {
+ stackLength = scale._parseValue(datasets[imeta.index].data[index]);
+ ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;
- ivalue = +scale.getRightValue(datasets[i].data[index]);
- if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {
+ if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {
start += ivalue;
}
}
@@ -4145,12 +5087,12 @@ var controller_bar = core_datasetController.extend({
}
base = scale.getPixelForValue(start);
- head = scale.getPixelForValue(start + value);
+ head = scale.getPixelForValue(start + length);
size = head - base;
if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
size = minBarLength;
- if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {
+ if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {
head = base - minBarLength;
} else {
head = base + minBarLength;
@@ -4168,9 +5110,8 @@ var controller_bar = core_datasetController.extend({
/**
* @private
*/
- calculateBarIndexPixels: function(datasetIndex, index, ruler) {
+ calculateBarIndexPixels: function(datasetIndex, index, ruler, options) {
var me = this;
- var options = ruler.scale.options;
var range = options.barThickness === 'flex'
? computeFlexCategoryTraits(index, ruler, options)
: computeFitCategoryTraits(index, ruler, options);
@@ -4178,7 +5119,7 @@ var controller_bar = core_datasetController.extend({
var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);
var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);
var size = Math.min(
- helpers$1.valueOrDefault(options.maxBarThickness, Infinity),
+ valueOrDefault$3(options.maxBarThickness, Infinity),
range.chunk * range.ratio);
return {
@@ -4201,7 +5142,8 @@ var controller_bar = core_datasetController.extend({
helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);
for (; i < ilen; ++i) {
- if (!isNaN(scale.getRightValue(dataset.data[i]))) {
+ var val = scale._parseValue(dataset.data[i]);
+ if (!isNaN(val.min) && !isNaN(val.max)) {
rects[i].draw();
}
}
@@ -4212,46 +5154,25 @@ var controller_bar = core_datasetController.extend({
/**
* @private
*/
- _resolveElementOptions: function(rectangle, index) {
+ _resolveDataElementOptions: function() {
var me = this;
- var chart = me.chart;
- var datasets = chart.data.datasets;
- var dataset = datasets[me.index];
- var custom = rectangle.custom || {};
- var options = chart.options.elements.rectangle;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderSkipped',
- 'borderWidth'
- ];
+ var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));
+ var indexOpts = me._getIndexScale().options;
+ var valueOpts = me._getValueScale().options;
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$1([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
- }
+ values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);
+ values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);
+ values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);
+ values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);
+ values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);
return values;
}
+
});
-var valueOrDefault$3 = helpers$1.valueOrDefault;
-var resolve$2 = helpers$1.options.resolve;
+var valueOrDefault$4 = helpers$1.valueOrDefault;
+var resolve$1 = helpers$1.options.resolve;
core_defaults._set('bubble', {
hover: {
@@ -4292,6 +5213,22 @@ var controller_bubble = core_datasetController.extend({
*/
dataElementType: elements.Point,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ 'hoverRadius',
+ 'hitRadius',
+ 'pointStyle',
+ 'rotation'
+ ],
+
/**
* @protected
*/
@@ -4315,7 +5252,7 @@ var controller_bubble = core_datasetController.extend({
var custom = point.custom || {};
var xScale = me.getScaleForId(meta.xAxisID);
var yScale = me.getScaleForId(meta.yAxisID);
- var options = me._resolveElementOptions(point, index);
+ var options = me._resolveDataElementOptions(point, index);
var data = me.getDataset().data[index];
var dsIndex = me.index;
@@ -4358,25 +5295,22 @@ var controller_bubble = core_datasetController.extend({
radius: model.radius
};
- model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth);
+ model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
model.radius = options.radius + options.hoverRadius;
},
/**
* @private
*/
- _resolveElementOptions: function(point, index) {
+ _resolveDataElementOptions: function(point, index) {
var me = this;
var chart = me.chart;
- var datasets = chart.data.datasets;
- var dataset = datasets[me.index];
+ var dataset = me.getDataset();
var custom = point.custom || {};
- var options = chart.options.elements.point;
- var data = dataset.data[index];
- var values = {};
- var i, ilen, key;
+ var data = dataset.data[index] || {};
+ var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments);
// Scriptable options
var context = {
@@ -4386,42 +5320,28 @@ var controller_bubble = core_datasetController.extend({
datasetIndex: me.index
};
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- 'hoverRadius',
- 'hitRadius',
- 'pointStyle',
- 'rotation'
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$2([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
+ // In case values were cached (and thus frozen), we need to clone the values
+ if (me._cachedDataOpts === values) {
+ values = helpers$1.extend({}, values);
}
// Custom radius resolution
- values.radius = resolve$2([
+ values.radius = resolve$1([
custom.radius,
- data ? data.r : undefined,
- dataset.radius,
- options.radius
+ data.r,
+ me._config.radius,
+ chart.options.elements.point.radius
], context, index);
return values;
}
});
-var resolve$3 = helpers$1.options.resolve;
-var valueOrDefault$4 = helpers$1.valueOrDefault;
+var valueOrDefault$5 = helpers$1.valueOrDefault;
+
+var PI$1 = Math.PI;
+var DOUBLE_PI$1 = PI$1 * 2;
+var HALF_PI$1 = PI$1 / 2;
core_defaults._set('doughnut', {
animation: {
@@ -4434,25 +5354,25 @@ core_defaults._set('doughnut', {
mode: 'single'
},
legendCallback: function(chart) {
- var text = [];
- text.push('<ul class="' + chart.id + '-legend">');
-
+ var list = document.createElement('ul');
var data = chart.data;
var datasets = data.datasets;
var labels = data.labels;
+ var i, ilen, listItem, listItemSpan;
+ list.setAttribute('class', chart.id + '-legend');
if (datasets.length) {
- for (var i = 0; i < datasets[0].data.length; ++i) {
- text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>');
+ for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
if (labels[i]) {
- text.push(labels[i]);
+ listItem.appendChild(document.createTextNode(labels[i]));
}
- text.push('</li>');
}
}
- text.push('</ul>');
- return text.join('');
+ return list.outerHTML;
},
legend: {
labels: {
@@ -4461,20 +5381,14 @@ core_defaults._set('doughnut', {
if (data.labels.length && data.datasets.length) {
return data.labels.map(function(label, i) {
var meta = chart.getDatasetMeta(0);
- var ds = data.datasets[0];
- var arc = meta.data[i];
- var custom = arc && arc.custom || {};
- var arcOpts = chart.options.elements.arc;
- var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
- var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
- var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
+ var style = meta.controller.getStyle(i);
return {
text: label,
- fillStyle: fill,
- strokeStyle: stroke,
- lineWidth: bw,
- hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
+ fillStyle: style.backgroundColor,
+ strokeStyle: style.borderColor,
+ lineWidth: style.borderWidth,
+ hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
// Extra data used for toggling the correct item
index: i
@@ -4506,10 +5420,10 @@ core_defaults._set('doughnut', {
cutoutPercentage: 50,
// The rotation of the chart, where the first data arc begins.
- rotation: Math.PI * -0.5,
+ rotation: -HALF_PI$1,
// The total circumference of the chart.
- circumference: Math.PI * 2.0,
+ circumference: DOUBLE_PI$1,
// Need to override these to give a nice default
tooltips: {
@@ -4542,6 +5456,19 @@ var controller_doughnut = core_datasetController.extend({
linkScales: helpers$1.noop,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ],
+
// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
getRingIndex: function(datasetIndex) {
var ringIndex = 0;
@@ -4560,46 +5487,52 @@ var controller_doughnut = core_datasetController.extend({
var chart = me.chart;
var chartArea = chart.chartArea;
var opts = chart.options;
- var availableWidth = chartArea.right - chartArea.left;
- var availableHeight = chartArea.bottom - chartArea.top;
- var minSize = Math.min(availableWidth, availableHeight);
- var offset = {x: 0, y: 0};
+ var ratioX = 1;
+ var ratioY = 1;
+ var offsetX = 0;
+ var offsetY = 0;
var meta = me.getMeta();
var arcs = meta.data;
- var cutoutPercentage = opts.cutoutPercentage;
+ var cutout = opts.cutoutPercentage / 100 || 0;
var circumference = opts.circumference;
var chartWeight = me._getRingWeight(me.index);
- var i, ilen;
+ var maxWidth, maxHeight, i, ilen;
- // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc
- if (circumference < Math.PI * 2.0) {
- var startAngle = opts.rotation % (Math.PI * 2.0);
- startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);
+ // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc
+ if (circumference < DOUBLE_PI$1) {
+ var startAngle = opts.rotation % DOUBLE_PI$1;
+ startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;
var endAngle = startAngle + circumference;
- var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};
- var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};
- var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);
- var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);
- var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);
- var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);
- var cutout = cutoutPercentage / 100.0;
- var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};
- var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};
- var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};
- minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
- offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};
+ var startX = Math.cos(startAngle);
+ var startY = Math.sin(startAngle);
+ var endX = Math.cos(endAngle);
+ var endY = Math.sin(endAngle);
+ var contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1;
+ var contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1;
+ var contains180 = startAngle === -PI$1 || endAngle >= PI$1;
+ var contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1;
+ var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);
+ var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);
+ var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);
+ var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);
+ ratioX = (maxX - minX) / 2;
+ ratioY = (maxY - minY) / 2;
+ offsetX = -(maxX + minX) / 2;
+ offsetY = -(maxY + minY) / 2;
}
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arcs[i]._options = me._resolveElementOptions(arcs[i], i);
+ arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
}
chart.borderWidth = me.getMaxBorderWidth();
- chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);
- chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);
+ maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;
+ maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;
+ chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);
+ chart.innerRadius = Math.max(chart.outerRadius * cutout, 0);
chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);
- chart.offsetX = offset.x * chart.outerRadius;
- chart.offsetY = offset.y * chart.outerRadius;
+ chart.offsetX = offsetX * chart.outerRadius;
+ chart.offsetY = offsetY * chart.outerRadius;
meta.total = me.calculateTotal();
@@ -4622,7 +5555,7 @@ var controller_doughnut = core_datasetController.extend({
var startAngle = opts.rotation; // non reset case handled later
var endAngle = opts.rotation; // non reset case handled later
var dataset = me.getDataset();
- var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));
+ var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);
var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
var options = arc._options || {};
@@ -4688,7 +5621,7 @@ var controller_doughnut = core_datasetController.extend({
calculateCircumference: function(value) {
var total = this.getMeta().total;
if (total > 0 && !isNaN(value)) {
- return (Math.PI * 2.0) * (Math.abs(value) / total);
+ return DOUBLE_PI$1 * (Math.abs(value) / total);
}
return 0;
},
@@ -4720,7 +5653,12 @@ var controller_doughnut = core_datasetController.extend({
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
arc = arcs[i];
- options = controller ? controller._resolveElementOptions(arc, i) : arc._options;
+ if (controller) {
+ controller._configure();
+ options = controller._resolveDataElementOptions(arc, i);
+ } else {
+ options = arc._options;
+ }
if (options.borderAlign !== 'inner') {
borderWidth = options.borderWidth;
hoverWidth = options.hoverBorderWidth;
@@ -4746,51 +5684,9 @@ var controller_doughnut = core_datasetController.extend({
borderWidth: model.borderWidth,
};
- model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
- },
-
- /**
- * @private
- */
- _resolveElementOptions: function(arc, index) {
- var me = this;
- var chart = me.chart;
- var dataset = me.getDataset();
- var custom = arc.custom || {};
- var options = chart.options.elements.arc;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'borderAlign',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$3([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
+ model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
},
/**
@@ -4813,7 +5709,7 @@ var controller_doughnut = core_datasetController.extend({
* @private
*/
_getRingWeight: function(dataSetIndex) {
- return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
+ return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
},
/**
@@ -4840,8 +5736,6 @@ core_defaults._set('horizontalBar', {
yAxes: [{
type: 'category',
position: 'left',
- categoryPercentage: 0.8,
- barPercentage: 0.9,
offset: true,
gridLines: {
offsetGridLines: true
@@ -4861,6 +5755,15 @@ core_defaults._set('horizontalBar', {
}
});
+core_defaults._set('global', {
+ datasets: {
+ horizontalBar: {
+ categoryPercentage: 0.8,
+ barPercentage: 0.9
+ }
+ }
+});
+
var controller_horizontalBar = controller_bar.extend({
/**
* @private
@@ -4877,8 +5780,8 @@ var controller_horizontalBar = controller_bar.extend({
}
});
-var valueOrDefault$5 = helpers$1.valueOrDefault;
-var resolve$4 = helpers$1.options.resolve;
+var valueOrDefault$6 = helpers$1.valueOrDefault;
+var resolve$2 = helpers$1.options.resolve;
var isPointInArea = helpers$1.canvas._isPointInArea;
core_defaults._set('line', {
@@ -4901,40 +5804,116 @@ core_defaults._set('line', {
}
});
-function lineEnabled(dataset, options) {
- return valueOrDefault$5(dataset.showLine, options.showLines);
+function scaleClip(scale, halfBorderWidth) {
+ var tickOpts = scale && scale.options.ticks || {};
+ var reverse = tickOpts.reverse;
+ var min = tickOpts.min === undefined ? halfBorderWidth : 0;
+ var max = tickOpts.max === undefined ? halfBorderWidth : 0;
+ return {
+ start: reverse ? max : min,
+ end: reverse ? min : max
+ };
+}
+
+function defaultClip(xScale, yScale, borderWidth) {
+ var halfBorderWidth = borderWidth / 2;
+ var x = scaleClip(xScale, halfBorderWidth);
+ var y = scaleClip(yScale, halfBorderWidth);
+
+ return {
+ top: y.end,
+ right: x.end,
+ bottom: y.start,
+ left: x.start
+ };
+}
+
+function toClip(value) {
+ var t, r, b, l;
+
+ if (helpers$1.isObject(value)) {
+ t = value.top;
+ r = value.right;
+ b = value.bottom;
+ l = value.left;
+ } else {
+ t = r = b = l = value;
+ }
+
+ return {
+ top: t,
+ right: r,
+ bottom: b,
+ left: l
+ };
}
+
var controller_line = core_datasetController.extend({
datasetElementType: elements.Line,
dataElementType: elements.Point,
+ /**
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderCapStyle',
+ 'borderColor',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'borderWidth',
+ 'cubicInterpolationMode',
+ 'fill'
+ ],
+
+ /**
+ * @private
+ */
+ _dataElementOptions: {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ },
+
update: function(reset) {
var me = this;
var meta = me.getMeta();
var line = meta.dataset;
var points = meta.data || [];
- var scale = me.getScaleForId(meta.yAxisID);
- var dataset = me.getDataset();
- var showLine = lineEnabled(dataset, me.chart.options);
+ var options = me.chart.options;
+ var config = me._config;
+ var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);
var i, ilen;
+ me._xScale = me.getScaleForId(meta.xAxisID);
+ me._yScale = me.getScaleForId(meta.yAxisID);
+
// Update Line
if (showLine) {
// Compatibility: If the properties are defined with only the old name, use those values
- if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
- dataset.lineTension = dataset.tension;
+ if (config.tension !== undefined && config.lineTension === undefined) {
+ config.lineTension = config.tension;
}
// Utility
- line._scale = scale;
+ line._scale = me._yScale;
line._datasetIndex = me.index;
// Data
line._children = points;
// Model
- line._model = me._resolveLineOptions(line);
+ line._model = me._resolveDatasetElementOptions(line);
line.pivot();
}
@@ -4961,12 +5940,12 @@ var controller_line = core_datasetController.extend({
var dataset = me.getDataset();
var datasetIndex = me.index;
var value = dataset.data[index];
- var yScale = me.getScaleForId(meta.yAxisID);
- var xScale = me.getScaleForId(meta.xAxisID);
+ var xScale = me._xScale;
+ var yScale = me._yScale;
var lineModel = meta.dataset._model;
var x, y;
- var options = me._resolvePointOptions(point, index);
+ var options = me._resolveDataElementOptions(point, index);
x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);
y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
@@ -4990,7 +5969,7 @@ var controller_line = core_datasetController.extend({
backgroundColor: options.backgroundColor,
borderColor: options.borderColor,
borderWidth: options.borderWidth,
- tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0),
+ tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),
steppedLine: lineModel ? lineModel.steppedLine : false,
// Tooltip
hitRadius: options.hitRadius
@@ -5000,91 +5979,21 @@ var controller_line = core_datasetController.extend({
/**
* @private
*/
- _resolvePointOptions: function(element, index) {
- var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
- var custom = element.custom || {};
- var options = chart.options.elements.point;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var ELEMENT_OPTIONS = {
- backgroundColor: 'pointBackgroundColor',
- borderColor: 'pointBorderColor',
- borderWidth: 'pointBorderWidth',
- hitRadius: 'pointHitRadius',
- hoverBackgroundColor: 'pointHoverBackgroundColor',
- hoverBorderColor: 'pointHoverBorderColor',
- hoverBorderWidth: 'pointHoverBorderWidth',
- hoverRadius: 'pointHoverRadius',
- pointStyle: 'pointStyle',
- radius: 'pointRadius',
- rotation: 'pointRotation'
- };
- var keys = Object.keys(ELEMENT_OPTIONS);
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$4([
- custom[key],
- dataset[ELEMENT_OPTIONS[key]],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
- },
-
- /**
- * @private
- */
- _resolveLineOptions: function(element) {
+ _resolveDatasetElementOptions: function(element) {
var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
+ var config = me._config;
var custom = element.custom || {};
- var options = chart.options;
- var elementOptions = options.elements.line;
- var values = {};
- var i, ilen, key;
-
- var keys = [
- 'backgroundColor',
- 'borderWidth',
- 'borderColor',
- 'borderCapStyle',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'fill',
- 'cubicInterpolationMode'
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$4([
- custom[key],
- dataset[key],
- elementOptions[key]
- ]);
- }
+ var options = me.chart.options;
+ var lineOptions = options.elements.line;
+ var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
// The default behavior of lines is to break at null values, according
// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
// This option gives lines the ability to span gaps
- values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps);
- values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension);
- values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);
+ values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);
+ values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);
+ values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));
return values;
},
@@ -5092,18 +6001,25 @@ var controller_line = core_datasetController.extend({
calculatePointY: function(value, index, datasetIndex) {
var me = this;
var chart = me.chart;
- var meta = me.getMeta();
- var yScale = me.getScaleForId(meta.yAxisID);
+ var yScale = me._yScale;
var sumPos = 0;
var sumNeg = 0;
- var i, ds, dsMeta;
+ var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;
if (yScale.options.stacked) {
- for (i = 0; i < datasetIndex; i++) {
- ds = chart.data.datasets[i];
- dsMeta = chart.getDatasetMeta(i);
- if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
- var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));
+ rightValue = +yScale.getRightValue(value);
+ metasets = chart._getSortedVisibleDatasetMetas();
+ ilen = metasets.length;
+
+ for (i = 0; i < ilen; ++i) {
+ dsMeta = metasets[i];
+ if (dsMeta.index === datasetIndex) {
+ break;
+ }
+
+ ds = chart.data.datasets[dsMeta.index];
+ if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {
+ stackedRightValue = +yScale.getRightValue(ds.data[index]);
if (stackedRightValue < 0) {
sumNeg += stackedRightValue || 0;
} else {
@@ -5112,13 +6028,11 @@ var controller_line = core_datasetController.extend({
}
}
- var rightValue = Number(yScale.getRightValue(value));
if (rightValue < 0) {
return yScale.getPixelForValue(sumNeg + rightValue);
}
return yScale.getPixelForValue(sumPos + rightValue);
}
-
return yScale.getPixelForValue(value);
},
@@ -5183,18 +6097,19 @@ var controller_line = core_datasetController.extend({
var meta = me.getMeta();
var points = meta.data || [];
var area = chart.chartArea;
- var ilen = points.length;
- var halfBorderWidth;
+ var canvas = chart.canvas;
var i = 0;
+ var ilen = points.length;
+ var clip;
- if (lineEnabled(me.getDataset(), chart.options)) {
- halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;
+ if (me._showLine) {
+ clip = meta.dataset._model.clip;
helpers$1.canvas.clipArea(chart.ctx, {
- left: area.left,
- right: area.right,
- top: area.top - halfBorderWidth,
- bottom: area.bottom + halfBorderWidth
+ left: clip.left === false ? 0 : area.left - clip.left,
+ right: clip.right === false ? canvas.width : area.right + clip.right,
+ top: clip.top === false ? 0 : area.top - clip.top,
+ bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom
});
meta.dataset.draw();
@@ -5223,14 +6138,14 @@ var controller_line = core_datasetController.extend({
radius: model.radius
};
- model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
- model.radius = valueOrDefault$5(options.hoverRadius, options.radius);
+ model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$6(options.hoverRadius, options.radius);
},
});
-var resolve$5 = helpers$1.options.resolve;
+var resolve$3 = helpers$1.options.resolve;
core_defaults._set('polarArea', {
scale: {
@@ -5257,25 +6172,25 @@ core_defaults._set('polarArea', {
startAngle: -0.5 * Math.PI,
legendCallback: function(chart) {
- var text = [];
- text.push('<ul class="' + chart.id + '-legend">');
-
+ var list = document.createElement('ul');
var data = chart.data;
var datasets = data.datasets;
var labels = data.labels;
+ var i, ilen, listItem, listItemSpan;
+ list.setAttribute('class', chart.id + '-legend');
if (datasets.length) {
- for (var i = 0; i < datasets[0].data.length; ++i) {
- text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>');
+ for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
if (labels[i]) {
- text.push(labels[i]);
+ listItem.appendChild(document.createTextNode(labels[i]));
}
- text.push('</li>');
}
}
- text.push('</ul>');
- return text.join('');
+ return list.outerHTML;
},
legend: {
labels: {
@@ -5284,20 +6199,14 @@ core_defaults._set('polarArea', {
if (data.labels.length && data.datasets.length) {
return data.labels.map(function(label, i) {
var meta = chart.getDatasetMeta(0);
- var ds = data.datasets[0];
- var arc = meta.data[i];
- var custom = arc.custom || {};
- var arcOpts = chart.options.elements.arc;
- var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
- var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
- var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
+ var style = meta.controller.getStyle(i);
return {
text: label,
- fillStyle: fill,
- strokeStyle: stroke,
- lineWidth: bw,
- hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
+ fillStyle: style.backgroundColor,
+ strokeStyle: style.borderColor,
+ lineWidth: style.borderWidth,
+ hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
// Extra data used for toggling the correct item
index: i
@@ -5337,9 +6246,36 @@ core_defaults._set('polarArea', {
var controller_polarArea = core_datasetController.extend({
- dataElementType: elements.Arc,
+ dataElementType: elements.Arc,
+
+ linkScales: helpers$1.noop,
+
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ],
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.chart.scale.id;
+ },
- linkScales: helpers$1.noop,
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.chart.scale.id;
+ },
update: function(reset) {
var me = this;
@@ -5363,7 +6299,7 @@ var controller_polarArea = core_datasetController.extend({
}
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arcs[i]._options = me._resolveElementOptions(arcs[i], i);
+ arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
me.updateElement(arcs[i], i, reset);
}
},
@@ -5466,48 +6402,6 @@ var controller_polarArea = core_datasetController.extend({
model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);
},
- /**
- * @private
- */
- _resolveElementOptions: function(arc, index) {
- var me = this;
- var chart = me.chart;
- var dataset = me.getDataset();
- var custom = arc.custom || {};
- var options = chart.options.elements.arc;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'borderAlign',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$5([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
- },
-
/**
* @private
*/
@@ -5529,7 +6423,7 @@ var controller_polarArea = core_datasetController.extend({
datasetIndex: me.index
};
- return resolve$5([
+ return resolve$3([
me.chart.options.elements.arc.angle,
(2 * Math.PI) / count
], context, index);
@@ -5544,40 +6438,85 @@ core_defaults._set('pie', {
// Pie charts are Doughnut chart with different defaults
var controller_pie = controller_doughnut;
-var valueOrDefault$6 = helpers$1.valueOrDefault;
-var resolve$6 = helpers$1.options.resolve;
+var valueOrDefault$7 = helpers$1.valueOrDefault;
core_defaults._set('radar', {
+ spanGaps: false,
scale: {
type: 'radialLinear'
},
elements: {
line: {
+ fill: 'start',
tension: 0 // no bezier in radar
}
}
});
var controller_radar = core_datasetController.extend({
-
datasetElementType: elements.Line,
dataElementType: elements.Point,
linkScales: helpers$1.noop,
+ /**
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderWidth',
+ 'borderColor',
+ 'borderCapStyle',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'fill'
+ ],
+
+ /**
+ * @private
+ */
+ _dataElementOptions: {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.chart.scale.id;
+ },
+
update: function(reset) {
var me = this;
var meta = me.getMeta();
var line = meta.dataset;
var points = meta.data || [];
var scale = me.chart.scale;
- var dataset = me.getDataset();
+ var config = me._config;
var i, ilen;
// Compatibility: If the properties are defined with only the old name, use those values
- if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
- dataset.lineTension = dataset.tension;
+ if (config.tension !== undefined && config.lineTension === undefined) {
+ config.lineTension = config.tension;
}
// Utility
@@ -5587,7 +6526,7 @@ var controller_radar = core_datasetController.extend({
line._children = points;
line._loop = true;
// Model
- line._model = me._resolveLineOptions(line);
+ line._model = me._resolveDatasetElementOptions(line);
line.pivot();
@@ -5611,7 +6550,7 @@ var controller_radar = core_datasetController.extend({
var dataset = me.getDataset();
var scale = me.chart.scale;
var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);
- var options = me._resolvePointOptions(point, index);
+ var options = me._resolveDataElementOptions(point, index);
var lineModel = me.getMeta().dataset._model;
var x = reset ? scale.xCenter : pointPosition.x;
var y = reset ? scale.yCenter : pointPosition.y;
@@ -5634,7 +6573,7 @@ var controller_radar = core_datasetController.extend({
backgroundColor: options.backgroundColor,
borderColor: options.borderColor,
borderWidth: options.borderWidth,
- tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),
+ tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),
// Tooltip
hitRadius: options.hitRadius
@@ -5644,84 +6583,14 @@ var controller_radar = core_datasetController.extend({
/**
* @private
*/
- _resolvePointOptions: function(element, index) {
- var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
- var custom = element.custom || {};
- var options = chart.options.elements.point;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var ELEMENT_OPTIONS = {
- backgroundColor: 'pointBackgroundColor',
- borderColor: 'pointBorderColor',
- borderWidth: 'pointBorderWidth',
- hitRadius: 'pointHitRadius',
- hoverBackgroundColor: 'pointHoverBackgroundColor',
- hoverBorderColor: 'pointHoverBorderColor',
- hoverBorderWidth: 'pointHoverBorderWidth',
- hoverRadius: 'pointHoverRadius',
- pointStyle: 'pointStyle',
- radius: 'pointRadius',
- rotation: 'pointRotation'
- };
- var keys = Object.keys(ELEMENT_OPTIONS);
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$6([
- custom[key],
- dataset[ELEMENT_OPTIONS[key]],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
- },
-
- /**
- * @private
- */
- _resolveLineOptions: function(element) {
+ _resolveDatasetElementOptions: function() {
var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
- var custom = element.custom || {};
- var options = chart.options.elements.line;
- var values = {};
- var i, ilen, key;
-
- var keys = [
- 'backgroundColor',
- 'borderWidth',
- 'borderColor',
- 'borderCapStyle',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'fill'
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$6([
- custom[key],
- dataset[key],
- options[key]
- ]);
- }
+ var config = me._config;
+ var options = me.chart.options;
+ var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
- values.tension = valueOrDefault$6(dataset.lineTension, options.tension);
+ values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);
return values;
},
@@ -5733,6 +6602,13 @@ var controller_radar = core_datasetController.extend({
var points = meta.data || [];
var i, ilen, model, controlPoints;
+ // Only consider points that are drawn in case the spanGaps option is used
+ if (meta.dataset._model.spanGaps) {
+ points = points.filter(function(pt) {
+ return !pt._model.skip;
+ });
+ }
+
function capControlPoint(pt, min, max) {
return Math.max(Math.min(pt, max), min);
}
@@ -5766,10 +6642,10 @@ var controller_radar = core_datasetController.extend({
radius: model.radius
};
- model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);
- model.radius = valueOrDefault$6(options.hoverRadius, options.radius);
+ model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$7(options.hoverRadius, options.radius);
}
});
@@ -5791,8 +6667,6 @@ core_defaults._set('scatter', {
}]
},
- showLines: false,
-
tooltips: {
callbacks: {
title: function() {
@@ -5805,6 +6679,14 @@ core_defaults._set('scatter', {
}
});
+core_defaults._set('global', {
+ datasets: {
+ scatter: {
+ showLine: false
+ }
+ }
+});
+
// Scatter charts use line controllers
var controller_scatter = controller_line;
@@ -5847,17 +6729,13 @@ function getRelativePosition(e, chart) {
* @param {function} handler - the callback to execute for each visible item
*/
function parseVisibleItems(chart, handler) {
- var datasets = chart.data.datasets;
- var meta, i, j, ilen, jlen;
-
- for (i = 0, ilen = datasets.length; i < ilen; ++i) {
- if (!chart.isDatasetVisible(i)) {
- continue;
- }
+ var metasets = chart._getSortedVisibleDatasetMetas();
+ var metadata, i, j, ilen, jlen, element;
- meta = chart.getDatasetMeta(i);
- for (j = 0, jlen = meta.data.length; j < jlen; ++j) {
- var element = meta.data[j];
+ for (i = 0, ilen = metasets.length; i < ilen; ++i) {
+ metadata = metasets[i].data;
+ for (j = 0, jlen = metadata.length; j < jlen; ++j) {
+ element = metadata[j];
if (!element._view.skip) {
handler(element);
}
@@ -5942,15 +6820,12 @@ function indexMode(chart, e, options) {
return [];
}
- chart.data.datasets.forEach(function(dataset, datasetIndex) {
- if (chart.isDatasetVisible(datasetIndex)) {
- var meta = chart.getDatasetMeta(datasetIndex);
- var element = meta.data[items[0]._index];
+ chart._getSortedVisibleDatasetMetas().forEach(function(meta) {
+ var element = meta.data[items[0]._index];
- // don't count items that are skipped (null data)
- if (element && !element._view.skip) {
- elements.push(element);
- }
+ // don't count items that are skipped (null data)
+ if (element && !element._view.skip) {
+ elements.push(element);
}
});
@@ -6131,55 +7006,194 @@ var core_interaction = {
}
};
+var extend = helpers$1.extend;
+
function filterByPosition(array, position) {
return helpers$1.where(array, function(v) {
- return v.position === position;
+ return v.pos === position;
});
}
function sortByWeight(array, reverse) {
- array.forEach(function(v, i) {
- v._tmpIndex_ = i;
- return v;
- });
- array.sort(function(a, b) {
+ return array.sort(function(a, b) {
var v0 = reverse ? b : a;
var v1 = reverse ? a : b;
return v0.weight === v1.weight ?
- v0._tmpIndex_ - v1._tmpIndex_ :
+ v0.index - v1.index :
v0.weight - v1.weight;
});
- array.forEach(function(v) {
- delete v._tmpIndex_;
- });
}
-function findMaxPadding(boxes) {
- var top = 0;
- var left = 0;
- var bottom = 0;
- var right = 0;
- helpers$1.each(boxes, function(box) {
- if (box.getPadding) {
- var boxPadding = box.getPadding();
- top = Math.max(top, boxPadding.top);
- left = Math.max(left, boxPadding.left);
- bottom = Math.max(bottom, boxPadding.bottom);
- right = Math.max(right, boxPadding.right);
- }
- });
+function wrapBoxes(boxes) {
+ var layoutBoxes = [];
+ var i, ilen, box;
+
+ for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {
+ box = boxes[i];
+ layoutBoxes.push({
+ index: i,
+ box: box,
+ pos: box.position,
+ horizontal: box.isHorizontal(),
+ weight: box.weight
+ });
+ }
+ return layoutBoxes;
+}
+
+function setLayoutDims(layouts, params) {
+ var i, ilen, layout;
+ for (i = 0, ilen = layouts.length; i < ilen; ++i) {
+ layout = layouts[i];
+ // store width used instead of chartArea.w in fitBoxes
+ layout.width = layout.horizontal
+ ? layout.box.fullWidth && params.availableWidth
+ : params.vBoxMaxWidth;
+ // store height used instead of chartArea.h in fitBoxes
+ layout.height = layout.horizontal && params.hBoxMaxHeight;
+ }
+}
+
+function buildLayoutBoxes(boxes) {
+ var layoutBoxes = wrapBoxes(boxes);
+ var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);
+ var right = sortByWeight(filterByPosition(layoutBoxes, 'right'));
+ var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);
+ var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));
+
return {
- top: top,
- left: left,
- bottom: bottom,
- right: right
+ leftAndTop: left.concat(top),
+ rightAndBottom: right.concat(bottom),
+ chartArea: filterByPosition(layoutBoxes, 'chartArea'),
+ vertical: left.concat(right),
+ horizontal: top.concat(bottom)
};
}
-function addSizeByPosition(boxes, size) {
- helpers$1.each(boxes, function(box) {
- size[box.position] += box.isHorizontal() ? box.height : box.width;
- });
+function getCombinedMax(maxPadding, chartArea, a, b) {
+ return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);
+}
+
+function updateDims(chartArea, params, layout) {
+ var box = layout.box;
+ var maxPadding = chartArea.maxPadding;
+ var newWidth, newHeight;
+
+ if (layout.size) {
+ // this layout was already counted for, lets first reduce old size
+ chartArea[layout.pos] -= layout.size;
+ }
+ layout.size = layout.horizontal ? box.height : box.width;
+ chartArea[layout.pos] += layout.size;
+
+ if (box.getPadding) {
+ var boxPadding = box.getPadding();
+ maxPadding.top = Math.max(maxPadding.top, boxPadding.top);
+ maxPadding.left = Math.max(maxPadding.left, boxPadding.left);
+ maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);
+ maxPadding.right = Math.max(maxPadding.right, boxPadding.right);
+ }
+
+ newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');
+ newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');
+
+ if (newWidth !== chartArea.w || newHeight !== chartArea.h) {
+ chartArea.w = newWidth;
+ chartArea.h = newHeight;
+
+ // return true if chart area changed in layout's direction
+ var sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h];
+ return sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1]));
+ }
+}
+
+function handleMaxPadding(chartArea) {
+ var maxPadding = chartArea.maxPadding;
+
+ function updatePos(pos) {
+ var change = Math.max(maxPadding[pos] - chartArea[pos], 0);
+ chartArea[pos] += change;
+ return change;
+ }
+ chartArea.y += updatePos('top');
+ chartArea.x += updatePos('left');
+ updatePos('right');
+ updatePos('bottom');
+}
+
+function getMargins(horizontal, chartArea) {
+ var maxPadding = chartArea.maxPadding;
+
+ function marginForPositions(positions) {
+ var margin = {left: 0, top: 0, right: 0, bottom: 0};
+ positions.forEach(function(pos) {
+ margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);
+ });
+ return margin;
+ }
+
+ return horizontal
+ ? marginForPositions(['left', 'right'])
+ : marginForPositions(['top', 'bottom']);
+}
+
+function fitBoxes(boxes, chartArea, params) {
+ var refitBoxes = [];
+ var i, ilen, layout, box, refit, changed;
+
+ for (i = 0, ilen = boxes.length; i < ilen; ++i) {
+ layout = boxes[i];
+ box = layout.box;
+
+ box.update(
+ layout.width || chartArea.w,
+ layout.height || chartArea.h,
+ getMargins(layout.horizontal, chartArea)
+ );
+ if (updateDims(chartArea, params, layout)) {
+ changed = true;
+ if (refitBoxes.length) {
+ // Dimensions changed and there were non full width boxes before this
+ // -> we have to refit those
+ refit = true;
+ }
+ }
+ if (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case
+ refitBoxes.push(layout);
+ }
+ }
+
+ return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;
+}
+
+function placeBoxes(boxes, chartArea, params) {
+ var userPadding = params.padding;
+ var x = chartArea.x;
+ var y = chartArea.y;
+ var i, ilen, layout, box;
+
+ for (i = 0, ilen = boxes.length; i < ilen; ++i) {
+ layout = boxes[i];
+ box = layout.box;
+ if (layout.horizontal) {
+ box.left = box.fullWidth ? userPadding.left : chartArea.left;
+ box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;
+ box.top = y;
+ box.bottom = y + box.height;
+ box.width = box.right - box.left;
+ y = box.bottom;
+ } else {
+ box.left = x;
+ box.right = x + box.width;
+ box.top = chartArea.top;
+ box.bottom = chartArea.top + chartArea.h;
+ box.height = box.bottom - box.top;
+ x = box.right;
+ }
+ }
+
+ chartArea.x = x;
+ chartArea.y = y;
}
core_defaults._set('global', {
@@ -6231,6 +7245,14 @@ var core_layouts = {
item.fullWidth = item.fullWidth || false;
item.position = item.position || 'top';
item.weight = item.weight || 0;
+ item._layers = item._layers || function() {
+ return [{
+ z: 0,
+ draw: function() {
+ item.draw.apply(item, arguments);
+ }
+ }];
+ };
chart.boxes.push(item);
},
@@ -6281,26 +7303,12 @@ var core_layouts = {
var layoutOptions = chart.options.layout || {};
var padding = helpers$1.options.toPadding(layoutOptions.padding);
- var leftPadding = padding.left;
- var rightPadding = padding.right;
- var topPadding = padding.top;
- var bottomPadding = padding.bottom;
-
- var leftBoxes = filterByPosition(chart.boxes, 'left');
- var rightBoxes = filterByPosition(chart.boxes, 'right');
- var topBoxes = filterByPosition(chart.boxes, 'top');
- var bottomBoxes = filterByPosition(chart.boxes, 'bottom');
- var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');
-
- // Sort boxes by weight. A higher weight is further away from the chart area
- sortByWeight(leftBoxes, true);
- sortByWeight(rightBoxes, false);
- sortByWeight(topBoxes, true);
- sortByWeight(bottomBoxes, false);
-
- var verticalBoxes = leftBoxes.concat(rightBoxes);
- var horizontalBoxes = topBoxes.concat(bottomBoxes);
- var outerBoxes = verticalBoxes.concat(horizontalBoxes);
+
+ var availableWidth = width - padding.width;
+ var availableHeight = height - padding.height;
+ var boxes = buildLayoutBoxes(chart.boxes);
+ var verticalBoxes = boxes.vertical;
+ var horizontalBoxes = boxes.horizontal;
// Essentially we now have any number of boxes on each of the 4 sides.
// Our canvas looks like the following.
@@ -6328,201 +7336,57 @@ var core_layouts = {
// | B2 (Full Width) |
// |----------------------------------------------------|
//
- // What we do to find the best sizing, we do the following
- // 1. Determine the minimum size of the chart area.
- // 2. Split the remaining width equally between each vertical axis
- // 3. Split the remaining height equally between each horizontal axis
- // 4. Give each layout the maximum size it can be. The layout will return it's minimum size
- // 5. Adjust the sizes of each axis based on it's minimum reported size.
- // 6. Refit each axis
- // 7. Position each axis in the final location
- // 8. Tell the chart the final location of the chart area
- // 9. Tell any axes that overlay the chart area the positions of the chart area
-
- // Step 1
- var chartWidth = width - leftPadding - rightPadding;
- var chartHeight = height - topPadding - bottomPadding;
- var chartAreaWidth = chartWidth / 2; // min 50%
-
- // Step 2
- var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length;
-
- // Step 3
- // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837)
- // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length;
-
- // Step 4
- var maxChartAreaWidth = chartWidth;
- var maxChartAreaHeight = chartHeight;
- var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding};
- var minBoxSizes = [];
- var maxPadding;
-
- function getMinimumBoxSize(box) {
- var minSize;
- var isHorizontal = box.isHorizontal();
-
- if (isHorizontal) {
- minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2);
- maxChartAreaHeight -= minSize.height;
- } else {
- minSize = box.update(verticalBoxWidth, maxChartAreaHeight);
- maxChartAreaWidth -= minSize.width;
- }
-
- minBoxSizes.push({
- horizontal: isHorizontal,
- width: minSize.width,
- box: box,
- });
- }
-
- helpers$1.each(outerBoxes, getMinimumBoxSize);
-
- // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)
- maxPadding = findMaxPadding(outerBoxes);
-
- // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could
- // be if the axes are drawn at their minimum sizes.
- // Steps 5 & 6
-
- // Function to fit a box
- function fitBox(box) {
- var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) {
- return minBox.box === box;
- });
-
- if (minBoxSize) {
- if (minBoxSize.horizontal) {
- var scaleMargin = {
- left: Math.max(outerBoxSizes.left, maxPadding.left),
- right: Math.max(outerBoxSizes.right, maxPadding.right),
- top: 0,
- bottom: 0
- };
-
- // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends
- // on the margin. Sometimes they need to increase in size slightly
- box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);
- } else {
- box.update(minBoxSize.width, maxChartAreaHeight);
- }
- }
- }
-
- // Update, and calculate the left and right margins for the horizontal boxes
- helpers$1.each(verticalBoxes, fitBox);
- addSizeByPosition(verticalBoxes, outerBoxSizes);
-
- // Set the Left and Right margins for the horizontal boxes
- helpers$1.each(horizontalBoxes, fitBox);
- addSizeByPosition(horizontalBoxes, outerBoxSizes);
-
- function finalFitVerticalBox(box) {
- var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) {
- return minSize.box === box;
- });
- var scaleMargin = {
- left: 0,
- right: 0,
- top: outerBoxSizes.top,
- bottom: outerBoxSizes.bottom
- };
-
- if (minBoxSize) {
- box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin);
- }
- }
-
- // Let the left layout know the final margin
- helpers$1.each(verticalBoxes, finalFitVerticalBox);
-
- // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)
- outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding};
- addSizeByPosition(outerBoxes, outerBoxSizes);
-
- // We may be adding some padding to account for rotated x axis labels
- var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0);
- outerBoxSizes.left += leftPaddingAddition;
- outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0);
-
- var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0);
- outerBoxSizes.top += topPaddingAddition;
- outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0);
-
- // Figure out if our chart area changed. This would occur if the dataset layout label rotation
- // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do
- // without calling `fit` again
- var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom;
- var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right;
+ var params = Object.freeze({
+ outerWidth: width,
+ outerHeight: height,
+ padding: padding,
+ availableWidth: availableWidth,
+ vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,
+ hBoxMaxHeight: availableHeight / 2
+ });
+ var chartArea = extend({
+ maxPadding: extend({}, padding),
+ w: availableWidth,
+ h: availableHeight,
+ x: padding.left,
+ y: padding.top
+ }, padding);
- if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {
- helpers$1.each(verticalBoxes, function(box) {
- box.height = newMaxChartAreaHeight;
- });
+ setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);
- helpers$1.each(horizontalBoxes, function(box) {
- if (!box.fullWidth) {
- box.width = newMaxChartAreaWidth;
- }
- });
+ // First fit vertical boxes
+ fitBoxes(verticalBoxes, chartArea, params);
- maxChartAreaHeight = newMaxChartAreaHeight;
- maxChartAreaWidth = newMaxChartAreaWidth;
+ // Then fit horizontal boxes
+ if (fitBoxes(horizontalBoxes, chartArea, params)) {
+ // if the area changed, re-fit vertical boxes
+ fitBoxes(verticalBoxes, chartArea, params);
}
- // Step 7 - Position the boxes
- var left = leftPadding + leftPaddingAddition;
- var top = topPadding + topPaddingAddition;
-
- function placeBox(box) {
- if (box.isHorizontal()) {
- box.left = box.fullWidth ? leftPadding : outerBoxSizes.left;
- box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth;
- box.top = top;
- box.bottom = top + box.height;
-
- // Move to next point
- top = box.bottom;
-
- } else {
-
- box.left = left;
- box.right = left + box.width;
- box.top = outerBoxSizes.top;
- box.bottom = outerBoxSizes.top + maxChartAreaHeight;
-
- // Move to next point
- left = box.right;
- }
- }
+ handleMaxPadding(chartArea);
- helpers$1.each(leftBoxes.concat(topBoxes), placeBox);
+ // Finally place the boxes to correct coordinates
+ placeBoxes(boxes.leftAndTop, chartArea, params);
- // Account for chart width and height
- left += maxChartAreaWidth;
- top += maxChartAreaHeight;
+ // Move to opposite side of chart
+ chartArea.x += chartArea.w;
+ chartArea.y += chartArea.h;
- helpers$1.each(rightBoxes, placeBox);
- helpers$1.each(bottomBoxes, placeBox);
+ placeBoxes(boxes.rightAndBottom, chartArea, params);
- // Step 8
chart.chartArea = {
- left: outerBoxSizes.left,
- top: outerBoxSizes.top,
- right: outerBoxSizes.left + maxChartAreaWidth,
- bottom: outerBoxSizes.top + maxChartAreaHeight
+ left: chartArea.left,
+ top: chartArea.top,
+ right: chartArea.left + chartArea.w,
+ bottom: chartArea.top + chartArea.h
};
- // Step 9
- helpers$1.each(chartAreaBoxes, function(box) {
- box.left = chart.chartArea.left;
- box.top = chart.chartArea.top;
- box.right = chart.chartArea.right;
- box.bottom = chart.chartArea.bottom;
-
- box.update(maxChartAreaWidth, maxChartAreaHeight);
+ // Finally update boxes in chartArea (radial scale for example)
+ helpers$1.each(boxes.chartArea, function(layout) {
+ var box = layout.box;
+ extend(box, chart.chartArea);
+ box.update(chartArea.w, chartArea.h);
});
}
};
@@ -6543,26 +7407,13 @@ var platform_basic = {
}
};
-var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n at keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n";
+var platform_dom = "/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n at keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n";
var platform_dom$1 = /*#__PURE__*/Object.freeze({
-default: platform_dom
+__proto__: null,
+'default': platform_dom
});
-var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-function commonjsRequire () {
- throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
-}
-
-function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
-}
-
-function getCjsExportFromNamespace (n) {
- return n && n.default || n;
-}
-
var stylesheet = getCjsExportFromNamespace(platform_dom$1);
var EXPANDO_KEY = '$chartjs';
@@ -6852,17 +7703,22 @@ function removeResizeListener(node) {
}
}
-function injectCSS(platform, css) {
+/**
+ * Injects CSS styles inline if the styles are not already present.
+ * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the <style>.
+ * @param {string} css - the CSS to be injected.
+ */
+function injectCSS(rootNode, css) {
// https://stackoverflow.com/q/3922139
- var style = platform._style || document.createElement('style');
- if (!platform._style) {
- platform._style = style;
+ var expando = rootNode[EXPANDO_KEY] || (rootNode[EXPANDO_KEY] = {});
+ if (!expando.containsStyles) {
+ expando.containsStyles = true;
css = '/* Chart.js */\n' + css;
+ var style = document.createElement('style');
style.setAttribute('type', 'text/css');
- document.getElementsByTagName('head')[0].appendChild(style);
+ style.appendChild(document.createTextNode(css));
+ rootNode.appendChild(style);
}
-
- style.appendChild(document.createTextNode(css));
}
var platform_dom$2 = {
@@ -6883,18 +7739,18 @@ var platform_dom$2 = {
_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',
/**
+ * Initializes resources that depend on platform options.
+ * @param {HTMLCanvasElement} canvas - The Canvas element.
* @private
*/
- _ensureLoaded: function() {
- if (this._loaded) {
- return;
- }
-
- this._loaded = true;
-
- // https://github.com/chartjs/Chart.js/issues/5208
+ _ensureLoaded: function(canvas) {
if (!this.disableCSSInjection) {
- injectCSS(this, stylesheet);
+ // If the canvas is in a shadow DOM, then the styles must also be inserted
+ // into the same shadow DOM.
+ // https://github.com/chartjs/Chart.js/issues/5763
+ var root = canvas.getRootNode ? canvas.getRootNode() : document;
+ var targetNode = root.host ? root : document.head;
+ injectCSS(targetNode, stylesheet);
}
},
@@ -6916,10 +7772,6 @@ var platform_dom$2 = {
// https://github.com/chartjs/Chart.js/issues/2807
var context = item && item.getContext && item.getContext('2d');
- // Load platform resources on first chart creation, to make possible to change
- // platform options after importing the library (e.g. `disableCSSInjection`).
- this._ensureLoaded();
-
// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is
// inside an iframe or when running in a protected environment. We could guess the
// types from their toString() value but let's keep things flexible and assume it's
@@ -6928,6 +7780,9 @@ var platform_dom$2 = {
// https://github.com/chartjs/Chart.js/issues/4102
// https://github.com/chartjs/Chart.js/issues/4152
if (context && context.canvas === item) {
+ // Load platform resources on first chart creation, to make it possible to
+ // import the library before setting platform options.
+ this._ensureLoaded(item);
initCanvas(item, config);
return context;
}
@@ -7260,7 +8115,7 @@ var core_scaleService = {
},
getScaleDefaults: function(type) {
// Return the scale defaults merged with the global settings so that we always use the latest ones
- return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {};
+ return this.defaults.hasOwnProperty(type) ? helpers$1.merge(Object.create(null), [core_defaults.scale, this.defaults[type]]) : {};
},
updateScaleDefaults: function(type, additions) {
var me = this;
@@ -7280,7 +8135,8 @@ var core_scaleService = {
}
};
-var valueOrDefault$7 = helpers$1.valueOrDefault;
+var valueOrDefault$8 = helpers$1.valueOrDefault;
+var getRtlHelper = helpers$1.rtl.getRtlAdapter;
core_defaults._set('global', {
tooltips: {
@@ -7518,28 +8374,32 @@ function getBaseModel(tooltipOpts) {
xAlign: tooltipOpts.xAlign,
yAlign: tooltipOpts.yAlign,
+ // Drawing direction and text direction
+ rtl: tooltipOpts.rtl,
+ textDirection: tooltipOpts.textDirection,
+
// Body
bodyFontColor: tooltipOpts.bodyFontColor,
- _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),
- _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),
+ _bodyFontFamily: valueOrDefault$8(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),
+ _bodyFontStyle: valueOrDefault$8(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),
_bodyAlign: tooltipOpts.bodyAlign,
- bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),
+ bodyFontSize: valueOrDefault$8(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),
bodySpacing: tooltipOpts.bodySpacing,
// Title
titleFontColor: tooltipOpts.titleFontColor,
- _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),
- _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),
- titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),
+ _titleFontFamily: valueOrDefault$8(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),
+ _titleFontStyle: valueOrDefault$8(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),
+ titleFontSize: valueOrDefault$8(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),
_titleAlign: tooltipOpts.titleAlign,
titleSpacing: tooltipOpts.titleSpacing,
titleMarginBottom: tooltipOpts.titleMarginBottom,
// Footer
footerFontColor: tooltipOpts.footerFontColor,
- _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),
- _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),
- footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),
+ _footerFontFamily: valueOrDefault$8(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),
+ _footerFontStyle: valueOrDefault$8(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),
+ footerFontSize: valueOrDefault$8(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),
_footerAlign: tooltipOpts.footerAlign,
footerSpacing: tooltipOpts.footerSpacing,
footerMarginTop: tooltipOpts.footerMarginTop,
@@ -7766,7 +8626,7 @@ function getBeforeAfterBodyLines(callback) {
return pushOrConcat([], splitNewlines(callback));
}
-var exports$3 = core_element.extend({
+var exports$4 = core_element.extend({
initialize: function() {
this._model = getBaseModel(this._options);
this._lastActive = [];
@@ -8024,25 +8884,28 @@ var exports$3 = core_element.extend({
drawTitle: function(pt, vm, ctx) {
var title = vm.title;
+ var length = title.length;
+ var titleFontSize, titleSpacing, i;
+
+ if (length) {
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- if (title.length) {
pt.x = getAlignedX(vm, vm._titleAlign);
- ctx.textAlign = vm._titleAlign;
- ctx.textBaseline = 'top';
+ ctx.textAlign = rtlHelper.textAlign(vm._titleAlign);
+ ctx.textBaseline = 'middle';
- var titleFontSize = vm.titleFontSize;
- var titleSpacing = vm.titleSpacing;
+ titleFontSize = vm.titleFontSize;
+ titleSpacing = vm.titleSpacing;
ctx.fillStyle = vm.titleFontColor;
ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);
- var i, len;
- for (i = 0, len = title.length; i < len; ++i) {
- ctx.fillText(title[i], pt.x, pt.y);
+ for (i = 0; i < length; ++i) {
+ ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFontSize / 2);
pt.y += titleFontSize + titleSpacing; // Line Height and spacing
- if (i + 1 === title.length) {
+ if (i + 1 === length) {
pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing
}
}
@@ -8055,60 +8918,68 @@ var exports$3 = core_element.extend({
var bodyAlign = vm._bodyAlign;
var body = vm.body;
var drawColorBoxes = vm.displayColors;
- var labelColors = vm.labelColors;
var xLinePadding = 0;
var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;
- var textColor;
- ctx.textAlign = bodyAlign;
- ctx.textBaseline = 'top';
- ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- pt.x = getAlignedX(vm, bodyAlign);
-
- // Before Body
var fillLineOfText = function(line) {
- ctx.fillText(line, pt.x + xLinePadding, pt.y);
+ ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyFontSize / 2);
pt.y += bodyFontSize + bodySpacing;
};
+ var bodyItem, textColor, labelColors, lines, i, j, ilen, jlen;
+ var bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);
+
+ ctx.textAlign = bodyAlign;
+ ctx.textBaseline = 'middle';
+ ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
+
+ pt.x = getAlignedX(vm, bodyAlignForCalculation);
+
// Before body lines
ctx.fillStyle = vm.bodyFontColor;
helpers$1.each(vm.beforeBody, fillLineOfText);
- xLinePadding = drawColorBoxes && bodyAlign !== 'right'
+ xLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right'
? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2)
: 0;
// Draw body lines now
- helpers$1.each(body, function(bodyItem, i) {
+ for (i = 0, ilen = body.length; i < ilen; ++i) {
+ bodyItem = body[i];
textColor = vm.labelTextColors[i];
+ labelColors = vm.labelColors[i];
+
ctx.fillStyle = textColor;
helpers$1.each(bodyItem.before, fillLineOfText);
- helpers$1.each(bodyItem.lines, function(line) {
+ lines = bodyItem.lines;
+ for (j = 0, jlen = lines.length; j < jlen; ++j) {
// Draw Legend-like boxes if needed
if (drawColorBoxes) {
+ var rtlColorX = rtlHelper.x(colorX);
+
// Fill a white rect so that colours merge nicely if the opacity is < 1
ctx.fillStyle = vm.legendColorBackground;
- ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize);
+ ctx.fillRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
// Border
ctx.lineWidth = 1;
- ctx.strokeStyle = labelColors[i].borderColor;
- ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize);
+ ctx.strokeStyle = labelColors.borderColor;
+ ctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
// Inner square
- ctx.fillStyle = labelColors[i].backgroundColor;
- ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);
+ ctx.fillStyle = labelColors.backgroundColor;
+ ctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), bodyFontSize - 2), pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);
ctx.fillStyle = textColor;
}
- fillLineOfText(line);
- });
+ fillLineOfText(lines[j]);
+ }
helpers$1.each(bodyItem.after, fillLineOfText);
- });
+ }
// Reset back to 0 for after body
xLinePadding = 0;
@@ -8120,21 +8991,27 @@ var exports$3 = core_element.extend({
drawFooter: function(pt, vm, ctx) {
var footer = vm.footer;
+ var length = footer.length;
+ var footerFontSize, i;
+
+ if (length) {
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- if (footer.length) {
pt.x = getAlignedX(vm, vm._footerAlign);
pt.y += vm.footerMarginTop;
- ctx.textAlign = vm._footerAlign;
- ctx.textBaseline = 'top';
+ ctx.textAlign = rtlHelper.textAlign(vm._footerAlign);
+ ctx.textBaseline = 'middle';
+
+ footerFontSize = vm.footerFontSize;
ctx.fillStyle = vm.footerFontColor;
- ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
+ ctx.font = helpers$1.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
- helpers$1.each(footer, function(line) {
- ctx.fillText(line, pt.x, pt.y);
- pt.y += vm.footerFontSize + vm.footerSpacing;
- });
+ for (i = 0; i < length; ++i) {
+ ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFontSize / 2);
+ pt.y += footerFontSize + vm.footerSpacing;
+ }
}
},
@@ -8214,6 +9091,8 @@ var exports$3 = core_element.extend({
// Draw Title, Body, and Footer
pt.y += vm.yPadding;
+ helpers$1.rtl.overrideTextDirection(ctx, vm.textDirection);
+
// Titles
this.drawTitle(pt, vm, ctx);
@@ -8223,6 +9102,8 @@ var exports$3 = core_element.extend({
// Footer
this.drawFooter(pt, vm, ctx);
+ helpers$1.rtl.restoreTextDirection(ctx, vm.textDirection);
+
ctx.restore();
}
},
@@ -8245,6 +9126,9 @@ var exports$3 = core_element.extend({
me._active = [];
} else {
me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);
+ if (options.reverse) {
+ me._active.reverse();
+ }
}
// Remember Last Actives
@@ -8274,10 +9158,10 @@ var exports$3 = core_element.extend({
*/
var positioners_1 = positioners;
-var core_tooltip = exports$3;
+var core_tooltip = exports$4;
core_tooltip.positioners = positioners_1;
-var valueOrDefault$8 = helpers$1.valueOrDefault;
+var valueOrDefault$9 = helpers$1.valueOrDefault;
core_defaults._set('global', {
elements: {},
@@ -8306,7 +9190,7 @@ core_defaults._set('global', {
* returns a deep copy of the result, thus doesn't alter inputs.
*/
function mergeScaleConfig(/* config objects ... */) {
- return helpers$1.merge({}, [].slice.call(arguments), {
+ return helpers$1.merge(Object.create(null), [].slice.call(arguments), {
merger: function(key, target, source, options) {
if (key === 'xAxes' || key === 'yAxes') {
var slen = source[key].length;
@@ -8318,7 +9202,7 @@ function mergeScaleConfig(/* config objects ... */) {
for (i = 0; i < slen; ++i) {
scale = source[key][i];
- type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear');
+ type = valueOrDefault$9(scale.type, key === 'xAxes' ? 'category' : 'linear');
if (i >= target[key].length) {
target[key].push({});
@@ -8346,9 +9230,9 @@ function mergeScaleConfig(/* config objects ... */) {
* a deep copy of the result, thus doesn't alter inputs.
*/
function mergeConfig(/* config objects ... */) {
- return helpers$1.merge({}, [].slice.call(arguments), {
+ return helpers$1.merge(Object.create(null), [].slice.call(arguments), {
merger: function(key, target, source, options) {
- var tval = target[key] || {};
+ var tval = target[key] || Object.create(null);
var sval = source[key];
if (key === 'scales') {
@@ -8365,7 +9249,7 @@ function mergeConfig(/* config objects ... */) {
}
function initConfig(config) {
- config = config || {};
+ config = config || Object.create(null);
// Do NOT use mergeConfig for the data object because this method merges arrays
// and so would change references to labels and datasets, preventing data updates.
@@ -8402,10 +9286,31 @@ function updateConfig(chart) {
chart.tooltip.initialize();
}
+function nextAvailableScaleId(axesOpts, prefix, index) {
+ var id;
+ var hasId = function(obj) {
+ return obj.id === id;
+ };
+
+ do {
+ id = prefix + index++;
+ } while (helpers$1.findIndex(axesOpts, hasId) >= 0);
+
+ return id;
+}
+
function positionIsHorizontal(position) {
return position === 'top' || position === 'bottom';
}
+function compare2Level(l1, l2) {
+ return function(a, b) {
+ return a[l1] === b[l1]
+ ? a[l2] - b[l2]
+ : a[l1] - b[l1];
+ };
+}
+
var Chart = function(item, config) {
this.construct(item, config);
return this;
@@ -8434,6 +9339,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
me.aspectRatio = height ? width / height : null;
me.options = config.options;
me._bufferedRender = false;
+ me._layers = [];
/**
* Provided for backward compatibility, Chart and Chart.Controller have been merged,
@@ -8490,9 +9396,6 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
me.resize(true);
}
- // Make sure scales have IDs and are built before we build any controllers.
- me.ensureScalesHaveIDs();
- me.buildOrUpdateScales();
me.initToolTip();
// After init plugin notification
@@ -8559,11 +9462,15 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
var scaleOptions = options.scale;
helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) {
- xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);
+ if (!xAxisOptions.id) {
+ xAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);
+ }
});
helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) {
- yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);
+ if (!yAxisOptions.id) {
+ yAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);
+ }
});
if (scaleOptions) {
@@ -8607,7 +9514,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
helpers$1.each(items, function(item) {
var scaleOptions = item.options;
var id = scaleOptions.id;
- var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype);
+ var scaleType = valueOrDefault$9(scaleOptions.type, item.dtype);
if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {
scaleOptions.position = item.dposition;
@@ -8659,19 +9566,24 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
buildOrUpdateControllers: function() {
var me = this;
var newControllers = [];
+ var datasets = me.data.datasets;
+ var i, ilen;
- helpers$1.each(me.data.datasets, function(dataset, datasetIndex) {
- var meta = me.getDatasetMeta(datasetIndex);
+ for (i = 0, ilen = datasets.length; i < ilen; i++) {
+ var dataset = datasets[i];
+ var meta = me.getDatasetMeta(i);
var type = dataset.type || me.config.type;
if (meta.type && meta.type !== type) {
- me.destroyDatasetMeta(datasetIndex);
- meta = me.getDatasetMeta(datasetIndex);
+ me.destroyDatasetMeta(i);
+ meta = me.getDatasetMeta(i);
}
meta.type = type;
+ meta.order = dataset.order || 0;
+ meta.index = i;
if (meta.controller) {
- meta.controller.updateIndex(datasetIndex);
+ meta.controller.updateIndex(i);
meta.controller.linkScales();
} else {
var ControllerClass = controllers[meta.type];
@@ -8679,10 +9591,10 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
throw new Error('"' + meta.type + '" is not a chart type.');
}
- meta.controller = new ControllerClass(me, datasetIndex);
+ meta.controller = new ControllerClass(me, i);
newControllers.push(meta.controller);
}
- }, me);
+ }
return newControllers;
},
@@ -8708,6 +9620,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
update: function(config) {
var me = this;
+ var i, ilen;
if (!config || typeof config !== 'object') {
// backwards compatibility
@@ -8734,9 +9647,9 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
var newControllers = me.buildOrUpdateControllers();
// Make sure all dataset controllers have correct meta data counts
- helpers$1.each(me.data.datasets, function(dataset, datasetIndex) {
- me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();
- }, me);
+ for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) {
+ me.getDatasetMeta(i).controller.buildOrUpdateElements();
+ }
me.updateLayout();
@@ -8760,6 +9673,8 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
// Do this before render so that any plugins that need final scale updates can use it
core_plugins.notify(me, 'afterUpdate');
+ me._layers.sort(compare2Level('z', '_idx'));
+
if (me._bufferedRender) {
me._bufferedRequest = {
duration: config.duration,
@@ -8785,6 +9700,20 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
core_layouts.update(this, this.width, this.height);
+ me._layers = [];
+ helpers$1.each(me.boxes, function(box) {
+ // _configure is called twice, once in core.scale.update and once here.
+ // Here the boxes are fully updated and at their final positions.
+ if (box._configure) {
+ box._configure();
+ }
+ me._layers.push.apply(me._layers, box._layers());
+ }, me);
+
+ me._layers.forEach(function(item, index) {
+ item._idx = index;
+ });
+
/**
* Provided for backward compatibility, use `afterLayout` instead.
* @method IPlugin#afterScaleUpdate
@@ -8832,7 +9761,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
return;
}
- meta.controller.update();
+ meta.controller._update();
core_plugins.notify(me, 'afterDatasetUpdate', [args]);
},
@@ -8849,7 +9778,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
}
var animationOptions = me.options.animation;
- var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration);
+ var duration = valueOrDefault$9(config.duration, animationOptions && animationOptions.duration);
var lazy = config.lazy;
if (core_plugins.notify(me, 'beforeRender') === false) {
@@ -8891,6 +9820,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
draw: function(easingValue) {
var me = this;
+ var i, layers;
me.clear();
@@ -8908,12 +9838,21 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
return;
}
- // Draw all the scales
- helpers$1.each(me.boxes, function(box) {
- box.draw(me.chartArea);
- }, me);
+ // Because of plugin hooks (before/afterDatasetsDraw), datasets can't
+ // currently be part of layers. Instead, we draw
+ // layers <= 0 before(default, backward compat), and the rest after
+ layers = me._layers;
+ for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {
+ layers[i].draw(me.chartArea);
+ }
me.drawDatasets(easingValue);
+
+ // Rest of layers
+ for (; i < layers.length; ++i) {
+ layers[i].draw(me.chartArea);
+ }
+
me._drawTooltip(easingValue);
core_plugins.notify(me, 'afterDraw', [easingValue]);
@@ -8934,6 +9873,33 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
me.tooltip.transition(easingValue);
},
+ /**
+ * @private
+ */
+ _getSortedDatasetMetas: function(filterVisible) {
+ var me = this;
+ var datasets = me.data.datasets || [];
+ var result = [];
+ var i, ilen;
+
+ for (i = 0, ilen = datasets.length; i < ilen; ++i) {
+ if (!filterVisible || me.isDatasetVisible(i)) {
+ result.push(me.getDatasetMeta(i));
+ }
+ }
+
+ result.sort(compare2Level('order', 'index'));
+
+ return result;
+ },
+
+ /**
+ * @private
+ */
+ _getSortedVisibleDatasetMetas: function() {
+ return this._getSortedDatasetMetas(true);
+ },
+
/**
* Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`
* hook, in which case, plugins will not be called on `afterDatasetsDraw`.
@@ -8941,16 +9907,15 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
*/
drawDatasets: function(easingValue) {
var me = this;
+ var metasets, i;
if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {
return;
}
- // Draw datasets reversed to support proper line stacking
- for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {
- if (me.isDatasetVisible(i)) {
- me.drawDataset(i, easingValue);
- }
+ metasets = me._getSortedVisibleDatasetMetas();
+ for (i = metasets.length - 1; i >= 0; --i) {
+ me.drawDataset(metasets[i], easingValue);
}
core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);
@@ -8961,12 +9926,11 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
* hook, in which case, plugins will not be called on `afterDatasetDraw`.
* @private
*/
- drawDataset: function(index, easingValue) {
+ drawDataset: function(meta, easingValue) {
var me = this;
- var meta = me.getDatasetMeta(index);
var args = {
meta: meta,
- index: index,
+ index: meta.index,
easingValue: easingValue
};
@@ -9046,7 +10010,9 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
controller: null,
hidden: null, // See isDatasetVisible() comment
xAxisID: null,
- yAxisID: null
+ yAxisID: null,
+ order: dataset.order || 0,
+ index: datasetIndex
};
}
@@ -9172,15 +10138,19 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
},
updateHoverStyle: function(elements, mode, enabled) {
- var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';
+ var prefix = enabled ? 'set' : 'remove';
var element, i, ilen;
for (i = 0, ilen = elements.length; i < ilen; ++i) {
element = elements[i];
if (element) {
- this.getDatasetMeta(element._datasetIndex).controller[method](element);
+ this.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);
}
}
+
+ if (mode === 'dataset') {
+ this.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();
+ }
},
/**
@@ -9396,7 +10366,7 @@ var core_helpers = function() {
};
helpers$1.almostWhole = function(x, epsilon) {
var rounded = Math.round(x);
- return (((rounded - epsilon) < x) && ((rounded + epsilon) > x));
+ return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);
};
helpers$1.max = function(array) {
return array.reduce(function(max, value) {
@@ -9425,19 +10395,6 @@ var core_helpers = function() {
}
return x > 0 ? 1 : -1;
};
- helpers$1.log10 = Math.log10 ?
- function(x) {
- return Math.log10(x);
- } :
- function(x) {
- var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.
- // Check for whole powers of 10,
- // which due to floating point rounding error should be corrected.
- var powerOf10 = Math.round(exponent);
- var isPowerOf10 = x === Math.pow(10, powerOf10);
-
- return isPowerOf10 ? powerOf10 : exponent;
- };
helpers$1.toRadians = function(degrees) {
return degrees * (Math.PI / 180);
};
@@ -9878,25 +10835,30 @@ var core_helpers = function() {
ctx.font = font;
var longest = 0;
- helpers$1.each(arrayOfThings, function(thing) {
+ var ilen = arrayOfThings.length;
+ var i, j, jlen, thing, nestedThing;
+ for (i = 0; i < ilen; i++) {
+ thing = arrayOfThings[i];
+
// Undefined strings and arrays should not be measured
if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {
longest = helpers$1.measureText(ctx, data, gc, longest, thing);
} else if (helpers$1.isArray(thing)) {
// if it is an array lets measure each element
// to do maybe simplify this function a bit so we can do this more recursively?
- helpers$1.each(thing, function(nestedThing) {
+ for (j = 0, jlen = thing.length; j < jlen; j++) {
+ nestedThing = thing[j];
// Undefined strings and arrays should not be measured
if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {
longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);
}
- });
+ }
}
- });
+ }
var gcLen = gc.length / 2;
if (gcLen > arrayOfThings.length) {
- for (var i = 0; i < gcLen; i++) {
+ for (i = 0; i < gcLen; i++) {
delete data[gc[i]];
}
gc.splice(0, gcLen);
@@ -9914,6 +10876,10 @@ var core_helpers = function() {
}
return longest;
};
+
+ /**
+ * @deprecated
+ */
helpers$1.numberOfLabelLines = function(arrayOfThings) {
var numberOfLines = 1;
helpers$1.each(arrayOfThings, function(thing) {
@@ -10111,7 +11077,9 @@ var core_ticks = {
var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));
if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation
var logTick = helpers$1.log10(Math.abs(tickValue));
- tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta));
+ var numExponential = Math.floor(logTick) - Math.floor(logDelta);
+ numExponential = Math.max(Math.min(numExponential, 20), 0);
+ tickString = tickValue.toExponential(numExponential);
} else {
var numDecimal = -1 * Math.floor(logDelta);
numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places
@@ -10137,7 +11105,9 @@ var core_ticks = {
}
};
-var valueOrDefault$9 = helpers$1.valueOrDefault;
+var isArray = helpers$1.isArray;
+var isNullOrUndef = helpers$1.isNullOrUndef;
+var valueOrDefault$a = helpers$1.valueOrDefault;
var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;
core_defaults._set('scale', {
@@ -10148,7 +11118,7 @@ core_defaults._set('scale', {
// grid line settings
gridLines: {
display: true,
- color: 'rgba(0, 0, 0, 0.1)',
+ color: 'rgba(0,0,0,0.1)',
lineWidth: 1,
drawBorder: true,
drawOnChartArea: true,
@@ -10197,41 +11167,270 @@ core_defaults._set('scale', {
}
});
-function labelsFromTicks(ticks) {
- var labels = [];
- var i, ilen;
+/** Returns a new array containing numItems from arr */
+function sample(arr, numItems) {
+ var result = [];
+ var increment = arr.length / numItems;
+ var i = 0;
+ var len = arr.length;
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
- labels.push(ticks[i].label);
+ for (; i < len; i += increment) {
+ result.push(arr[Math.floor(i)]);
}
-
- return labels;
+ return result;
}
function getPixelForGridLine(scale, index, offsetGridLines) {
- var lineValue = scale.getPixelForTick(index);
+ var length = scale.getTicks().length;
+ var validIndex = Math.min(index, length - 1);
+ var lineValue = scale.getPixelForTick(validIndex);
+ var start = scale._startPixel;
+ var end = scale._endPixel;
+ var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.
+ var offset;
if (offsetGridLines) {
- if (scale.getTicks().length === 1) {
- lineValue -= scale.isHorizontal() ?
- Math.max(lineValue - scale.left, scale.right - lineValue) :
- Math.max(lineValue - scale.top, scale.bottom - lineValue);
+ if (length === 1) {
+ offset = Math.max(lineValue - start, end - lineValue);
} else if (index === 0) {
- lineValue -= (scale.getPixelForTick(1) - lineValue) / 2;
+ offset = (scale.getPixelForTick(1) - lineValue) / 2;
} else {
- lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;
+ offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;
+ }
+ lineValue += validIndex < index ? offset : -offset;
+
+ // Return undefined if the pixel is out of the range
+ if (lineValue < start - epsilon || lineValue > end + epsilon) {
+ return;
}
}
return lineValue;
}
-function computeTextSize(context, tick, font) {
- return helpers$1.isArray(tick) ?
- helpers$1.longestText(context, font, tick) :
- context.measureText(tick).width;
+function garbageCollect(caches, length) {
+ helpers$1.each(caches, function(cache) {
+ var gc = cache.gc;
+ var gcLen = gc.length / 2;
+ var i;
+ if (gcLen > length) {
+ for (i = 0; i < gcLen; ++i) {
+ delete cache.data[gc[i]];
+ }
+ gc.splice(0, gcLen);
+ }
+ });
+}
+
+/**
+ * Returns {width, height, offset} objects for the first, last, widest, highest tick
+ * labels where offset indicates the anchor point offset from the top in pixels.
+ */
+function computeLabelSizes(ctx, tickFonts, ticks, caches) {
+ var length = ticks.length;
+ var widths = [];
+ var heights = [];
+ var offsets = [];
+ var widestLabelSize = 0;
+ var highestLabelSize = 0;
+ var i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel, widest, highest;
+
+ for (i = 0; i < length; ++i) {
+ label = ticks[i].label;
+ tickFont = ticks[i].major ? tickFonts.major : tickFonts.minor;
+ ctx.font = fontString = tickFont.string;
+ cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};
+ lineHeight = tickFont.lineHeight;
+ width = height = 0;
+ // Undefined labels and arrays should not be measured
+ if (!isNullOrUndef(label) && !isArray(label)) {
+ width = helpers$1.measureText(ctx, cache.data, cache.gc, width, label);
+ height = lineHeight;
+ } else if (isArray(label)) {
+ // if it is an array let's measure each element
+ for (j = 0, jlen = label.length; j < jlen; ++j) {
+ nestedLabel = label[j];
+ // Undefined labels and arrays should not be measured
+ if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {
+ width = helpers$1.measureText(ctx, cache.data, cache.gc, width, nestedLabel);
+ height += lineHeight;
+ }
+ }
+ }
+ widths.push(width);
+ heights.push(height);
+ offsets.push(lineHeight / 2);
+ widestLabelSize = Math.max(width, widestLabelSize);
+ highestLabelSize = Math.max(height, highestLabelSize);
+ }
+ garbageCollect(caches, length);
+
+ widest = widths.indexOf(widestLabelSize);
+ highest = heights.indexOf(highestLabelSize);
+
+ function valueAt(idx) {
+ return {
+ width: widths[idx] || 0,
+ height: heights[idx] || 0,
+ offset: offsets[idx] || 0
+ };
+ }
+
+ return {
+ first: valueAt(0),
+ last: valueAt(length - 1),
+ widest: valueAt(widest),
+ highest: valueAt(highest)
+ };
+}
+
+function getTickMarkLength(options) {
+ return options.drawTicks ? options.tickMarkLength : 0;
+}
+
+function getScaleLabelHeight(options) {
+ var font, padding;
+
+ if (!options.display) {
+ return 0;
+ }
+
+ font = helpers$1.options._parseFont(options);
+ padding = helpers$1.options.toPadding(options.padding);
+
+ return font.lineHeight + padding.height;
+}
+
+function parseFontOptions(options, nestedOpts) {
+ return helpers$1.extend(helpers$1.options._parseFont({
+ fontFamily: valueOrDefault$a(nestedOpts.fontFamily, options.fontFamily),
+ fontSize: valueOrDefault$a(nestedOpts.fontSize, options.fontSize),
+ fontStyle: valueOrDefault$a(nestedOpts.fontStyle, options.fontStyle),
+ lineHeight: valueOrDefault$a(nestedOpts.lineHeight, options.lineHeight)
+ }), {
+ color: helpers$1.options.resolve([nestedOpts.fontColor, options.fontColor, core_defaults.global.defaultFontColor])
+ });
+}
+
+function parseTickFontOptions(options) {
+ var minor = parseFontOptions(options, options.minor);
+ var major = options.major.enabled ? parseFontOptions(options, options.major) : minor;
+
+ return {minor: minor, major: major};
+}
+
+function nonSkipped(ticksToFilter) {
+ var filtered = [];
+ var item, index, len;
+ for (index = 0, len = ticksToFilter.length; index < len; ++index) {
+ item = ticksToFilter[index];
+ if (typeof item._index !== 'undefined') {
+ filtered.push(item);
+ }
+ }
+ return filtered;
+}
+
+function getEvenSpacing(arr) {
+ var len = arr.length;
+ var i, diff;
+
+ if (len < 2) {
+ return false;
+ }
+
+ for (diff = arr[0], i = 1; i < len; ++i) {
+ if (arr[i] - arr[i - 1] !== diff) {
+ return false;
+ }
+ }
+ return diff;
+}
+
+function calculateSpacing(majorIndices, ticks, axisLength, ticksLimit) {
+ var evenMajorSpacing = getEvenSpacing(majorIndices);
+ var spacing = (ticks.length - 1) / ticksLimit;
+ var factors, factor, i, ilen;
+
+ // If the major ticks are evenly spaced apart, place the minor ticks
+ // so that they divide the major ticks into even chunks
+ if (!evenMajorSpacing) {
+ return Math.max(spacing, 1);
+ }
+
+ factors = helpers$1.math._factorize(evenMajorSpacing);
+ for (i = 0, ilen = factors.length - 1; i < ilen; i++) {
+ factor = factors[i];
+ if (factor > spacing) {
+ return factor;
+ }
+ }
+ return Math.max(spacing, 1);
+}
+
+function getMajorIndices(ticks) {
+ var result = [];
+ var i, ilen;
+ for (i = 0, ilen = ticks.length; i < ilen; i++) {
+ if (ticks[i].major) {
+ result.push(i);
+ }
+ }
+ return result;
+}
+
+function skipMajors(ticks, majorIndices, spacing) {
+ var count = 0;
+ var next = majorIndices[0];
+ var i, tick;
+
+ spacing = Math.ceil(spacing);
+ for (i = 0; i < ticks.length; i++) {
+ tick = ticks[i];
+ if (i === next) {
+ tick._index = i;
+ count++;
+ next = majorIndices[count * spacing];
+ } else {
+ delete tick.label;
+ }
+ }
+}
+
+function skip(ticks, spacing, majorStart, majorEnd) {
+ var start = valueOrDefault$a(majorStart, 0);
+ var end = Math.min(valueOrDefault$a(majorEnd, ticks.length), ticks.length);
+ var count = 0;
+ var length, i, tick, next;
+
+ spacing = Math.ceil(spacing);
+ if (majorEnd) {
+ length = majorEnd - majorStart;
+ spacing = length / Math.floor(length / spacing);
+ }
+
+ next = start;
+
+ while (next < 0) {
+ count++;
+ next = Math.round(start + count * spacing);
+ }
+
+ for (i = Math.max(start, 0); i < end; i++) {
+ tick = ticks[i];
+ if (i === next) {
+ tick._index = i;
+ count++;
+ next = Math.round(start + count * spacing);
+ } else {
+ delete tick.label;
+ }
+ }
}
-var core_scale = core_element.extend({
+var Scale = core_element.extend({
+
+ zeroLineIndex: 0,
+
/**
* Get the padding needed for the scale
* @method getPadding
@@ -10256,40 +11455,45 @@ var core_scale = core_element.extend({
return this._ticks;
},
+ /**
+ * @private
+ */
+ _getLabels: function() {
+ var data = this.chart.data;
+ return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];
+ },
+
// These methods are ordered by lifecyle. Utilities then follow.
// Any function defined here is inherited by all scale types.
// Any function can be extended by the scale type
+ /**
+ * Provided for backward compatibility, not available anymore
+ * @function Chart.Scale.mergeTicksOptions
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ */
mergeTicksOptions: function() {
- var ticks = this.options.ticks;
- if (ticks.minor === false) {
- ticks.minor = {
- display: false
- };
- }
- if (ticks.major === false) {
- ticks.major = {
- display: false
- };
- }
- for (var key in ticks) {
- if (key !== 'major' && key !== 'minor') {
- if (typeof ticks.minor[key] === 'undefined') {
- ticks.minor[key] = ticks[key];
- }
- if (typeof ticks.major[key] === 'undefined') {
- ticks.major[key] = ticks[key];
- }
- }
- }
+ // noop
},
+
beforeUpdate: function() {
helpers$1.callback(this.options.beforeUpdate, [this]);
},
+ /**
+ * @param {number} maxWidth - the max width in pixels
+ * @param {number} maxHeight - the max height in pixels
+ * @param {object} margins - the space between the edge of the other scales and edge of the chart
+ * This space comes from two sources:
+ * - padding - space that's required to show the labels at the edges of the scale
+ * - thickness of scales or legends in another orientation
+ */
update: function(maxWidth, maxHeight, margins) {
var me = this;
- var i, ilen, labels, label, ticks, tick;
+ var tickOpts = me.options.ticks;
+ var sampleSize = tickOpts.sampleSize;
+ var i, ilen, labels, ticks, samplingEnabled;
// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
me.beforeUpdate();
@@ -10304,9 +11508,14 @@ var core_scale = core_element.extend({
bottom: 0
}, margins);
+ me._ticks = null;
+ me.ticks = null;
+ me._labelSizes = null;
me._maxLabelLines = 0;
me.longestLabelWidth = 0;
me.longestTextCache = me.longestTextCache || {};
+ me._gridLineItems = null;
+ me._labelItems = null;
// Dimensions
me.beforeSetDimensions();
@@ -10334,49 +11543,81 @@ var core_scale = core_element.extend({
// Allow modification of ticks in callback.
ticks = me.afterBuildTicks(ticks) || ticks;
- me.beforeTickToLabelConversion();
-
- // New implementations should return the formatted tick labels but for BACKWARD
- // COMPAT, we still support no return (`this.ticks` internally changed by calling
- // this method and supposed to contain only string values).
- labels = me.convertTicksToLabels(ticks) || me.ticks;
-
- me.afterTickToLabelConversion();
-
- me.ticks = labels; // BACKWARD COMPATIBILITY
-
- // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!
-
- // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)
- for (i = 0, ilen = labels.length; i < ilen; ++i) {
- label = labels[i];
- tick = ticks[i];
- if (!tick) {
- ticks.push(tick = {
- label: label,
+ // Ensure ticks contains ticks in new tick format
+ if ((!ticks || !ticks.length) && me.ticks) {
+ ticks = [];
+ for (i = 0, ilen = me.ticks.length; i < ilen; ++i) {
+ ticks.push({
+ value: me.ticks[i],
major: false
});
- } else {
- tick.label = label;
}
}
me._ticks = ticks;
+ // Compute tick rotation and fit using a sampled subset of labels
+ // We generally don't need to compute the size of every single label for determining scale size
+ samplingEnabled = sampleSize < ticks.length;
+ labels = me._convertTicksToLabels(samplingEnabled ? sample(ticks, sampleSize) : ticks);
+
+ // _configure is called twice, once here, once from core.controller.updateLayout.
+ // Here we haven't been positioned yet, but dimensions are correct.
+ // Variables set in _configure are needed for calculateTickRotation, and
+ // it's ok that coordinates are not correct there, only dimensions matter.
+ me._configure();
+
// Tick Rotation
me.beforeCalculateTickRotation();
me.calculateTickRotation();
me.afterCalculateTickRotation();
- // Fit
+
me.beforeFit();
me.fit();
me.afterFit();
- //
+
+ // Auto-skip
+ me._ticksToDraw = tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto') ? me._autoSkip(ticks) : ticks;
+
+ if (samplingEnabled) {
+ // Generate labels using all non-skipped ticks
+ labels = me._convertTicksToLabels(me._ticksToDraw);
+ }
+
+ me.ticks = labels; // BACKWARD COMPATIBILITY
+
+ // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!
+
me.afterUpdate();
+ // TODO(v3): remove minSize as a public property and return value from all layout boxes. It is unused
+ // make maxWidth and maxHeight private
return me.minSize;
+ },
+ /**
+ * @private
+ */
+ _configure: function() {
+ var me = this;
+ var reversePixels = me.options.ticks.reverse;
+ var startPixel, endPixel;
+
+ if (me.isHorizontal()) {
+ startPixel = me.left;
+ endPixel = me.right;
+ } else {
+ startPixel = me.top;
+ endPixel = me.bottom;
+ // by default vertical scales are from bottom to top, so pixels are reversed
+ reversePixels = !reversePixels;
+ }
+ me._startPixel = startPixel;
+ me._endPixel = endPixel;
+ me._reversePixels = reversePixels;
+ me._length = endPixel - startPixel;
},
+
afterUpdate: function() {
helpers$1.callback(this.options.afterUpdate, [this]);
},
@@ -10429,7 +11670,7 @@ var core_scale = core_element.extend({
afterBuildTicks: function(ticks) {
var me = this;
// ticks is empty for old axis implementations here
- if (helpers$1.isArray(ticks) && ticks.length) {
+ if (isArray(ticks) && ticks.length) {
return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);
}
// Support old implementations (that modified `this.ticks` directly in buildTicks)
@@ -10457,40 +11698,39 @@ var core_scale = core_element.extend({
},
calculateTickRotation: function() {
var me = this;
- var context = me.ctx;
- var tickOpts = me.options.ticks;
- var labels = labelsFromTicks(me._ticks);
-
- // Get the width of each grid by calculating the difference
- // between x offsets between 0 and 1.
- var tickFont = helpers$1.options._parseFont(tickOpts);
- context.font = tickFont.string;
-
- var labelRotation = tickOpts.minRotation || 0;
-
- if (labels.length && me.options.display && me.isHorizontal()) {
- var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache);
- var labelWidth = originalLabelWidth;
- var cosRotation, sinRotation;
-
- // Allow 3 pixels x2 padding either side for label readability
- var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;
+ var options = me.options;
+ var tickOpts = options.ticks;
+ var numTicks = me.getTicks().length;
+ var minRotation = tickOpts.minRotation || 0;
+ var maxRotation = tickOpts.maxRotation;
+ var labelRotation = minRotation;
+ var labelSizes, maxLabelWidth, maxLabelHeight, maxWidth, tickWidth, maxHeight, maxLabelDiagonal;
+
+ if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {
+ me.labelRotation = minRotation;
+ return;
+ }
- // Max label rotation can be set or default to 90 - also act as a loop counter
- while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {
- var angleRadians = helpers$1.toRadians(labelRotation);
- cosRotation = Math.cos(angleRadians);
- sinRotation = Math.sin(angleRadians);
+ labelSizes = me._getLabelSizes();
+ maxLabelWidth = labelSizes.widest.width;
+ maxLabelHeight = labelSizes.highest.height - labelSizes.highest.offset;
- if (sinRotation * originalLabelWidth > me.maxHeight) {
- // go back one step
- labelRotation--;
- break;
- }
+ // Estimate the width of each grid based on the canvas width, the maximum
+ // label width and the number of tick intervals
+ maxWidth = Math.min(me.maxWidth, me.chart.width - maxLabelWidth);
+ tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);
- labelRotation++;
- labelWidth = cosRotation * originalLabelWidth;
- }
+ // Allow 3 pixels x2 padding either side for label readability
+ if (maxLabelWidth + 6 > tickWidth) {
+ tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));
+ maxHeight = me.maxHeight - getTickMarkLength(options.gridLines)
+ - tickOpts.padding - getScaleLabelHeight(options.scaleLabel);
+ maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);
+ labelRotation = helpers$1.toDegrees(Math.min(
+ Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)),
+ Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)
+ ));
+ labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));
}
me.labelRotation = labelRotation;
@@ -10512,111 +11752,99 @@ var core_scale = core_element.extend({
height: 0
};
- var labels = labelsFromTicks(me._ticks);
-
+ var chart = me.chart;
var opts = me.options;
var tickOpts = opts.ticks;
var scaleLabelOpts = opts.scaleLabel;
var gridLineOpts = opts.gridLines;
var display = me._isVisible();
- var position = opts.position;
+ var isBottom = opts.position === 'bottom';
var isHorizontal = me.isHorizontal();
- var parseFont = helpers$1.options._parseFont;
- var tickFont = parseFont(tickOpts);
- var tickMarkLength = opts.gridLines.tickMarkLength;
-
// Width
if (isHorizontal) {
- // subtract the margins to line up with the chartArea if we are a full width scale
- minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;
- } else {
- minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;
+ minSize.width = me.maxWidth;
+ } else if (display) {
+ minSize.width = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
}
// height
- if (isHorizontal) {
- minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;
- } else {
+ if (!isHorizontal) {
minSize.height = me.maxHeight; // fill all the height
- }
-
- // Are we showing a title for the scale?
- if (scaleLabelOpts.display && display) {
- var scaleLabelFont = parseFont(scaleLabelOpts);
- var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding);
- var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height;
-
- if (isHorizontal) {
- minSize.height += deltaHeight;
- } else {
- minSize.width += deltaHeight;
- }
+ } else if (display) {
+ minSize.height = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
}
// Don't bother fitting the ticks if we are not showing the labels
if (tickOpts.display && display) {
- var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache);
- var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels);
- var lineSpace = tickFont.size * 0.5;
- var tickPadding = me.options.ticks.padding;
-
- // Store max number of lines and widest label for _autoSkip
- me._maxLabelLines = tallestLabelHeightInLines;
- me.longestLabelWidth = largestTextWidth;
+ var tickFonts = parseTickFontOptions(tickOpts);
+ var labelSizes = me._getLabelSizes();
+ var firstLabelSize = labelSizes.first;
+ var lastLabelSize = labelSizes.last;
+ var widestLabelSize = labelSizes.widest;
+ var highestLabelSize = labelSizes.highest;
+ var lineSpace = tickFonts.minor.lineHeight * 0.4;
+ var tickPadding = tickOpts.padding;
if (isHorizontal) {
+ // A horizontal axis is more constrained by the height.
+ var isRotated = me.labelRotation !== 0;
var angleRadians = helpers$1.toRadians(me.labelRotation);
var cosRotation = Math.cos(angleRadians);
var sinRotation = Math.sin(angleRadians);
- // TODO - improve this calculation
- var labelHeight = (sinRotation * largestTextWidth)
- + (tickFont.lineHeight * tallestLabelHeightInLines)
- + lineSpace; // padding
+ var labelHeight = sinRotation * widestLabelSize.width
+ + cosRotation * (highestLabelSize.height - (isRotated ? highestLabelSize.offset : 0))
+ + (isRotated ? 0 : lineSpace); // padding
minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);
- me.ctx.font = tickFont.string;
- var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string);
- var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string);
var offsetLeft = me.getPixelForTick(0) - me.left;
- var offsetRight = me.right - me.getPixelForTick(labels.length - 1);
+ var offsetRight = me.right - me.getPixelForTick(me.getTicks().length - 1);
var paddingLeft, paddingRight;
// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned
// which means that the right padding is dominated by the font height
- if (me.labelRotation !== 0) {
- paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace);
- paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth);
+ if (isRotated) {
+ paddingLeft = isBottom ?
+ cosRotation * firstLabelSize.width + sinRotation * firstLabelSize.offset :
+ sinRotation * (firstLabelSize.height - firstLabelSize.offset);
+ paddingRight = isBottom ?
+ sinRotation * (lastLabelSize.height - lastLabelSize.offset) :
+ cosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset;
} else {
- paddingLeft = firstLabelWidth / 2;
- paddingRight = lastLabelWidth / 2;
+ paddingLeft = firstLabelSize.width / 2;
+ paddingRight = lastLabelSize.width / 2;
}
- me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges
- me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3;
+
+ // Adjust padding taking into account changes in offsets
+ // and add 3 px to move away from canvas edges
+ me.paddingLeft = Math.max((paddingLeft - offsetLeft) * me.width / (me.width - offsetLeft), 0) + 3;
+ me.paddingRight = Math.max((paddingRight - offsetRight) * me.width / (me.width - offsetRight), 0) + 3;
} else {
// A vertical axis is more constrained by the width. Labels are the
// dominant factor here, so get that length first and account for padding
- if (tickOpts.mirror) {
- largestTextWidth = 0;
- } else {
+ var labelWidth = tickOpts.mirror ? 0 :
// use lineSpace for consistency with horizontal axis
// tickPadding is not implemented for horizontal
- largestTextWidth += tickPadding + lineSpace;
- }
+ widestLabelSize.width + tickPadding + lineSpace;
- minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);
+ minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth);
- me.paddingTop = tickFont.size / 2;
- me.paddingBottom = tickFont.size / 2;
+ me.paddingTop = firstLabelSize.height / 2;
+ me.paddingBottom = lastLabelSize.height / 2;
}
}
me.handleMargins();
-
- me.width = minSize.width;
- me.height = minSize.height;
+
+ if (isHorizontal) {
+ me.width = me._length = chart.width - me.margins.left - me.margins.right;
+ me.height = minSize.height;
+ } else {
+ me.width = minSize.width;
+ me.height = me._length = chart.height - me.margins.top - me.margins.bottom;
+ }
},
/**
@@ -10626,10 +11854,10 @@ var core_scale = core_element.extend({
handleMargins: function() {
var me = this;
if (me.margins) {
- me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);
- me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);
- me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);
- me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);
+ me.margins.left = Math.max(me.paddingLeft, me.margins.left);
+ me.margins.top = Math.max(me.paddingTop, me.margins.top);
+ me.margins.right = Math.max(me.paddingRight, me.margins.right);
+ me.margins.bottom = Math.max(me.paddingBottom, me.margins.bottom);
}
},
@@ -10639,22 +11867,24 @@ var core_scale = core_element.extend({
// Shared Methods
isHorizontal: function() {
- return this.options.position === 'top' || this.options.position === 'bottom';
+ var pos = this.options.position;
+ return pos === 'top' || pos === 'bottom';
},
isFullWidth: function() {
- return (this.options.fullWidth);
+ return this.options.fullWidth;
},
// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not
getRightValue: function(rawValue) {
// Null and undefined values first
- if (helpers$1.isNullOrUndef(rawValue)) {
+ if (isNullOrUndef(rawValue)) {
return NaN;
}
// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values
if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {
return NaN;
}
+
// If it is in fact an object, dive in one more level
if (rawValue) {
if (this.isHorizontal()) {
@@ -10670,6 +11900,85 @@ var core_scale = core_element.extend({
return rawValue;
},
+ _convertTicksToLabels: function(ticks) {
+ var me = this;
+ var labels, i, ilen;
+
+ me.ticks = ticks.map(function(tick) {
+ return tick.value;
+ });
+
+ me.beforeTickToLabelConversion();
+
+ // New implementations should return the formatted tick labels but for BACKWARD
+ // COMPAT, we still support no return (`this.ticks` internally changed by calling
+ // this method and supposed to contain only string values).
+ labels = me.convertTicksToLabels(ticks) || me.ticks;
+
+ me.afterTickToLabelConversion();
+
+ // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ ticks[i].label = labels[i];
+ }
+
+ return labels;
+ },
+
+ /**
+ * @private
+ */
+ _getLabelSizes: function() {
+ var me = this;
+ var labelSizes = me._labelSizes;
+
+ if (!labelSizes) {
+ me._labelSizes = labelSizes = computeLabelSizes(me.ctx, parseTickFontOptions(me.options.ticks), me.getTicks(), me.longestTextCache);
+ me.longestLabelWidth = labelSizes.widest.width;
+ }
+
+ return labelSizes;
+ },
+
+ /**
+ * @private
+ */
+ _parseValue: function(value) {
+ var start, end, min, max;
+
+ if (isArray(value)) {
+ start = +this.getRightValue(value[0]);
+ end = +this.getRightValue(value[1]);
+ min = Math.min(start, end);
+ max = Math.max(start, end);
+ } else {
+ value = +this.getRightValue(value);
+ start = undefined;
+ end = value;
+ min = value;
+ max = value;
+ }
+
+ return {
+ min: min,
+ max: max,
+ start: start,
+ end: end
+ };
+ },
+
+ /**
+ * @private
+ */
+ _getScaleLabel: function(rawValue) {
+ var v = this._parseValue(rawValue);
+ if (v.start !== undefined) {
+ return '[' + v.start + ', ' + v.end + ']';
+ }
+
+ return +this.getRightValue(rawValue);
+ },
+
/**
* Used to get the value to display in the tooltip for the data at the given index
* @param index
@@ -10700,21 +12009,12 @@ var core_scale = core_element.extend({
getPixelForTick: function(index) {
var me = this;
var offset = me.options.offset;
- if (me.isHorizontal()) {
- var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
- var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);
- var pixel = (tickWidth * index) + me.paddingLeft;
-
- if (offset) {
- pixel += tickWidth / 2;
- }
+ var numTicks = me._ticks.length;
+ var tickWidth = 1 / Math.max(numTicks - (offset ? 0 : 1), 1);
- var finalVal = me.left + pixel;
- finalVal += me.isFullWidth() ? me.margins.left : 0;
- return finalVal;
- }
- var innerHeight = me.height - (me.paddingTop + me.paddingBottom);
- return me.top + (index * (innerHeight / (me._ticks.length - 1)));
+ return index < 0 || index > numTicks - 1
+ ? null
+ : me.getPixelForDecimal(index * tickWidth + (offset ? tickWidth / 2 : 0));
},
/**
@@ -10723,15 +12023,17 @@ var core_scale = core_element.extend({
*/
getPixelForDecimal: function(decimal) {
var me = this;
- if (me.isHorizontal()) {
- var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
- var valueOffset = (innerWidth * decimal) + me.paddingLeft;
- var finalVal = me.left + valueOffset;
- finalVal += me.isFullWidth() ? me.margins.left : 0;
- return finalVal;
+ if (me._reversePixels) {
+ decimal = 1 - decimal;
}
- return me.top + (decimal * me.height);
+
+ return me._startPixel + decimal * me._length;
+ },
+
+ getDecimalForPixel: function(pixel) {
+ var decimal = (pixel - this._startPixel) / this._length;
+ return this._reversePixels ? 1 - decimal : decimal;
},
/**
@@ -10759,44 +12061,34 @@ var core_scale = core_element.extend({
*/
_autoSkip: function(ticks) {
var me = this;
- var isHorizontal = me.isHorizontal();
- var optionTicks = me.options.ticks.minor;
- var tickCount = ticks.length;
- var skipRatio = false;
- var maxTicks = optionTicks.maxTicksLimit;
-
- // Total space needed to display all ticks. First and last ticks are
- // drawn as their center at end of axis, so tickCount-1
- var ticksLength = me._tickSize() * (tickCount - 1);
-
- // Axis length
- var axisLength = isHorizontal
- ? me.width - (me.paddingLeft + me.paddingRight)
- : me.height - (me.paddingTop + me.PaddingBottom);
-
- var result = [];
- var i, tick;
-
- if (ticksLength > axisLength) {
- skipRatio = 1 + Math.floor(ticksLength / axisLength);
- }
+ var tickOpts = me.options.ticks;
+ var axisLength = me._length;
+ var ticksLimit = tickOpts.maxTicksLimit || axisLength / me._tickSize() + 1;
+ var majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];
+ var numMajorIndices = majorIndices.length;
+ var first = majorIndices[0];
+ var last = majorIndices[numMajorIndices - 1];
+ var i, ilen, spacing, avgMajorSpacing;
- // if they defined a max number of optionTicks,
- // increase skipRatio until that number is met
- if (tickCount > maxTicks) {
- skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks));
+ // If there are too many major ticks to display them all
+ if (numMajorIndices > ticksLimit) {
+ skipMajors(ticks, majorIndices, numMajorIndices / ticksLimit);
+ return nonSkipped(ticks);
}
- for (i = 0; i < tickCount; i++) {
- tick = ticks[i];
+ spacing = calculateSpacing(majorIndices, ticks, axisLength, ticksLimit);
- if (skipRatio > 1 && i % skipRatio > 0) {
- // leave tick in place but make sure it's not displayed (#4635)
- delete tick.label;
+ if (numMajorIndices > 0) {
+ for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {
+ skip(ticks, spacing, majorIndices[i], majorIndices[i + 1]);
}
- result.push(tick);
+ avgMajorSpacing = numMajorIndices > 1 ? (last - first) / (numMajorIndices - 1) : null;
+ skip(ticks, spacing, helpers$1.isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);
+ skip(ticks, spacing, last, helpers$1.isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);
+ return nonSkipped(ticks);
}
- return result;
+ skip(ticks, spacing);
+ return nonSkipped(ticks);
},
/**
@@ -10804,22 +12096,20 @@ var core_scale = core_element.extend({
*/
_tickSize: function() {
var me = this;
- var isHorizontal = me.isHorizontal();
- var optionTicks = me.options.ticks.minor;
+ var optionTicks = me.options.ticks;
// Calculate space needed by label in axis direction.
var rot = helpers$1.toRadians(me.labelRotation);
var cos = Math.abs(Math.cos(rot));
var sin = Math.abs(Math.sin(rot));
+ var labelSizes = me._getLabelSizes();
var padding = optionTicks.autoSkipPadding || 0;
- var w = (me.longestLabelWidth + padding) || 0;
-
- var tickFont = helpers$1.options._parseFont(optionTicks);
- var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0;
+ var w = labelSizes ? labelSizes.widest.width + padding : 0;
+ var h = labelSizes ? labelSizes.highest.height + padding : 0;
// Calculate space needed for 1 tick in axis direction.
- return isHorizontal
+ return me.isHorizontal()
? h * cos > w * sin ? w / cos : h / sin
: h * sin < w * cos ? h / cos : w / sin;
},
@@ -10851,152 +12141,93 @@ var core_scale = core_element.extend({
},
/**
- * Actually draw the scale on the canvas
- * @param {object} chartArea - the area of the chart to draw full grid lines on
+ * @private
*/
- draw: function(chartArea) {
+ _computeGridLineItems: function(chartArea) {
var me = this;
- var options = me.options;
-
- if (!me._isVisible()) {
- return;
- }
-
var chart = me.chart;
- var context = me.ctx;
- var globalDefaults = core_defaults.global;
- var defaultFontColor = globalDefaults.defaultFontColor;
- var optionTicks = options.ticks.minor;
- var optionMajorTicks = options.ticks.major || optionTicks;
+ var options = me.options;
var gridLines = options.gridLines;
- var scaleLabel = options.scaleLabel;
var position = options.position;
-
- var isRotated = me.labelRotation !== 0;
- var isMirrored = optionTicks.mirror;
+ var offsetGridLines = gridLines.offsetGridLines;
var isHorizontal = me.isHorizontal();
+ var ticks = me._ticksToDraw;
+ var ticksLength = ticks.length + (offsetGridLines ? 1 : 0);
- var parseFont = helpers$1.options._parseFont;
- var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();
- var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor);
- var tickFont = parseFont(optionTicks);
- var lineHeight = tickFont.lineHeight;
- var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor);
- var majorTickFont = parseFont(optionMajorTicks);
- var tickPadding = optionTicks.padding;
- var labelOffset = optionTicks.labelOffset;
-
- var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;
-
- var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor);
- var scaleLabelFont = parseFont(scaleLabel);
- var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);
- var labelRotationRadians = helpers$1.toRadians(me.labelRotation);
-
- var itemsToDraw = [];
-
+ var tl = getTickMarkLength(gridLines);
+ var items = [];
var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
+ var axisHalfWidth = axisWidth / 2;
var alignPixel = helpers$1._alignPixel;
- var borderValue, tickStart, tickEnd;
+ var alignBorderValue = function(pixel) {
+ return alignPixel(chart, pixel, axisWidth);
+ };
+ var borderValue, i, tick, lineValue, alignedLineValue;
+ var tx1, ty1, tx2, ty2, x1, y1, x2, y2, lineWidth, lineColor, borderDash, borderDashOffset;
if (position === 'top') {
- borderValue = alignPixel(chart, me.bottom, axisWidth);
- tickStart = me.bottom - tl;
- tickEnd = borderValue - axisWidth / 2;
+ borderValue = alignBorderValue(me.bottom);
+ ty1 = me.bottom - tl;
+ ty2 = borderValue - axisHalfWidth;
+ y1 = alignBorderValue(chartArea.top) + axisHalfWidth;
+ y2 = chartArea.bottom;
} else if (position === 'bottom') {
- borderValue = alignPixel(chart, me.top, axisWidth);
- tickStart = borderValue + axisWidth / 2;
- tickEnd = me.top + tl;
+ borderValue = alignBorderValue(me.top);
+ y1 = chartArea.top;
+ y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;
+ ty1 = borderValue + axisHalfWidth;
+ ty2 = me.top + tl;
} else if (position === 'left') {
- borderValue = alignPixel(chart, me.right, axisWidth);
- tickStart = me.right - tl;
- tickEnd = borderValue - axisWidth / 2;
+ borderValue = alignBorderValue(me.right);
+ tx1 = me.right - tl;
+ tx2 = borderValue - axisHalfWidth;
+ x1 = alignBorderValue(chartArea.left) + axisHalfWidth;
+ x2 = chartArea.right;
} else {
- borderValue = alignPixel(chart, me.left, axisWidth);
- tickStart = borderValue + axisWidth / 2;
- tickEnd = me.left + tl;
+ borderValue = alignBorderValue(me.left);
+ x1 = chartArea.left;
+ x2 = alignBorderValue(chartArea.right) - axisHalfWidth;
+ tx1 = borderValue + axisHalfWidth;
+ tx2 = me.left + tl;
}
- var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error.
+ for (i = 0; i < ticksLength; ++i) {
+ tick = ticks[i] || {};
- helpers$1.each(ticks, function(tick, index) {
// autoskipper skipped this tick (#4635)
- if (helpers$1.isNullOrUndef(tick.label)) {
- return;
+ if (isNullOrUndef(tick.label) && i < ticks.length) {
+ continue;
}
- var label = tick.label;
- var lineWidth, lineColor, borderDash, borderDashOffset;
- if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {
+ if (i === me.zeroLineIndex && options.offset === offsetGridLines) {
// Draw the first index specially
lineWidth = gridLines.zeroLineWidth;
lineColor = gridLines.zeroLineColor;
borderDash = gridLines.zeroLineBorderDash || [];
borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;
} else {
- lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index);
- lineColor = valueAtIndexOrDefault(gridLines.color, index);
+ lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, i, 1);
+ lineColor = valueAtIndexOrDefault(gridLines.color, i, 'rgba(0,0,0,0.1)');
borderDash = gridLines.borderDash || [];
borderDashOffset = gridLines.borderDashOffset || 0.0;
}
- // Common properties
- var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign;
- var labelCount = helpers$1.isArray(label) ? label.length : 1;
- var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines);
+ lineValue = getPixelForGridLine(me, tick._index || i, offsetGridLines);
- if (isHorizontal) {
- var labelYOffset = tl + tickPadding;
+ // Skip if the pixel is out of the range
+ if (lineValue === undefined) {
+ continue;
+ }
- if (lineValue < me.left - epsilon) {
- lineColor = 'rgba(0,0,0,0)';
- }
+ alignedLineValue = alignPixel(chart, lineValue, lineWidth);
- tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth);
- ty1 = tickStart;
- ty2 = tickEnd;
- labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option)
-
- if (position === 'top') {
- y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2;
- y2 = chartArea.bottom;
- textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight;
- textAlign = !isRotated ? 'center' : 'left';
- labelY = me.bottom - labelYOffset;
- } else {
- y1 = chartArea.top;
- y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2;
- textOffset = (!isRotated ? 0.5 : 0) * lineHeight;
- textAlign = !isRotated ? 'center' : 'right';
- labelY = me.top + labelYOffset;
- }
+ if (isHorizontal) {
+ tx1 = tx2 = x1 = x2 = alignedLineValue;
} else {
- var labelXOffset = (isMirrored ? 0 : tl) + tickPadding;
-
- if (lineValue < me.top - epsilon) {
- lineColor = 'rgba(0,0,0,0)';
- }
-
- tx1 = tickStart;
- tx2 = tickEnd;
- ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth);
- labelY = me.getPixelForTick(index) + labelOffset;
- textOffset = (1 - labelCount) * lineHeight / 2;
-
- if (position === 'left') {
- x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2;
- x2 = chartArea.right;
- textAlign = isMirrored ? 'left' : 'right';
- labelX = me.right - labelXOffset;
- } else {
- x1 = chartArea.left;
- x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2;
- textAlign = isMirrored ? 'right' : 'left';
- labelX = me.left + labelXOffset;
- }
+ ty1 = ty2 = y1 = y2 = alignedLineValue;
}
- itemsToDraw.push({
+ items.push({
tx1: tx1,
ty1: ty1,
tx2: tx2,
@@ -11005,114 +12236,146 @@ var core_scale = core_element.extend({
y1: y1,
x2: x2,
y2: y2,
- labelX: labelX,
- labelY: labelY,
- glWidth: lineWidth,
- glColor: lineColor,
- glBorderDash: borderDash,
- glBorderDashOffset: borderDashOffset,
- rotation: -1 * labelRotationRadians,
+ width: lineWidth,
+ color: lineColor,
+ borderDash: borderDash,
+ borderDashOffset: borderDashOffset,
+ });
+ }
+
+ items.ticksLength = ticksLength;
+ items.borderValue = borderValue;
+
+ return items;
+ },
+
+ /**
+ * @private
+ */
+ _computeLabelItems: function() {
+ var me = this;
+ var options = me.options;
+ var optionTicks = options.ticks;
+ var position = options.position;
+ var isMirrored = optionTicks.mirror;
+ var isHorizontal = me.isHorizontal();
+ var ticks = me._ticksToDraw;
+ var fonts = parseTickFontOptions(optionTicks);
+ var tickPadding = optionTicks.padding;
+ var tl = getTickMarkLength(options.gridLines);
+ var rotation = -helpers$1.toRadians(me.labelRotation);
+ var items = [];
+ var i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;
+
+ if (position === 'top') {
+ y = me.bottom - tl - tickPadding;
+ textAlign = !rotation ? 'center' : 'left';
+ } else if (position === 'bottom') {
+ y = me.top + tl + tickPadding;
+ textAlign = !rotation ? 'center' : 'right';
+ } else if (position === 'left') {
+ x = me.right - (isMirrored ? 0 : tl) - tickPadding;
+ textAlign = isMirrored ? 'left' : 'right';
+ } else {
+ x = me.left + (isMirrored ? 0 : tl) + tickPadding;
+ textAlign = isMirrored ? 'right' : 'left';
+ }
+
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ tick = ticks[i];
+ label = tick.label;
+
+ // autoskipper skipped this tick (#4635)
+ if (isNullOrUndef(label)) {
+ continue;
+ }
+
+ pixel = me.getPixelForTick(tick._index || i) + optionTicks.labelOffset;
+ font = tick.major ? fonts.major : fonts.minor;
+ lineHeight = font.lineHeight;
+ lineCount = isArray(label) ? label.length : 1;
+
+ if (isHorizontal) {
+ x = pixel;
+ textOffset = position === 'top'
+ ? ((!rotation ? 0.5 : 1) - lineCount) * lineHeight
+ : (!rotation ? 0.5 : 0) * lineHeight;
+ } else {
+ y = pixel;
+ textOffset = (1 - lineCount) * lineHeight / 2;
+ }
+
+ items.push({
+ x: x,
+ y: y,
+ rotation: rotation,
label: label,
- major: tick.major,
+ font: font,
textOffset: textOffset,
textAlign: textAlign
});
- });
+ }
- // Draw all of the tick labels, tick marks, and grid lines at the correct places
- helpers$1.each(itemsToDraw, function(itemToDraw) {
- var glWidth = itemToDraw.glWidth;
- var glColor = itemToDraw.glColor;
-
- if (gridLines.display && glWidth && glColor) {
- context.save();
- context.lineWidth = glWidth;
- context.strokeStyle = glColor;
- if (context.setLineDash) {
- context.setLineDash(itemToDraw.glBorderDash);
- context.lineDashOffset = itemToDraw.glBorderDashOffset;
- }
+ return items;
+ },
- context.beginPath();
+ /**
+ * @private
+ */
+ _drawGrid: function(chartArea) {
+ var me = this;
+ var gridLines = me.options.gridLines;
- if (gridLines.drawTicks) {
- context.moveTo(itemToDraw.tx1, itemToDraw.ty1);
- context.lineTo(itemToDraw.tx2, itemToDraw.ty2);
- }
+ if (!gridLines.display) {
+ return;
+ }
- if (gridLines.drawOnChartArea) {
- context.moveTo(itemToDraw.x1, itemToDraw.y1);
- context.lineTo(itemToDraw.x2, itemToDraw.y2);
+ var ctx = me.ctx;
+ var chart = me.chart;
+ var alignPixel = helpers$1._alignPixel;
+ var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
+ var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));
+ var width, color, i, ilen, item;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ width = item.width;
+ color = item.color;
+
+ if (width && color) {
+ ctx.save();
+ ctx.lineWidth = width;
+ ctx.strokeStyle = color;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(item.borderDash);
+ ctx.lineDashOffset = item.borderDashOffset;
}
- context.stroke();
- context.restore();
- }
+ ctx.beginPath();
- if (optionTicks.display) {
- // Make sure we draw text in the correct color and font
- context.save();
- context.translate(itemToDraw.labelX, itemToDraw.labelY);
- context.rotate(itemToDraw.rotation);
- context.font = itemToDraw.major ? majorTickFont.string : tickFont.string;
- context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;
- context.textBaseline = 'middle';
- context.textAlign = itemToDraw.textAlign;
-
- var label = itemToDraw.label;
- var y = itemToDraw.textOffset;
- if (helpers$1.isArray(label)) {
- for (var i = 0; i < label.length; ++i) {
- // We just make sure the multiline element is a string here..
- context.fillText('' + label[i], 0, y);
- y += lineHeight;
- }
- } else {
- context.fillText(label, 0, y);
+ if (gridLines.drawTicks) {
+ ctx.moveTo(item.tx1, item.ty1);
+ ctx.lineTo(item.tx2, item.ty2);
}
- context.restore();
- }
- });
- if (scaleLabel.display) {
- // Draw the scale label
- var scaleLabelX;
- var scaleLabelY;
- var rotation = 0;
- var halfLineHeight = scaleLabelFont.lineHeight / 2;
+ if (gridLines.drawOnChartArea) {
+ ctx.moveTo(item.x1, item.y1);
+ ctx.lineTo(item.x2, item.y2);
+ }
- if (isHorizontal) {
- scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width
- scaleLabelY = position === 'bottom'
- ? me.bottom - halfLineHeight - scaleLabelPadding.bottom
- : me.top + halfLineHeight + scaleLabelPadding.top;
- } else {
- var isLeft = position === 'left';
- scaleLabelX = isLeft
- ? me.left + halfLineHeight + scaleLabelPadding.top
- : me.right - halfLineHeight - scaleLabelPadding.top;
- scaleLabelY = me.top + ((me.bottom - me.top) / 2);
- rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
+ ctx.stroke();
+ ctx.restore();
}
-
- context.save();
- context.translate(scaleLabelX, scaleLabelY);
- context.rotate(rotation);
- context.textAlign = 'center';
- context.textBaseline = 'middle';
- context.fillStyle = scaleLabelFontColor; // render in correct colour
- context.font = scaleLabelFont.string;
- context.fillText(scaleLabel.labelString, 0, 0);
- context.restore();
}
if (axisWidth) {
// Draw the line at the edge of the axis
var firstLineWidth = axisWidth;
- var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0);
+ var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 1);
+ var borderValue = items.borderValue;
var x1, x2, y1, y2;
- if (isHorizontal) {
+ if (me.isHorizontal()) {
x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;
x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;
y1 = y2 = borderValue;
@@ -11122,59 +12385,214 @@ var core_scale = core_element.extend({
x1 = x2 = borderValue;
}
- context.lineWidth = axisWidth;
- context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);
- context.beginPath();
- context.moveTo(x1, y1);
- context.lineTo(x2, y2);
- context.stroke();
+ ctx.lineWidth = axisWidth;
+ ctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);
+ ctx.beginPath();
+ ctx.moveTo(x1, y1);
+ ctx.lineTo(x2, y2);
+ ctx.stroke();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawLabels: function() {
+ var me = this;
+ var optionTicks = me.options.ticks;
+
+ if (!optionTicks.display) {
+ return;
+ }
+
+ var ctx = me.ctx;
+ var items = me._labelItems || (me._labelItems = me._computeLabelItems());
+ var i, j, ilen, jlen, item, tickFont, label, y;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ tickFont = item.font;
+
+ // Make sure we draw text in the correct color and font
+ ctx.save();
+ ctx.translate(item.x, item.y);
+ ctx.rotate(item.rotation);
+ ctx.font = tickFont.string;
+ ctx.fillStyle = tickFont.color;
+ ctx.textBaseline = 'middle';
+ ctx.textAlign = item.textAlign;
+
+ label = item.label;
+ y = item.textOffset;
+ if (isArray(label)) {
+ for (j = 0, jlen = label.length; j < jlen; ++j) {
+ // We just make sure the multiline element is a string here..
+ ctx.fillText('' + label[j], 0, y);
+ y += tickFont.lineHeight;
+ }
+ } else {
+ ctx.fillText(label, 0, y);
+ }
+ ctx.restore();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawTitle: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var options = me.options;
+ var scaleLabel = options.scaleLabel;
+
+ if (!scaleLabel.display) {
+ return;
+ }
+
+ var scaleLabelFontColor = valueOrDefault$a(scaleLabel.fontColor, core_defaults.global.defaultFontColor);
+ var scaleLabelFont = helpers$1.options._parseFont(scaleLabel);
+ var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);
+ var halfLineHeight = scaleLabelFont.lineHeight / 2;
+ var position = options.position;
+ var rotation = 0;
+ var scaleLabelX, scaleLabelY;
+
+ if (me.isHorizontal()) {
+ scaleLabelX = me.left + me.width / 2; // midpoint of the width
+ scaleLabelY = position === 'bottom'
+ ? me.bottom - halfLineHeight - scaleLabelPadding.bottom
+ : me.top + halfLineHeight + scaleLabelPadding.top;
+ } else {
+ var isLeft = position === 'left';
+ scaleLabelX = isLeft
+ ? me.left + halfLineHeight + scaleLabelPadding.top
+ : me.right - halfLineHeight - scaleLabelPadding.top;
+ scaleLabelY = me.top + me.height / 2;
+ rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
+ }
+
+ ctx.save();
+ ctx.translate(scaleLabelX, scaleLabelY);
+ ctx.rotate(rotation);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+ ctx.fillStyle = scaleLabelFontColor; // render in correct colour
+ ctx.font = scaleLabelFont.string;
+ ctx.fillText(scaleLabel.labelString, 0, 0);
+ ctx.restore();
+ },
+
+ draw: function(chartArea) {
+ var me = this;
+
+ if (!me._isVisible()) {
+ return;
+ }
+
+ me._drawGrid(chartArea);
+ me._drawTitle();
+ me._drawLabels();
+ },
+
+ /**
+ * @private
+ */
+ _layers: function() {
+ var me = this;
+ var opts = me.options;
+ var tz = opts.ticks && opts.ticks.z || 0;
+ var gz = opts.gridLines && opts.gridLines.z || 0;
+
+ if (!me._isVisible() || tz === gz || me.draw !== me._draw) {
+ // backward compatibility: draw has been overridden by custom scale
+ return [{
+ z: tz,
+ draw: function() {
+ me.draw.apply(me, arguments);
+ }
+ }];
}
+
+ return [{
+ z: gz,
+ draw: function() {
+ me._drawGrid.apply(me, arguments);
+ me._drawTitle.apply(me, arguments);
+ }
+ }, {
+ z: tz,
+ draw: function() {
+ me._drawLabels.apply(me, arguments);
+ }
+ }];
+ },
+
+ /**
+ * @private
+ */
+ _getMatchingVisibleMetas: function(type) {
+ var me = this;
+ var isHorizontal = me.isHorizontal();
+ return me.chart._getSortedVisibleDatasetMetas()
+ .filter(function(meta) {
+ return (!type || meta.type === type)
+ && (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);
+ });
}
});
+Scale.prototype._draw = Scale.prototype.draw;
+
+var core_scale = Scale;
+
+var isNullOrUndef$1 = helpers$1.isNullOrUndef;
+
var defaultConfig = {
position: 'bottom'
};
var scale_category = core_scale.extend({
- /**
- * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those
- * else fall back to data.labels
- * @private
- */
- getLabels: function() {
- var data = this.chart.data;
- return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;
- },
-
determineDataLimits: function() {
var me = this;
- var labels = me.getLabels();
- me.minIndex = 0;
- me.maxIndex = labels.length - 1;
+ var labels = me._getLabels();
+ var ticksOpts = me.options.ticks;
+ var min = ticksOpts.min;
+ var max = ticksOpts.max;
+ var minIndex = 0;
+ var maxIndex = labels.length - 1;
var findIndex;
- if (me.options.ticks.min !== undefined) {
+ if (min !== undefined) {
// user specified min value
- findIndex = labels.indexOf(me.options.ticks.min);
- me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;
+ findIndex = labels.indexOf(min);
+ if (findIndex >= 0) {
+ minIndex = findIndex;
+ }
}
- if (me.options.ticks.max !== undefined) {
+ if (max !== undefined) {
// user specified max value
- findIndex = labels.indexOf(me.options.ticks.max);
- me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;
+ findIndex = labels.indexOf(max);
+ if (findIndex >= 0) {
+ maxIndex = findIndex;
+ }
}
- me.min = labels[me.minIndex];
- me.max = labels[me.maxIndex];
+ me.minIndex = minIndex;
+ me.maxIndex = maxIndex;
+ me.min = labels[minIndex];
+ me.max = labels[maxIndex];
},
buildTicks: function() {
var me = this;
- var labels = me.getLabels();
+ var labels = me._getLabels();
+ var minIndex = me.minIndex;
+ var maxIndex = me.maxIndex;
+
// If we are viewing some subset of labels, slice the original array
- me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);
+ me.ticks = (minIndex === 0 && maxIndex === labels.length - 1) ? labels : labels.slice(minIndex, maxIndex + 1);
},
getLabelForIndex: function(index, datasetIndex) {
@@ -11185,74 +12603,66 @@ var scale_category = core_scale.extend({
return me.getRightValue(chart.data.datasets[datasetIndex].data[index]);
}
- return me.ticks[index - me.minIndex];
+ return me._getLabels()[index];
},
- // Used to get data value locations. Value can either be an index or a numerical value
- getPixelForValue: function(value, index) {
+ _configure: function() {
var me = this;
var offset = me.options.offset;
- // 1 is added because we need the length but we have the indexes
- var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);
+ var ticks = me.ticks;
- // If value is a data object, then index is the index in the data array,
- // not the index of the scale. We need to change that.
- var valueCategory;
- if (value !== undefined && value !== null) {
- valueCategory = me.isHorizontal() ? value.x : value.y;
+ core_scale.prototype._configure.call(me);
+
+ if (!me.isHorizontal()) {
+ // For backward compatibility, vertical category scale reverse is inverted.
+ me._reversePixels = !me._reversePixels;
}
- if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
- var labels = me.getLabels();
- value = valueCategory || value;
- var idx = labels.indexOf(value);
- index = idx !== -1 ? idx : index;
+
+ if (!ticks) {
+ return;
}
- if (me.isHorizontal()) {
- var valueWidth = me.width / offsetAmt;
- var widthOffset = (valueWidth * (index - me.minIndex));
+ me._startValue = me.minIndex - (offset ? 0.5 : 0);
+ me._valueRange = Math.max(ticks.length - (offset ? 0 : 1), 1);
+ },
- if (offset) {
- widthOffset += (valueWidth / 2);
- }
+ // Used to get data value locations. Value can either be an index or a numerical value
+ getPixelForValue: function(value, index, datasetIndex) {
+ var me = this;
+ var valueCategory, labels, idx;
- return me.left + widthOffset;
+ if (!isNullOrUndef$1(index) && !isNullOrUndef$1(datasetIndex)) {
+ value = me.chart.data.datasets[datasetIndex].data[index];
}
- var valueHeight = me.height / offsetAmt;
- var heightOffset = (valueHeight * (index - me.minIndex));
- if (offset) {
- heightOffset += (valueHeight / 2);
+ // If value is a data object, then index is the index in the data array,
+ // not the index of the scale. We need to change that.
+ if (!isNullOrUndef$1(value)) {
+ valueCategory = me.isHorizontal() ? value.x : value.y;
}
-
- return me.top + heightOffset;
+ if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
+ labels = me._getLabels();
+ value = helpers$1.valueOrDefault(valueCategory, value);
+ idx = labels.indexOf(value);
+ index = idx !== -1 ? idx : index;
+ if (isNaN(index)) {
+ index = value;
+ }
+ }
+ return me.getPixelForDecimal((index - me._startValue) / me._valueRange);
},
getPixelForTick: function(index) {
- return this.getPixelForValue(this.ticks[index], index + this.minIndex, null);
+ var ticks = this.ticks;
+ return index < 0 || index > ticks.length - 1
+ ? null
+ : this.getPixelForValue(ticks[index], index + this.minIndex);
},
getValueForPixel: function(pixel) {
var me = this;
- var offset = me.options.offset;
- var value;
- var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);
- var horz = me.isHorizontal();
- var valueDimension = (horz ? me.width : me.height) / offsetAmt;
-
- pixel -= horz ? me.left : me.top;
-
- if (offset) {
- pixel -= (valueDimension / 2);
- }
-
- if (pixel <= 0) {
- value = 0;
- } else {
- value = Math.round(pixel / valueDimension);
- }
-
- return value + me.minIndex;
+ var value = Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);
+ return Math.min(Math.max(value, 0), me.ticks.length - 1);
},
getBasePixel: function() {
@@ -11265,7 +12675,7 @@ var _defaults = defaultConfig;
scale_category._defaults = _defaults;
var noop = helpers$1.noop;
-var isNullOrUndef = helpers$1.isNullOrUndef;
+var isNullOrUndef$2 = helpers$1.isNullOrUndef;
/**
* Generate a set of linear ticks
@@ -11293,7 +12703,7 @@ function generateTicks(generationOptions, dataRange) {
// Beyond MIN_SPACING floating point numbers being to lose precision
// such that we can't do the math necessary to generate ticks
- if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) {
+ if (spacing < MIN_SPACING && isNullOrUndef$2(min) && isNullOrUndef$2(max)) {
return [rmin, rmax];
}
@@ -11303,7 +12713,7 @@ function generateTicks(generationOptions, dataRange) {
spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;
}
- if (stepSize || isNullOrUndef(precision)) {
+ if (stepSize || isNullOrUndef$2(precision)) {
// If a precision is not specified, calculate factor based on spacing
factor = Math.pow(10, helpers$1._decimalPlaces(spacing));
} else {
@@ -11318,10 +12728,10 @@ function generateTicks(generationOptions, dataRange) {
// If min, max and stepSize is set and they make an evenly spaced scale use it.
if (stepSize) {
// If very close to our whole number, use it.
- if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {
+ if (!isNullOrUndef$2(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {
niceMin = min;
}
- if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {
+ if (!isNullOrUndef$2(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {
niceMax = max;
}
}
@@ -11336,11 +12746,11 @@ function generateTicks(generationOptions, dataRange) {
niceMin = Math.round(niceMin * factor) / factor;
niceMax = Math.round(niceMax * factor) / factor;
- ticks.push(isNullOrUndef(min) ? niceMin : min);
+ ticks.push(isNullOrUndef$2(min) ? niceMin : min);
for (var j = 1; j < numSpaces; ++j) {
ticks.push(Math.round((niceMin + j * spacing) * factor) / factor);
}
- ticks.push(isNullOrUndef(max) ? niceMax : max);
+ ticks.push(isNullOrUndef$2(max) ? niceMax : max);
return ticks;
}
@@ -11492,6 +12902,25 @@ var scale_linearbase = core_scale.extend({
me.zeroLineIndex = me.ticks.indexOf(0);
core_scale.prototype.convertTicksToLabels.call(me);
+ },
+
+ _configure: function() {
+ var me = this;
+ var ticks = me.getTicks();
+ var start = me.min;
+ var end = me.max;
+ var offset;
+
+ core_scale.prototype._configure.call(me);
+
+ if (me.options.offset && ticks.length) {
+ offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;
+ start -= offset;
+ end += offset;
+ }
+ me._startValue = start;
+ me._endValue = end;
+ me._valueRange = end - start;
}
});
@@ -11502,123 +12931,113 @@ var defaultConfig$1 = {
}
};
-var scale_linear = scale_linearbase.extend({
- determineDataLimits: function() {
- var me = this;
- var opts = me.options;
- var chart = me.chart;
- var data = chart.data;
- var datasets = data.datasets;
- var isHorizontal = me.isHorizontal();
- var DEFAULT_MIN = 0;
- var DEFAULT_MAX = 1;
-
- function IDMatches(meta) {
- return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
- }
-
- // First Calculate the range
- me.min = null;
- me.max = null;
+var DEFAULT_MIN = 0;
+var DEFAULT_MAX = 1;
+
+function getOrCreateStack(stacks, stacked, meta) {
+ var key = [
+ meta.type,
+ // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
+ stacked === undefined && meta.stack === undefined ? meta.index : '',
+ meta.stack
+ ].join('.');
+
+ if (stacks[key] === undefined) {
+ stacks[key] = {
+ pos: [],
+ neg: []
+ };
+ }
- var hasStacks = opts.stacked;
- if (hasStacks === undefined) {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- if (hasStacks) {
- return;
- }
+ return stacks[key];
+}
- var meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&
- meta.stack !== undefined) {
- hasStacks = true;
- }
- });
+function stackData(scale, stacks, meta, data) {
+ var opts = scale.options;
+ var stacked = opts.stacked;
+ var stack = getOrCreateStack(stacks, stacked, meta);
+ var pos = stack.pos;
+ var neg = stack.neg;
+ var ilen = data.length;
+ var i, value;
+
+ for (i = 0; i < ilen; ++i) {
+ value = scale._parseValue(data[i]);
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
+ continue;
}
- if (opts.stacked || hasStacks) {
- var valuesPerStack = {};
-
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
- var key = [
- meta.type,
- // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
- ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),
- meta.stack
- ].join('.');
-
- if (valuesPerStack[key] === undefined) {
- valuesPerStack[key] = {
- positiveValues: [],
- negativeValues: []
- };
- }
+ pos[i] = pos[i] || 0;
+ neg[i] = neg[i] || 0;
- // Store these per type
- var positiveValues = valuesPerStack[key].positiveValues;
- var negativeValues = valuesPerStack[key].negativeValues;
+ if (opts.relativePoints) {
+ pos[i] = 100;
+ } else if (value.min < 0 || value.max < 0) {
+ neg[i] += value.min;
+ } else {
+ pos[i] += value.max;
+ }
+ }
+}
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
+function updateMinMax(scale, meta, data) {
+ var ilen = data.length;
+ var i, value;
- positiveValues[index] = positiveValues[index] || 0;
- negativeValues[index] = negativeValues[index] || 0;
+ for (i = 0; i < ilen; ++i) {
+ value = scale._parseValue(data[i]);
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
+ continue;
+ }
- if (opts.relativePoints) {
- positiveValues[index] = 100;
- } else if (value < 0) {
- negativeValues[index] += value;
- } else {
- positiveValues[index] += value;
- }
- });
- }
- });
+ scale.min = Math.min(scale.min, value.min);
+ scale.max = Math.max(scale.max, value.max);
+ }
+}
- helpers$1.each(valuesPerStack, function(valuesForType) {
- var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);
- var minVal = helpers$1.min(values);
- var maxVal = helpers$1.max(values);
- me.min = me.min === null ? minVal : Math.min(me.min, minVal);
- me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);
- });
+var scale_linear = scale_linearbase.extend({
+ determineDataLimits: function() {
+ var me = this;
+ var opts = me.options;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var metasets = me._getMatchingVisibleMetas();
+ var hasStacks = opts.stacked;
+ var stacks = {};
+ var ilen = metasets.length;
+ var i, meta, data, values;
- } else {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
+ me.min = Number.POSITIVE_INFINITY;
+ me.max = Number.NEGATIVE_INFINITY;
- if (me.min === null) {
- me.min = value;
- } else if (value < me.min) {
- me.min = value;
- }
+ if (hasStacks === undefined) {
+ for (i = 0; !hasStacks && i < ilen; ++i) {
+ meta = metasets[i];
+ hasStacks = meta.stack !== undefined;
+ }
+ }
- if (me.max === null) {
- me.max = value;
- } else if (value > me.max) {
- me.max = value;
- }
- });
- }
- });
+ for (i = 0; i < ilen; ++i) {
+ meta = metasets[i];
+ data = datasets[meta.index].data;
+ if (hasStacks) {
+ stackData(me, stacks, meta, data);
+ } else {
+ updateMinMax(me, meta, data);
+ }
}
- me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;
- me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;
+ helpers$1.each(stacks, function(stackValues) {
+ values = stackValues.pos.concat(stackValues.neg);
+ me.min = Math.min(me.min, helpers$1.min(values));
+ me.max = Math.max(me.max, helpers$1.max(values));
+ });
+
+ me.min = helpers$1.isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;
+ me.max = helpers$1.isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;
// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero
- this.handleTickRangeOptions();
+ me.handleTickRangeOptions();
},
// Returns the maximum number of ticks based on the scale dimension
@@ -11642,38 +13061,25 @@ var scale_linear = scale_linearbase.extend({
},
getLabelForIndex: function(index, datasetIndex) {
- return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
+ return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
},
// Utils
getPixelForValue: function(value) {
- // This must be called after fit has been run so that
- // this.left, this.top, this.right, and this.bottom have been defined
var me = this;
- var start = me.start;
-
- var rightValue = +me.getRightValue(value);
- var pixel;
- var range = me.end - start;
-
- if (me.isHorizontal()) {
- pixel = me.left + (me.width / range * (rightValue - start));
- } else {
- pixel = me.bottom - (me.height / range * (rightValue - start));
- }
- return pixel;
+ return me.getPixelForDecimal((+me.getRightValue(value) - me._startValue) / me._valueRange);
},
getValueForPixel: function(pixel) {
- var me = this;
- var isHorizontal = me.isHorizontal();
- var innerDimension = isHorizontal ? me.width : me.height;
- var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;
- return me.start + ((me.end - me.start) * offset);
+ return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;
},
getPixelForTick: function(index) {
- return this.getPixelForValue(this.ticksAsNumbers[index]);
+ var ticks = this.ticksAsNumbers;
+ if (index < 0 || index > ticks.length - 1) {
+ return null;
+ }
+ return this.getPixelForValue(ticks[index]);
}
});
@@ -11681,7 +13087,8 @@ var scale_linear = scale_linearbase.extend({
var _defaults$1 = defaultConfig$1;
scale_linear._defaults = _defaults$1;
-var valueOrDefault$a = helpers$1.valueOrDefault;
+var valueOrDefault$b = helpers$1.valueOrDefault;
+var log10 = helpers$1.math.log10;
/**
* Generate a set of logarithmic ticks
@@ -11692,20 +13099,20 @@ var valueOrDefault$a = helpers$1.valueOrDefault;
function generateTicks$1(generationOptions, dataRange) {
var ticks = [];
- var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min))));
+ var tickVal = valueOrDefault$b(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));
- var endExp = Math.floor(helpers$1.log10(dataRange.max));
+ var endExp = Math.floor(log10(dataRange.max));
var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));
var exp, significand;
if (tickVal === 0) {
- exp = Math.floor(helpers$1.log10(dataRange.minNotZero));
+ exp = Math.floor(log10(dataRange.minNotZero));
significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));
ticks.push(tickVal);
tickVal = significand * Math.pow(10, exp);
} else {
- exp = Math.floor(helpers$1.log10(tickVal));
+ exp = Math.floor(log10(tickVal));
significand = Math.floor(tickVal / Math.pow(10, exp));
}
var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;
@@ -11723,7 +13130,7 @@ function generateTicks$1(generationOptions, dataRange) {
tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;
} while (exp < endExp || (exp === endExp && significand < endSignificand));
- var lastTick = valueOrDefault$a(generationOptions.max, tickVal);
+ var lastTick = valueOrDefault$b(generationOptions.max, tickVal);
ticks.push(lastTick);
return ticks;
@@ -11748,38 +13155,35 @@ var scale_logarithmic = core_scale.extend({
var me = this;
var opts = me.options;
var chart = me.chart;
- var data = chart.data;
- var datasets = data.datasets;
+ var datasets = chart.data.datasets;
var isHorizontal = me.isHorizontal();
function IDMatches(meta) {
return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
}
+ var datasetIndex, meta, value, data, i, ilen;
// Calculate Range
- me.min = null;
- me.max = null;
- me.minNotZero = null;
+ me.min = Number.POSITIVE_INFINITY;
+ me.max = Number.NEGATIVE_INFINITY;
+ me.minNotZero = Number.POSITIVE_INFINITY;
var hasStacks = opts.stacked;
if (hasStacks === undefined) {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- if (hasStacks) {
- return;
- }
-
- var meta = chart.getDatasetMeta(datasetIndex);
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&
meta.stack !== undefined) {
hasStacks = true;
+ break;
}
- });
+ }
}
if (opts.stacked || hasStacks) {
var valuesPerStack = {};
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
var key = [
meta.type,
// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
@@ -11792,59 +13196,56 @@ var scale_logarithmic = core_scale.extend({
valuesPerStack[key] = [];
}
- helpers$1.each(dataset.data, function(rawValue, index) {
+ data = datasets[datasetIndex].data;
+ for (i = 0, ilen = data.length; i < ilen; i++) {
var values = valuesPerStack[key];
- var value = +me.getRightValue(rawValue);
+ value = me._parseValue(data[i]);
// invalid, hidden and negative values are ignored
- if (isNaN(value) || meta.data[index].hidden || value < 0) {
- return;
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
+ continue;
}
- values[index] = values[index] || 0;
- values[index] += value;
- });
+ values[i] = values[i] || 0;
+ values[i] += value.max;
+ }
}
- });
+ }
helpers$1.each(valuesPerStack, function(valuesForType) {
if (valuesForType.length > 0) {
var minVal = helpers$1.min(valuesForType);
var maxVal = helpers$1.max(valuesForType);
- me.min = me.min === null ? minVal : Math.min(me.min, minVal);
- me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);
+ me.min = Math.min(me.min, minVal);
+ me.max = Math.max(me.max, maxVal);
}
});
} else {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
+ data = datasets[datasetIndex].data;
+ for (i = 0, ilen = data.length; i < ilen; i++) {
+ value = me._parseValue(data[i]);
// invalid, hidden and negative values are ignored
- if (isNaN(value) || meta.data[index].hidden || value < 0) {
- return;
- }
-
- if (me.min === null) {
- me.min = value;
- } else if (value < me.min) {
- me.min = value;
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
+ continue;
}
- if (me.max === null) {
- me.max = value;
- } else if (value > me.max) {
- me.max = value;
- }
+ me.min = Math.min(value.min, me.min);
+ me.max = Math.max(value.max, me.max);
- if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {
- me.minNotZero = value;
+ if (value.min !== 0) {
+ me.minNotZero = Math.min(value.min, me.minNotZero);
}
- });
+ }
}
- });
+ }
}
+ me.min = helpers$1.isFinite(me.min) ? me.min : null;
+ me.max = helpers$1.isFinite(me.max) ? me.max : null;
+ me.minNotZero = helpers$1.isFinite(me.minNotZero) ? me.minNotZero : null;
+
// Common base implementation to handle ticks.min, ticks.max
this.handleTickRangeOptions();
},
@@ -11860,26 +13261,26 @@ var scale_logarithmic = core_scale.extend({
if (me.min === me.max) {
if (me.min !== 0 && me.min !== null) {
- me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1);
- me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1);
+ me.min = Math.pow(10, Math.floor(log10(me.min)) - 1);
+ me.max = Math.pow(10, Math.floor(log10(me.max)) + 1);
} else {
me.min = DEFAULT_MIN;
me.max = DEFAULT_MAX;
}
}
if (me.min === null) {
- me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1);
+ me.min = Math.pow(10, Math.floor(log10(me.max)) - 1);
}
if (me.max === null) {
me.max = me.min !== 0
- ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1)
+ ? Math.pow(10, Math.floor(log10(me.min)) + 1)
: DEFAULT_MAX;
}
if (me.minNotZero === null) {
if (me.min > 0) {
me.minNotZero = me.min;
} else if (me.max < 1) {
- me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max)));
+ me.minNotZero = Math.pow(10, Math.floor(log10(me.max)));
} else {
me.minNotZero = DEFAULT_MIN;
}
@@ -11923,11 +13324,15 @@ var scale_logarithmic = core_scale.extend({
// Get the correct tooltip label
getLabelForIndex: function(index, datasetIndex) {
- return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
+ return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
},
getPixelForTick: function(index) {
- return this.getPixelForValue(this.tickValues[index]);
+ var ticks = this.tickValues;
+ if (index < 0 || index > ticks.length - 1) {
+ return null;
+ }
+ return this.getPixelForValue(ticks[index]);
},
/**
@@ -11937,87 +13342,47 @@ var scale_logarithmic = core_scale.extend({
* @private
*/
_getFirstTickValue: function(value) {
- var exp = Math.floor(helpers$1.log10(value));
+ var exp = Math.floor(log10(value));
var significand = Math.floor(value / Math.pow(10, exp));
return significand * Math.pow(10, exp);
},
- getPixelForValue: function(value) {
+ _configure: function() {
var me = this;
- var tickOpts = me.options.ticks;
- var reverse = tickOpts.reverse;
- var log10 = helpers$1.log10;
- var firstTickValue = me._getFirstTickValue(me.minNotZero);
+ var start = me.min;
var offset = 0;
- var innerDimension, pixel, start, end, sign;
- value = +me.getRightValue(value);
- if (reverse) {
- start = me.end;
- end = me.start;
- sign = -1;
- } else {
- start = me.start;
- end = me.end;
- sign = 1;
- }
- if (me.isHorizontal()) {
- innerDimension = me.width;
- pixel = reverse ? me.right : me.left;
- } else {
- innerDimension = me.height;
- sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)
- pixel = reverse ? me.top : me.bottom;
- }
- if (value !== start) {
- if (start === 0) { // include zero tick
- offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);
- innerDimension -= offset;
- start = firstTickValue;
- }
- if (value !== 0) {
- offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));
- }
- pixel += sign * offset;
+ core_scale.prototype._configure.call(me);
+
+ if (start === 0) {
+ start = me._getFirstTickValue(me.minNotZero);
+ offset = valueOrDefault$b(me.options.ticks.fontSize, core_defaults.global.defaultFontSize) / me._length;
}
- return pixel;
+
+ me._startValue = log10(start);
+ me._valueOffset = offset;
+ me._valueRange = (log10(me.max) - log10(start)) / (1 - offset);
},
- getValueForPixel: function(pixel) {
+ getPixelForValue: function(value) {
var me = this;
- var tickOpts = me.options.ticks;
- var reverse = tickOpts.reverse;
- var log10 = helpers$1.log10;
- var firstTickValue = me._getFirstTickValue(me.minNotZero);
- var innerDimension, start, end, value;
+ var decimal = 0;
- if (reverse) {
- start = me.end;
- end = me.start;
- } else {
- start = me.start;
- end = me.end;
- }
- if (me.isHorizontal()) {
- innerDimension = me.width;
- value = reverse ? me.right - pixel : pixel - me.left;
- } else {
- innerDimension = me.height;
- value = reverse ? pixel - me.top : me.bottom - pixel;
- }
- if (value !== start) {
- if (start === 0) { // include zero tick
- var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);
- value -= offset;
- innerDimension -= offset;
- start = firstTickValue;
- }
- value *= log10(end) - log10(start);
- value /= innerDimension;
- value = Math.pow(10, log10(start) + value);
+ value = +me.getRightValue(value);
+
+ if (value > me.min && value > 0) {
+ decimal = (log10(value) - me._startValue) / me._valueRange + me._valueOffset;
}
- return value;
+ return me.getPixelForDecimal(decimal);
+ },
+
+ getValueForPixel: function(pixel) {
+ var me = this;
+ var decimal = me.getDecimalForPixel(pixel);
+ return decimal === 0 && me.min === 0
+ ? 0
+ : Math.pow(10, me._startValue + (decimal - me._valueOffset) * me._valueRange);
}
});
@@ -12025,9 +13390,9 @@ var scale_logarithmic = core_scale.extend({
var _defaults$2 = defaultConfig$2;
scale_logarithmic._defaults = _defaults$2;
-var valueOrDefault$b = helpers$1.valueOrDefault;
+var valueOrDefault$c = helpers$1.valueOrDefault;
var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;
-var resolve$7 = helpers$1.options.resolve;
+var resolve$4 = helpers$1.options.resolve;
var defaultConfig$3 = {
display: true,
@@ -12038,7 +13403,7 @@ var defaultConfig$3 = {
angleLines: {
display: true,
- color: 'rgba(0, 0, 0, 0.1)',
+ color: 'rgba(0,0,0,0.1)',
lineWidth: 1,
borderDash: [],
borderDashOffset: 0.0
@@ -12079,16 +13444,11 @@ var defaultConfig$3 = {
}
};
-function getValueCount(scale) {
- var opts = scale.options;
- return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;
-}
-
function getTickBackdropHeight(opts) {
var tickOpts = opts.ticks;
if (tickOpts.display && opts.display) {
- return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;
+ return valueOrDefault$c(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;
}
return 0;
}
@@ -12173,10 +13533,10 @@ function fitWithPointLabels(scale) {
scale.ctx.font = plFont.string;
scale._pointLabelSizes = [];
- var valueCount = getValueCount(scale);
+ var valueCount = scale.chart.data.labels.length;
for (i = 0; i < valueCount; i++) {
pointPosition = scale.getPointPosition(i, scale.drawingArea + 5);
- textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || '');
+ textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i]);
scale._pointLabelSizes[i] = textSize;
// Add quarter circle to make degree 0 mean top of circle
@@ -12244,53 +13604,30 @@ function adjustPointPositionForLabelHeight(angle, textSize, position) {
function drawPointLabels(scale) {
var ctx = scale.ctx;
var opts = scale.options;
- var angleLineOpts = opts.angleLines;
- var gridLineOpts = opts.gridLines;
var pointLabelOpts = opts.pointLabels;
- var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth);
- var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color);
var tickBackdropHeight = getTickBackdropHeight(opts);
-
- ctx.save();
- ctx.lineWidth = lineWidth;
- ctx.strokeStyle = lineColor;
- if (ctx.setLineDash) {
- ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));
- ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);
- }
-
var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);
-
- // Point Label Font
var plFont = helpers$1.options._parseFont(pointLabelOpts);
+ ctx.save();
+
ctx.font = plFont.string;
ctx.textBaseline = 'middle';
- for (var i = getValueCount(scale) - 1; i >= 0; i--) {
- if (angleLineOpts.display && lineWidth && lineColor) {
- var outerPosition = scale.getPointPosition(i, outerDistance);
- ctx.beginPath();
- ctx.moveTo(scale.xCenter, scale.yCenter);
- ctx.lineTo(outerPosition.x, outerPosition.y);
- ctx.stroke();
- }
-
- if (pointLabelOpts.display) {
- // Extra pixels out for some label spacing
- var extra = (i === 0 ? tickBackdropHeight / 2 : 0);
- var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);
+ for (var i = scale.chart.data.labels.length - 1; i >= 0; i--) {
+ // Extra pixels out for some label spacing
+ var extra = (i === 0 ? tickBackdropHeight / 2 : 0);
+ var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);
- // Keep this in loop since we may support array properties here
- var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);
- ctx.fillStyle = pointLabelFontColor;
+ // Keep this in loop since we may support array properties here
+ var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);
+ ctx.fillStyle = pointLabelFontColor;
- var angleRadians = scale.getIndexAngle(i);
- var angle = helpers$1.toDegrees(angleRadians);
- ctx.textAlign = getTextAlignForAngle(angle);
- adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);
- fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight);
- }
+ var angleRadians = scale.getIndexAngle(i);
+ var angle = helpers$1.toDegrees(angleRadians);
+ ctx.textAlign = getTextAlignForAngle(angle);
+ adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);
+ fillText(ctx, scale.pointLabels[i], pointLabelPosition, plFont.lineHeight);
}
ctx.restore();
}
@@ -12298,7 +13635,7 @@ function drawPointLabels(scale) {
function drawRadiusLine(scale, gridLineOpts, radius, index) {
var ctx = scale.ctx;
var circular = gridLineOpts.circular;
- var valueCount = getValueCount(scale);
+ var valueCount = scale.chart.data.labels.length;
var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);
var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);
var pointPosition;
@@ -12391,7 +13728,10 @@ var scale_radialLinear = scale_linearbase.extend({
scale_linearbase.prototype.convertTicksToLabels.call(me);
// Point labels
- me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);
+ me.pointLabels = me.chart.data.labels.map(function() {
+ var label = helpers$1.callback(me.options.pointLabels.callback, arguments, me);
+ return label || label === 0 ? label : '';
+ });
},
getLabelForIndex: function(index, datasetIndex) {
@@ -12443,22 +13783,22 @@ var scale_radialLinear = scale_linearbase.extend({
},
getIndexAngle: function(index) {
- var angleMultiplier = (Math.PI * 2) / getValueCount(this);
- var startAngle = this.chart.options && this.chart.options.startAngle ?
- this.chart.options.startAngle :
- 0;
-
- var startAngleRadians = startAngle * Math.PI * 2 / 360;
+ var chart = this.chart;
+ var angleMultiplier = 360 / chart.data.labels.length;
+ var options = chart.options || {};
+ var startAngle = options.startAngle || 0;
// Start from the top instead of right, so remove a quarter of the circle
- return index * angleMultiplier + startAngleRadians;
+ var angle = (index * angleMultiplier + startAngle) % 360;
+
+ return (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360;
},
getDistanceFromCenterForValue: function(value) {
var me = this;
- if (value === null) {
- return 0; // null always in center
+ if (helpers$1.isNullOrUndef(value)) {
+ return NaN;
}
// Take into account half font size + the yPadding of the top value
@@ -12482,79 +13822,130 @@ var scale_radialLinear = scale_linearbase.extend({
return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));
},
- getBasePosition: function() {
+ getBasePosition: function(index) {
var me = this;
var min = me.min;
var max = me.max;
- return me.getPointPositionForValue(0,
- me.beginAtZero ? 0 :
- min < 0 && max < 0 ? max :
- min > 0 && max > 0 ? min :
- 0);
+ return me.getPointPositionForValue(index || 0,
+ me.beginAtZero ? 0 :
+ min < 0 && max < 0 ? max :
+ min > 0 && max > 0 ? min :
+ 0);
+ },
+
+ /**
+ * @private
+ */
+ _drawGrid: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var opts = me.options;
+ var gridLineOpts = opts.gridLines;
+ var angleLineOpts = opts.angleLines;
+ var lineWidth = valueOrDefault$c(angleLineOpts.lineWidth, gridLineOpts.lineWidth);
+ var lineColor = valueOrDefault$c(angleLineOpts.color, gridLineOpts.color);
+ var i, offset, position;
+
+ if (opts.pointLabels.display) {
+ drawPointLabels(me);
+ }
+
+ if (gridLineOpts.display) {
+ helpers$1.each(me.ticks, function(label, index) {
+ if (index !== 0) {
+ offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
+ drawRadiusLine(me, gridLineOpts, offset, index);
+ }
+ });
+ }
+
+ if (angleLineOpts.display && lineWidth && lineColor) {
+ ctx.save();
+ ctx.lineWidth = lineWidth;
+ ctx.strokeStyle = lineColor;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(resolve$4([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));
+ ctx.lineDashOffset = resolve$4([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);
+ }
+
+ for (i = me.chart.data.labels.length - 1; i >= 0; i--) {
+ offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);
+ position = me.getPointPosition(i, offset);
+ ctx.beginPath();
+ ctx.moveTo(me.xCenter, me.yCenter);
+ ctx.lineTo(position.x, position.y);
+ ctx.stroke();
+ }
+
+ ctx.restore();
+ }
},
- draw: function() {
+ /**
+ * @private
+ */
+ _drawLabels: function() {
var me = this;
+ var ctx = me.ctx;
var opts = me.options;
- var gridLineOpts = opts.gridLines;
var tickOpts = opts.ticks;
- if (opts.display) {
- var ctx = me.ctx;
- var startAngle = this.getIndexAngle(0);
- var tickFont = helpers$1.options._parseFont(tickOpts);
+ if (!tickOpts.display) {
+ return;
+ }
+
+ var startAngle = me.getIndexAngle(0);
+ var tickFont = helpers$1.options._parseFont(tickOpts);
+ var tickFontColor = valueOrDefault$c(tickOpts.fontColor, core_defaults.global.defaultFontColor);
+ var offset, width;
- if (opts.angleLines.display || opts.pointLabels.display) {
- drawPointLabels(me);
+ ctx.save();
+ ctx.font = tickFont.string;
+ ctx.translate(me.xCenter, me.yCenter);
+ ctx.rotate(startAngle);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+
+ helpers$1.each(me.ticks, function(label, index) {
+ if (index === 0 && !tickOpts.reverse) {
+ return;
}
- helpers$1.each(me.ticks, function(label, index) {
- // Don't draw a centre value (if it is minimum)
- if (index > 0 || tickOpts.reverse) {
- var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
+ offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
- // Draw circular lines around the scale
- if (gridLineOpts.display && index !== 0) {
- drawRadiusLine(me, gridLineOpts, yCenterOffset, index);
- }
+ if (tickOpts.showLabelBackdrop) {
+ width = ctx.measureText(label).width;
+ ctx.fillStyle = tickOpts.backdropColor;
- if (tickOpts.display) {
- var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor);
- ctx.font = tickFont.string;
-
- ctx.save();
- ctx.translate(me.xCenter, me.yCenter);
- ctx.rotate(startAngle);
-
- if (tickOpts.showLabelBackdrop) {
- var labelWidth = ctx.measureText(label).width;
- ctx.fillStyle = tickOpts.backdropColor;
- ctx.fillRect(
- -labelWidth / 2 - tickOpts.backdropPaddingX,
- -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY,
- labelWidth + tickOpts.backdropPaddingX * 2,
- tickFont.size + tickOpts.backdropPaddingY * 2
- );
- }
+ ctx.fillRect(
+ -width / 2 - tickOpts.backdropPaddingX,
+ -offset - tickFont.size / 2 - tickOpts.backdropPaddingY,
+ width + tickOpts.backdropPaddingX * 2,
+ tickFont.size + tickOpts.backdropPaddingY * 2
+ );
+ }
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
- ctx.fillStyle = tickFontColor;
- ctx.fillText(label, 0, -yCenterOffset);
- ctx.restore();
- }
- }
- });
- }
- }
+ ctx.fillStyle = tickFontColor;
+ ctx.fillText(label, 0, -offset);
+ });
+
+ ctx.restore();
+ },
+
+ /**
+ * @private
+ */
+ _drawTitle: helpers$1.noop
});
// INTERNAL: static default options, registered in src/index.js
var _defaults$3 = defaultConfig$3;
scale_radialLinear._defaults = _defaults$3;
-var valueOrDefault$c = helpers$1.valueOrDefault;
+var deprecated$1 = helpers$1._deprecated;
+var resolve$5 = helpers$1.options.resolve;
+var valueOrDefault$d = helpers$1.valueOrDefault;
// Integer constants are from the ES6 spec.
var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
@@ -12564,42 +13955,42 @@ var INTERVALS = {
millisecond: {
common: true,
size: 1,
- steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]
+ steps: 1000
},
second: {
common: true,
size: 1000,
- steps: [1, 2, 5, 10, 15, 30]
+ steps: 60
},
minute: {
common: true,
size: 60000,
- steps: [1, 2, 5, 10, 15, 30]
+ steps: 60
},
hour: {
common: true,
size: 3600000,
- steps: [1, 2, 3, 6, 12]
+ steps: 24
},
day: {
common: true,
size: 86400000,
- steps: [1, 2, 5]
+ steps: 30
},
week: {
common: false,
size: 604800000,
- steps: [1, 2, 3, 4]
+ steps: 4
},
month: {
common: true,
size: 2.628e9,
- steps: [1, 2, 3]
+ steps: 12
},
quarter: {
common: false,
size: 7.884e9,
- steps: [1, 2, 3, 4]
+ steps: 4
},
year: {
common: true,
@@ -12629,6 +14020,14 @@ function arrayUnique(items) {
return out;
}
+function getMin(options) {
+ return helpers$1.valueOrDefault(options.time.min, options.ticks.min);
+}
+
+function getMax(options) {
+ return helpers$1.valueOrDefault(options.time.max, options.ticks.max);
+}
+
/**
* Returns an array of {time, pos} objects used to interpolate a specific `time` or position
* (`pos`) on the scale, by searching entries before and after the requested value. `pos` is
@@ -12780,31 +14179,6 @@ function parse(scale, input) {
return value;
}
-/**
- * Returns the number of unit to skip to be able to display up to `capacity` number of ticks
- * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.
- */
-function determineStepSize(min, max, unit, capacity) {
- var range = max - min;
- var interval = INTERVALS[unit];
- var milliseconds = interval.size;
- var steps = interval.steps;
- var i, ilen, factor;
-
- if (!steps) {
- return Math.ceil(range / (capacity * milliseconds));
- }
-
- for (i = 0, ilen = steps.length; i < ilen; ++i) {
- factor = steps[i];
- if (Math.ceil(range / (milliseconds * factor)) <= capacity) {
- break;
- }
- }
-
- return factor;
-}
-
/**
* Figures out what unit results in an appropriate number of auto-generated ticks
*/
@@ -12814,7 +14188,7 @@ function determineUnitForAutoTicks(minUnit, min, max, capacity) {
for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {
interval = INTERVALS[UNITS[i]];
- factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;
+ factor = interval.steps ? interval.steps : MAX_INTEGER;
if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {
return UNITS[i];
@@ -12827,13 +14201,12 @@ function determineUnitForAutoTicks(minUnit, min, max, capacity) {
/**
* Figures out what unit to format a set of ticks with
*/
-function determineUnitForFormatting(scale, ticks, minUnit, min, max) {
- var ilen = UNITS.length;
+function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {
var i, unit;
- for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {
+ for (i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {
unit = UNITS[i];
- if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) {
+ if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {
return unit;
}
}
@@ -12851,7 +14224,7 @@ function determineMajorUnit(unit) {
/**
* Generates a maximum of `capacity` timestamps between min and max, rounded to the
- * `minor` unit, aligned on the `major` unit and using the given scale time `options`.
+ * `minor` unit using the given scale time `options`.
* Important: this method can return ticks outside the min and max range, it's the
* responsibility of the calling code to clamp values if needed.
*/
@@ -12860,51 +14233,33 @@ function generate(scale, min, max, capacity) {
var options = scale.options;
var timeOpts = options.time;
var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);
- var major = determineMajorUnit(minor);
- var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize);
+ var stepSize = resolve$5([timeOpts.stepSize, timeOpts.unitStepSize, 1]);
var weekday = minor === 'week' ? timeOpts.isoWeekday : false;
- var majorTicksEnabled = options.ticks.major.enabled;
- var interval = INTERVALS[minor];
var first = min;
- var last = max;
var ticks = [];
var time;
- if (!stepSize) {
- stepSize = determineStepSize(min, max, minor, capacity);
- }
-
// For 'week' unit, handle the first day of week option
if (weekday) {
first = +adapter.startOf(first, 'isoWeek', weekday);
- last = +adapter.startOf(last, 'isoWeek', weekday);
}
- // Align first/last ticks on unit
+ // Align first ticks on unit
first = +adapter.startOf(first, weekday ? 'day' : minor);
- last = +adapter.startOf(last, weekday ? 'day' : minor);
- // Make sure that the last tick include max
- if (last < max) {
- last = +adapter.add(last, 1, minor);
+ // Prevent browser from freezing in case user options request millions of milliseconds
+ if (adapter.diff(max, min, minor) > 100000 * stepSize) {
+ throw min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor;
}
- time = first;
-
- if (majorTicksEnabled && major && !weekday && !timeOpts.round) {
- // Align the first tick on the previous `minor` unit aligned on the `major` unit:
- // we first aligned time on the previous `major` unit then add the number of full
- // stepSize there is between first and the previous major time.
- time = +adapter.startOf(time, major);
- time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor);
+ for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) {
+ ticks.push(time);
}
- for (; time < last; time = +adapter.add(time, stepSize, minor)) {
- ticks.push(+time);
+ if (time === max || options.bounds === 'ticks') {
+ ticks.push(time);
}
- ticks.push(+time);
-
return ticks;
}
@@ -12920,42 +14275,57 @@ function computeOffsets(table, ticks, min, max, options) {
var first, last;
if (options.offset && ticks.length) {
- if (!options.time.min) {
- first = interpolate$1(table, 'time', ticks[0], 'pos');
- if (ticks.length === 1) {
- start = 1 - first;
- } else {
- start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;
- }
+ first = interpolate$1(table, 'time', ticks[0], 'pos');
+ if (ticks.length === 1) {
+ start = 1 - first;
+ } else {
+ start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;
}
- if (!options.time.max) {
- last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');
- if (ticks.length === 1) {
- end = last;
- } else {
- end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;
- }
+ last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');
+ if (ticks.length === 1) {
+ end = last;
+ } else {
+ end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;
}
}
- return {start: start, end: end};
+ return {start: start, end: end, factor: 1 / (start + 1 + end)};
+}
+
+function setMajorTicks(scale, ticks, map, majorUnit) {
+ var adapter = scale._adapter;
+ var first = +adapter.startOf(ticks[0].value, majorUnit);
+ var last = ticks[ticks.length - 1].value;
+ var major, index;
+
+ for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {
+ index = map[major];
+ if (index >= 0) {
+ ticks[index].major = true;
+ }
+ }
+ return ticks;
}
function ticksFromTimestamps(scale, values, majorUnit) {
var ticks = [];
- var i, ilen, value, major;
+ var map = {};
+ var ilen = values.length;
+ var i, value;
- for (i = 0, ilen = values.length; i < ilen; ++i) {
+ for (i = 0; i < ilen; ++i) {
value = values[i];
- major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false;
+ map[value] = i;
ticks.push({
value: value,
- major: major
+ major: false
});
}
- return ticks;
+ // We set the major ticks separately from the above loop because calling startOf for every tick
+ // is expensive when there is a large number of ticks
+ return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);
}
var defaultConfig$4 = {
@@ -12982,7 +14352,6 @@ var defaultConfig$4 = {
adapters: {},
time: {
parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment
- format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/
unit: false, // false == automatic or override with week, month, year, etc.
round: false, // none, or override with week, month, year, etc.
displayFormat: false, // DEPRECATED
@@ -13022,9 +14391,9 @@ var scale_time = core_scale.extend({
var adapter = me._adapter = new core_adapters._date(options.adapters.date);
// DEPRECATIONS: output a message only one time per update
- if (time.format) {
- console.warn('options.time.format is deprecated and replaced by options.time.parser.');
- }
+ deprecated$1('time scale', time.format, 'time.format', 'time.parser');
+ deprecated$1('time scale', time.min, 'time.min', 'ticks.min');
+ deprecated$1('time scale', time.max, 'time.max', 'ticks.max');
// Backward compatibility: before introducing adapter, `displayFormats` was
// supposed to contain *all* unit/string pairs but this can't be resolved
@@ -13049,22 +14418,20 @@ var scale_time = core_scale.extend({
var me = this;
var chart = me.chart;
var adapter = me._adapter;
- var timeOpts = me.options.time;
- var unit = timeOpts.unit || 'day';
+ var options = me.options;
+ var unit = options.time.unit || 'day';
var min = MAX_INTEGER;
var max = MIN_INTEGER;
var timestamps = [];
var datasets = [];
var labels = [];
- var i, j, ilen, jlen, data, timestamp;
- var dataLabels = chart.data.labels || [];
+ var i, j, ilen, jlen, data, timestamp, labelsAdded;
+ var dataLabels = me._getLabels();
- // Convert labels to timestamps
for (i = 0, ilen = dataLabels.length; i < ilen; ++i) {
labels.push(parse(me, dataLabels[i]));
}
- // Convert data to timestamps
for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
if (chart.isDatasetVisible(i)) {
data = chart.data.datasets[i].data;
@@ -13079,10 +14446,11 @@ var scale_time = core_scale.extend({
datasets[i][j] = timestamp;
}
} else {
- for (j = 0, jlen = labels.length; j < jlen; ++j) {
- timestamps.push(labels[j]);
- }
datasets[i] = labels.slice(0);
+ if (!labelsAdded) {
+ timestamps = timestamps.concat(labels);
+ labelsAdded = true;
+ }
}
} else {
datasets[i] = [];
@@ -13090,20 +14458,18 @@ var scale_time = core_scale.extend({
}
if (labels.length) {
- // Sort labels **after** data have been converted
- labels = arrayUnique(labels).sort(sorter);
min = Math.min(min, labels[0]);
max = Math.max(max, labels[labels.length - 1]);
}
if (timestamps.length) {
- timestamps = arrayUnique(timestamps).sort(sorter);
+ timestamps = ilen > 1 ? arrayUnique(timestamps).sort(sorter) : timestamps.sort(sorter);
min = Math.min(min, timestamps[0]);
max = Math.max(max, timestamps[timestamps.length - 1]);
}
- min = parse(me, timeOpts.min) || min;
- max = parse(me, timeOpts.max) || max;
+ min = parse(me, getMin(options)) || min;
+ max = parse(me, getMax(options)) || max;
// In case there is no valid min/max, set limits based on unit time option
min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;
@@ -13114,7 +14480,6 @@ var scale_time = core_scale.extend({
me.max = Math.max(min + 1, max);
// PRIVATE
- me._horizontal = me.isHorizontal();
me._table = [];
me._timestamps = {
data: timestamps,
@@ -13128,21 +14493,21 @@ var scale_time = core_scale.extend({
var min = me.min;
var max = me.max;
var options = me.options;
+ var tickOpts = options.ticks;
var timeOpts = options.time;
- var timestamps = [];
+ var timestamps = me._timestamps;
var ticks = [];
+ var capacity = me.getLabelCapacity(min);
+ var source = tickOpts.source;
+ var distribution = options.distribution;
var i, ilen, timestamp;
- switch (options.ticks.source) {
- case 'data':
- timestamps = me._timestamps.data;
- break;
- case 'labels':
- timestamps = me._timestamps.labels;
- break;
- case 'auto':
- default:
- timestamps = generate(me, min, max, me.getLabelCapacity(min), options);
+ if (source === 'data' || (source === 'auto' && distribution === 'series')) {
+ timestamps = timestamps.data;
+ } else if (source === 'labels') {
+ timestamps = timestamps.labels;
+ } else {
+ timestamps = generate(me, min, max, capacity);
}
if (options.bounds === 'ticks' && timestamps.length) {
@@ -13151,8 +14516,8 @@ var scale_time = core_scale.extend({
}
// Enforce limits with user min/max options
- min = parse(me, timeOpts.min) || min;
- max = parse(me, timeOpts.max) || max;
+ min = parse(me, getMin(options)) || min;
+ max = parse(me, getMax(options)) || max;
// Remove ticks outside the min/max range
for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
@@ -13166,12 +14531,17 @@ var scale_time = core_scale.extend({
me.max = max;
// PRIVATE
- me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max);
- me._majorUnit = determineMajorUnit(me._unit);
- me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);
+ // determineUnitForFormatting relies on the number of ticks so we don't use it when
+ // autoSkip is enabled because we don't yet know what the final number of ticks will be
+ me._unit = timeOpts.unit || (tickOpts.autoSkip
+ ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, capacity)
+ : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));
+ me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined
+ : determineMajorUnit(me._unit);
+ me._table = buildLookupTable(me._timestamps.data, min, max, distribution);
me._offsets = computeOffsets(me._table, ticks, min, max, options);
- if (options.ticks.reverse) {
+ if (tickOpts.reverse) {
ticks.reverse();
}
@@ -13210,12 +14580,17 @@ var scale_time = core_scale.extend({
var minorFormat = formats[me._unit];
var majorUnit = me._majorUnit;
var majorFormat = formats[majorUnit];
- var majorTime = +adapter.startOf(time, majorUnit);
- var majorTickOpts = options.ticks.major;
- var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;
+ var tick = ticks[index];
+ var tickOpts = options.ticks;
+ var major = majorUnit && majorFormat && tick && tick.major;
var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);
- var tickOpts = major ? majorTickOpts : options.ticks.minor;
- var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback);
+ var nestedTickOpts = major ? tickOpts.major : tickOpts.minor;
+ var formatter = resolve$5([
+ nestedTickOpts.callback,
+ nestedTickOpts.userCallback,
+ tickOpts.callback,
+ tickOpts.userCallback
+ ]);
return formatter ? formatter(label, index, ticks) : label;
},
@@ -13236,13 +14611,9 @@ var scale_time = core_scale.extend({
*/
getPixelForOffset: function(time) {
var me = this;
- var isReverse = me.options.ticks.reverse;
- var size = me._horizontal ? me.width : me.height;
- var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top;
+ var offsets = me._offsets;
var pos = interpolate$1(me._table, 'time', time, 'pos');
- var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end);
-
- return isReverse ? start - offset : start + offset;
+ return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);
},
getPixelForValue: function(value, index, datasetIndex) {
@@ -13271,9 +14642,8 @@ var scale_time = core_scale.extend({
getValueForPixel: function(pixel) {
var me = this;
- var size = me._horizontal ? me.width : me.height;
- var start = me._horizontal ? me.left : me.top;
- var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end;
+ var offsets = me._offsets;
+ var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;
var time = interpolate$1(me._table, 'pos', pos, 'time');
// DEPRECATION, we should return time directly
@@ -13281,19 +14651,29 @@ var scale_time = core_scale.extend({
},
/**
- * Crude approximation of what the label width might be
* @private
*/
- getLabelWidth: function(label) {
+ _getLabelSize: function(label) {
var me = this;
var ticksOpts = me.options.ticks;
var tickLabelWidth = me.ctx.measureText(label).width;
- var angle = helpers$1.toRadians(ticksOpts.maxRotation);
+ var angle = helpers$1.toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);
var cosRotation = Math.cos(angle);
var sinRotation = Math.sin(angle);
- var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize);
+ var tickFontSize = valueOrDefault$d(ticksOpts.fontSize, core_defaults.global.defaultFontSize);
- return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);
+ return {
+ w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),
+ h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)
+ };
+ },
+
+ /**
+ * Crude approximation of what the label width might be
+ * @private
+ */
+ getLabelWidth: function(label) {
+ return this._getLabelSize(label).w;
},
/**
@@ -13301,13 +14681,18 @@ var scale_time = core_scale.extend({
*/
getLabelCapacity: function(exampleTime) {
var me = this;
+ var timeOpts = me.options.time;
+ var displayFormats = timeOpts.displayFormats;
// pick the longest format (milliseconds) for guestimation
- var format = me.options.time.displayFormats.millisecond;
- var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format);
- var tickLabelWidth = me.getLabelWidth(exampleLabel);
- var innerWidth = me.isHorizontal() ? me.width : me.height;
- var capacity = Math.floor(innerWidth / tickLabelWidth);
+ var format = displayFormats[timeOpts.unit] || displayFormats.millisecond;
+ var exampleLabel = me.tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);
+ var size = me._getLabelSize(exampleLabel);
+ var capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h);
+
+ if (me.options.offset) {
+ capacity--;
+ }
return capacity > 0 ? capacity : 1;
}
@@ -13327,7 +14712,7 @@ var scales = {
var moment = createCommonjsModule(function (module, exports) {
(function (global, factory) {
- module.exports = factory();
+ module.exports = factory() ;
}(commonjsGlobal, (function () {
var hookCallback;
@@ -17963,7 +19348,7 @@ core_adapters._date.override(typeof moment === 'function' ? {
},
diff: function(max, min, unit) {
- return moment.duration(moment(max).diff(moment(min))).as(unit);
+ return moment(max).diff(moment(min), unit);
},
startOf: function(time, unit, weekday) {
@@ -18018,6 +19403,12 @@ var mappers = {
var x = boundary ? boundary.x : null;
var y = boundary ? boundary.y : null;
+ if (helpers$1.isArray(boundary)) {
+ return function(point, i) {
+ return boundary[i];
+ };
+ }
+
return function(point) {
return {
x: x === null ? point.x : x,
@@ -18077,7 +19468,7 @@ function decodeFill(el, index, count) {
}
}
-function computeBoundary(source) {
+function computeLinearBoundary(source) {
var model = source.el._model || {};
var scale = source.el._scale || {};
var fill = source.fill;
@@ -18098,8 +19489,6 @@ function computeBoundary(source) {
target = model.scaleTop === undefined ? scale.top : model.scaleTop;
} else if (model.scaleZero !== undefined) {
target = model.scaleZero;
- } else if (scale.getBasePosition) {
- target = scale.getBasePosition();
} else if (scale.getBasePixel) {
target = scale.getBasePixel();
}
@@ -18121,6 +19510,44 @@ function computeBoundary(source) {
return null;
}
+function computeCircularBoundary(source) {
+ var scale = source.el._scale;
+ var options = scale.options;
+ var length = scale.chart.data.labels.length;
+ var fill = source.fill;
+ var target = [];
+ var start, end, center, i, point;
+
+ if (!length) {
+ return null;
+ }
+
+ start = options.ticks.reverse ? scale.max : scale.min;
+ end = options.ticks.reverse ? scale.min : scale.max;
+ center = scale.getPointPositionForValue(0, start);
+ for (i = 0; i < length; ++i) {
+ point = fill === 'start' || fill === 'end'
+ ? scale.getPointPositionForValue(i, fill === 'start' ? start : end)
+ : scale.getBasePosition(i);
+ if (options.gridLines.circular) {
+ point.cx = center.x;
+ point.cy = center.y;
+ point.angle = scale.getIndexAngle(i) - Math.PI / 2;
+ }
+ target.push(point);
+ }
+ return target;
+}
+
+function computeBoundary(source) {
+ var scale = source.el._scale || {};
+
+ if (scale.getPointPositionForValue) {
+ return computeCircularBoundary(source);
+ }
+ return computeLinearBoundary(source);
+}
+
function resolveTarget(sources, index, propagate) {
var source = sources[index];
var fill = source.fill;
@@ -18172,7 +19599,7 @@ function isDrawable(point) {
}
function drawArea(ctx, curve0, curve1, len0, len1) {
- var i;
+ var i, cx, cy, r;
if (!len0 || !len1) {
return;
@@ -18184,6 +19611,16 @@ function drawArea(ctx, curve0, curve1, len0, len1) {
helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);
}
+ if (curve1[0].angle !== undefined) {
+ cx = curve1[0].cx;
+ cy = curve1[0].cy;
+ r = Math.sqrt(Math.pow(curve1[0].x - cx, 2) + Math.pow(curve1[0].y - cy, 2));
+ for (i = len1 - 1; i > 0; --i) {
+ ctx.arc(cx, cy, r, curve1[i].angle, curve1[i - 1].angle, true);
+ }
+ return;
+ }
+
// joining the two area curves
ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);
@@ -18200,17 +19637,22 @@ function doFill(ctx, points, mapper, view, color, loop) {
var curve1 = [];
var len0 = 0;
var len1 = 0;
- var i, ilen, index, p0, p1, d0, d1;
+ var i, ilen, index, p0, p1, d0, d1, loopOffset;
ctx.beginPath();
- for (i = 0, ilen = (count + !!loop); i < ilen; ++i) {
+ for (i = 0, ilen = count; i < ilen; ++i) {
index = i % count;
p0 = points[index]._view;
p1 = mapper(p0, index, view);
d0 = isDrawable(p0);
d1 = isDrawable(p1);
+ if (loop && loopOffset === undefined && d0) {
+ loopOffset = i + 1;
+ ilen = count + loopOffset;
+ }
+
if (d0 && d1) {
len0 = curve0.push(p0);
len1 = curve1.push(p1);
@@ -18277,34 +19719,42 @@ var plugin_filler = {
}
},
- beforeDatasetDraw: function(chart, args) {
- var meta = args.meta.$filler;
- if (!meta) {
- return;
- }
-
+ beforeDatasetsDraw: function(chart) {
+ var metasets = chart._getSortedVisibleDatasetMetas();
var ctx = chart.ctx;
- var el = meta.el;
- var view = el._view;
- var points = el._children || [];
- var mapper = meta.mapper;
- var color = view.backgroundColor || core_defaults.global.defaultColor;
+ var meta, i, el, view, points, mapper, color;
+
+ for (i = metasets.length - 1; i >= 0; --i) {
+ meta = metasets[i].$filler;
+
+ if (!meta || !meta.visible) {
+ continue;
+ }
- if (mapper && color && points.length) {
- helpers$1.canvas.clipArea(ctx, chart.chartArea);
- doFill(ctx, points, mapper, view, color, el._loop);
- helpers$1.canvas.unclipArea(ctx);
+ el = meta.el;
+ view = el._view;
+ points = el._children || [];
+ mapper = meta.mapper;
+ color = view.backgroundColor || core_defaults.global.defaultColor;
+
+ if (mapper && color && points.length) {
+ helpers$1.canvas.clipArea(ctx, chart.chartArea);
+ doFill(ctx, points, mapper, view, color, el._loop);
+ helpers$1.canvas.unclipArea(ctx);
+ }
}
}
};
+var getRtlHelper$1 = helpers$1.rtl.getRtlAdapter;
var noop$1 = helpers$1.noop;
-var valueOrDefault$d = helpers$1.valueOrDefault;
+var valueOrDefault$e = helpers$1.valueOrDefault;
core_defaults._set('global', {
legend: {
display: true,
position: 'top',
+ align: 'center',
fullWidth: true,
reverse: false,
weight: 1000,
@@ -18340,40 +19790,51 @@ core_defaults._set('global', {
// lineJoin :
// lineWidth :
generateLabels: function(chart) {
- var data = chart.data;
- return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
+ var datasets = chart.data.datasets;
+ var options = chart.options.legend || {};
+ var usePointStyle = options.labels && options.labels.usePointStyle;
+
+ return chart._getSortedDatasetMetas().map(function(meta) {
+ var style = meta.controller.getStyle(usePointStyle ? 0 : undefined);
+
return {
- text: dataset.label,
- fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),
- hidden: !chart.isDatasetVisible(i),
- lineCap: dataset.borderCapStyle,
- lineDash: dataset.borderDash,
- lineDashOffset: dataset.borderDashOffset,
- lineJoin: dataset.borderJoinStyle,
- lineWidth: dataset.borderWidth,
- strokeStyle: dataset.borderColor,
- pointStyle: dataset.pointStyle,
+ text: datasets[meta.index].label,
+ fillStyle: style.backgroundColor,
+ hidden: !chart.isDatasetVisible(meta.index),
+ lineCap: style.borderCapStyle,
+ lineDash: style.borderDash,
+ lineDashOffset: style.borderDashOffset,
+ lineJoin: style.borderJoinStyle,
+ lineWidth: style.borderWidth,
+ strokeStyle: style.borderColor,
+ pointStyle: style.pointStyle,
+ rotation: style.rotation,
// Below is extra data used for toggling the datasets
- datasetIndex: i
+ datasetIndex: meta.index
};
- }, this) : [];
+ }, this);
}
}
},
legendCallback: function(chart) {
- var text = [];
- text.push('<ul class="' + chart.id + '-legend">');
- for (var i = 0; i < chart.data.datasets.length; i++) {
- text.push('<li><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"></span>');
- if (chart.data.datasets[i].label) {
- text.push(chart.data.datasets[i].label);
+ var list = document.createElement('ul');
+ var datasets = chart.data.datasets;
+ var i, ilen, listItem, listItemSpan;
+
+ list.setAttribute('class', chart.id + '-legend');
+
+ for (i = 0, ilen = datasets.length; i < ilen; i++) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[i].backgroundColor;
+ if (datasets[i].label) {
+ listItem.appendChild(document.createTextNode(datasets[i].label));
}
- text.push('</li>');
}
- text.push('</ul>');
- return text.join('');
+
+ return list.outerHTML;
}
});
@@ -18395,18 +19856,19 @@ function getBoxWidth(labelOpts, fontSize) {
var Legend = core_element.extend({
initialize: function(config) {
- helpers$1.extend(this, config);
+ var me = this;
+ helpers$1.extend(me, config);
// Contains hit boxes for each dataset (in dataset order)
- this.legendHitBoxes = [];
+ me.legendHitBoxes = [];
/**
* @private
*/
- this._hoveredItem = null;
+ me._hoveredItem = null;
// Are we in doughnut mode which has a different data type
- this.doughnutMode = false;
+ me.doughnutMode = false;
},
// These methods are ordered by lifecycle. Utilities then follow.
@@ -18529,79 +19991,82 @@ var Legend = core_element.extend({
}
// Increase sizes here
- if (display) {
- ctx.font = labelFont.string;
+ if (!display) {
+ me.width = minSize.width = me.height = minSize.height = 0;
+ return;
+ }
+ ctx.font = labelFont.string;
- if (isHorizontal) {
- // Labels
+ if (isHorizontal) {
+ // Labels
- // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
- var lineWidths = me.lineWidths = [0];
- var totalHeight = 0;
+ // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
+ var lineWidths = me.lineWidths = [0];
+ var totalHeight = 0;
- ctx.textAlign = 'left';
- ctx.textBaseline = 'top';
+ ctx.textAlign = 'left';
+ ctx.textBaseline = 'middle';
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
- if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) {
- totalHeight += fontSize + labelOpts.padding;
- lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding;
- }
+ if (i === 0 || lineWidths[lineWidths.length - 1] + width + 2 * labelOpts.padding > minSize.width) {
+ totalHeight += fontSize + labelOpts.padding;
+ lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;
+ }
- // Store the hitbox width and height here. Final position will be updated in `draw`
- hitboxes[i] = {
- left: 0,
- top: 0,
- width: width,
- height: fontSize
- };
+ // Store the hitbox width and height here. Final position will be updated in `draw`
+ hitboxes[i] = {
+ left: 0,
+ top: 0,
+ width: width,
+ height: fontSize
+ };
- lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
- });
+ lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
+ });
- minSize.height += totalHeight;
+ minSize.height += totalHeight;
- } else {
- var vPadding = labelOpts.padding;
- var columnWidths = me.columnWidths = [];
- var totalWidth = labelOpts.padding;
- var currentColWidth = 0;
- var currentColHeight = 0;
- var itemHeight = fontSize + vPadding;
-
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
-
- // If too tall, go to new column
- if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) {
- totalWidth += currentColWidth + labelOpts.padding;
- columnWidths.push(currentColWidth); // previous column width
-
- currentColWidth = 0;
- currentColHeight = 0;
- }
+ } else {
+ var vPadding = labelOpts.padding;
+ var columnWidths = me.columnWidths = [];
+ var columnHeights = me.columnHeights = [];
+ var totalWidth = labelOpts.padding;
+ var currentColWidth = 0;
+ var currentColHeight = 0;
- // Get max width
- currentColWidth = Math.max(currentColWidth, itemWidth);
- currentColHeight += itemHeight;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
+
+ // If too tall, go to new column
+ if (i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize.height) {
+ totalWidth += currentColWidth + labelOpts.padding;
+ columnWidths.push(currentColWidth); // previous column width
+ columnHeights.push(currentColHeight);
+ currentColWidth = 0;
+ currentColHeight = 0;
+ }
- // Store the hitbox width and height here. Final position will be updated in `draw`
- hitboxes[i] = {
- left: 0,
- top: 0,
- width: itemWidth,
- height: fontSize
- };
- });
+ // Get max width
+ currentColWidth = Math.max(currentColWidth, itemWidth);
+ currentColHeight += fontSize + vPadding;
- totalWidth += currentColWidth;
- columnWidths.push(currentColWidth);
- minSize.width += totalWidth;
- }
+ // Store the hitbox width and height here. Final position will be updated in `draw`
+ hitboxes[i] = {
+ left: 0,
+ top: 0,
+ width: itemWidth,
+ height: fontSize
+ };
+ });
+
+ totalWidth += currentColWidth;
+ columnWidths.push(currentColWidth);
+ columnHeights.push(currentColHeight);
+ minSize.width += totalWidth;
}
me.width = minSize.width;
@@ -18622,139 +20087,163 @@ var Legend = core_element.extend({
var globalDefaults = core_defaults.global;
var defaultColor = globalDefaults.defaultColor;
var lineDefault = globalDefaults.elements.line;
+ var legendHeight = me.height;
+ var columnHeights = me.columnHeights;
var legendWidth = me.width;
var lineWidths = me.lineWidths;
- if (opts.display) {
- var ctx = me.ctx;
- var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor);
- var labelFont = helpers$1.options._parseFont(labelOpts);
- var fontSize = labelFont.size;
- var cursor;
+ if (!opts.display) {
+ return;
+ }
- // Canvas setup
- ctx.textAlign = 'left';
- ctx.textBaseline = 'middle';
- ctx.lineWidth = 0.5;
- ctx.strokeStyle = fontColor; // for strikethrough effect
- ctx.fillStyle = fontColor; // render in correct colour
- ctx.font = labelFont.string;
+ var rtlHelper = getRtlHelper$1(opts.rtl, me.left, me.minSize.width);
+ var ctx = me.ctx;
+ var fontColor = valueOrDefault$e(labelOpts.fontColor, globalDefaults.defaultFontColor);
+ var labelFont = helpers$1.options._parseFont(labelOpts);
+ var fontSize = labelFont.size;
+ var cursor;
+
+ // Canvas setup
+ ctx.textAlign = rtlHelper.textAlign('left');
+ ctx.textBaseline = 'middle';
+ ctx.lineWidth = 0.5;
+ ctx.strokeStyle = fontColor; // for strikethrough effect
+ ctx.fillStyle = fontColor; // render in correct colour
+ ctx.font = labelFont.string;
+
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var hitboxes = me.legendHitBoxes;
+
+ // current position
+ var drawLegendBox = function(x, y, legendItem) {
+ if (isNaN(boxWidth) || boxWidth <= 0) {
+ return;
+ }
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var hitboxes = me.legendHitBoxes;
+ // Set the ctx for the box
+ ctx.save();
- // current position
- var drawLegendBox = function(x, y, legendItem) {
- if (isNaN(boxWidth) || boxWidth <= 0) {
- return;
+ var lineWidth = valueOrDefault$e(legendItem.lineWidth, lineDefault.borderWidth);
+ ctx.fillStyle = valueOrDefault$e(legendItem.fillStyle, defaultColor);
+ ctx.lineCap = valueOrDefault$e(legendItem.lineCap, lineDefault.borderCapStyle);
+ ctx.lineDashOffset = valueOrDefault$e(legendItem.lineDashOffset, lineDefault.borderDashOffset);
+ ctx.lineJoin = valueOrDefault$e(legendItem.lineJoin, lineDefault.borderJoinStyle);
+ ctx.lineWidth = lineWidth;
+ ctx.strokeStyle = valueOrDefault$e(legendItem.strokeStyle, defaultColor);
+
+ if (ctx.setLineDash) {
+ // IE 9 and 10 do not support line dash
+ ctx.setLineDash(valueOrDefault$e(legendItem.lineDash, lineDefault.borderDash));
+ }
+
+ if (labelOpts && labelOpts.usePointStyle) {
+ // Recalculate x and y for drawPoint() because its expecting
+ // x and y to be center of figure (instead of top left)
+ var radius = boxWidth * Math.SQRT2 / 2;
+ var centerX = rtlHelper.xPlus(x, boxWidth / 2);
+ var centerY = y + fontSize / 2;
+
+ // Draw pointStyle as legend symbol
+ helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);
+ } else {
+ // Draw box as legend symbol
+ ctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
+ if (lineWidth !== 0) {
+ ctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
}
+ }
- // Set the ctx for the box
- ctx.save();
+ ctx.restore();
+ };
- var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth);
- ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor);
- ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle);
- ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset);
- ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle);
- ctx.lineWidth = lineWidth;
- ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor);
+ var fillText = function(x, y, legendItem, textWidth) {
+ var halfFontSize = fontSize / 2;
+ var xLeft = rtlHelper.xPlus(x, boxWidth + halfFontSize);
+ var yMiddle = y + halfFontSize;
- if (ctx.setLineDash) {
- // IE 9 and 10 do not support line dash
- ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash));
- }
+ ctx.fillText(legendItem.text, xLeft, yMiddle);
- if (opts.labels && opts.labels.usePointStyle) {
- // Recalculate x and y for drawPoint() because its expecting
- // x and y to be center of figure (instead of top left)
- var radius = boxWidth * Math.SQRT2 / 2;
- var centerX = x + boxWidth / 2;
- var centerY = y + fontSize / 2;
+ if (legendItem.hidden) {
+ // Strikethrough the text if hidden
+ ctx.beginPath();
+ ctx.lineWidth = 2;
+ ctx.moveTo(xLeft, yMiddle);
+ ctx.lineTo(rtlHelper.xPlus(xLeft, textWidth), yMiddle);
+ ctx.stroke();
+ }
+ };
- // Draw pointStyle as legend symbol
- helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
- } else {
- // Draw box as legend symbol
- if (lineWidth !== 0) {
- ctx.strokeRect(x, y, boxWidth, fontSize);
- }
- ctx.fillRect(x, y, boxWidth, fontSize);
- }
+ var alignmentOffset = function(dimension, blockSize) {
+ switch (opts.align) {
+ case 'start':
+ return labelOpts.padding;
+ case 'end':
+ return dimension - blockSize;
+ default: // center
+ return (dimension - blockSize + labelOpts.padding) / 2;
+ }
+ };
- ctx.restore();
+ // Horizontal
+ var isHorizontal = me.isHorizontal();
+ if (isHorizontal) {
+ cursor = {
+ x: me.left + alignmentOffset(legendWidth, lineWidths[0]),
+ y: me.top + labelOpts.padding,
+ line: 0
};
- var fillText = function(x, y, legendItem, textWidth) {
- var halfFontSize = fontSize / 2;
- var xLeft = boxWidth + halfFontSize + x;
- var yMiddle = y + halfFontSize;
-
- ctx.fillText(legendItem.text, xLeft, yMiddle);
-
- if (legendItem.hidden) {
- // Strikethrough the text if hidden
- ctx.beginPath();
- ctx.lineWidth = 2;
- ctx.moveTo(xLeft, yMiddle);
- ctx.lineTo(xLeft + textWidth, yMiddle);
- ctx.stroke();
- }
+ } else {
+ cursor = {
+ x: me.left + labelOpts.padding,
+ y: me.top + alignmentOffset(legendHeight, columnHeights[0]),
+ line: 0
};
+ }
- // Horizontal
- var isHorizontal = me.isHorizontal();
- if (isHorizontal) {
- cursor = {
- x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding,
- y: me.top + labelOpts.padding,
- line: 0
- };
- } else {
- cursor = {
- x: me.left + labelOpts.padding,
- y: me.top + labelOpts.padding,
- line: 0
- };
- }
+ helpers$1.rtl.overrideTextDirection(me.ctx, opts.textDirection);
- var itemHeight = fontSize + labelOpts.padding;
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var textWidth = ctx.measureText(legendItem.text).width;
- var width = boxWidth + (fontSize / 2) + textWidth;
- var x = cursor.x;
- var y = cursor.y;
-
- // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)
- // instead of me.right and me.bottom because me.width and me.height
- // may have been changed since me.minSize was calculated
- if (isHorizontal) {
- if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {
- y = cursor.y += itemHeight;
- cursor.line++;
- x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding;
- }
- } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {
- x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;
- y = cursor.y = me.top + labelOpts.padding;
+ var itemHeight = fontSize + labelOpts.padding;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var textWidth = ctx.measureText(legendItem.text).width;
+ var width = boxWidth + (fontSize / 2) + textWidth;
+ var x = cursor.x;
+ var y = cursor.y;
+
+ rtlHelper.setWidth(me.minSize.width);
+
+ // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)
+ // instead of me.right and me.bottom because me.width and me.height
+ // may have been changed since me.minSize was calculated
+ if (isHorizontal) {
+ if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {
+ y = cursor.y += itemHeight;
cursor.line++;
+ x = cursor.x = me.left + alignmentOffset(legendWidth, lineWidths[cursor.line]);
}
+ } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {
+ x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;
+ cursor.line++;
+ y = cursor.y = me.top + alignmentOffset(legendHeight, columnHeights[cursor.line]);
+ }
- drawLegendBox(x, y, legendItem);
+ var realX = rtlHelper.x(x);
- hitboxes[i].left = x;
- hitboxes[i].top = y;
+ drawLegendBox(realX, y, legendItem);
- // Fill the actual label
- fillText(x, y, legendItem, textWidth);
+ hitboxes[i].left = rtlHelper.leftForLtr(realX, hitboxes[i].width);
+ hitboxes[i].top = y;
- if (isHorizontal) {
- cursor.x += width + labelOpts.padding;
- } else {
- cursor.y += itemHeight;
- }
+ // Fill the actual label
+ fillText(realX, y, legendItem, textWidth);
- });
- }
+ if (isHorizontal) {
+ cursor.x += width + labelOpts.padding;
+ } else {
+ cursor.y += itemHeight;
+ }
+ });
+
+ helpers$1.rtl.restoreTextDirection(me.ctx, opts.textDirection);
},
/**
@@ -18992,23 +20481,20 @@ var Title = core_element.extend({
fit: function() {
var me = this;
var opts = me.options;
- var display = opts.display;
- var minSize = me.minSize;
- var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;
- var fontOpts = helpers$1.options._parseFont(opts);
- var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0;
+ var minSize = me.minSize = {};
+ var isHorizontal = me.isHorizontal();
+ var lineCount, textSize;
- if (me.isHorizontal()) {
- minSize.width = me.maxWidth; // fill all the width
- minSize.height = textSize;
- } else {
- minSize.width = textSize;
- minSize.height = me.maxHeight; // fill all the height
+ if (!opts.display) {
+ me.width = minSize.width = me.height = minSize.height = 0;
+ return;
}
- me.width = minSize.width;
- me.height = minSize.height;
+ lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;
+ textSize = lineCount * helpers$1.options._parseFont(opts).lineHeight + opts.padding * 2;
+ me.width = minSize.width = isHorizontal ? me.maxWidth : textSize;
+ me.height = minSize.height = isHorizontal ? textSize : me.maxHeight;
},
afterFit: noop$2,
@@ -19024,51 +20510,53 @@ var Title = core_element.extend({
var ctx = me.ctx;
var opts = me.options;
- if (opts.display) {
- var fontOpts = helpers$1.options._parseFont(opts);
- var lineHeight = fontOpts.lineHeight;
- var offset = lineHeight / 2 + opts.padding;
- var rotation = 0;
- var top = me.top;
- var left = me.left;
- var bottom = me.bottom;
- var right = me.right;
- var maxWidth, titleX, titleY;
-
- ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour
- ctx.font = fontOpts.string;
-
- // Horizontal
- if (me.isHorizontal()) {
- titleX = left + ((right - left) / 2); // midpoint of the width
- titleY = top + offset;
- maxWidth = right - left;
- } else {
- titleX = opts.position === 'left' ? left + offset : right - offset;
- titleY = top + ((bottom - top) / 2);
- maxWidth = bottom - top;
- rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);
- }
+ if (!opts.display) {
+ return;
+ }
- ctx.save();
- ctx.translate(titleX, titleY);
- ctx.rotate(rotation);
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
+ var fontOpts = helpers$1.options._parseFont(opts);
+ var lineHeight = fontOpts.lineHeight;
+ var offset = lineHeight / 2 + opts.padding;
+ var rotation = 0;
+ var top = me.top;
+ var left = me.left;
+ var bottom = me.bottom;
+ var right = me.right;
+ var maxWidth, titleX, titleY;
+
+ ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour
+ ctx.font = fontOpts.string;
+
+ // Horizontal
+ if (me.isHorizontal()) {
+ titleX = left + ((right - left) / 2); // midpoint of the width
+ titleY = top + offset;
+ maxWidth = right - left;
+ } else {
+ titleX = opts.position === 'left' ? left + offset : right - offset;
+ titleY = top + ((bottom - top) / 2);
+ maxWidth = bottom - top;
+ rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);
+ }
- var text = opts.text;
- if (helpers$1.isArray(text)) {
- var y = 0;
- for (var i = 0; i < text.length; ++i) {
- ctx.fillText(text[i], 0, y, maxWidth);
- y += lineHeight;
- }
- } else {
- ctx.fillText(text, 0, 0, maxWidth);
+ ctx.save();
+ ctx.translate(titleX, titleY);
+ ctx.rotate(rotation);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+
+ var text = opts.text;
+ if (helpers$1.isArray(text)) {
+ var y = 0;
+ for (var i = 0; i < text.length; ++i) {
+ ctx.fillText(text[i], 0, y, maxWidth);
+ y += lineHeight;
}
-
- ctx.restore();
+ } else {
+ ctx.fillText(text, 0, 0, maxWidth);
}
+
+ ctx.restore();
}
});
@@ -19140,7 +20628,7 @@ plugins.title = title;
core_controller.helpers = helpers$1;
// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!
-core_helpers(core_controller);
+core_helpers();
core_controller._adapters = core_adapters;
core_controller.Animation = core_animation;
diff --git a/borrowed/chartjs/Chart.bundle.min.js b/borrowed/chartjs/Chart.bundle.min.js
old mode 100644
new mode 100755
index 0bf9ea9e4..7134d267b
--- a/borrowed/chartjs/Chart.bundle.min.js
+++ b/borrowed/chartjs/Chart.bundle.min.js
@@ -1,7 +1,7 @@
/*!
- * Chart.js v2.8.0
+ * Chart.js v2.9.4
* https://www.chartjs.org
- * (c) 2019 Chart.js Contributors
+ * (c) 2020 Chart.js Contributors
* Released under the MIT License
*/
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Chart=e()}(this,function(){"use strict";var t={rgb2hsl:e,rgb2hsv:i,rgb2hwb:n,rgb2cmyk:a,rgb2keyword:o,rgb2xyz:s,rgb2lab:l,rgb2lch:function(t){return v(l(t))},hsl2rgb:u,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return n(u(t))},hsl2cmyk:function(t){return a(u(t))},hsl2keyword:function(t){return o(u(t))},hsv2rgb:d,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,r=t[2]/100;return e=a*r,[n,100*(e=(e/=(i=(2-a)*r)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return n(d(t))},hsv2cmyk:function(t){return a(d(t))},hsv2keyword:function(t){return o(d(t))},hwb2rgb:h,hwb2hsl:function(t){return e(h(t))},hwb2hsv:function(t){return i(h(t))},hwb2cmyk:function(t){return a(h(t))},hwb2keyword:function(t){return o(h(t))},cmyk2rgb:c,cmyk2hsl:function(t){return e(c(t))},cmyk2hsv:function(t){return i(c(t))},cmyk2hwb:function(t){return n(c(t))},cmyk2keyword:function(t){return o(c(t))},keyword2rgb:_,keyword2hsl:function(t){return e(_(t))},keyword2hsv:function(t){return i(_(t))},keyword2hwb:function(t){return n(_(t))},keyword2cmyk:function(t){return a(_(t))},keyword2lab:function(t){return l(_(t))},keyword2xyz:function(t){return s(_(t))},xyz2rgb:f,xyz2lab:m,xyz2lch:function(t){return v(m(t))},lab2xyz:p,lab2rgb:y,lab2lch:v,lch2lab:x,lch2xyz:function(t){return p(x(t))},lch2rgb:function(t){return y(x(t))}};function e(t){var e,i,n=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(n,a,r),s=Math.max(n,a,r),l=s-o;return s==o?e=0:n==s?e=(a-r)/l:a==s?e=2+(r-n)/l:r==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(o+s)/2,[e,100*(s==o?0:i<=.5?l/(s+o):l/(2-s-o)),100*i]}function i(t){var e,i,n=t[0],a=t[1],r=t[2],o=Math.min(n,a,r),s=Math.max(n,a,r),l=s-o;return i=0==s?0:l/s*1e3/10,s==o?e=0:n==s?e=(a-r)/l:a==s?e=2+(r-n)/l:r==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function n(t){var i=t[0],n=t[1],a=t[2];return[e(t)[0],100*(1/255*Math.min(i,Math.min(n,a))),100*(a=1-1/255*Math.max(i,Math.max(n,a)))]}function a(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function o(t){return w[JSON.stringify(t)]}function s(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function l(t){var e=s(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function u(t){var e,i,n,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[r=255*l,r,r];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(n=o+1/3*-(u-1))<0&&n++,n>1&&n--,r=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[u]=255*r;return a}function d(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*n*(1-i),s=255*n*(1-i*r),l=255*n*(1-i*(1-r));n*=255;switch(a){case 0:return[n,l,o];case 1:return[s,n,o];case 2:return[o,n,l];case 3:return[o,s,n];case 4:return[l,o,n];case 5:return[n,o,s]}}function h(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function c(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function f(t){var e,i,n,a=t[0]/100,r=t[1]/100,o=t[2]/100;return i=-.9689*a+1.8758*r+.0415*o,n=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function m(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function p(t){var e,i,n,a,r=t[0],o=t[1],s=t[2];return r<=8?a=(i=100*r/903.3)/100*7.787+16/116:(i=100*Math.pow((r+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function v(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function y(t){return f(p(t))}function x(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function _(t){return k[t]}var k={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},w={};for(var M in k)w[JSON.stringify(k[M])]=M;var S=function(){return new O};for(var D in t){S[D+"Raw"]=function(e){return function(i){return"number"==typeof i&&(i=Array.prototype.slice.call(arguments)),t[e](i)}}(D);var C=/(\w+)2(\w+)/.exec(D),P=C[1],T=C[2];(S[P]=S[P]||{})[T]=S[D]=function(e){return function(i){"number"==typeof i&&(i=Array.prototype.slice.call(arguments));var n=t[e](i);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(D)}var O=function(){this.convs={}};O.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},O.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},O.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,n=this.convs[i];e=S[i][t](n),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){O.prototype[t]=function(e){return this.routeSpace(t,arguments)}});var I=S,A={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},F={getRgba:R,getHsla:L,getRgb:function(t){var e=R(t);return e&&e.slice(0,3)},getHsl:function(t){var e=L(t);return e&&e.slice(0,3)},getHwb:W,getAlpha:function(t){var e=R(t);if(e)return e[3];if(e=L(t))return e[3];if(e=W(t))return e[3]},hexString:function(t,e){var e=void 0!==e&&3===t.length?e:t[3];return"#"+H(t[0])+H(t[1])+H(t[2])+(e>=0&&e<1?H(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return Y(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:Y,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return N(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"},percentaString:N,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return z(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:z,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return E[t.slice(0,3)]}};function R(t){if(t){var e=[0,0,0],i=1,n=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(n){a=(n=n[1])[3];for(var r=0;r<e.length;r++)e[r]=parseInt(n[r]+n[r],16);a&&(i=Math.round(parseInt(a+a,16)/255*100)/100)}else if(n=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=n[2],n=n[1];for(r=0;r<e.length;r++)e[r]=parseInt(n.slice(2*r,2*r+2),16);a&&(i=Math.round(parseInt(a,16)/255*100)/100)}else if(n=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(n[r+1]);i=parseFloat(n[4])}else if(n=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(n[r+1]));i=parseFloat(n[4])}else if(n=t.match(/(\w+)/)){if("transparent"==n[1])return[0,0,0,0];if(!(e=A[n[1]]))return}for(r=0;r<e.length;r++)e[r]=V(e[r],0,255);return i=i||0==i?V(i,0,1):1,e[3]=i,e}}function L(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[V(parseInt(e[1]),0,360),V(parseFloat(e[2]),0,100),V(parseFloat(e[3]),0,100),V(isNaN(i)?1:i,0,1)]}}}function W(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[V(parseInt(e[1]),0,360),V(parseFloat(e[2]),0,100),V(parseFloat(e[3]),0,100),V(isNaN(i)?1:i,0,1)]}}}function Y(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function N(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function z(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function V(t,e,i){return Math.min(Math.max(e,t),i)}function H(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var E={};for(var B in A)E[A[B]]=B;var j=function(t){return t instanceof j?t:this instanceof j?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=F.getRgba(t))?this.setValues("rgb",e):(e=F.getHsla(t))?this.setValues("hsl",e):(e=F.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new j(t);var e};j.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return F.hexString(this.values.rgb)},rgbString:function(){return F.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return F.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return F.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return F.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return F.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return F.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return F.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var n=t[i]/255;e[i]=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=t,n=void 0===e?.5:e,a=2*n-1,r=this.alpha()-i.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*i.red(),o*this.green()+s*i.green(),o*this.blue()+s*i.blue()).alpha(this.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new j,n=this.values,a=i.values;for(var r in n)n.hasOwnProperty(r)&&(t=n[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return i}},j.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},j.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},j.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n<t.length;n++)i[t.charAt(n)]=e[t][n];return 1!==e.alpha&&(i.a=e.alpha),i},j.prototype.setValues=function(t,e){var i,n,a=this.values,r=this.spaces,o=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)a[t][i]=e[t.charAt(i)];s=e.a}else if(void 0!==e[r[t][0]]){var l=r[t];for(i=0;i<t.length;i++)a[t][i]=e[l[i]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(i=0;i<t.length;i++)n=Math.max(0,Math.min(o[t][i],a[t][i])),a[t][i]=Math.round(n);for(var u in r)u!==t&&(a[u]=I[t][u](a[t]));return!0},j.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},j.prototype.setChannel=function(t,e,i){var n=this.values[t];return void 0===i?n[e]:i===n[e]?this:(n[e]=i,this.setValues(t,n),this)},"undefined"!=typeof window&&(window.Color=j);var U,G=j,q={noop:function(){},uid:(U=0,function(){return U++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,i){return q.valueOrDefault(q.isArray(t)?t[e]:t,i)},callback:function(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)},each:function(t,e,i,n){var a,r,o;if(q.isArray(t))if(r=t.length,n)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(q.isObject(t))for(r=(o=Object.keys(t)).length,a=0;a<r;a++)e.call(i,t[o[a]],o[a])},arrayEquals:function(t,e){var i,n,a,r;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(a=t[i],r=e[i],a instanceof Array&&r instanceof Array){if(!q.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},clone:function(t){if(q.isArray(t))return t.map(q.clone);if(q.isObject(t)){for(var e={},i=Object.keys(t),n=i.length,a=0;a<n;++a)e[i[a]]=q.clone(t[i[a]]);return e}return t},_merger:function(t,e,i,n){var a=e[t],r=i[t];q.isObject(a)&&q.isObject(r)?q.merge(a,r,n):e[t]=q.clone(r)},_mergerIf:function(t,e,i){var n=e[t],a=i[t];q.isObject(n)&&q.isObject(a)?q.mergeIf(n,a):e.hasOwnProperty(t)||(e[t]=q.clone(a))},merge:function(t,e,i){var n,a,r,o,s,l=q.isArray(e)?e:[e],u=l.length;if(!q.isObject(t))return t;for(n=(i=i||{}).merger||q._merger,a=0;a<u;++a)if(e=l[a],q.isObject(e))for(s=0,o=(r=Object.keys(e)).length;s<o;++s)n(r[s],t,e,i);return t},mergeIf:function(t,e){return q.merge(t,e,{merger:q._mergerIf})},extend:function(t){for(var e=function(e,i){t[i]=e},i=1,n=arguments.length;i<n;++i)q.each(arguments[i],e);return t},inherits:function(t){var e=this,i=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},n=function(){this.constructor=i};return n.prototype=e.prototype,i.prototype=new n,i.extend=q.inherits,t&&q.extend(i.prototype,t),i.__super__=e.prototype,i}},Z=q;q.callCallback=q.callback,q.indexOf=function(t,e,i){return Array.prototype.indexOf.call(t,e,i)},q.getValueOrDefault=q.valueOrDefault,q.getValueAtIndexOrDefault=q.valueAtIndexOrDefault;var $={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-$.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*$.easeInBounce(2*t):.5*$.easeOutBounce(2*t-1)+.5}},X={effects:$};Z.easingEffects=$;var K=Math.PI,J=K/180,Q=2*K,tt=K/2,et=K/4,it=2*K/3,nt={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,r){if(r){var o=Math.min(r,a/2,n/2),s=e+o,l=i+o,u=e+n-o,d=i+a-o;t.moveTo(e,l),s<u&&l<d?(t.arc(s,l,o,-K,-tt),t.arc(u,l,o,-tt,0),t.arc(u,d,o,0,tt),t.arc(s,d,o,tt,K)):s<u?(t.moveTo(s,i),t.arc(u,l,o,-tt,tt),t.arc(s,l,o,tt,K+tt)):l<d?(t.arc(s,l,o,-K,0),t.arc(s,d,o,0,K)):t.arc(s,l,o,-K,K),t.closePath(),t.moveTo(e,i)}else t.rect(e,i,n,a)},drawPoint:function(t,e,i,n,a,r){var o,s,l,u,d,h=(r||0)*J;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(i)||i<=0)){switch(t.beginPath(),e){default:t.arc(n,a,i,0,Q),t.closePath();break;case"triangle":t.moveTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=it,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=it,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),t.closePath();break;case"rectRounded":u=i-(d=.516*i),s=Math.cos(h+et)*u,l=Math.sin(h+et)*u,t.arc(n-s,a-l,d,h-K,h-tt),t.arc(n+l,a-s,d,h-tt,h),t.arc(n+s,a+l,d,h,h+tt),t.arc(n-l,a+s,d,h+tt,h+K),t.closePath();break;case"rect":if(!r){u=Math.SQRT1_2*i,t.rect(n-u,a-u,2*u,2*u);break}h+=et;case"rectRot":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+l,a-s),t.lineTo(n+s,a+l),t.lineTo(n-l,a+s),t.closePath();break;case"crossRot":h+=et;case"cross":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"star":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s),h+=et,s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"line":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l);break;case"dash":t.moveTo(n,a),t.lineTo(n+Math.cos(h)*i,a+Math.sin(h)*i)}t.fill(),t.stroke()}}else t.drawImage(e,n-e.width/2,a-e.height/2,e.width,e.height)},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,i,n){var a=i.steppedLine;if(a){if("middle"===a){var r=(e.x+i.x)/2;t.lineTo(r,n?i.y:e.y),t.lineTo(r,n?e.y:i.y)}else"after"===a&&!n||"after"!==a&&n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}else i.tension?t.bezierCurveTo(n?e.controlPointPreviousX:e.controlPointNextX,n?e.controlPointPreviousY:e.controlPointNextY,n?i.controlPointNextX:i.controlPointPreviousX,n?i.controlPointNextY:i.controlPointPreviousY,i.x,i.y):t.lineTo(i.x,i.y)}},at=nt;Z.clear=nt.clear,Z.drawRoundedRectangle=function(t){t.beginPath(),nt.roundedRect.apply(nt,arguments)};var rt={_set:function(t,e){return Z.merge(this[t]||(this[t]={}),e)}};rt._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var ot=rt,st=Z.valueOrDefault;var lt={toLineHeight:function(t,e){var i=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,i,n,a;return Z.isObject(t)?(e=+t.top||0,i=+t.right||0,n=+t.bottom||0,a=+t.left||0):e=i=n=a=+t||0,{top:e,right:i,bottom:n,left:a,height:e+n,width:a+i}},_parseFont:function(t){var e=ot.global,i=st(t.fontSize,e.defaultFontSize),n={family:st(t.fontFamily,e.defaultFontFamily),lineHeight:Z.options.toLineHeight(st(t.lineHeight,e.defaultLineHeight),i),size:i,style:st(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return n.string=function(t){return!t||Z.isNullOrUndef(t.size)||Z.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(n),n},resolve:function(t,e,i){var n,a,r;for(n=0,a=t.length;n<a;++n)if(void 0!==(r=t[n])&&(void 0!==e&&"function"==typeof r&&(r=r(e)),void 0!==i&&Z.isArray(r)&&(r=r[i]),void 0!==r))return r}},ut=Z,dt=X,ht=at,ct=lt;ut.easing=dt,ut.canvas=ht,ut.options=ct;var ft=function(t){ut.extend(this,t),this.initialize.apply(this,arguments)};ut.extend(ft.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=ut.clone(t._model)),t._start={},t},transition:function(t){var e=this,i=e._model,n=e._start,a=e._view;return i&&1!==t?(a||(a=e._view={}),n||(n=e._start={}),function(t,e,i,n){var a,r,o,s,l,u,d,h,c,f=Object.keys(i);for(a=0,r=f.length;a<r;++a)if(u=i[o=f[a]],e.hasOwnProperty(o)||(e[o]=u),(s=e[o])!==u&&"_"!==o[0]){if(t.hasOwnProperty(o)||(t[o]=s),(d=typeof u)==typeof(l=t[o]))if("string"===d){if((h=G(l)).valid&&(c=G(u)).valid){e[o]=c.mix(h,n).rgbString();continue}}else if(ut.isFinite(l)&&ut.isFinite(u)){e[o]=l+(u-l)*n;continue}e[o]=u}}(n,a,i,t),e):(e._view=i,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return ut.isNumber(this._model.x)&&ut.isNumber(this._model.y)}}),ft.extend=ut.inherits;var gt=ft,mt=gt.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),pt=mt;Object.defineProperty(mt.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(mt.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),ot._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:ut.noop,onComplete:ut.noop}});var vt={animations:[],request:null,addAnimation:function(t,e,i,n){var a,r,o=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=i,n||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=ut.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=ut.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,i,n,a=this.animations,r=0;r<a.length;)e=(t=a[r]).chart,i=t.numSteps,n=Math.floor((Date.now()-t.startTime)/t.duration*i)+1,t.currentStep=Math.min(n,i),ut.callback(t.render,[e,t],e),ut.callback(t.onAnimationProgress,[t],e),t.currentStep>=i?(ut.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},yt=ut.options.resolve,bt=["push","pop","shift","splice","unshift"];function xt(t,e){var i=t._chartjs;if(i){var n=i.listeners,a=n.indexOf(e);-1!==a&&n.splice(a,1),n.length>0||(bt.forEach(function(e){delete t[e]}),delete t._chartjs)}}var _t=function(t,e){this.initialize(t,e)};ut.extend(_t.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this.update(!0)},destroy:function(){this._data&&xt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);i.dataset=i.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,i=this,n=i.getDataset(),a=n.data||(n.data=[]);i._data!==a&&(i._data&&xt(i._data,i),a&&Object.isExtensible(a)&&(e=i,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),bt.forEach(function(e){var i="onData"+e.charAt(0).toUpperCase()+e.slice(1),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=n.apply(this,e);return ut.each(t._chartjs.listeners,function(t){"function"==typeof t[i]&&t[i].apply(t,e)}),a}})}))),i._data=a),i.resyncElements()},update:ut.noop,transition:function(t){for(var e=this.getMeta(),i=e.data||[],n=i.length,a=0;a<n;++a)i[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],i=e.length,n=0;for(t.dataset&&t.dataset.draw();n<i;++n)e[n].draw()},removeHoverStyle:function(t){ut.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model,r=ut.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=yt([n.hoverBackgroundColor,e.hoverBackgroundColor,r(a.backgroundColor)],void 0,i),a.borderColor=yt([n.hoverBorderColor,e.hoverBorderColor,r(a.borderColor)],void 0,i),a.borderWidth=yt([n.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,i)},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,i=t.data.length,n=e.length;n<i?t.data.splice(n,i-n):n>i&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;i<e;++i)this.addElementAndReset(t+i)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),_t.extend=ut.inherits;var kt=_t;ot._set("global",{elements:{arc:{backgroundColor:ot.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var wt=gt.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var i=this._view;if(i){for(var n=ut.getAngleFromPoint(i,{x:t,y:e}),a=n.angle,r=n.distance,o=i.startAngle,s=i.endAngle;s<o;)s+=2*Math.PI;for(;a>s;)a-=2*Math.PI;for(;a<o;)a+=2*Math.PI;var l=a>=o&&a<=s,u=r>=i.innerRadius&&r<=i.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t,e=this._chart.ctx,i=this._view,n=i.startAngle,a=i.endAngle,r="inner"===i.borderAlign?.33:0;e.save(),e.beginPath(),e.arc(i.x,i.y,Math.max(i.outerRadius-r,0),n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.fillStyle=i.backgroundColor,e.fill(),i.borderWidth&&("inner"===i.borderAlign?(e.beginPath(),t=r/i.outerRadius,e.arc(i.x,i.y,i.outerRadius,n-t,a+t),i.innerRadius>r?(t=r/i.innerRadius,e.arc(i.x,i.y,i.innerRadius-r,a+t,n-t,!0)):e.arc(i.x,i.y,r,a+Math.PI/2,n-Math.PI/2),e.closePath(),e.clip(),e.beginPath(),e.arc(i.x,i.y,i.outerRadius,n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.lineWidth=2*i.borderWidth,e.lineJoin="round"):(e.lineWidth=i.borderWidth,e.lineJoin="bevel"),e.strokeStyle=i.borderColor,e.stroke()),e.restore()}}),Mt=ut.valueOrDefault,St=ot.global.defaultColor;ot._set("global",{elements:{line:{tension:.4,backgroundColor:St,borderWidth:3,borderColor:St,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Dt=gt.extend({draw:function(){var t,e,i,n,a=this._view,r=this._chart.ctx,o=a.spanGaps,s=this._children.slice(),l=ot.global,u=l.elements.line,d=-1;for(this._loop&&s.length&&s.push(s[0]),r.save(),r.lineCap=a.borderCapStyle||u.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||u.borderDash),r.lineDashOffset=Mt(a.borderDashOffset,u.borderDashOffset),r.lineJoin=a.borderJoinStyle||u.borderJoinStyle,r.lineWidth=Mt(a.borderWidth,u.borderWidth),r.strokeStyle=a.borderColor||l.defaultColor,r.beginPath(),d=-1,t=0;t<s.length;++t)e=s[t],i=ut.previousItem(s,t),n=e._view,0===t?n.skip||(r.moveTo(n.x,n.y),d=t):(i=-1===d?i:s[d],n.skip||(d!==t-1&&!o||-1===d?r.moveTo(n.x,n.y):ut.canvas.lineTo(r,i._view,e._view),d=t));r.stroke(),r.restore()}}),Ct=ut.valueOrDefault,Pt=ot.global.defaultColor;function Tt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}ot._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:Pt,borderColor:Pt,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var Ot=gt.extend({inRange:function(t,e){var i=this._view;return!!i&&Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2)},inLabelRange:Tt,inXRange:Tt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,i=this._chart.ctx,n=e.pointStyle,a=e.rotation,r=e.radius,o=e.x,s=e.y,l=ot.global,u=l.defaultColor;e.skip||(void 0===t||ut.canvas._isPointInArea(e,t))&&(i.strokeStyle=e.borderColor||u,i.lineWidth=Ct(e.borderWidth,l.elements.point.borderWidth),i.fillStyle=e.backgroundColor||u,ut.canvas.drawPoint(i,n,r,o,s,a))}}),It=ot.global.defaultColor;function At(t){return t&&void 0!==t.width}function Ft(t){var e,i,n,a,r;return At(t)?(r=t.width/2,e=t.x-r,i=t.x+r,n=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(r=t.height/2,e=Math.min(t.x,t.base),i=Math.max(t.x,t.base),n=t.y-r,a=t.y+r),{left:e,top:n,right:i,bottom:a}}function Rt(t,e,i){return t===e?i:t===i?e:t}function Lt(t,e,i){var n,a,r,o,s=t.borderWidth,l=function(t){var e=t.borderSkipped,i={};return e?(t.horizontal?t.base>t.x&&(e=Rt(e,"left","right")):t.base<t.y&&(e=Rt(e,"bottom","top")),i[e]=!0,i):i}(t);return ut.isObject(s)?(n=+s.top||0,a=+s.right||0,r=+s.bottom||0,o=+s.left||0):n=a=r=o=+s||0,{t:l.top||n<0?0:n>i?i:n,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>i?i:r,l:l.left||o<0?0:o>e?e:o}}function Wt(t,e,i){var n=null===e,a=null===i,r=!(!t||n&&a)&&Ft(t);return r&&(n||e>=r.left&&e<=r.right)&&(a||i>=r.top&&i<=r.bottom)}ot._set("global",{elements:{rectangle:{backgroundColor:It,borderColor:It,borderSkipped:"bottom",borderWidth:0}}});var Yt=gt.extend({draw:function(){var t=this._chart.ctx,e=this._view,i=function(t){var e=Ft(t),i=e.right-e.left,n=e.bottom-e.top,a=Lt(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n},inner:{x:e.left+a.l,y:e.top+a.t,w:i-a.l-a.r,h:n-a.t-a.b}}}(e),n=i.outer,a=i.inner;t.fillStyle=e.backgroundColor,t.fillRect(n.x,n.y,n.w,n.h),n.w===a.w&&n.h===a.h||(t.save(),t.beginPath(),t.rect(n.x,n.y,n.w,n.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return Wt(this._view,t,e)},inLabelRange:function(t,e){var i=this._view;return At(i)?Wt(i,t,null):Wt(i,null,e)},inXRange:function(t){return Wt(this._view,t,null)},inYRange:function(t){return Wt(this._view,null,t)},getCenterPoint:function(){var t,e,i=this._view;return At(i)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return At(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),Nt={},zt=wt,Vt=Dt,Ht=Ot,Et=Yt;Nt.Arc=zt,Nt.Line=Vt,Nt.Point=Ht,Nt.Rectangle=Et;var Bt=ut.options.resolve;ot._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});var jt=kt.extend({dataElementType:Nt.Rectangle,initialize:function(){var t;kt.prototype.initialize.apply(this,arguments),(t=this.getMeta()).stack=this.getDataset().stack,t.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e<i;++e)this.updateElement(n[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.getMeta(),r=n.getDataset(),o=n._resolveElementOptions(t,e);t._xScale=n.getScaleForId(a.xAxisID),t._yScale=n.getScaleForId(a.yAxisID),t._datasetIndex=n.index,t._index=e,t._model={backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderSkipped:o.borderSkipped,borderWidth:o.borderWidth,datasetLabel:r.label,label:n.chart.data.labels[e]},n._updateElementGeometry(t,e,i),t.pivot()},_updateElementGeometry:function(t,e,i){var n=this,a=t._model,r=n._getValueScale(),o=r.getBasePixel(),s=r.isHorizontal(),l=n._ruler||n.getRuler(),u=n.calculateBarValuePixels(n.index,e),d=n.calculateBarIndexPixels(n.index,e,l);a.horizontal=s,a.base=i?o:u.base,a.x=s?i?o:u.head:d.center,a.y=s?d.center:i?o:u.head,a.height=s?d.size:void 0,a.width=s?void 0:d.size},_getStacks:function(t){var e,i,n=this.chart,a=this._getIndexScale().options.stacked,r=void 0===t?n.data.datasets.length:t+1,o=[];for(e=0;e<r;++e)(i=n.getDatasetMeta(e)).bar&&n.isDatasetVisible(e)&&(!1===a||!0===a&&-1===o.indexOf(i.stack)||void 0===a&&(void 0===i.stack||-1===o.indexOf(i.stack)))&&o.push(i.stack);return o},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var i=this._getStacks(t),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n},getRuler:function(){var t,e,i=this._getIndexScale(),n=this.getStackCount(),a=this.index,r=i.isHorizontal(),o=r?i.left:i.top,s=o+(r?i.width:i.height),l=[];for(t=0,e=this.getMeta().data.length;t<e;++t)l.push(i.getPixelForValue(null,t,a));return{min:ut.isNullOrUndef(i.options.barThickness)?function(t,e){var i,n,a,r,o=t.isHorizontal()?t.width:t.height,s=t.getTicks();for(a=1,r=e.length;a<r;++a)o=Math.min(o,Math.abs(e[a]-e[a-1]));for(a=0,r=s.length;a<r;++a)n=t.getPixelForTick(a),o=a>0?Math.min(o,n-i):o,i=n;return o}(i,l):-1,pixels:l,start:o,end:s,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,r,o,s,l=this.chart,u=this.getMeta(),d=this._getValueScale(),h=d.isHorizontal(),c=l.data.datasets,f=+d.getRightValue(c[t].data[e]),g=d.options.minBarLength,m=d.options.stacked,p=u.stack,v=0;if(m||void 0===m&&void 0!==p)for(i=0;i<t;++i)(n=l.getDatasetMeta(i)).bar&&n.stack===p&&n.controller._getValueScaleId()===d.id&&l.isDatasetVisible(i)&&(a=+d.getRightValue(c[i].data[e]),(f<0&&a<0||f>=0&&a>0)&&(v+=a));return r=d.getPixelForValue(v),s=(o=d.getPixelForValue(v+f))-r,void 0!==g&&Math.abs(s)<g&&(s=g,o=f>=0&&!h||f<0&&h?r-g:r+g),{size:s,base:r,head:o,center:o+s/2}},calculateBarIndexPixels:function(t,e,i){var n=i.scale.options,a="flex"===n.barThickness?function(t,e,i){var n,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=i.categoryPercentage;return null===o&&(o=r-(null===s?e.end-e.start:s-r)),null===s&&(s=r+r-o),n=r-(r-Math.min(o,s))/2*l,{chunk:Math.abs(s-o)/2*l/e.stackCount,ratio:i.barPercentage,start:n}}(e,i,n):function(t,e,i){var n,a,r=i.barThickness,o=e.stackCount,s=e.pixels[t];return ut.isNullOrUndef(r)?(n=e.min*i.categoryPercentage,a=i.barPercentage):(n=r*o,a=1),{chunk:n/o,ratio:a,start:s-n/2}}(e,i,n),r=this.getStackIndex(t,this.getMeta().stack),o=a.start+a.chunk*r+a.chunk/2,s=Math.min(ut.valueOrDefault(n.maxBarThickness,1/0),a.chunk*a.ratio);return{base:o-s/2,head:o+s/2,center:o,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),i=this.getMeta().data,n=this.getDataset(),a=i.length,r=0;for(ut.canvas.clipArea(t.ctx,t.chartArea);r<a;++r)isNaN(e.getRightValue(n.data[r]))||i[r].draw();ut.canvas.unclipArea(t.ctx)},_resolveElementOptions:function(t,e){var i,n,a,r=this.chart,o=r.data.datasets[this.index],s=t.custom||{},l=r.options.elements.rectangle,u={},d={chart:r,dataIndex:e,dataset:o,datasetIndex:this.index},h=["backgroundColor","borderColor","borderSkipped","borderWidth"];for(i=0,n=h.length;i<n;++i)u[a=h[i]]=Bt([s[a],o[a],l[a]],d,e);return u}}),Ut=ut.valueOrDefault,Gt=ut.options.resolve;ot._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"",n=e.datasets[t.datasetIndex].data[t.index];return i+": ("+t.xLabel+", "+t.yLabel+", "+n.r+")"}}}});var qt=kt.extend({dataElementType:Nt.Point,update:function(t){var e=this,i=e.getMeta().data;ut.each(i,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.getMeta(),r=t.custom||{},o=n.getScaleForId(a.xAxisID),s=n.getScaleForId(a.yAxisID),l=n._resolveElementOptions(t,e),u=n.getDataset().data[e],d=n.index,h=i?o.getPixelForDecimal(.5):o.getPixelForValue("object"==typeof u?u:NaN,e,d),c=i?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:i?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ut(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Ut(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Ut(i.hoverBorderWidth,i.borderWidth),e.radius=i.radius+i.hoverRadius},_resolveElementOptions:function(t,e){var i,n,a,r=this.chart,o=r.data.datasets[this.index],s=t.custom||{},l=r.options.elements.point,u=o.data[e],d={},h={chart:r,dataIndex:e,dataset:o,datasetIndex:this.index},c=["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"];for(i=0,n=c.length;i<n;++i)d[a=c[i]]=Gt([s[a],o[a],l[a]],h,e);return d.radius=Gt([s.radius,u?u.r:void 0,o.radius,l.radius],h,e),d}}),Zt=ut.options.resolve,$t=ut.valueOrDefault;ot._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var r=0;r<n[0].data.length;++r)e.push('<li><span style="background-color:'+n[0].backgroundColor[r]+'"></span>'),a[r]&&e.push(a[r]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),r=e.datasets[0],o=a.data[n],s=o&&o.custom||{},l=t.options.elements.arc;return{text:i,fillStyle:Zt([s.backgroundColor,r.backgroundColor,l.backgroundColor],void 0,n),strokeStyle:Zt([s.borderColor,r.borderColor,l.borderColor],void 0,n),lineWidth:Zt([s.borderWidth,r.borderWidth,l.borderWidth],void 0,n),hidden:isNaN(r.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,r=e.index,o=this.chart;for(i=0,n=(o.data.datasets||[]).length;i<n;++i)(a=o.getDatasetMeta(i)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.labels[t.index],n=": "+e.datasets[t.datasetIndex].data[t.index];return ut.isArray(i)?(i=i.slice())[0]+=n:i+=n,i}}}});var Xt=kt.extend({dataElementType:Nt.Arc,linkScales:ut.noop,getRingIndex:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var e,i,n=this,a=n.chart,r=a.chartArea,o=a.options,s=r.right-r.left,l=r.bottom-r.top,u=Math.min(s,l),d={x:0,y:0},h=n.getMeta(),c=h.data,f=o.cutoutPercentage,g=o.circumference,m=n._getRingWeight(n.index);if(g<2*Math.PI){var p=o.rotation%(2*Math.PI),v=(p+=2*Math.PI*(p>=Math.PI?-1:p<-Math.PI?1:0))+g,y={x:Math.cos(p),y:Math.sin(p)},b={x:Math.cos(v),y:Math.sin(v)},x=p<=0&&v>=0||p<=2*Math.PI&&2*Math.PI<=v,_=p<=.5*Math.PI&&.5*Math.PI<=v||p<=2.5*Math.PI&&2.5*Math.PI<=v,k=p<=-Math.PI&&-Math.PI<=v||p<=Math.PI&&Math.PI<=v,w=p<=.5*-Math.PI&&.5*-Math.PI<=v||p<=1.5*Math.PI&&1.5*Math.PI<=v,M=f/100,S={x:k?-1:Math.min(y.x*(y.x<0?1:M),b.x*(b.x<0?1:M)),y:w?-1:Math.min(y.y*(y.y<0?1:M),b.y*(b.y<0?1:M))},D={x:x?1:Math.max(y.x*(y.x>0?1:M),b.x*(b.x>0?1:M)),y:_?1:Math.max(y.y*(y.y>0?1:M),b.y*(b.y>0?1:M))},C={width:.5*(D.x-S.x),height:.5*(D.y-S.y)};u=Math.min(s/C.width,l/C.height),d={x:-.5*(D.x+S.x),y:-.5*(D.y+S.y)}}for(e=0,i=c.length;e<i;++e)c[e]._options=n._resolveElementOptions(c[e],e);for(a.borderWidth=n.getMaxBorderWidth(),a.outerRadius=Math.max((u-a.borderWidth)/2,0),a.innerRadius=Math.max(f?a.outerRadius/100*f:0,0),a.radiusLength=(a.outerRadius-a.innerRadius)/(n._getVisibleDatasetWeightTotal()||1),a.offsetX=d.x*a.outerRadius,a.offsetY=d.y*a.outerRadius,h.total=n.calculateTotal(),n.outerRadius=a.outerRadius-a.radiusLength*n._getRingWeightOffset(n.index),n.innerRadius=Math.max(n.outerRadius-a.radiusLength*m,0),e=0,i=c.length;e<i;++e)n.updateElement(c[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.chart,r=a.chartArea,o=a.options,s=o.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,d=o.rotation,h=o.rotation,c=n.getDataset(),f=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(c.data[e])*(o.circumference/(2*Math.PI)),g=i&&s.animateScale?0:n.innerRadius,m=i&&s.animateScale?0:n.outerRadius,p=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_model:{backgroundColor:p.backgroundColor,borderColor:p.borderColor,borderWidth:p.borderWidth,borderAlign:p.borderAlign,x:l+a.offsetX,y:u+a.offsetY,startAngle:d,endAngle:h,circumference:f,outerRadius:m,innerRadius:g,label:ut.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;i&&s.animateRotate||(v.startAngle=0===e?o.rotation:n.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),i=this.getMeta(),n=0;return ut.each(i.data,function(i,a){t=e.data[a],isNaN(t)||i.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,i,n,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,i=d.data.datasets.length;e<i;++e)if(d.isDatasetVisible(e)){t=(n=d.getDatasetMeta(e)).data,e!==this.index&&(r=n.controller);break}if(!t)return 0;for(e=0,i=t.length;e<i;++e)a=t[e],"inner"!==(o=r?r._resolveElementOptions(a,e):a._options).borderAlign&&(s=o.borderWidth,u=(l=o.hoverBorderWidth)>(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=$t(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=$t(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=$t(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,r=this.chart,o=this.getDataset(),s=t.custom||{},l=r.options.elements.arc,u={},d={chart:r,dataIndex:e,dataset:o,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)u[a=h[i]]=Zt([s[a],o[a],l[a]],d,e);return u},_getRingWeightOffset:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e},_getRingWeight:function(t){return Math.max($t(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});ot._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}});var Kt=jt.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Jt=ut.valueOrDefault,Qt=ut.options.resolve,te=ut.canvas._isPointInArea;function ee(t,e){return Jt(t.showLine,e.showLines)}ot._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var ie=kt.extend({datasetElementType:Nt.Line,dataElementType:Nt.Point,update:function(t){var e,i,n=this,a=n.getMeta(),r=a.dataset,o=a.data||[],s=n.getScaleForId(a.yAxisID),l=n.getDataset(),u=ee(l,n.chart.options);for(u&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=n.index,r._children=o,r._model=n._resolveLineOptions(r),r.pivot()),e=0,i=o.length;e<i;++e)n.updateElement(o[e],e,t);for(u&&0!==r._model.tension&&n.updateBezierControlPoints(),e=0,i=o.length;e<i;++e)o[e].pivot()},updateElement:function(t,e,i){var n,a,r=this,o=r.getMeta(),s=t.custom||{},l=r.getDataset(),u=r.index,d=l.data[e],h=r.getScaleForId(o.yAxisID),c=r.getScaleForId(o.xAxisID),f=o.dataset._model,g=r._resolvePointOptions(t,e);n=c.getPixelForValue("object"==typeof d?d:NaN,e,u),a=i?h.getBasePixel():r.calculatePointY(d,e,u),t._xScale=c,t._yScale=h,t._options=g,t._datasetIndex=u,t._index=e,t._model={x:n,y:a,skip:s.skip||isNaN(n)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Jt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,r=this.chart,o=r.data.datasets[this.index],s=t.custom||{},l=r.options.elements.point,u={},d={chart:r,dataIndex:e,dataset:o,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)u[a=c[i]]=Qt([s[a],o[h[a]],o[a],l[a]],d,e);return u},_resolveLineOptions:function(t){var e,i,n,a=this.chart,r=a.data.datasets[this.index],o=t.custom||{},s=a.options,l=s.elements.line,u={},d=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","cubicInterpolationMode"];for(e=0,i=d.length;e<i;++e)u[n=d[e]]=Qt([o[n],r[n],l[n]]);return u.spanGaps=Jt(r.spanGaps,s.spanGaps),u.tension=Jt(r.lineTension,l.tension),u.steppedLine=Qt([o.steppedLine,r.steppedLine,l.stepped]),u},calculatePointY:function(t,e,i){var n,a,r,o=this.chart,s=this.getMeta(),l=this.getScaleForId(s.yAxisID),u=0,d=0;if(l.options.stacked){for(n=0;n<i;n++)if(a=o.data.datasets[n],"line"===(r=o.getDatasetMeta(n)).type&&r.yAxisID===l.id&&o.isDatasetVisible(n)){var h=Number(l.getRightValue(a.data[e]));h<0?d+=h||0:u+=h||0}var c=Number(l.getRightValue(t));return c<0?l.getPixelForValue(d+c):l.getPixelForValue(u+c)}return l.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,a=this.chart,r=this.getMeta(),o=r.dataset._model,s=a.chartArea,l=r.data||[];function u(t,e,i){return Math.max(Math.min(t,i),e)}if(o.spanGaps&&(l=l.filter(function(t){return!t._model.skip})),"monotone"===o.cubicInterpolationMode)ut.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)i=l[t]._model,n=ut.splineCurve(ut.previousItem(l,t)._model,i,ut.nextItem(l,t)._model,o.tension),i.controlPointPreviousX=n.previous.x,i.controlPointPreviousY=n.previous.y,i.controlPointNextX=n.next.x,i.controlPointNextY=n.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)i=l[t]._model,te(i,s)&&(t>0&&te(l[t-1]._model,s)&&(i.controlPointPreviousX=u(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=u(i.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&te(l[t+1]._model,s)&&(i.controlPointNextX=u(i.controlPointNextX,s.left,s.right),i.controlPointNextY=u(i.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,i=this.getMeta(),n=i.data||[],a=e.chartArea,r=n.length,o=0;for(ee(this.getDataset(),e.options)&&(t=(i.dataset._model.borderWidth||0)/2,ut.canvas.clipArea(e.ctx,{left:a.left,right:a.right,top:a.top-t,bottom:a.bottom+t}),i.dataset.draw(),ut.canvas.unclipArea(e.ctx));o<r;++o)n[o].draw(a)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Jt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Jt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Jt(i.hoverBorderWidth,i.borderWidth),e.radius=Jt(i.hoverRadius,i.radius)}}),ne=ut.options.resolve;ot._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var r=0;r<n[0].data.length;++r)e.push('<li><span style="background-color:'+n[0].backgroundColor[r]+'"></span>'),a[r]&&e.push(a[r]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),r=e.datasets[0],o=a.data[n].custom||{},s=t.options.elements.arc;return{text:i,fillStyle:ne([o.backgroundColor,r.backgroundColor,s.backgroundColor],void 0,n),strokeStyle:ne([o.borderColor,r.borderColor,s.borderColor],void 0,n),lineWidth:ne([o.borderWidth,r.borderWidth,s.borderWidth],void 0,n),hidden:isNaN(r.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,r=e.index,o=this.chart;for(i=0,n=(o.data.datasets||[]).length;i<n;++i)(a=o.getDatasetMeta(i)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var ae=kt.extend({dataElementType:Nt.Arc,linkScales:ut.noop,update:function(t){var e,i,n,a=this,r=a.getDataset(),o=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],u=a._angles=[],d=o.data;for(a._updateRadius(),o.count=a.countVisibleElements(),e=0,i=r.data.length;e<i;e++)l[e]=s,n=a._computeAngle(e),u[e]=n,s+=n;for(e=0,i=d.length;e<i;++e)d[e]._options=a._resolveElementOptions(d[e],e),a.updateElement(d[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,i=e.chartArea,n=e.options,a=Math.min(i.right-i.left,i.bottom-i.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(n.cutoutPercentage?e.outerRadius/100*n.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,i){var n=this,a=n.chart,r=n.getDataset(),o=a.options,s=o.animation,l=a.scale,u=a.data.labels,d=l.xCenter,h=l.yCenter,c=o.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(r.data[e]),g=n._starts[e],m=g+(t.hidden?0:n._angles[e]),p=s.animateScale?0:l.getDistanceFromCenterForValue(r.data[e]),v=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:d,y:h,innerRadius:0,outerRadius:i?p:f,startAngle:i&&s.animateRotate?c:g,endAngle:i&&s.animateRotate?c:m,label:ut.valueAtIndexOrDefault(u,e,u[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),i=0;return ut.each(e.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor,a=ut.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=a(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=a(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,r=this.chart,o=this.getDataset(),s=t.custom||{},l=r.options.elements.arc,u={},d={chart:r,dataIndex:e,dataset:o,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)u[a=h[i]]=ne([s[a],o[a],l[a]],d,e);return u},_computeAngle:function(t){var e=this,i=this.getMeta().count,n=e.getDataset(),a=e.getMeta();if(isNaN(n.data[t])||a.data[t].hidden)return 0;var r={chart:e.chart,dataIndex:t,dataset:n,datasetIndex:e.index};return ne([e.chart.options.elements.arc.angle,2*Math.PI/i],r,t)}});ot._set("pie",ut.clone(ot.doughnut)),ot._set("pie",{cutoutPercentage:0});var re=Xt,oe=ut.valueOrDefault,se=ut.options.resolve;ot._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}});var le=kt.extend({datasetElementType:Nt.Line,dataElementType:Nt.Point,linkScales:ut.noop,update:function(t){var e,i,n=this,a=n.getMeta(),r=a.dataset,o=a.data||[],s=n.chart.scale,l=n.getDataset();for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=n.index,r._children=o,r._loop=!0,r._model=n._resolveLineOptions(r),r.pivot(),e=0,i=o.length;e<i;++e)n.updateElement(o[e],e,t);for(n.updateBezierControlPoints(),e=0,i=o.length;e<i;++e)o[e].pivot()},updateElement:function(t,e,i){var n=this,a=t.custom||{},r=n.getDataset(),o=n.chart.scale,s=o.getPointPositionForValue(e,r.data[e]),l=n._resolvePointOptions(t,e),u=n.getMeta().dataset._model,d=i?o.xCenter:s.x,h=i?o.yCenter:s.y;t._scale=o,t._options=l,t._datasetIndex=n.index,t._index=e,t._model={x:d,y:h,skip:a.skip||isNaN(d)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:oe(a.tension,u?u.tension:0),hitRadius:l.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,r=this.chart,o=r.data.datasets[this.index],s=t.custom||{},l=r.options.elements.point,u={},d={chart:r,dataIndex:e,dataset:o,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)u[a=c[i]]=se([s[a],o[h[a]],o[a],l[a]],d,e);return u},_resolveLineOptions:function(t){var e,i,n,a=this.chart,r=a.data.datasets[this.index],o=t.custom||{},s=a.options.elements.line,l={},u=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"];for(e=0,i=u.length;e<i;++e)l[n=u[e]]=se([o[n],r[n],s[n]]);return l.tension=oe(r.lineTension,s.tension),l},updateBezierControlPoints:function(){var t,e,i,n,a=this.getMeta(),r=this.chart.chartArea,o=a.data||[];function s(t,e,i){return Math.max(Math.min(t,i),e)}for(t=0,e=o.length;t<e;++t)i=o[t]._model,n=ut.splineCurve(ut.previousItem(o,t,!0)._model,i,ut.nextItem(o,t,!0)._model,i.tension),i.controlPointPreviousX=s(n.previous.x,r.left,r.right),i.controlPointPreviousY=s(n.previous.y,r.top,r.bottom),i.controlPointNextX=s(n.next.x,r.left,r.right),i.controlPointNextY=s(n.next.y,r.top,r.bottom)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=oe(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=oe(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=oe(i.hoverBorderWidth,i.borderWidth),e.radius=oe(i.hoverRadius,i.radius)}});ot._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}});var ue={bar:jt,bubble:qt,doughnut:Xt,horizontalBar:Kt,line:ie,polarArea:ae,pie:re,radar:le,scatter:ie};function de(t,e){return t.native?{x:t.x,y:t.y}:ut.getRelativePosition(t,e)}function he(t,e){var i,n,a,r,o;for(n=0,r=t.data.datasets.length;n<r;++n)if(t.isDatasetVisible(n))for(a=0,o=(i=t.getDatasetMeta(n)).data.length;a<o;++a){var s=i.data[a];s._view.skip||e(s)}}function ce(t,e){var i=[];return he(t,function(t){t.inRange(e.x,e.y)&&i.push(t)}),i}function fe(t,e,i,n){var a=Number.POSITIVE_INFINITY,r=[];return he(t,function(t){if(!i||t.inRange(e.x,e.y)){var o=t.getCenterPoint(),s=n(e,o);s<a?(r=[t],a=s):s===a&&r.push(t)}}),r}function ge(t){var e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){var a=e?Math.abs(t.x-n.x):0,r=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function me(t,e,i){var n=de(e,t);i.axis=i.axis||"x";var a=ge(i.axis),r=i.intersect?ce(t,n):fe(t,n,!1,a),o=[];return r.length?(t.data.datasets.forEach(function(e,i){if(t.isDatasetVisible(i)){var n=t.getDatasetMeta(i).data[r[0]._index];n&&!n._view.skip&&o.push(n)}}),o):[]}var pe={modes:{single:function(t,e){var i=de(e,t),n=[];return he(t,function(t){if(t.inRange(i.x,i.y))return n.push(t),n}),n.slice(0,1)},label:me,index:me,dataset:function(t,e,i){var n=de(e,t);i.axis=i.axis||"xy";var a=ge(i.axis),r=i.intersect?ce(t,n):fe(t,n,!1,a);return r.length>0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return me(t,e,{intersect:!1})},point:function(t,e){return ce(t,de(e,t))},nearest:function(t,e,i){var n=de(e,t);i.axis=i.axis||"xy";var a=ge(i.axis);return fe(t,n,i.intersect,a)},x:function(t,e,i){var n=de(e,t),a=[],r=!1;return he(t,function(t){t.inXRange(n.x)&&a.push(t),t.inRange(n.x,n.y)&&(r=!0)}),i.intersect&&!r&&(a=[]),a},y:function(t,e,i){var n=de(e,t),a=[],r=!1;return he(t,function(t){t.inYRange(n.y)&&a.push(t),t.inRange(n.x,n.y)&&(r=!0)}),i.intersect&&!r&&(a=[]),a}}};function ve(t,e){return ut.where(t,function(t){return t.position===e})}function ye(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}function be(t,e){ut.each(t,function(t){e[t.position]+=t.isHorizontal()?t.height:t.width})}ot._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var xe={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],r=a.length,o=0;o<r;++o)n=a[o],i.hasOwnProperty(n)&&(e[n]=i[n])},update:function(t,e,i){if(t){var n=t.options.layout||{},a=ut.options.toPadding(n.padding),r=a.left,o=a.right,s=a.top,l=a.bottom,u=ve(t.boxes,"left"),d=ve(t.boxes,"right"),h=ve(t.boxes,"top"),c=ve(t.boxes,"bottom"),f=ve(t.boxes,"chartArea");ye(u,!0),ye(d,!1),ye(h,!0),ye(c,!1);var g,m=u.concat(d),p=h.concat(c),v=m.concat(p),y=e-r-o,b=i-s-l,x=(e-y/2)/m.length,_=y,k=b,w={top:s,left:r,bottom:l,right:o},M=[];ut.each(v,function(t){var e,i=t.isHorizontal();i?(e=t.update(t.fullWidth?y:_,b/2),k-=e.height):(e=t.update(x,k),_-=e.width),M.push({horizontal:i,width:e.width,box:t})}),g=function(t){var e=0,i=0,n=0,a=0;return ut.each(t,function(t){if(t.getPadding){var r=t.getPadding();e=Math.max(e,r.top),i=Math.max(i,r.left),n=Math.max(n,r.bottom),a=Math.max(a,r.right)}}),{top:e,left:i,bottom:n,right:a}}(v),ut.each(m,I),be(m,w),ut.each(p,I),be(p,w),ut.each(m,function(t){var e=ut.findNextWhere(M,function(e){return e.box===t}),i={left:0,right:0,top:w.top,bottom:w.bottom};e&&t.update(e.width,k,i)}),be(v,w={top:s,left:r,bottom:l,right:o});var S=Math.max(g.left-w.left,0);w.left+=S,w.right+=Math.max(g.right-w.right,0);var D=Math.max(g.top-w.top,0);w.top+=D,w.bottom+=Math.max(g.bottom-w.bottom,0);var C=i-w.top-w.bottom,P=e-w.left-w.right;P===_&&C===k||(ut.each(m,function(t){t.height=C}),ut.each(p,function(t){t.fullWidth||(t.width=P)}),k=C,_=P);var T=r+S,O=s+D;ut.each(u.concat(h),A),T+=_,O+=k,ut.each(d,A),ut.each(c,A),t.chartArea={left:w.left,top:w.top,right:w.left+_,bottom:w.top+k},ut.each(f,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(_,k)})}function I(t){var e=ut.findNextWhere(M,function(e){return e.box===t});if(e)if(e.horizontal){var i={left:Math.max(w.left,g.left),right:Math.max(w.right,g.right),top:0,bottom:0};t.update(t.fullWidth?y:_,b/2,i)}else t.update(e.width,k)}function A(t){t.isHorizontal()?(t.left=t.fullWidth?r:w.left,t.right=t.fullWidth?e-o:w.left+_,t.top=O,t.bottom=O+t.height,O=t.bottom):(t.left=T,t.right=T+t.width,t.top=w.top,t.bottom=w.top+k,T=t.right)}}};"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function _e(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}var ke,we=(ke=Object.freeze({default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&ke.default||ke,Me="$chartjs",Se="chartjs-size-monitor",De="chartjs-render-monitor",Ce="chartjs-render-animation",Pe=["animationstart","webkitAnimationStart"],Te={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function Oe(t,e){var i=ut.getStyle(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?Number(n[1]):void 0}var Ie=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Ae(t,e,i){t.addEventListener(e,i,Ie)}function Fe(t,e,i){t.removeEventListener(e,i,Ie)}function Re(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Le(t){var e=document.createElement("div");return e.className=t||"",e}function We(t,e,i){var n,a,r,o,s=t[Me]||(t[Me]={}),l=s.resizer=function(t){var e=Le(Se),i=Le(Se+"-expand"),n=Le(Se+"-shrink");i.appendChild(Le()),n.appendChild(Le()),e.appendChild(i),e.appendChild(n),e._reset=function(){i.scrollLeft=1e6,i.scrollTop=1e6,n.scrollLeft=1e6,n.scrollTop=1e6};var a=function(){e._reset(),t()};return Ae(i,"scroll",a.bind(i,"expand")),Ae(n,"scroll",a.bind(n,"shrink")),e}((n=function(){if(s.resizer){var n=i.options.maintainAspectRatio&&t.parentNode,a=n?n.clientWidth:0;e(Re("resize",i)),n&&n.clientWidth<a&&i.canvas&&e(Re("resize",i))}},r=!1,o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,ut.requestAnimFrame.call(window,function(){r=!1,n.apply(a,o)}))}));!function(t,e){var i=t[Me]||(t[Me]={}),n=i.renderProxy=function(t){t.animationName===Ce&&e()};ut.each(Pe,function(e){Ae(t,e,n)}),i.reflow=!!t.offsetParent,t.classList.add(De)}(t,function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}})}function Ye(t){var e=t[Me]||{},i=e.resizer;delete e.resizer,function(t){var e=t[Me]||{},i=e.renderProxy;i&&(ut.each(Pe,function(e){Fe(t,e,i)}),delete e.renderProxy),t.classList.remove(De)}(t),i&&i.parentNode&&i.parentNode.removeChild(i)}var Ne={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(){var t,e,i;this._loaded||(this._loaded=!0,this.disableCSSInjection||(e=we,i=(t=this)._style||document.createElement("style"),t._style||(t._style=i,e="/* Chart.js */\n"+e,i.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(i)),i.appendChild(document.createTextNode(e))))},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return this._ensureLoaded(),i&&i.canvas===t?(function(t,e){var i=t.style,n=t.getAttribute("height"),a=t.getAttribute("width");if(t[Me]={initial:{height:n,width:a,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===a||""===a){var r=Oe(t,"width");void 0!==r&&(t.width=r)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=Oe(t,"height");void 0!==r&&(t.height=o)}}(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e[Me]){var i=e[Me].initial;["height","width"].forEach(function(t){var n=i[t];ut.isNullOrUndef(n)?e.removeAttribute(t):e.setAttribute(t,n)}),ut.each(i.style||{},function(t,i){e.style[i]=t}),e.width=e.width,delete e[Me]}},addEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=i[Me]||(i[Me]={});Ae(n,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){i(function(t,e){var i=Te[t.type]||t.type,n=ut.getRelativePosition(t,e);return Re(i,e,n.x,n.y,t)}(e,t))})}else We(n,i,t)},removeEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=((i[Me]||{}).proxies||{})[t.id+"_"+e];a&&Fe(n,e,a)}else Ye(n)}};ut.addEvent=Ae,ut.removeEvent=Fe;var ze=Ne._enabled?Ne:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Ve=ut.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},ze);ot._set("global",{plugins:{}});var He={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var i=e.indexOf(t);-1!==i&&e.splice(i,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,i){var n,a,r,o,s,l=this.descriptors(t),u=l.length;for(n=0;n<u;++n)if("function"==typeof(s=(r=(a=l[n]).plugin)[e])&&((o=[t].concat(i||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var i=[],n=[],a=t&&t.config||{},r=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach(function(t){if(-1===i.indexOf(t)){var e=t.id,a=r[e];!1!==a&&(!0===a&&(a=ut.clone(ot.global.plugins[e])),i.push(t),n.push({plugin:t,options:a||{}}))}}),e.descriptors=n,e.id=this._cacheId,n},_invalidate:function(t){delete t.$plugins}},Ee={constructors:{},defaults:{},registerScaleType:function(t,e,i){this.constructors[t]=e,this.defaults[t]=ut.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?ut.merge({},[ot.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=ut.extend(this.defaults[t],e))},addScalesToLayout:function(t){ut.each(t.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,xe.addBox(t,e)})}},Be=ut.valueOrDefault;ot._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:ut.noop,title:function(t,e){var i="",n=e.labels,a=n?n.length:0;if(t.length>0){var r=t[0];r.label?i=r.label:r.xLabel?i=r.xLabel:a>0&&r.index<a&&(i=n[r.index])}return i},afterTitle:ut.noop,beforeBody:ut.noop,beforeLabel:ut.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i&&(i+=": "),ut.isNullOrUndef(t.value)?i+=t.yLabel:i+=t.value,i},labelColor:function(t,e){var i=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:i.borderColor,backgroundColor:i.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:ut.noop,afterBody:ut.noop,beforeFooter:ut.noop,footer:ut.noop,afterFooter:ut.noop}}});var je={average:function(t){if(!t.length)return!1;var e,i,n=0,a=0,r=0;for(e=0,i=t.length;e<i;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();n+=s.x,a+=s.y,++r}}return{x:n/r,y:a/r}},nearest:function(t,e){var i,n,a,r=e.x,o=e.y,s=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){var l=t[i];if(l&&l.hasValue()){var u=l.getCenterPoint(),d=ut.distanceBetweenPoints(e,u);d<s&&(s=d,a=l)}}if(a){var h=a.tooltipPosition();r=h.x,o=h.y}return{x:r,y:o}}};function Ue(t,e){return e&&(ut.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ge(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function qe(t){var e=ot.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:Be(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:Be(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:Be(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:Be(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:Be(t.titleFontStyle,e.defaultFontStyle),titleFontSize:Be(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:Be(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:Be(t.footerFontStyle,e.defaultFontStyle),footerFontSize:Be(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ze(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function $e(t){return Ue([],Ge(t))}var Xe=gt.extend({initialize:function(){this._model=qe(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),i=t.title.apply(this,arguments),n=t.afterTitle.apply(this,arguments),a=[];return a=Ue(a,Ge(e)),a=Ue(a,Ge(i)),a=Ue(a,Ge(n))},getBeforeBody:function(){return $e(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var i=this,n=i._options.callbacks,a=[];return ut.each(t,function(t){var r={before:[],lines:[],after:[]};Ue(r.before,Ge(n.beforeLabel.call(i,t,e))),Ue(r.lines,n.label.call(i,t,e)),Ue(r.after,Ge(n.afterLabel.call(i,t,e))),a.push(r)}),a},getAfterBody:function(){return $e(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),i=t.footer.apply(this,arguments),n=t.afterFooter.apply(this,arguments),a=[];return a=Ue(a,Ge(e)),a=Ue(a,Ge(i)),a=Ue(a,Ge(n))},update:function(t){var e,i,n,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=qe(c),m=h._active,p=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},y={x:f.x,y:f.y},b={width:f.width,height:f.height},x={x:f.caretX,y:f.caretY};if(m.length){g.opacity=1;var _=[],k=[];x=je[c.position].call(h,m,h._eventPosition);var w=[];for(e=0,i=m.length;e<i;++e)w.push((n=m[e],a=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,d=void 0,a=n._xScale,r=n._yScale||n._scale,o=n._index,s=n._datasetIndex,l=n._chart.getDatasetMeta(s).controller,u=l._getIndexScale(),d=l._getValueScale(),{xLabel:a?a.getLabelForIndex(o,s):"",yLabel:r?r.getLabelForIndex(o,s):"",label:u?""+u.getLabelForIndex(o,s):"",value:d?""+d.getLabelForIndex(o,s):"",index:o,datasetIndex:s,x:n._model.x,y:n._model.y}));c.filter&&(w=w.filter(function(t){return c.filter(t,p)})),c.itemSort&&(w=w.sort(function(t,e){return c.itemSort(t,e,p)})),ut.each(w,function(t){_.push(c.callbacks.labelColor.call(h,t,h._chart)),k.push(c.callbacks.labelTextColor.call(h,t,h._chart))}),g.title=h.getTitle(w,p),g.beforeBody=h.getBeforeBody(w,p),g.body=h.getBody(w,p),g.afterBody=h.getAfterBody(w,p),g.footer=h.getFooter(w,p),g.x=x.x,g.y=x.y,g.caretPadding=c.caretPadding,g.labelColors=_,g.labelTextColors=k,g.dataPoints=w,b=function(t,e){var i=t._chart.ctx,n=2*e.yPadding,a=0,r=e.body,o=r.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;n+=s*u,n+=s?(s-1)*e.titleSpacing:0,n+=s?e.titleMarginBottom:0,n+=o*d,n+=o?(o-1)*e.bodySpacing:0,n+=l?e.footerMarginTop:0,n+=l*h,n+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,i.measureText(t).width+c)};return i.font=ut.fontString(u,e._titleFontStyle,e._titleFontFamily),ut.each(e.title,f),i.font=ut.fontString(d,e._bodyFontStyle,e._bodyFontFamily),ut.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,ut.each(r,function(t){ut.each(t.before,f),ut.each(t.lines,f),ut.each(t.after,f)}),c=0,i.font=ut.fontString(h,e._footerFontStyle,e._footerFontFamily),ut.each(e.footer,f),{width:a+=2*e.xPadding,height:n}}(this,g),y=function(t,e,i,n){var a=t.x,r=t.y,o=t.caretSize,s=t.caretPadding,l=t.cornerRadius,u=i.xAlign,d=i.yAlign,h=o+s,c=l+s;return"right"===u?a-=e.width:"center"===u&&((a-=e.width/2)+e.width>n.width&&(a=n.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,b,v=function(t,e){var i,n,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},i(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):n(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,b),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=y.x,g.y=y.y,g.width=b.width,g.height=b.height,g.caretX=x.x,g.caretY=x.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,r,o,s,l,u=i.caretSize,d=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,"left"===h?(a=(n=f)-u,r=n,o=s+u,l=s-u):(a=(n=f+m)+u,r=n,o=s-u,l=s+u);else if("left"===h?(n=(a=f+d+u)-u,r=a+u):"right"===h?(n=(a=f+m-d-u)-u,r=a+u):(n=(a=i.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=n,n=v}return{x1:n,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,i){var n=e.title;if(n.length){t.x=Ze(e,e._titleAlign),i.textAlign=e._titleAlign,i.textBaseline="top";var a,r,o=e.titleFontSize,s=e.titleSpacing;for(i.fillStyle=e.titleFontColor,i.font=ut.fontString(o,e._titleFontStyle,e._titleFontFamily),a=0,r=n.length;a<r;++a)i.fillText(n[a],t.x,t.y),t.y+=o+s,a+1===n.length&&(t.y+=e.titleMarginBottom-s)}},drawBody:function(t,e,i){var n,a=e.bodyFontSize,r=e.bodySpacing,o=e._bodyAlign,s=e.body,l=e.displayColors,u=e.labelColors,d=0,h=l?Ze(e,"left"):0;i.textAlign=o,i.textBaseline="top",i.font=ut.fontString(a,e._bodyFontStyle,e._bodyFontFamily),t.x=Ze(e,o);var c=function(e){i.fillText(e,t.x+d,t.y),t.y+=a+r};i.fillStyle=e.bodyFontColor,ut.each(e.beforeBody,c),d=l&&"right"!==o?"center"===o?a/2+1:a+2:0,ut.each(s,function(r,o){n=e.labelTextColors[o],i.fillStyle=n,ut.each(r.before,c),ut.each(r.lines,function(r){l&&(i.fillStyle=e.legendColorBackground,i.fillRect(h,t.y,a,a),i.lineWidth=1,i.strokeStyle=u[o].borderColor,i.strokeRect(h,t.y,a,a),i.fillStyle=u[o].backgroundColor,i.fillRect(h+1,t.y+1,a-2,a-2),i.fillStyle=n),c(r)}),ut.each(r.after,c)}),d=0,ut.each(e.afterBody,c),t.y-=r},drawFooter:function(t,e,i){var n=e.footer;n.length&&(t.x=Ze(e,e._footerAlign),t.y+=e.footerMarginTop,i.textAlign=e._footerAlign,i.textBaseline="top",i.fillStyle=e.footerFontColor,i.font=ut.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),ut.each(n,function(n){i.fillText(n,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing}))},drawBackground:function(t,e,i,n){i.fillStyle=e.backgroundColor,i.strokeStyle=e.borderColor,i.lineWidth=e.borderWidth;var a=e.xAlign,r=e.yAlign,o=t.x,s=t.y,l=n.width,u=n.height,d=e.cornerRadius;i.beginPath(),i.moveTo(o+d,s),"top"===r&&this.drawCaret(t,n),i.lineTo(o+l-d,s),i.quadraticCurveTo(o+l,s,o+l,s+d),"center"===r&&"right"===a&&this.drawCaret(t,n),i.lineTo(o+l,s+u-d),i.quadraticCurveTo(o+l,s+u,o+l-d,s+u),"bottom"===r&&this.drawCaret(t,n),i.lineTo(o+d,s+u),i.quadraticCurveTo(o,s+u,o,s+u-d),"center"===r&&"left"===a&&this.drawCaret(t,n),i.lineTo(o,s+d),i.quadraticCurveTo(o,s,o+d,s),i.closePath(),i.fill(),e.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(n,e,t,i),n.y+=e.yPadding,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),t.restore())}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!ut.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),Ke=je,Je=Xe;Je.positioners=Ke;var Qe=ut.valueOrDefault;function ti(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){if("xAxes"===t||"yAxes"===t){var a,r,o,s=i[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)o=i[t][a],r=Qe(o.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?ut.merge(e[t][a],[Ee.getScaleDefaults(r),o]):ut.merge(e[t][a],o)}else ut._merger(t,e,i,n)}})}function ei(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){var a=e[t]||{},r=i[t];"scales"===t?e[t]=ti(a,r):"scale"===t?e[t]=ut.merge(a,[Ee.getScaleDefaults(r.type),r]):ut._merger(t,e,i,n)}})}function ii(t){return"top"===t||"bottom"===t}ot._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var ni=function(t,e){return this.construct(t,e),this};ut.extend(ni.prototype,{construct:function(t,e){var i=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=ei(ot.global,ot[t.type],t.options||{}),t}(e);var n=Ve.acquireContext(t,e),a=n&&n.canvas,r=a&&a.height,o=a&&a.width;i.id=ut.uid(),i.ctx=n,i.canvas=a,i.config=e,i.width=o,i.height=r,i.aspectRatio=r?o/r:null,i.options=e.options,i._bufferedRender=!1,i.chart=i,i.controller=i,ni.instances[i.id]=i,Object.defineProperty(i,"data",{get:function(){return i.config.data},set:function(t){i.config.data=t}}),n&&a?(i.initialize(),i.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return He.notify(t,"beforeInit"),ut.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),He.notify(t,"afterInit"),t},clear:function(){return ut.canvas.clear(this),this},stop:function(){return vt.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,a=i.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(ut.getMaximumWidth(n))),o=Math.max(0,Math.floor(a?r/a:ut.getMaximumHeight(n)));if((e.width!==r||e.height!==o)&&(n.width=e.width=r,n.height=e.height=o,n.style.width=r+"px",n.style.height=o+"px",ut.retinaScale(e,i.devicePixelRatio),!t)){var s={width:r,height:o};He.notify(e,"resize",[s]),i.onResize&&i.onResize(e,s),e.stop(),e.update({duration:i.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;ut.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),ut.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,i=t.scales||{},n=[],a=Object.keys(i).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(n=n.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&n.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),ut.each(n,function(e){var n=e.options,r=n.id,o=Qe(n.type,e.dtype);ii(n.position)!==ii(e.dposition)&&(n.position=e.dposition),a[r]=!0;var s=null;if(r in i&&i[r].type===o)(s=i[r]).options=n,s.ctx=t.ctx,s.chart=t;else{var l=Ee.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:n,ctx:t.ctx,chart:t}),i[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),ut.each(a,function(t,e){t||delete i[e]}),t.scales=i,Ee.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t=this,e=[];return ut.each(t.data.datasets,function(i,n){var a=t.getDatasetMeta(n),r=i.type||t.config.type;if(a.type&&a.type!==r&&(t.destroyDatasetMeta(n),a=t.getDatasetMeta(n)),a.type=r,a.controller)a.controller.updateIndex(n),a.controller.linkScales();else{var o=ue[a.type];if(void 0===o)throw new Error('"'+a.type+'" is not a chart type.');a.controller=new o(t,n),e.push(a.controller)}},t),e},resetElements:function(){var t=this;ut.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,i,n=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),i=(e=n).options,ut.each(e.scales,function(t){xe.removeBox(e,t)}),i=ei(ot.global,ot[e.config.type],i),e.options=e.config.options=i,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=i.tooltips,e.tooltip.initialize(),He._invalidate(n),!1!==He.notify(n,"beforeUpdate")){n.tooltip._data=n.data;var a=n.buildOrUpdateControllers();ut.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),n.updateLayout(),n.options.animation&&n.options.animation.duration&&ut.each(a,function(t){t.reset()}),n.updateDatasets(),n.tooltip.initialize(),n.lastActive=[],He.notify(n,"afterUpdate"),n._bufferedRender?n._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:n.render(t)}},updateLayout:function(){!1!==He.notify(this,"beforeLayout")&&(xe.update(this,this.width,this.height),He.notify(this,"afterScaleUpdate"),He.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==He.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);He.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),i={meta:e,index:t};!1!==He.notify(this,"beforeDatasetUpdate",[i])&&(e.controller.update(),He.notify(this,"afterDatasetUpdate",[i]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var i=e.options.animation,n=Qe(t.duration,i&&i.duration),a=t.lazy;if(!1!==He.notify(e,"beforeRender")){var r=function(t){He.notify(e,"afterRender"),ut.callback(i&&i.onComplete,[t],e)};if(i&&n){var o=new pt({numSteps:n/16.66,easing:t.easing||i.easing,render:function(t,e){var i=ut.easing.effects[e.easing],n=e.currentStep,a=n/e.numSteps;t.draw(i(a),a,n)},onAnimationProgress:i.onProgress,onAnimationComplete:r});vt.addAnimation(e,o,n,a)}else e.draw(),r(new pt({numSteps:0,chart:e}));return e}},draw:function(t){var e=this;e.clear(),ut.isNullOrUndef(t)&&(t=1),e.transition(t),e.width<=0||e.height<=0||!1!==He.notify(e,"beforeDraw",[t])&&(ut.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.drawDatasets(t),e._drawTooltip(t),He.notify(e,"afterDraw",[t]))},transition:function(t){for(var e=0,i=(this.data.datasets||[]).length;e<i;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==He.notify(e,"beforeDatasetsDraw",[t])){for(var i=(e.data.datasets||[]).length-1;i>=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);He.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==He.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),He.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==He.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),He.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return pe.modes.single(this,t)},getElementsAtEvent:function(t){return pe.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return pe.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=pe.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return pe.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e<i;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,i=this.data.datasets[t],n=i._meta&&i._meta[e];n&&(n.controller.destroy(),delete i._meta[e])},destroy:function(){var t,e,i=this,n=i.canvas;for(i.stop(),t=0,e=i.data.datasets.length;t<e;++t)i.destroyDatasetMeta(t);n&&(i.unbindEvents(),ut.canvas.clear(i),Ve.releaseContext(i.ctx),i.canvas=null,i.ctx=null),He.notify(i,"destroy"),delete ni.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Je({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},i=function(){t.eventHandler.apply(t,arguments)};ut.each(t.options.events,function(n){Ve.addEventListener(t,n,i),e[n]=i}),t.options.responsive&&(i=function(){t.resize()},Ve.addEventListener(t,"resize",i),e.resize=i)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,ut.each(e,function(e,i){Ve.removeEventListener(t,i,e)}))},updateHoverStyle:function(t,e,i){var n,a,r,o=i?"setHoverStyle":"removeHoverStyle";for(a=0,r=t.length;a<r;++a)(n=t[a])&&this.getDatasetMeta(n._datasetIndex).controller[o](n)},eventHandler:function(t){var e=this,i=e.tooltip;if(!1!==He.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var n=e.handleEvent(t);i&&(n=i._start?i.handleEvent(t):n|i.handleEvent(t)),He.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):n&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,i=this,n=i.options||{},a=n.hover;return i.lastActive=i.lastActive||[],"mouseout"===t.type?i.active=[]:i.active=i.getElementsAtEventForMode(t,a.mode,a),ut.callback(n.onHover||n.hover.onHover,[t.native,i.active],i),"mouseup"!==t.type&&"click"!==t.type||n.onClick&&n.onClick.call(i,t.native,i.active),i.lastActive.length&&i.updateHoverStyle(i.lastActive,a.mode,!1),i.active.length&&a.mode&&i.updateHoverStyle(i.active,a.mode,!0),e=!ut.arrayEquals(i.active,i.lastActive),i.lastActive=i.active,e}}),ni.instances={};var ai=ni;ni.Controller=ni,ni.types={},ut.configMerge=ei,ut.scaleMerge=ti;function ri(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function oi(t){this.options=t||{}}ut.extend(oi.prototype,{formats:ri,parse:ri,format:ri,add:ri,diff:ri,startOf:ri,endOf:ri,_create:function(t){return t}}),oi.override=function(t){ut.extend(oi.prototype,t)};var si={_date:oi},li={formatters:{values:function(t){return ut.isArray(t)?t:""+t},linear:function(t,e,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var a=ut.log10(Math.abs(n)),r="";if(0!==t)if(Math.max(Math.abs(i[0]),Math.abs(i[i.length-1]))<1e-4){var o=ut.log10(Math.abs(t));r=t.toExponential(Math.floor(o)-Math.floor(a))}else{var s=-1*Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toFixed(s)}else r="0";return r},logarithmic:function(t,e,i){var n=t/Math.pow(10,Math.floor(ut.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===e||e===i.length-1?t.toExponential():""}}},ui=ut.valueOrDefault,di=ut.valueAtIndexOrDefault;function hi(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(t[e].label);return n}function ci(t,e,i){return ut.isArray(e)?ut.longestText(t,i,e):t.measureText(e).width}ot._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:li.formatters.values,minor:{},major:{}}});var fi=gt.extend({getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;for(var e in!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1}),t)"major"!==e&&"minor"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){ut.callback(this.options.beforeUpdate,[this])},update:function(t,e,i){var n,a,r,o,s,l,u=this;for(u.beforeUpdate(),u.maxWidth=t,u.maxHeight=e,u.margins=ut.extend({left:0,right:0,top:0,bottom:0},i),u._maxLabelLines=0,u.longestLabelWidth=0,u.longestTextCache=u.longestTextCache||{},u.beforeSetDimensions(),u.setDimensions(),u.afterSetDimensions(),u.beforeDataLimits(),u.determineDataLimits(),u.afterDataLimits(),u.beforeBuildTicks(),s=u.buildTicks()||[],s=u.afterBuildTicks(s)||s,u.beforeTickToLabelConversion(),r=u.convertTicksToLabels(s)||u.ticks,u.afterTickToLabelConversion(),u.ticks=r,n=0,a=r.length;n<a;++n)o=r[n],(l=s[n])?l.label=o:s.push(l={label:o,major:!1});return u._ticks=s,u.beforeCalculateTickRotation(),u.calculateTickRotation(),u.afterCalculateTickRotation(),u.beforeFit(),u.fit(),u.afterFit(),u.afterUpdate(),u.minSize},afterUpdate:function(){ut.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){ut.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){ut.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){ut.callback(this.options.beforeDataLimits,[this])},determineDataLimits:ut.noop,afterDataLimits:function(){ut.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){ut.callback(this.options.beforeBuildTicks,[this])},buildTicks:ut.noop,afterBuildTicks:function(t){var e=this;return ut.isArray(t)&&t.length?ut.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=ut.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){ut.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){ut.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){ut.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,i=t.options.ticks,n=hi(t._ticks),a=ut.options._parseFont(i);e.font=a.string;var r=i.minRotation||0;if(n.length&&t.options.display&&t.isHorizontal())for(var o,s=ut.longestText(e,a.string,n,t.longestTextCache),l=s,u=t.getPixelForTick(1)-t.getPixelForTick(0)-6;l>u&&r<i.maxRotation;){var d=ut.toRadians(r);if(o=Math.cos(d),Math.sin(d)*s>t.maxHeight){r--;break}r++,l=o*s}t.labelRotation=r},afterCalculateTickRotation:function(){ut.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){ut.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},i=hi(t._ticks),n=t.options,a=n.ticks,r=n.scaleLabel,o=n.gridLines,s=t._isVisible(),l=n.position,u=t.isHorizontal(),d=ut.options._parseFont,h=d(a),c=n.gridLines.tickMarkLength;if(e.width=u?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&o.drawTicks?c:0,e.height=u?s&&o.drawTicks?c:0:t.maxHeight,r.display&&s){var f=d(r),g=ut.options.toPadding(r.padding),m=f.lineHeight+g.height;u?e.height+=m:e.width+=m}if(a.display&&s){var p=ut.longestText(t.ctx,h.string,i,t.longestTextCache),v=ut.numberOfLabelLines(i),y=.5*h.size,b=t.options.ticks.padding;if(t._maxLabelLines=v,t.longestLabelWidth=p,u){var x=ut.toRadians(t.labelRotation),_=Math.cos(x),k=Math.sin(x)*p+h.lineHeight*v+y;e.height=Math.min(t.maxHeight,e.height+k+b),t.ctx.font=h.string;var w,M,S=ci(t.ctx,i[0],h.string),D=ci(t.ctx,i[i.length-1],h.string),C=t.getPixelForTick(0)-t.left,P=t.right-t.getPixelForTick(i.length-1);0!==t.labelRotation?(w="bottom"===l?_*S:_*y,M="bottom"===l?_*y:_*D):(w=S/2,M=D/2),t.paddingLeft=Math.max(w-C,0)+3,t.paddingRight=Math.max(M-P,0)+3}else a.mirror?p=0:p+=b+y,e.width=Math.min(t.maxWidth,e.width+p),t.paddingTop=h.size/2,t.paddingBottom=h.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){ut.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ut.isNullOrUndef(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:ut.noop,getPixelForValue:ut.noop,getValueForPixel:ut.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var r=e.left+a;return r+=e.isFullWidth()?e.margins.left:0}var o=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(o/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+i;return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n=this,a=n.isHorizontal(),r=n.options.ticks.minor,o=t.length,s=!1,l=r.maxTicksLimit,u=n._tickSize()*(o-1),d=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.PaddingBottom),h=[];for(u>d&&(s=1+Math.floor(u/d)),o>l&&(s=Math.max(s,1+Math.floor(o/l))),e=0;e<o;e++)i=t[e],s>1&&e%s>0&&delete i.label,h.push(i);return h},_tickSize:function(){var t=this,e=t.isHorizontal(),i=t.options.ticks.minor,n=ut.toRadians(t.labelRotation),a=Math.abs(Math.cos(n)),r=Math.abs(Math.sin(n)),o=i.autoSkipPadding||0,s=t.longestLabelWidth+o||0,l=ut.options._parseFont(i),u=t._maxLabelLines*l.lineHeight+o||0;return e?u*a>s*r?s/a:u/r:u*r<s*a?u/a:s/r},_isVisible:function(){var t,e,i,n=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=n.data.datasets.length;t<e;++t)if(n.isDatasetVisible(t)&&((i=n.getDatasetMeta(t)).xAxisID===this.id||i.yAxisID===this.id))return!0;return!1},draw:function(t){var e=this,i=e.options;if(e._isVisible()){var n,a,r,o=e.chart,s=e.ctx,l=ot.global.defaultFontColor,u=i.ticks.minor,d=i.ticks.major||u,h=i.gridLines,c=i.scaleLabel,f=i.position,g=0!==e.labelRotation,m=u.mirror,p=e.isHorizontal(),v=ut.options._parseFont,y=u.display&&u.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),b=ui(u.fontColor,l),x=v(u),_=x.lineHeight,k=ui(d.fontColor,l),w=v(d),M=u.padding,S=u.labelOffset,D=h.drawTicks?h.tickMarkLength:0,C=ui(c.fontColor,l),P=v(c),T=ut.options.toPadding(c.padding),O=ut.toRadians(e.labelRotation),I=[],A=h.drawBorder?di(h.lineWidth,0,0):0,F=ut._alignPixel;"top"===f?(n=F(o,e.bottom,A),a=e.bottom-D,r=n-A/2):"bottom"===f?(n=F(o,e.top,A),a=n+A/2,r=e.top+D):"left"===f?(n=F(o,e.right,A),a=e.right-D,r=n-A/2):(n=F(o,e.left,A),a=n+A/2,r=e.left+D);if(ut.each(y,function(n,s){if(!ut.isNullOrUndef(n.label)){var l,u,d,c,v,y,b,x,k,w,C,P,T,R,L,W,Y=n.label;s===e.zeroLineIndex&&i.offset===h.offsetGridLines?(l=h.zeroLineWidth,u=h.zeroLineColor,d=h.zeroLineBorderDash||[],c=h.zeroLineBorderDashOffset||0):(l=di(h.lineWidth,s),u=di(h.color,s),d=h.borderDash||[],c=h.borderDashOffset||0);var N=ut.isArray(Y)?Y.length:1,z=function(t,e,i){var n=t.getPixelForTick(e);return i&&(1===t.getTicks().length?n-=t.isHorizontal()?Math.max(n-t.left,t.right-n):Math.max(n-t.top,t.bottom-n):n-=0===e?(t.getPixelForTick(1)-n)/2:(n-t.getPixelForTick(e-1))/2),n}(e,s,h.offsetGridLines);if(p){var V=D+M;z<e.left-1e-7&&(u="rgba(0,0,0,0)"),v=b=k=C=F(o,z,l),y=a,x=r,T=e.getPixelForTick(s)+S,"top"===f?(w=F(o,t.top,A)+A/2,P=t.bottom,L=((g?1:.5)-N)*_,W=g?"left":"center",R=e.bottom-V):(w=t.top,P=F(o,t.bottom,A)-A/2,L=(g?0:.5)*_,W=g?"right":"center",R=e.top+V)}else{var H=(m?0:D)+M;z<e.top-1e-7&&(u="rgba(0,0,0,0)"),v=a,b=r,y=x=w=P=F(o,z,l),R=e.getPixelForTick(s)+S,L=(1-N)*_/2,"left"===f?(k=F(o,t.left,A)+A/2,C=t.right,W=m?"left":"right",T=e.right-H):(k=t.left,C=F(o,t.right,A)-A/2,W=m?"right":"left",T=e.left+H)}I.push({tx1:v,ty1:y,tx2:b,ty2:x,x1:k,y1:w,x2:C,y2:P,labelX:T,labelY:R,glWidth:l,glColor:u,glBorderDash:d,glBorderDashOffset:c,rotation:-1*O,label:Y,major:n.major,textOffset:L,textAlign:W})}}),ut.each(I,function(t){var e=t.glWidth,i=t.glColor;if(h.display&&e&&i&&(s.save(),s.lineWidth=e,s.strokeStyle=i,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),h.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),u.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=t.major?w.string:x.string,s.fillStyle=t.major?k:b,s.textBaseline="middle",s.textAlign=t.textAlign;var n=t.label,a=t.textOffset;if(ut.isArray(n))for(var r=0;r<n.length;++r)s.fillText(""+n[r],0,a),a+=_;else s.fillText(n,0,a);s.restore()}}),c.display){var R,L,W=0,Y=P.lineHeight/2;if(p)R=e.left+(e.right-e.left)/2,L="bottom"===f?e.bottom-Y-T.bottom:e.top+Y+T.top;else{var N="left"===f;R=N?e.left+Y+T.top:e.right-Y-T.top,L=e.top+(e.bottom-e.top)/2,W=N?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(R,L),s.rotate(W),s.textAlign="center",s.textBaseline="middle",s.fillStyle=C,s.font=P.string,s.fillText(c.labelString,0,0),s.restore()}if(A){var z,V,H,E,B=A,j=di(h.lineWidth,y.length-1,0);p?(z=F(o,e.left,B)-B/2,V=F(o,e.right,j)+j/2,H=E=n):(H=F(o,e.top,B)-B/2,E=F(o,e.bottom,j)+j/2,z=V=n),s.lineWidth=A,s.strokeStyle=di(h.color,0),s.beginPath(),s.moveTo(z,H),s.lineTo(V,E),s.stroke()}}}}),gi=fi.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t,e=this,i=e.getLabels();e.minIndex=0,e.maxIndex=i.length-1,void 0!==e.options.ticks.min&&(t=i.indexOf(e.options.ticks.min),e.minIndex=-1!==t?t:e.minIndex),void 0!==e.options.ticks.max&&(t=i.indexOf(e.options.ticks.max),e.maxIndex=-1!==t?t:e.maxIndex),e.min=i[e.minIndex],e.max=i[e.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var i=this,n=i.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===i.id?i.getRightValue(n.data.datasets[e].data[t]):i.ticks[t-i.minIndex]},getPixelForValue:function(t,e){var i,n=this,a=n.options.offset,r=Math.max(n.maxIndex+1-n.minIndex-(a?0:1),1);if(null!=t&&(i=n.isHorizontal()?t.x:t.y),void 0!==i||void 0!==t&&isNaN(e)){t=i||t;var o=n.getLabels().indexOf(t);e=-1!==o?o:e}if(n.isHorizontal()){var s=n.width/r,l=s*(e-n.minIndex);return a&&(l+=s/2),n.left+l}var u=n.height/r,d=u*(e-n.minIndex);return a&&(d+=u/2),n.top+d},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,i=e.options.offset,n=Math.max(e._ticks.length-(i?0:1),1),a=e.isHorizontal(),r=(a?e.width:e.height)/n;return t-=a?e.left:e.top,i&&(t-=r/2),(t<=0?0:Math.round(t/r))+e.minIndex},getBasePixel:function(){return this.bottom}}),mi={position:"bottom"};gi._defaults=mi;var pi=ut.noop,vi=ut.isNullOrUndef;var yi=fi.extend({getRightValue:function(t){return"string"==typeof t?+t:fi.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var i=ut.sign(t.min),n=ut.sign(t.max);i<0&&n<0?t.max=0:i>0&&n>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,i=e.stepSize,n=e.maxTicksLimit;return i?t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1:(t=this._computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:pi,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),n={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,precision:e.precision,stepSize:ut.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var i,n,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,m=ut.niceNum((g-f)/u/l)*l;if(m<1e-14&&vi(d)&&vi(h))return[f,g];(r=Math.ceil(g/m)-Math.floor(f/m))>u&&(m=ut.niceNum(r*m/u/l)*l),s||vi(c)?i=Math.pow(10,ut._decimalPlaces(m)):(i=Math.pow(10,c),m=Math.ceil(m*i)/i),n=Math.floor(f/m)*m,a=Math.ceil(g/m)*m,s&&(!vi(d)&&ut.almostWhole(d/m,m/1e3)&&(n=d),!vi(h)&&ut.almostWhole(h/m,m/1e3)&&(a=h)),r=(a-n)/m,r=ut.almostEquals(r,Math.round(r),m/1e3)?Math.round(r):Math.ceil(r),n=Math.round(n*i)/i,a=Math.round(a*i)/i,o.push(vi(d)?n:d);for(var p=1;p<r;++p)o.push(Math.round((n+p*m)*i)/i);return o.push(vi(h)?a:h),o}(n,t);t.handleDirectionalChanges(),t.max=ut.max(a),t.min=ut.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),fi.prototype.convertTicksToLabels.call(t)}}),bi={position:"left",ticks:{callback:li.formatters.linear}},xi=yi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function r(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null;var o=e.stacked;if(void 0===o&&ut.each(n,function(t,e){if(!o){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&r(n)&&void 0!==n.stack&&(o=!0)}}),e.stacked||o){var s={};ut.each(n,function(n,a){var o=i.getDatasetMeta(a),l=[o.type,void 0===e.stacked&&void 0===o.stack?a:"",o.stack].join(".");void 0===s[l]&&(s[l]={positiveValues:[],negativeValues:[]});var u=s[l].positiveValues,d=s[l].negativeValues;i.isDatasetVisible(a)&&r(o)&&ut.each(n.data,function(i,n){var a=+t.getRightValue(i);isNaN(a)||o.data[n].hidden||(u[n]=u[n]||0,d[n]=d[n]||0,e.relativePoints?u[n]=100:a<0?d[n]+=a:u[n]+=a)})}),ut.each(s,function(e){var i=e.positiveValues.concat(e.negativeValues),n=ut.min(i),a=ut.max(i);t.min=null===t.min?n:Math.min(t.min,n),t.max=null===t.max?a:Math.max(t.max,a)})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&r(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=ut.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}}),_i=bi;xi._defaults=_i;var ki=ut.valueOrDefault;var wi={position:"left",ticks:{callback:li.formatters.logarithmic}};function Mi(t,e){return ut.isFinite(t)&&t>=0?t:e}var Si=fi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function r(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var o=e.stacked;if(void 0===o&&ut.each(n,function(t,e){if(!o){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&r(n)&&void 0!==n.stack&&(o=!0)}}),e.stacked||o){var s={};ut.each(n,function(n,a){var o=i.getDatasetMeta(a),l=[o.type,void 0===e.stacked&&void 0===o.stack?a:"",o.stack].join(".");i.isDatasetVisible(a)&&r(o)&&(void 0===s[l]&&(s[l]=[]),ut.each(n.data,function(e,i){var n=s[l],a=+t.getRightValue(e);isNaN(a)||o.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),ut.each(s,function(e){if(e.length>0){var i=ut.min(e),n=ut.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?n:Math.max(t.max,n)}})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&r(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||n<0||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n),0!==n&&(null===t.minNotZero||n<t.minNotZero)&&(t.minNotZero=n))})});this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=Mi(e.min,t.min),t.max=Mi(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(ut.log10(t.min))-1),t.max=Math.pow(10,Math.floor(ut.log10(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(ut.log10(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(ut.log10(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(ut.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),n={min:Mi(e.min),max:Mi(e.max)},a=t.ticks=function(t,e){var i,n,a=[],r=ki(t.min,Math.pow(10,Math.floor(ut.log10(e.min)))),o=Math.floor(ut.log10(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(i=Math.floor(ut.log10(e.minNotZero)),n=Math.floor(e.minNotZero/Math.pow(10,i)),a.push(r),r=n*Math.pow(10,i)):(i=Math.floor(ut.log10(r)),n=Math.floor(r/Math.pow(10,i)));var l=i<0?Math.pow(10,Math.abs(i)):1;do{a.push(r),10==++n&&(n=1,l=++i>=0?1:l),r=Math.round(n*Math.pow(10,i)*l)/l}while(i<o||i===o&&n<s);var u=ki(t.max,r);return a.push(u),a}(n,t);t.max=ut.max(a),t.min=ut.min(a),e.reverse?(i=!i,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),i&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),fi.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},_getFirstTickValue:function(t){var e=Math.floor(ut.log10(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},getPixelForValue:function(t){var e,i,n,a,r,o=this,s=o.options.ticks,l=s.reverse,u=ut.log10,d=o._getFirstTickValue(o.minNotZero),h=0;return t=+o.getRightValue(t),l?(n=o.end,a=o.start,r=-1):(n=o.start,a=o.end,r=1),o.isHorizontal()?(e=o.width,i=l?o.right:o.left):(e=o.height,r*=-1,i=l?o.top:o.bottom),t!==n&&(0===n&&(e-=h=ki(s.fontSize,ot.global.defaultFontSize),n=d),0!==t&&(h+=e/(u(a)-u(n))*(u(t)-u(n))),i+=r*h),i},getValueForPixel:function(t){var e,i,n,a,r=this,o=r.options.ticks,s=o.reverse,l=ut.log10,u=r._getFirstTickValue(r.minNotZero);if(s?(i=r.end,n=r.start):(i=r.start,n=r.end),r.isHorizontal()?(e=r.width,a=s?r.right-t:t-r.left):(e=r.height,a=s?t-r.top:r.bottom-t),a!==i){if(0===i){var d=ki(o.fontSize,ot.global.defaultFontSize);a-=d,e-=d,i=u}a*=l(n)-l(i),a/=e,a=Math.pow(10,l(i)+a)}return a}}),Di=wi;Si._defaults=Di;var Ci=ut.valueOrDefault,Pi=ut.valueAtIndexOrDefault,Ti=ut.options.resolve,Oi={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:li.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Ii(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function Ai(t){var e=t.ticks;return e.display&&t.display?Ci(e.fontSize,ot.global.defaultFontSize)+2*e.backdropPaddingY:0}function Fi(t,e,i,n,a){return t===n||t===a?{start:e-i/2,end:e+i/2}:t<n||t>a?{start:e-i,end:e}:{start:e,end:e+i}}function Ri(t){return 0===t||180===t?"center":t<180?"left":"right"}function Li(t,e,i,n){var a,r,o=i.y+n/2;if(ut.isArray(e))for(a=0,r=e.length;a<r;++a)t.fillText(e[a],i.x,o),o+=n;else t.fillText(e,i.x,o)}function Wi(t,e,i){90===t||270===t?i.y-=e.h/2:(t>270||t<90)&&(i.y-=e.h)}function Yi(t){return ut.isNumber(t)?t:0}var Ni=yi.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Ai(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;ut.each(e.data.datasets,function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);ut.each(a.data,function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(i=Math.min(r,i),n=Math.max(r,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Ai(this.options))},convertTicksToLabels:function(){var t=this;yi.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(t.options.pointLabels.callback,t)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,i,n,a=ut.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=Ii(t);for(e=0;e<d;e++){n=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,u=t.pointLabels[e]||"",i=ut.isArray(u)?{w:ut.longestText(s,s.font,u),h:u.length*l}:{w:s.measureText(u).width,h:l},t._pointLabelSizes[e]=i;var h=t.getIndexAngle(e),c=ut.toDegrees(h)%360,f=Fi(c,n.x,i.w,0,180),g=Fi(c,n.y,i.h,90,270);f.start<r.l&&(r.l=f.start,o.l=h),f.end>r.r&&(r.r=f.end,o.r=h),g.start<r.t&&(r.t=g.start,o.t=h),g.end>r.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,i){var n=this,a=e.l/Math.sin(i.l),r=Math.max(e.r-n.width,0)/Math.sin(i.r),o=-e.t/Math.cos(i.t),s=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);a=Yi(a),r=Yi(r),o=Yi(o),s=Yi(s),n.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),n.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,i,n){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=i+a.drawingArea,l=a.height-a.paddingTop-n-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){return t*(2*Math.PI/Ii(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+this.xCenter,y:Math.sin(i)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,e=t.options,i=e.gridLines,n=e.ticks;if(e.display){var a=t.ctx,r=this.getIndexAngle(0),o=ut.options._parseFont(n);(e.angleLines.display||e.pointLabels.display)&&function(t){var e=t.ctx,i=t.options,n=i.angleLines,a=i.gridLines,r=i.pointLabels,o=Ci(n.lineWidth,a.lineWidth),s=Ci(n.color,a.color),l=Ai(i);e.save(),e.lineWidth=o,e.strokeStyle=s,e.setLineDash&&(e.setLineDash(Ti([n.borderDash,a.borderDash,[]])),e.lineDashOffset=Ti([n.borderDashOffset,a.borderDashOffset,0]));var u=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),d=ut.options._parseFont(r);e.font=d.string,e.textBaseline="middle";for(var h=Ii(t)-1;h>=0;h--){if(n.display&&o&&s){var c=t.getPointPosition(h,u);e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(c.x,c.y),e.stroke()}if(r.display){var f=0===h?l/2:0,g=t.getPointPosition(h,u+f+5),m=Pi(r.fontColor,h,ot.global.defaultFontColor);e.fillStyle=m;var p=t.getIndexAngle(h),v=ut.toDegrees(p);e.textAlign=Ri(v),Wi(v,t._pointLabelSizes[h],g),Li(e,t.pointLabels[h]||"",g,d.lineHeight)}}e.restore()}(t),ut.each(t.ticks,function(e,s){if(s>0||n.reverse){var l=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(i.display&&0!==s&&function(t,e,i,n){var a,r=t.ctx,o=e.circular,s=Ii(t),l=Pi(e.color,n-1),u=Pi(e.lineWidth,n-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI);else{a=t.getPointPosition(0,i),r.moveTo(a.x,a.y);for(var d=1;d<s;d++)a=t.getPointPosition(d,i),r.lineTo(a.x,a.y)}r.closePath(),r.stroke(),r.restore()}}(t,i,l,s),n.display){var u=Ci(n.fontColor,ot.global.defaultFontColor);if(a.font=o.string,a.save(),a.translate(t.xCenter,t.yCenter),a.rotate(r),n.showLabelBackdrop){var d=a.measureText(e).width;a.fillStyle=n.backdropColor,a.fillRect(-d/2-n.backdropPaddingX,-l-o.size/2-n.backdropPaddingY,d+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)}a.textAlign="center",a.textBaseline="middle",a.fillStyle=u,a.fillText(e,0,-l),a.restore()}}})}}}),zi=Oi;Ni._defaults=zi;var Vi=ut.valueOrDefault,Hi=Number.MIN_SAFE_INTEGER||-9007199254740991,Ei=Number.MAX_SAFE_INTEGER||9007199254740991,Bi={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,15,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,15,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},ji=Object.keys(Bi);function Ui(t,e){return t-e}function Gi(t){var e,i,n,a={},r=[];for(e=0,i=t.length;e<i;++e)a[n=t[e]]||(a[n]=!0,r.push(n));return r}function qi(t,e,i,n){var a=function(t,e,i){for(var n,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(n=o+s>>1)-1]||null,r=t[n],!a)return{lo:null,hi:r};if(r[e]<i)o=n+1;else{if(!(a[e]>i))return{lo:a,hi:r};s=n-1}}return{lo:r,hi:null}}(t,e,i),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(i-r[e])/s:0,u=(o[n]-r[n])*l;return r[n]+u}function Zi(t,e){var i=t._adapter,n=t.options.time,a=n.parser,r=a||n.format,o=e;return"function"==typeof a&&(o=a(o)),ut.isFinite(o)||(o="string"==typeof r?i.parse(o,r):i.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),ut.isFinite(o)||(o=i.parse(o))),o)}function $i(t,e){if(ut.isNullOrUndef(e))return null;var i=t.options.time,n=Zi(t,t.getRightValue(e));return null===n?n:(i.round&&(n=+t._adapter.startOf(n,i.round)),n)}function Xi(t){for(var e=ji.indexOf(t)+1,i=ji.length;e<i;++e)if(Bi[ji[e]].common)return ji[e]}function Ki(t,e,i,n){var a,r=t._adapter,o=t.options,s=o.time,l=s.unit||function(t,e,i,n){var a,r,o,s=ji.length;for(a=ji.indexOf(t);a<s-1;++a)if(o=(r=Bi[ji[a]]).steps?r.steps[r.steps.length-1]:Ei,r.common&&Math.ceil((i-e)/(o*r.size))<=n)return ji[a];return ji[s-1]}(s.minUnit,e,i,n),u=Xi(l),d=Vi(s.stepSize,s.unitStepSize),h="week"===l&&s.isoWeekday,c=o.ticks.major.enabled,f=Bi[l],g=e,m=i,p=[];for(d||(d=function(t,e,i,n){var a,r,o,s=e-t,l=Bi[i],u=l.size,d=l.steps;if(!d)return Math.ceil(s/(n*u));for(a=0,r=d.length;a<r&&(o=d[a],!(Math.ceil(s/(u*o))<=n));++a);return o}(e,i,l,n)),h&&(g=+r.startOf(g,"isoWeek",h),m=+r.startOf(m,"isoWeek",h)),g=+r.startOf(g,h?"day":l),(m=+r.startOf(m,h?"day":l))<i&&(m=+r.add(m,1,l)),a=g,c&&u&&!h&&!s.round&&(a=+r.startOf(a,u),a=+r.add(a,~~((g-a)/(f.size*d))*d,l));a<m;a=+r.add(a,d,l))p.push(+a);return p.push(+a),p}var Ji=fi.extend({initialize:function(){this.mergeTicksOptions(),fi.prototype.initialize.call(this)},update:function(){var t=this.options,e=t.time||(t.time={}),i=this._adapter=new si._date(t.adapters.date);return e.format&&console.warn("options.time.format is deprecated and replaced by options.time.parser."),ut.mergeIf(e.displayFormats,i.formats()),fi.prototype.update.apply(this,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),fi.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,i,n,a,r,o=this,s=o.chart,l=o._adapter,u=o.options.time,d=u.unit||"day",h=Ei,c=Hi,f=[],g=[],m=[],p=s.data.labels||[];for(t=0,i=p.length;t<i;++t)m.push($i(o,p[t]));for(t=0,i=(s.data.datasets||[]).length;t<i;++t)if(s.isDatasetVisible(t))if(a=s.data.datasets[t].data,ut.isObject(a[0]))for(g[t]=[],e=0,n=a.length;e<n;++e)r=$i(o,a[e]),f.push(r),g[t][e]=r;else{for(e=0,n=m.length;e<n;++e)f.push(m[e]);g[t]=m.slice(0)}else g[t]=[];m.length&&(m=Gi(m).sort(Ui),h=Math.min(h,m[0]),c=Math.max(c,m[m.length-1])),f.length&&(f=Gi(f).sort(Ui),h=Math.min(h,f[0]),c=Math.max(c,f[f.length-1])),h=$i(o,u.min)||h,c=$i(o,u.max)||c,h=h===Ei?+l.startOf(Date.now(),d):h,c=c===Hi?+l.endOf(Date.now(),d)+1:c,o.min=Math.min(h,c),o.max=Math.max(h+1,c),o._horizontal=o.isHorizontal(),o._table=[],o._timestamps={data:f,datasets:g,labels:m}},buildTicks:function(){var t,e,i,n=this,a=n.min,r=n.max,o=n.options,s=o.time,l=[],u=[];switch(o.ticks.source){case"data":l=n._timestamps.data;break;case"labels":l=n._timestamps.labels;break;case"auto":default:l=Ki(n,a,r,n.getLabelCapacity(a))}for("ticks"===o.bounds&&l.length&&(a=l[0],r=l[l.length-1]),a=$i(n,s.min)||a,r=$i(n,s.max)||r,t=0,e=l.length;t<e;++t)(i=l[t])>=a&&i<=r&&u.push(i);return n.min=a,n.max=r,n._unit=s.unit||function(t,e,i,n,a){var r,o;for(r=ji.length-1;r>=ji.indexOf(i);r--)if(o=ji[r],Bi[o].common&&t._adapter.diff(a,n,o)>=e.length)return o;return ji[i?ji.indexOf(i):0]}(n,u,s.minUnit,n.min,n.max),n._majorUnit=Xi(n._unit),n._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<i&&d.push(s);for(d.push(i),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(n._timestamps.data,a,r,o.distribution),n._offsets=function(t,e,i,n,a){var r,o,s=0,l=0;return a.offset&&e.length&&(a.time.min||(r=qi(t,"time",e[0],"pos"),s=1===e.length?1-r:(qi(t,"time",e[1],"pos")-r)/2),a.time.max||(o=qi(t,"time",e[e.length-1],"pos"),l=1===e.length?o:(o-qi(t,"time",e[e.length-2],"pos"))/2)),{start:s,end:l}}(n._table,u,0,0,o),o.ticks.reverse&&u.reverse(),function(t,e,i){var n,a,r,o,s=[];for(n=0,a=e.length;n<a;++n)r=e[n],o=!!i&&r===+t._adapter.startOf(r,i),s.push({value:r,major:o});return s}(n,u,n._majorUnit)},getLabelForIndex:function(t,e){var i=this,n=i._adapter,a=i.chart.data,r=i.options.time,o=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return ut.isObject(s)&&(o=i.getRightValue(s)),r.tooltipFormat?n.format(Zi(i,o),r.tooltipFormat):"string"==typeof o?o:n.format(Zi(i,o),r.displayFormats.datetime)},tickFormatFunction:function(t,e,i,n){var a=this._adapter,r=this.options,o=r.time.displayFormats,s=o[this._unit],l=this._majorUnit,u=o[l],d=+a.startOf(t,l),h=r.ticks.major,c=h.enabled&&l&&u&&t===d,f=a.format(t,n||(c?u:s)),g=c?h:r.ticks.minor,m=Vi(g.callback,g.userCallback);return m?m(f,e,i):f},convertTicksToLabels:function(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(this.tickFormatFunction(t[e].value,e,t));return n},getPixelForOffset:function(t){var e=this,i=e.options.ticks.reverse,n=e._horizontal?e.width:e.height,a=e._horizontal?i?e.right:e.left:i?e.bottom:e.top,r=qi(e._table,"time",t,"pos"),o=n*(e._offsets.start+r)/(e._offsets.start+1+e._offsets.end);return i?a-o:a+o},getPixelForValue:function(t,e,i){var n=null;if(void 0!==e&&void 0!==i&&(n=this._timestamps.datasets[i][e]),null===n&&(n=$i(this,t)),null!==n)return this.getPixelForOffset(n)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,i=e._horizontal?e.width:e.height,n=e._horizontal?e.left:e.top,a=(i?(t-n)/i:0)*(e._offsets.start+1+e._offsets.start)-e._offsets.end,r=qi(e._table,"pos",a,"time");return e._adapter._create(r)},getLabelWidth:function(t){var e=this.options.ticks,i=this.ctx.measureText(t).width,n=ut.toRadians(e.maxRotation),a=Math.cos(n),r=Math.sin(n);return i*a+Vi(e.fontSize,ot.global.defaultFontSize)*r},getLabelCapacity:function(t){var e=this,i=e.options.time.displayFormats.millisecond,n=e.tickFormatFunction(t,0,[],i),a=e.getLabelWidth(n),r=e.isHorizontal()?e.width:e.height,o=Math.floor(r/a);return o>0?o:1}}),Qi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};Ji._defaults=Qi;var tn,en={category:gi,linear:xi,logarithmic:Si,radialLinear:Ni,time:Ji},nn=(function(t,e){t.exports=function(){var e,i;function n(){return e.apply(null,arguments)}function a(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function r(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function o(t){return void 0===t}function s(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function l(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function u(t,e){var i,n=[];for(i=0;i<t.length;++i)n.push(e(t[i],i));return n}function d(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function h(t,e){for(var i in e)d(e,i)&&(t[i]=e[i]);return d(e,"toString")&&(t.toString=e.toString),d(e,"valueOf")&&(t.valueOf=e.valueOf),t}function c(t,e,i,n){return Oe(t,e,i,n,!0).utc()}function f(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}function g(t){if(null==t._isValid){var e=f(t),n=i.call(e.parsedDateParts,function(t){return null!=t}),a=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(a=a&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return a;t._isValid=a}return t._isValid}function m(t){var e=c(NaN);return null!=t?h(f(e),t):f(e).userInvalidated=!0,e}i=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,n=0;n<i;n++)if(n in e&&t.call(this,e[n],n,e))return!0;return!1};var p=n.momentProperties=[];function v(t,e){var i,n,a;if(o(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),o(e._i)||(t._i=e._i),o(e._f)||(t._f=e._f),o(e._l)||(t._l=e._l),o(e._strict)||(t._strict=e._strict),o(e._tzm)||(t._tzm=e._tzm),o(e._isUTC)||(t._isUTC=e._isUTC),o(e._offset)||(t._offset=e._offset),o(e._pf)||(t._pf=f(e)),o(e._locale)||(t._locale=e._locale),p.length>0)for(i=0;i<p.length;i++)n=p[i],o(a=e[n])||(t[n]=a);return t}var y=!1;function b(t){v(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===y&&(y=!0,n.updateOffset(this),y=!1)}function x(t){return t instanceof b||null!=t&&null!=t._isAMomentObject}function _(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function k(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=_(e)),i}function w(t,e,i){var n,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(n=0;n<a;n++)(i&&t[n]!==e[n]||!i&&k(t[n])!==k(e[n]))&&o++;return o+r}function M(t){!1===n.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function S(t,e){var i=!0;return h(function(){if(null!=n.deprecationHandler&&n.deprecationHandler(null,t),i){for(var a,r=[],o=0;o<arguments.length;o++){if(a="","object"==typeof arguments[o]){for(var s in a+="\n["+o+"] ",arguments[0])a+=s+": "+arguments[0][s]+", ";a=a.slice(0,-2)}else a=arguments[o];r.push(a)}M(t+"\nArguments: "+Array.prototype.slice.call(r).join("")+"\n"+(new Error).stack),i=!1}return e.apply(this,arguments)},e)}var D,C={};function P(t,e){null!=n.deprecationHandler&&n.deprecationHandler(t,e),C[t]||(M(e),C[t]=!0)}function T(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function O(t,e){var i,n=h({},t);for(i in e)d(e,i)&&(r(t[i])&&r(e[i])?(n[i]={},h(n[i],t[i]),h(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)d(t,i)&&!d(e,i)&&r(t[i])&&(n[i]=h({},n[i]));return n}function I(t){null!=t&&this.set(t)}n.suppressDeprecationWarnings=!1,n.deprecationHandler=null,D=Object.keys?Object.keys:function(t){var e,i=[];for(e in t)d(t,e)&&i.push(e);return i};var A={};function F(t,e){var i=t.toLowerCase();A[i]=A[i+"s"]=A[e]=t}function R(t){return"string"==typeof t?A[t]||A[t.toLowerCase()]:void 0}function L(t){var e,i,n={};for(i in t)d(t,i)&&(e=R(i))&&(n[e]=t[i]);return n}var W={};function Y(t,e){W[t]=e}function N(t,e,i){var n=""+Math.abs(t),a=e-n.length,r=t>=0;return(r?i?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+n}var z=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,H={},E={};function B(t,e,i,n){var a=n;"string"==typeof n&&(a=function(){return this[n]()}),t&&(E[t]=a),e&&(E[e[0]]=function(){return N(a.apply(this,arguments),e[1],e[2])}),i&&(E[i]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function j(t,e){return t.isValid()?(e=U(e,t.localeData()),H[e]=H[e]||function(t){var e,i,n,a=t.match(z);for(e=0,i=a.length;e<i;e++)E[a[e]]?a[e]=E[a[e]]:a[e]=(n=a[e]).match(/\[[\s\S]/)?n.replace(/^\[|\]$/g,""):n.replace(/\\/g,"");return function(e){var n,r="";for(n=0;n<i;n++)r+=T(a[n])?a[n].call(e,t):a[n];return r}}(e),H[e](t)):t.localeData().invalidDate()}function U(t,e){var i=5;function n(t){return e.longDateFormat(t)||t}for(V.lastIndex=0;i>=0&&V.test(t);)t=t.replace(V,n),V.lastIndex=0,i-=1;return t}var G=/\d/,q=/\d\d/,Z=/\d{3}/,$=/\d{4}/,X=/[+-]?\d{6}/,K=/\d\d?/,J=/\d\d\d\d?/,Q=/\d\d\d\d\d\d?/,tt=/\d{1,3}/,et=/\d{1,4}/,it=/[+-]?\d{1,6}/,nt=/\d+/,at=/[+-]?\d+/,rt=/Z|[+-]\d\d:?\d\d/gi,ot=/Z|[+-]\d\d(?::?\d\d)?/gi,st=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,lt={};function ut(t,e,i){lt[t]=T(e)?e:function(t,n){return t&&i?i:e}}function dt(t,e){return d(lt,t)?lt[t](e._strict,e._locale):new RegExp(ht(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,n,a){return e||i||n||a})))}function ht(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ct={};function ft(t,e){var i,n=e;for("string"==typeof t&&(t=[t]),s(e)&&(n=function(t,i){i[e]=k(t)}),i=0;i<t.length;i++)ct[t[i]]=n}function gt(t,e){ft(t,function(t,i,n,a){n._w=n._w||{},e(t,n._w,n,a)})}function mt(t,e,i){null!=e&&d(ct,t)&&ct[t](e,i._a,i,t)}var pt=0,vt=1,yt=2,bt=3,xt=4,_t=5,kt=6,wt=7,Mt=8;function St(t){return Dt(t)?366:365}function Dt(t){return t%4==0&&t%100!=0||t%400==0}B("Y",0,0,function(){var t=this.year();return t<=9999?""+t:"+"+t}),B(0,["YY",2],0,function(){return this.year()%100}),B(0,["YYYY",4],0,"year"),B(0,["YYYYY",5],0,"year"),B(0,["YYYYYY",6,!0],0,"year"),F("year","y"),Y("year",1),ut("Y",at),ut("YY",K,q),ut("YYYY",et,$),ut("YYYYY",it,X),ut("YYYYYY",it,X),ft(["YYYYY","YYYYYY"],pt),ft("YYYY",function(t,e){e[pt]=2===t.length?n.parseTwoDigitYear(t):k(t)}),ft("YY",function(t,e){e[pt]=n.parseTwoDigitYear(t)}),ft("Y",function(t,e){e[pt]=parseInt(t,10)}),n.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)};var Ct,Pt=Tt("FullYear",!0);function Tt(t,e){return function(i){return null!=i?(It(this,t,i),n.updateOffset(this,e),this):Ot(this,t)}}function Ot(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function It(t,e,i){t.isValid()&&!isNaN(i)&&("FullYear"===e&&Dt(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](i,t.month(),At(i,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](i))}function At(t,e){if(isNaN(t)||isNaN(e))return NaN;var i,n=(e%(i=12)+i)%i;return t+=(e-n)/12,1===n?Dt(t)?29:28:31-n%7%2}Ct=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},B("M",["MM",2],"Mo",function(){return this.month()+1}),B("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),B("MMMM",0,0,function(t){return this.localeData().months(this,t)}),F("month","M"),Y("month",8),ut("M",K),ut("MM",K,q),ut("MMM",function(t,e){return e.monthsShortRegex(t)}),ut("MMMM",function(t,e){return e.monthsRegex(t)}),ft(["M","MM"],function(t,e){e[vt]=k(t)-1}),ft(["MMM","MMMM"],function(t,e,i,n){var a=i._locale.monthsParse(t,n,i._strict);null!=a?e[vt]=a:f(i).invalidMonth=t});var Ft=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Rt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Lt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Wt(t,e){var i;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=k(e);else if(!s(e=t.localeData().monthsParse(e)))return t;return i=Math.min(t.date(),At(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t}function Yt(t){return null!=t?(Wt(this,t),n.updateOffset(this,!0),this):Ot(this,"Month")}var Nt=st,zt=st;function Vt(){function t(t,e){return e.length-t.length}var e,i,n=[],a=[],r=[];for(e=0;e<12;e++)i=c([2e3,e]),n.push(this.monthsShort(i,"")),a.push(this.months(i,"")),r.push(this.months(i,"")),r.push(this.monthsShort(i,""));for(n.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)n[e]=ht(n[e]),a[e]=ht(a[e]);for(e=0;e<24;e++)r[e]=ht(r[e]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+n.join("|")+")","i")}function Ht(t){var e;if(t<100&&t>=0){var i=Array.prototype.slice.call(arguments);i[0]=t+400,e=new Date(Date.UTC.apply(null,i)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function Et(t,e,i){var n=7+e-i,a=(7+Ht(t,0,n).getUTCDay()-e)%7;return-a+n-1}function Bt(t,e,i,n,a){var r,o,s=(7+i-n)%7,l=Et(t,n,a),u=1+7*(e-1)+s+l;return u<=0?o=St(r=t-1)+u:u>St(t)?(r=t+1,o=u-St(t)):(r=t,o=u),{year:r,dayOfYear:o}}function jt(t,e,i){var n,a,r=Et(t.year(),e,i),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?(a=t.year()-1,n=o+Ut(a,e,i)):o>Ut(t.year(),e,i)?(n=o-Ut(t.year(),e,i),a=t.year()+1):(a=t.year(),n=o),{week:n,year:a}}function Ut(t,e,i){var n=Et(t,e,i),a=Et(t+1,e,i);return(St(t)-n+a)/7}function Gt(t,e){return t.slice(e,7).concat(t.slice(0,e))}B("w",["ww",2],"wo","week"),B("W",["WW",2],"Wo","isoWeek"),F("week","w"),F("isoWeek","W"),Y("week",5),Y("isoWeek",5),ut("w",K),ut("ww",K,q),ut("W",K),ut("WW",K,q),gt(["w","ww","W","WW"],function(t,e,i,n){e[n.substr(0,1)]=k(t)}),B("d",0,"do","day"),B("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),B("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),B("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),B("e",0,0,"weekday"),B("E",0,0,"isoWeekday"),F("day","d"),F("weekday","e"),F("isoWeekday","E"),Y("day",11),Y("weekday",11),Y("isoWeekday",11),ut("d",K),ut("e",K),ut("E",K),ut("dd",function(t,e){return e.weekdaysMinRegex(t)}),ut("ddd",function(t,e){return e.weekdaysShortRegex(t)}),ut("dddd",function(t,e){return e.weekdaysRegex(t)}),gt(["dd","ddd","dddd"],function(t,e,i,n){var a=i._locale.weekdaysParse(t,n,i._strict);null!=a?e.d=a:f(i).invalidWeekday=t}),gt(["d","e","E"],function(t,e,i,n){e[n]=k(t)});var qt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Zt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),$t="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Xt=st,Kt=st,Jt=st;function Qt(){function t(t,e){return e.length-t.length}var e,i,n,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)i=c([2e3,1]).day(e),n=this.weekdaysMin(i,""),a=this.weekdaysShort(i,""),r=this.weekdays(i,""),o.push(n),s.push(a),l.push(r),u.push(n),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ht(s[e]),l[e]=ht(l[e]),u[e]=ht(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function te(){return this.hours()%12||12}function ee(t,e){B(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function ie(t,e){return e._meridiemParse}B("H",["HH",2],0,"hour"),B("h",["hh",2],0,te),B("k",["kk",2],0,function(){return this.hours()||24}),B("hmm",0,0,function(){return""+te.apply(this)+N(this.minutes(),2)}),B("hmmss",0,0,function(){return""+te.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)}),B("Hmm",0,0,function(){return""+this.hours()+N(this.minutes(),2)}),B("Hmmss",0,0,function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)}),ee("a",!0),ee("A",!1),F("hour","h"),Y("hour",13),ut("a",ie),ut("A",ie),ut("H",K),ut("h",K),ut("k",K),ut("HH",K,q),ut("hh",K,q),ut("kk",K,q),ut("hmm",J),ut("hmmss",Q),ut("Hmm",J),ut("Hmmss",Q),ft(["H","HH"],bt),ft(["k","kk"],function(t,e,i){var n=k(t);e[bt]=24===n?0:n}),ft(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),ft(["h","hh"],function(t,e,i){e[bt]=k(t),f(i).bigHour=!0}),ft("hmm",function(t,e,i){var n=t.length-2;e[bt]=k(t.substr(0,n)),e[xt]=k(t.substr(n)),f(i).bigHour=!0}),ft("hmmss",function(t,e,i){var n=t.length-4,a=t.length-2;e[bt]=k(t.substr(0,n)),e[xt]=k(t.substr(n,2)),e[_t]=k(t.substr(a)),f(i).bigHour=!0}),ft("Hmm",function(t,e,i){var n=t.length-2;e[bt]=k(t.substr(0,n)),e[xt]=k(t.substr(n))}),ft("Hmmss",function(t,e,i){var n=t.length-4,a=t.length-2;e[bt]=k(t.substr(0,n)),e[xt]=k(t.substr(n,2)),e[_t]=k(t.substr(a))});var ne,ae=Tt("Hours",!0),re={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Rt,monthsShort:Lt,week:{dow:0,doy:6},weekdays:qt,weekdaysMin:$t,weekdaysShort:Zt,meridiemParse:/[ap]\.?m?\.?/i},oe={},se={};function le(t){return t?t.toLowerCase().replace("_","-"):t}function ue(e){var i=null;if(!oe[e]&&t&&t.exports)try{i=ne._abbr;var n=_e;n("./locale/"+e),de(i)}catch(t){}return oe[e]}function de(t,e){var i;return t&&((i=o(e)?ce(t):he(t,e))?ne=i:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),ne._abbr}function he(t,e){if(null!==e){var i,n=re;if(e.abbr=t,null!=oe[t])P("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=oe[t]._config;else if(null!=e.parentLocale)if(null!=oe[e.parentLocale])n=oe[e.parentLocale]._config;else{if(null==(i=ue(e.parentLocale)))return se[e.parentLocale]||(se[e.parentLocale]=[]),se[e.parentLocale].push({name:t,config:e}),null;n=i._config}return oe[t]=new I(O(n,e)),se[t]&&se[t].forEach(function(t){he(t.name,t.config)}),de(t),oe[t]}return delete oe[t],null}function ce(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return ne;if(!a(t)){if(e=ue(t))return e;t=[t]}return function(t){for(var e,i,n,a,r=0;r<t.length;){for(a=le(t[r]).split("-"),e=a.length,i=(i=le(t[r+1]))?i.split("-"):null;e>0;){if(n=ue(a.slice(0,e).join("-")))return n;if(i&&i.length>=e&&w(a,i,!0)>=e-1)break;e--}r++}return ne}(t)}function fe(t){var e,i=t._a;return i&&-2===f(t).overflow&&(e=i[vt]<0||i[vt]>11?vt:i[yt]<1||i[yt]>At(i[pt],i[vt])?yt:i[bt]<0||i[bt]>24||24===i[bt]&&(0!==i[xt]||0!==i[_t]||0!==i[kt])?bt:i[xt]<0||i[xt]>59?xt:i[_t]<0||i[_t]>59?_t:i[kt]<0||i[kt]>999?kt:-1,f(t)._overflowDayOfYear&&(e<pt||e>yt)&&(e=yt),f(t)._overflowWeeks&&-1===e&&(e=wt),f(t)._overflowWeekday&&-1===e&&(e=Mt),f(t).overflow=e),t}function ge(t,e,i){return null!=t?t:null!=e?e:i}function me(t){var e,i,a,r,o,s=[];if(!t._d){for(a=function(t){var e=new Date(n.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[yt]&&null==t._a[vt]&&function(t){var e,i,n,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,i=ge(e.GG,t._a[pt],jt(Ie(),1,4).year),n=ge(e.W,1),((a=ge(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=jt(Ie(),r,o);i=ge(e.gg,t._a[pt],u.year),n=ge(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}n<1||n>Ut(i,r,o)?f(t)._overflowWeeks=!0:null!=l?f(t)._overflowWeekday=!0:(s=Bt(i,n,a,r,o),t._a[pt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=ge(t._a[pt],a[pt]),(t._dayOfYear>St(o)||0===t._dayOfYear)&&(f(t)._overflowDayOfYear=!0),i=Ht(o,0,t._dayOfYear),t._a[vt]=i.getUTCMonth(),t._a[yt]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=a[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[bt]&&0===t._a[xt]&&0===t._a[_t]&&0===t._a[kt]&&(t._nextDay=!0,t._a[bt]=0),t._d=(t._useUTC?Ht:function(t,e,i,n,a,r,o){var s;return t<100&&t>=0?(s=new Date(t+400,e,i,n,a,r,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,i,n,a,r,o),s}).apply(null,s),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[bt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(f(t).weekdayMismatch=!0)}}var pe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ve=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/Z|[+-]\d\d(?::?\d\d)?/,be=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],xe=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],ke=/^\/?Date\((\-?\d+)/i;function we(t){var e,i,n,a,r,o,s=t._i,l=pe.exec(s)||ve.exec(s);if(l){for(f(t).iso=!0,e=0,i=be.length;e<i;e++)if(be[e][1].exec(l[1])){a=be[e][0],n=!1!==be[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,i=xe.length;e<i;e++)if(xe[e][1].exec(l[3])){r=(l[2]||" ")+xe[e][0];break}if(null==r)return void(t._isValid=!1)}if(!n&&null!=r)return void(t._isValid=!1);if(l[4]){if(!ye.exec(l[4]))return void(t._isValid=!1);o="Z"}t._f=a+(r||"")+(o||""),Pe(t)}else t._isValid=!1}var Me=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function Se(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}var De={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Ce(t){var e,i,n,a,r,o,s,l=Me.exec(t._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(l){var u=(e=l[4],i=l[3],n=l[2],a=l[5],r=l[6],o=l[7],s=[Se(e),Lt.indexOf(i),parseInt(n,10),parseInt(a,10),parseInt(r,10)],o&&s.push(parseInt(o,10)),s);if(!function(t,e,i){if(t){var n=Zt.indexOf(t),a=new Date(e[0],e[1],e[2]).getDay();if(n!==a)return f(i).weekdayMismatch=!0,i._isValid=!1,!1}return!0}(l[1],u,t))return;t._a=u,t._tzm=function(t,e,i){if(t)return De[t];if(e)return 0;var n=parseInt(i,10),a=n%100,r=(n-a)/100;return 60*r+a}(l[8],l[9],l[10]),t._d=Ht.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),f(t).rfc2822=!0}else t._isValid=!1}function Pe(t){if(t._f!==n.ISO_8601)if(t._f!==n.RFC_2822){t._a=[],f(t).empty=!0;var e,i,a,r,o,s=""+t._i,l=s.length,u=0;for(a=U(t._f,t._locale).match(z)||[],e=0;e<a.length;e++)r=a[e],(i=(s.match(dt(r,t))||[])[0])&&((o=s.substr(0,s.indexOf(i))).length>0&&f(t).unusedInput.push(o),s=s.slice(s.indexOf(i)+i.length),u+=i.length),E[r]?(i?f(t).empty=!1:f(t).unusedTokens.push(r),mt(r,i,t)):t._strict&&!i&&f(t).unusedTokens.push(r);f(t).charsLeftOver=l-u,s.length>0&&f(t).unusedInput.push(s),t._a[bt]<=12&&!0===f(t).bigHour&&t._a[bt]>0&&(f(t).bigHour=void 0),f(t).parsedDateParts=t._a.slice(0),f(t).meridiem=t._meridiem,t._a[bt]=(d=t._locale,h=t._a[bt],null==(c=t._meridiem)?h:null!=d.meridiemHour?d.meridiemHour(h,c):null!=d.isPM?((g=d.isPM(c))&&h<12&&(h+=12),g||12!==h||(h=0),h):h),me(t),fe(t)}else Ce(t);else we(t);var d,h,c,g}function Te(t){var e=t._i,i=t._f;return t._locale=t._locale||ce(t._l),null===e||void 0===i&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),x(e)?new b(fe(e)):(l(e)?t._d=e:a(i)?function(t){var e,i,n,a,r;if(0===t._f.length)return f(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=v({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],Pe(e),g(e)&&(r+=f(e).charsLeftOver,r+=10*f(e).unusedTokens.length,f(e).score=r,(null==n||r<n)&&(n=r,i=e));h(t,i||e)}(t):i?Pe(t):function(t){var e=t._i;o(e)?t._d=new Date(n.now()):l(e)?t._d=new Date(e.valueOf()):"string"==typeof e?function(t){var e=ke.exec(t._i);null===e?(we(t),!1===t._isValid&&(delete t._isValid,Ce(t),!1===t._isValid&&(delete t._isValid,n.createFromInputFallback(t)))):t._d=new Date(+e[1])}(t):a(e)?(t._a=u(e.slice(0),function(t){return parseInt(t,10)}),me(t)):r(e)?function(t){if(!t._d){var e=L(t._i);t._a=u([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),me(t)}}(t):s(e)?t._d=new Date(e):n.createFromInputFallback(t)}(t),g(t)||(t._d=null),t))}function Oe(t,e,i,n,o){var s,l={};return!0!==i&&!1!==i||(n=i,i=void 0),(r(t)&&function(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}(t)||a(t)&&0===t.length)&&(t=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=o,l._l=i,l._i=t,l._f=e,l._strict=n,(s=new b(fe(Te(l))))._nextDay&&(s.add(1,"d"),s._nextDay=void 0),s}function Ie(t,e,i,n){return Oe(t,e,i,n,!1)}n.createFromInputFallback=S("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),n.ISO_8601=function(){},n.RFC_2822=function(){};var Ae=S("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=Ie.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:m()}),Fe=S("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=Ie.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:m()});function Re(t,e){var i,n;if(1===e.length&&a(e[0])&&(e=e[0]),!e.length)return Ie();for(i=e[0],n=1;n<e.length;++n)e[n].isValid()&&!e[n][t](i)||(i=e[n]);return i}var Le=["year","quarter","month","week","day","hour","minute","second","millisecond"];function We(t){var e=L(t),i=e.year||0,n=e.quarter||0,a=e.month||0,r=e.week||e.isoWeek||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=function(t){for(var e in t)if(-1===Ct.call(Le,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var i=!1,n=0;n<Le.length;++n)if(t[Le[n]]){if(i)return!1;parseFloat(t[Le[n]])!==k(t[Le[n]])&&(i=!0)}return!0}(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*n+12*i,this._data={},this._locale=ce(),this._bubble()}function Ye(t){return t instanceof We}function Ne(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function ze(t,e){B(t,0,0,function(){var t=this.utcOffset(),i="+";return t<0&&(t=-t,i="-"),i+N(~~(t/60),2)+e+N(~~t%60,2)})}ze("Z",":"),ze("ZZ",""),ut("Z",ot),ut("ZZ",ot),ft(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=He(ot,t)});var Ve=/([\+\-]|\d\d)/gi;function He(t,e){var i=(e||"").match(t);if(null===i)return null;var n=i[i.length-1]||[],a=(n+"").match(Ve)||["-",0,0],r=60*a[1]+k(a[2]);return 0===r?0:"+"===a[0]?r:-r}function Ee(t,e){var i,a;return e._isUTC?(i=e.clone(),a=(x(t)||l(t)?t.valueOf():Ie(t).valueOf())-i.valueOf(),i._d.setTime(i._d.valueOf()+a),n.updateOffset(i,!1),i):Ie(t).local()}function Be(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function je(){return!!this.isValid()&&this._isUTC&&0===this._offset}n.updateOffset=function(){};var Ue=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Ge=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function qe(t,e){var i,n,a,r,o,l,u=t,h=null;return Ye(t)?u={ms:t._milliseconds,d:t._days,M:t._months}:s(t)?(u={},e?u[e]=t:u.milliseconds=t):(h=Ue.exec(t))?(i="-"===h[1]?-1:1,u={y:0,d:k(h[yt])*i,h:k(h[bt])*i,m:k(h[xt])*i,s:k(h[_t])*i,ms:k(Ne(1e3*h[kt]))*i}):(h=Ge.exec(t))?(i="-"===h[1]?-1:1,u={y:Ze(h[2],i),M:Ze(h[3],i),w:Ze(h[4],i),d:Ze(h[5],i),h:Ze(h[6],i),m:Ze(h[7],i),s:Ze(h[8],i)}):null==u?u={}:"object"==typeof u&&("from"in u||"to"in u)&&(r=Ie(u.from),o=Ie(u.to),a=r.isValid()&&o.isValid()?(o=Ee(o,r),r.isBefore(o)?l=$e(r,o):((l=$e(o,r)).milliseconds=-l.milliseconds,l.months=-l.months),l):{milliseconds:0,months:0},(u={}).ms=a.milliseconds,u.M=a.months),n=new We(u),Ye(t)&&d(t,"_locale")&&(n._locale=t._locale),n}function Ze(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Xe(t,e){return function(i,n){var a;return null===n||isNaN(+n)||(P(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),a=i,i=n,n=a),Ke(this,qe(i="string"==typeof i?+i:i,n),t),this}}function Ke(t,e,i,a){var r=e._milliseconds,o=Ne(e._days),s=Ne(e._months);t.isValid()&&(a=null==a||a,s&&Wt(t,Ot(t,"Month")+s*i),o&&It(t,"Date",Ot(t,"Date")+o*i),r&&t._d.setTime(t._d.valueOf()+r*i),a&&n.updateOffset(t,o||s))}qe.fn=We.prototype,qe.invalid=function(){return qe(NaN)};var Je=Xe(1,"add"),Qe=Xe(-1,"subtract");function ti(t,e){var i,n,a=12*(e.year()-t.year())+(e.month()-t.month()),r=t.clone().add(a,"months");return e-r<0?(i=t.clone().add(a-1,"months"),n=(e-r)/(r-i)):(i=t.clone().add(a+1,"months"),n=(e-r)/(i-r)),-(a+n)||0}function ei(t){var e;return void 0===t?this._locale._abbr:(null!=(e=ce(t))&&(this._locale=e),this)}n.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",n.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ii=S("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});function ni(){return this._locale}var ai=1e3,ri=60*ai,oi=60*ri,si=3506328*oi;function li(t,e){return(t%e+e)%e}function ui(t,e,i){return t<100&&t>=0?new Date(t+400,e,i)-si:new Date(t,e,i).valueOf()}function di(t,e,i){return t<100&&t>=0?Date.UTC(t+400,e,i)-si:Date.UTC(t,e,i)}function hi(t,e){B(0,[t,t.length],0,e)}function ci(t,e,i,n,a){var r;return null==t?jt(this,n,a).year:(r=Ut(t,n,a),e>r&&(e=r),function(t,e,i,n,a){var r=Bt(t,e,i,n,a),o=Ht(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}.call(this,t,e,i,n,a))}B(0,["gg",2],0,function(){return this.weekYear()%100}),B(0,["GG",2],0,function(){return this.isoWeekYear()%100}),hi("gggg","weekYear"),hi("ggggg","weekYear"),hi("GGGG","isoWeekYear"),hi("GGGGG","isoWeekYear"),F("weekYear","gg"),F("isoWeekYear","GG"),Y("weekYear",1),Y("isoWeekYear",1),ut("G",at),ut("g",at),ut("GG",K,q),ut("gg",K,q),ut("GGGG",et,$),ut("gggg",et,$),ut("GGGGG",it,X),ut("ggggg",it,X),gt(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,n){e[n.substr(0,2)]=k(t)}),gt(["gg","GG"],function(t,e,i,a){e[a]=n.parseTwoDigitYear(t)}),B("Q",0,"Qo","quarter"),F("quarter","Q"),Y("quarter",7),ut("Q",G),ft("Q",function(t,e){e[vt]=3*(k(t)-1)}),B("D",["DD",2],"Do","date"),F("date","D"),Y("date",9),ut("D",K),ut("DD",K,q),ut("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),ft(["D","DD"],yt),ft("Do",function(t,e){e[yt]=k(t.match(K)[0])});var fi=Tt("Date",!0);B("DDD",["DDDD",3],"DDDo","dayOfYear"),F("dayOfYear","DDD"),Y("dayOfYear",4),ut("DDD",tt),ut("DDDD",Z),ft(["DDD","DDDD"],function(t,e,i){i._dayOfYear=k(t)}),B("m",["mm",2],0,"minute"),F("minute","m"),Y("minute",14),ut("m",K),ut("mm",K,q),ft(["m","mm"],xt);var gi=Tt("Minutes",!1);B("s",["ss",2],0,"second"),F("second","s"),Y("second",15),ut("s",K),ut("ss",K,q),ft(["s","ss"],_t);var mi,pi=Tt("Seconds",!1);for(B("S",0,0,function(){return~~(this.millisecond()/100)}),B(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),B(0,["SSS",3],0,"millisecond"),B(0,["SSSS",4],0,function(){return 10*this.millisecond()}),B(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),B(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),B(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),B(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),B(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),F("millisecond","ms"),Y("millisecond",16),ut("S",tt,G),ut("SS",tt,q),ut("SSS",tt,Z),mi="SSSS";mi.length<=9;mi+="S")ut(mi,nt);function vi(t,e){e[kt]=k(1e3*("0."+t))}for(mi="S";mi.length<=9;mi+="S")ft(mi,vi);var yi=Tt("Milliseconds",!1);B("z",0,0,"zoneAbbr"),B("zz",0,0,"zoneName");var bi=b.prototype;function xi(t){return t}bi.add=Je,bi.calendar=function(t,e){var i=t||Ie(),a=Ee(i,this).startOf("day"),r=n.calendarFormat(this,a)||"sameElse",o=e&&(T(e[r])?e[r].call(this,i):e[r]);return this.format(o||this.localeData().calendar(r,this,Ie(i)))},bi.clone=function(){return new b(this)},bi.diff=function(t,e,i){var n,a,r;if(!this.isValid())return NaN;if(!(n=Ee(t,this)).isValid())return NaN;switch(a=6e4*(n.utcOffset()-this.utcOffset()),e=R(e)){case"year":r=ti(this,n)/12;break;case"month":r=ti(this,n);break;case"quarter":r=ti(this,n)/3;break;case"second":r=(this-n)/1e3;break;case"minute":r=(this-n)/6e4;break;case"hour":r=(this-n)/36e5;break;case"day":r=(this-n-a)/864e5;break;case"week":r=(this-n-a)/6048e5;break;default:r=this-n}return i?r:_(r)},bi.endOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var i=this._isUTC?di:ui;switch(t){case"year":e=i(this.year()+1,0,1)-1;break;case"quarter":e=i(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=i(this.year(),this.month()+1,1)-1;break;case"week":e=i(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=i(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=i(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=oi-li(e+(this._isUTC?0:this.utcOffset()*ri),oi)-1;break;case"minute":e=this._d.valueOf(),e+=ri-li(e,ri)-1;break;case"second":e=this._d.valueOf(),e+=ai-li(e,ai)-1}return this._d.setTime(e),n.updateOffset(this,!0),this},bi.format=function(t){t||(t=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var e=j(this,t);return this.localeData().postformat(e)},bi.from=function(t,e){return this.isValid()&&(x(t)&&t.isValid()||Ie(t).isValid())?qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},bi.fromNow=function(t){return this.from(Ie(),t)},bi.to=function(t,e){return this.isValid()&&(x(t)&&t.isValid()||Ie(t).isValid())?qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},bi.toNow=function(t){return this.to(Ie(),t)},bi.get=function(t){return T(this[t=R(t)])?this[t]():this},bi.invalidAt=function(){return f(this).overflow},bi.isAfter=function(t,e){var i=x(t)?t:Ie(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()>i.valueOf():i.valueOf()<this.clone().startOf(e).valueOf())},bi.isBefore=function(t,e){var i=x(t)?t:Ie(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()<i.valueOf():this.clone().endOf(e).valueOf()<i.valueOf())},bi.isBetween=function(t,e,i,n){var a=x(t)?t:Ie(t),r=x(e)?e:Ie(e);return!!(this.isValid()&&a.isValid()&&r.isValid())&&(("("===(n=n||"()")[0]?this.isAfter(a,i):!this.isBefore(a,i))&&(")"===n[1]?this.isBefore(r,i):!this.isAfter(r,i)))},bi.isSame=function(t,e){var i,n=x(t)?t:Ie(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()===n.valueOf():(i=n.valueOf(),this.clone().startOf(e).valueOf()<=i&&i<=this.clone().endOf(e).valueOf()))},bi.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},bi.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},bi.isValid=function(){return g(this)},bi.lang=ii,bi.locale=ei,bi.localeData=ni,bi.max=Fe,bi.min=Ae,bi.parsingFlags=function(){return h({},f(this))},bi.set=function(t,e){if("object"==typeof t)for(var i=function(t){var e=[];for(var i in t)e.push({unit:i,priority:W[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}(t=L(t)),n=0;n<i.length;n++)this[i[n].unit](t[i[n].unit]);else if(T(this[t=R(t)]))return this[t](e);return this},bi.startOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var i=this._isUTC?di:ui;switch(t){case"year":e=i(this.year(),0,1);break;case"quarter":e=i(this.year(),this.month()-this.month()%3,1);break;case"month":e=i(this.year(),this.month(),1);break;case"week":e=i(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=i(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=i(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=li(e+(this._isUTC?0:this.utcOffset()*ri),oi);break;case"minute":e=this._d.valueOf(),e-=li(e,ri);break;case"second":e=this._d.valueOf(),e-=li(e,ai)}return this._d.setTime(e),n.updateOffset(this,!0),this},bi.subtract=Qe,bi.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},bi.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},bi.toDate=function(){return new Date(this.valueOf())},bi.toISOString=function(t){if(!this.isValid())return null;var e=!0!==t,i=e?this.clone().utc():this;return i.year()<0||i.year()>9999?j(i,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",j(i,"Z")):j(i,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},bi.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a=e+'[")]';return this.format(i+n+"-MM-DD[T]HH:mm:ss.SSS"+a)},bi.toJSON=function(){return this.isValid()?this.toISOString():null},bi.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},bi.unix=function(){return Math.floor(this.valueOf()/1e3)},bi.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},bi.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},bi.year=Pt,bi.isLeapYear=function(){return Dt(this.year())},bi.weekYear=function(t){return ci.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},bi.isoWeekYear=function(t){return ci.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},bi.quarter=bi.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},bi.month=Yt,bi.daysInMonth=function(){return At(this.year(),this.month())},bi.week=bi.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},bi.isoWeek=bi.isoWeeks=function(t){var e=jt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},bi.weeksInYear=function(){var t=this.localeData()._week;return Ut(this.year(),t.dow,t.doy)},bi.isoWeeksInYear=function(){return Ut(this.year(),1,4)},bi.date=fi,bi.day=bi.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},bi.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},bi.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},bi.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},bi.hour=bi.hours=ae,bi.minute=bi.minutes=gi,bi.second=bi.seconds=pi,bi.millisecond=bi.milliseconds=yi,bi.utcOffset=function(t,e,i){var a,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=He(ot,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(a=Be(this)),this._offset=t,this._isUTC=!0,null!=a&&this.add(a,"m"),r!==t&&(!e||this._changeInProgress?Ke(this,qe(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,n.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Be(this)},bi.utc=function(t){return this.utcOffset(0,t)},bi.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Be(this),"m")),this},bi.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=He(rt,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},bi.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Ie(t).utcOffset():0,(this.utcOffset()-t)%60==0)},bi.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},bi.isLocal=function(){return!!this.isValid()&&!this._isUTC},bi.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},bi.isUtc=je,bi.isUTC=je,bi.zoneAbbr=function(){return this._isUTC?"UTC":""},bi.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},bi.dates=S("dates accessor is deprecated. Use date instead.",fi),bi.months=S("months accessor is deprecated. Use month instead",Yt),bi.years=S("years accessor is deprecated. Use year instead",Pt),bi.zone=S("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),bi.isDSTShifted=S("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),(t=Te(t))._a){var e=t._isUTC?c(t._a):Ie(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var _i=I.prototype;function ki(t,e,i,n){var a=ce(),r=c().set(n,e);return a[i](r,t)}function wi(t,e,i){if(s(t)&&(e=t,t=void 0),t=t||"",null!=e)return ki(t,e,i,"month");var n,a=[];for(n=0;n<12;n++)a[n]=ki(t,n,i,"month");return a}function Mi(t,e,i,n){"boolean"==typeof t?(s(e)&&(i=e,e=void 0),e=e||""):(i=e=t,t=!1,s(e)&&(i=e,e=void 0),e=e||"");var a,r=ce(),o=t?r._week.dow:0;if(null!=i)return ki(e,(i+o)%7,n,"day");var l=[];for(a=0;a<7;a++)l[a]=ki(e,(a+o)%7,n,"day");return l}_i.calendar=function(t,e,i){var n=this._calendar[t]||this._calendar.sameElse;return T(n)?n.call(e,i):n},_i.longDateFormat=function(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},_i.invalidDate=function(){return this._invalidDate},_i.ordinal=function(t){return this._ordinal.replace("%d",t)},_i.preparse=xi,_i.postformat=xi,_i.relativeTime=function(t,e,i,n){var a=this._relativeTime[i];return T(a)?a(t,e,i,n):a.replace(/%d/i,t)},_i.pastFuture=function(t,e){var i=this._relativeTime[t>0?"future":"past"];return T(i)?i(e):i.replace(/%s/i,e)},_i.set=function(t){var e,i;for(i in t)T(e=t[i])?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},_i.months=function(t,e){return t?a(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Ft).test(e)?"format":"standalone"][t.month()]:a(this._months)?this._months:this._months.standalone},_i.monthsShort=function(t,e){return t?a(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Ft.test(e)?"format":"standalone"][t.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},_i.monthsParse=function(t,e,i){var n,a,r;if(this._monthsParseExact)return function(t,e,i){var n,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],n=0;n<12;++n)r=c([2e3,n]),this._shortMonthsParse[n]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[n]=this.months(r,"").toLocaleLowerCase();return i?"MMM"===e?-1!==(a=Ct.call(this._shortMonthsParse,o))?a:null:-1!==(a=Ct.call(this._longMonthsParse,o))?a:null:"MMM"===e?-1!==(a=Ct.call(this._shortMonthsParse,o))?a:-1!==(a=Ct.call(this._longMonthsParse,o))?a:null:-1!==(a=Ct.call(this._longMonthsParse,o))?a:-1!==(a=Ct.call(this._shortMonthsParse,o))?a:null}.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),n=0;n<12;n++){if(a=c([2e3,n]),i&&!this._longMonthsParse[n]&&(this._longMonthsParse[n]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[n]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),i||this._monthsParse[n]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[n]=new RegExp(r.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[n].test(t))return n;if(i&&"MMM"===e&&this._shortMonthsParse[n].test(t))return n;if(!i&&this._monthsParse[n].test(t))return n}},_i.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=zt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},_i.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Nt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},_i.week=function(t){return jt(t,this._week.dow,this._week.doy).week},_i.firstDayOfYear=function(){return this._week.doy},_i.firstDayOfWeek=function(){return this._week.dow},_i.weekdays=function(t,e){var i=a(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?Gt(i,this._week.dow):t?i[t.day()]:i},_i.weekdaysMin=function(t){return!0===t?Gt(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},_i.weekdaysShort=function(t){return!0===t?Gt(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},_i.weekdaysParse=function(t,e,i){var n,a,r;if(this._weekdaysParseExact)return function(t,e,i){var n,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)r=c([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(r,"").toLocaleLowerCase();return i?"dddd"===e?-1!==(a=Ct.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=Ct.call(this._weekdaysParse,o))?a:-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:-1!==(a=Ct.call(this._weekdaysParse,o))?a:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:null:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:-1!==(a=Ct.call(this._weekdaysParse,o))?a:-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:null}.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(a=c([2e3,1]).day(n),i&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[n]=new RegExp(r.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[n].test(t))return n;if(i&&"ddd"===e&&this._shortWeekdaysParse[n].test(t))return n;if(i&&"dd"===e&&this._minWeekdaysParse[n].test(t))return n;if(!i&&this._weekdaysParse[n].test(t))return n}},_i.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Qt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Xt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},_i.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Qt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Kt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},_i.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Qt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Jt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},_i.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},_i.meridiem=function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},de("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),n.lang=S("moment.lang is deprecated. Use moment.locale instead.",de),n.langData=S("moment.langData is deprecated. Use moment.localeData instead.",ce);var Si=Math.abs;function Di(t,e,i,n){var a=qe(e,i);return t._milliseconds+=n*a._milliseconds,t._days+=n*a._days,t._months+=n*a._months,t._bubble()}function Ci(t){return t<0?Math.floor(t):Math.ceil(t)}function Pi(t){return 4800*t/146097}function Ti(t){return 146097*t/4800}function Oi(t){return function(){return this.as(t)}}var Ii=Oi("ms"),Ai=Oi("s"),Fi=Oi("m"),Ri=Oi("h"),Li=Oi("d"),Wi=Oi("w"),Yi=Oi("M"),Ni=Oi("Q"),zi=Oi("y");function Vi(t){return function(){return this.isValid()?this._data[t]:NaN}}var Hi=Vi("milliseconds"),Ei=Vi("seconds"),Bi=Vi("minutes"),ji=Vi("hours"),Ui=Vi("days"),Gi=Vi("months"),qi=Vi("years"),Zi=Math.round,$i={ss:44,s:45,m:45,h:22,d:26,M:11},Xi=Math.abs;function Ki(t){return(t>0)-(t<0)||+t}function Ji(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i=Xi(this._milliseconds)/1e3,n=Xi(this._days),a=Xi(this._months);t=_(i/60),e=_(t/60),i%=60,t%=60;var r=_(a/12),o=a%=12,s=n,l=e,u=t,d=i?i.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=Ki(this._months)!==Ki(h)?"-":"",g=Ki(this._days)!==Ki(h)?"-":"",m=Ki(this._milliseconds)!==Ki(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(o?f+o+"M":"")+(s?g+s+"D":"")+(l||u||d?"T":"")+(l?m+l+"H":"")+(u?m+u+"M":"")+(d?m+d+"S":"")}var Qi=We.prototype;return Qi.isValid=function(){return this._isValid},Qi.abs=function(){var t=this._data;return this._milliseconds=Si(this._milliseconds),this._days=Si(this._days),this._months=Si(this._months),t.milliseconds=Si(t.milliseconds),t.seconds=Si(t.seconds),t.minutes=Si(t.minutes),t.hours=Si(t.hours),t.months=Si(t.months),t.years=Si(t.years),this},Qi.add=function(t,e){return Di(this,t,e,1)},Qi.subtract=function(t,e){return Di(this,t,e,-1)},Qi.as=function(t){if(!this.isValid())return NaN;var e,i,n=this._milliseconds;if("month"===(t=R(t))||"quarter"===t||"year"===t)switch(e=this._days+n/864e5,i=this._months+Pi(e),t){case"month":return i;case"quarter":return i/3;case"year":return i/12}else switch(e=this._days+Math.round(Ti(this._months)),t){case"week":return e/7+n/6048e5;case"day":return e+n/864e5;case"hour":return 24*e+n/36e5;case"minute":return 1440*e+n/6e4;case"second":return 86400*e+n/1e3;case"millisecond":return Math.floor(864e5*e)+n;default:throw new Error("Unknown unit "+t)}},Qi.asMilliseconds=Ii,Qi.asSeconds=Ai,Qi.asMinutes=Fi,Qi.asHours=Ri,Qi.asDays=Li,Qi.asWeeks=Wi,Qi.asMonths=Yi,Qi.asQuarters=Ni,Qi.asYears=zi,Qi.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},Qi._bubble=function(){var t,e,i,n,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*Ci(Ti(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=_(r/1e3),l.seconds=t%60,e=_(t/60),l.minutes=e%60,i=_(e/60),l.hours=i%24,o+=_(i/24),a=_(Pi(o)),s+=a,o-=Ci(Ti(a)),n=_(s/12),s%=12,l.days=o,l.months=s,l.years=n,this},Qi.clone=function(){return qe(this)},Qi.get=function(t){return t=R(t),this.isValid()?this[t+"s"]():NaN},Qi.milliseconds=Hi,Qi.seconds=Ei,Qi.minutes=Bi,Qi.hours=ji,Qi.days=Ui,Qi.weeks=function(){return _(this.days()/7)},Qi.months=Gi,Qi.years=qi,Qi.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=function(t,e,i){var n=qe(t).abs(),a=Zi(n.as("s")),r=Zi(n.as("m")),o=Zi(n.as("h")),s=Zi(n.as("d")),l=Zi(n.as("M")),u=Zi(n.as("y")),d=a<=$i.ss&&["s",a]||a<$i.s&&["ss",a]||r<=1&&["m"]||r<$i.m&&["mm",r]||o<=1&&["h"]||o<$i.h&&["hh",o]||s<=1&&["d"]||s<$i.d&&["dd",s]||l<=1&&["M"]||l<$i.M&&["MM",l]||u<=1&&["y"]||["yy",u];return d[2]=e,d[3]=+t>0,d[4]=i,function(t,e,i,n,a){return a.relativeTime(e||1,!!i,t,n)}.apply(null,d)}(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)},Qi.toISOString=Ji,Qi.toString=Ji,Qi.toJSON=Ji,Qi.locale=ei,Qi.localeData=ni,Qi.toIsoString=S("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ji),Qi.lang=ii,B("X",0,0,"unix"),B("x",0,0,"valueOf"),ut("x",at),ut("X",/[+-]?\d+(\.\d{1,3})?/),ft("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),ft("x",function(t,e,i){i._d=new Date(k(t))}),n.version="2.24.0",e=Ie,n.fn=bi,n.min=function(){return Re("isBefore",[].slice.call(arguments,0))},n.max=function(){return Re("isAfter",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=c,n.unix=function(t){return Ie(1e3*t)},n.months=function(t,e){return wi(t,e,"months")},n.isDate=l,n.locale=de,n.invalid=m,n.duration=qe,n.isMoment=x,n.weekdays=function(t,e,i){return Mi(t,e,i,"weekdays")},n.parseZone=function(){return Ie.apply(null,arguments).parseZone()},n.localeData=ce,n.isDuration=Ye,n.monthsShort=function(t,e){return wi(t,e,"monthsShort")},n.weekdaysMin=function(t,e,i){return Mi(t,e,i,"weekdaysMin")},n.defineLocale=he,n.updateLocale=function(t,e){if(null!=e){var i,n,a=re;null!=(n=ue(t))&&(a=n._config),e=O(a,e),(i=new I(e)).parentLocale=oe[t],oe[t]=i,de(t)}else null!=oe[t]&&(null!=oe[t].parentLocale?oe[t]=oe[t].parentLocale:null!=oe[t]&&delete oe[t]);return oe[t]},n.locales=function(){return D(oe)},n.weekdaysShort=function(t,e,i){return Mi(t,e,i,"weekdaysShort")},n.normalizeUnits=R,n.relativeTimeRounding=function(t){return void 0===t?Zi:"function"==typeof t&&(Zi=t,!0)},n.relativeTimeThreshold=function(t,e){return void 0!==$i[t]&&(void 0===e?$i[t]:($i[t]=e,"s"===t&&($i.ss=e-1),!0))},n.calendarFormat=function(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"},n.prototype=bi,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n}()}(tn={exports:{}},tn.exports),tn.exports),an={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};si._date.override("function"==typeof nn?{_id:"moment",formats:function(){return an},parse:function(t,e){return"string"==typeof t&&"string"==typeof e?t=nn(t,e):t instanceof nn||(t=nn(t)),t.isValid()?t.valueOf():null},format:function(t,e){return nn(t).format(e)},add:function(t,e,i){return nn(t).add(e,i).valueOf()},diff:function(t,e,i){return nn.duration(nn(t).diff(nn(e))).as(i)},startOf:function(t,e,i){return t=nn(t),"isoWeek"===e?t.isoWeekday(i).valueOf():t.startOf(e).valueOf()},endOf:function(t,e){return nn(t).endOf(e).valueOf()},_create:function(t){return nn(t)}}:{}),ot._set("global",{plugins:{filler:{propagate:!0}}});var rn={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,i=e?e.x:null,n=e?e.y:null;return function(t){return{x:null===i?t.x:i,y:null===n?t.y:n}}}};function on(t,e,i){var n,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(n=parseFloat(r,10),isFinite(n)&&Math.floor(n)===n)return"-"!==r[0]&&"+"!==r[0]||(n=e+n),!(n===e||n<0||n>=i)&&n;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function sn(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?r=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?r=i.scaleZero:n.getBasePosition?r=n.getBasePosition():n.getBasePixel&&(r=n.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(ut.isFinite(r))return{x:(e=n.isHorizontal())?r:null,y:e?null:r}}return null}function ln(t,e,i){var n,a=t[e].fill,r=[e];if(!i)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;r.push(a),a=n.fill}return!1}function un(t){var e=t.fill,i="dataset";return!1===e?null:(isFinite(e)||(i="boundary"),rn[i](t))}function dn(t){return t&&!t.skip}function hn(t,e,i,n,a){var r;if(n&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<n;++r)ut.canvas.lineTo(t,e[r-1],e[r]);for(t.lineTo(i[a-1].x,i[a-1].y),r=a-1;r>0;--r)ut.canvas.lineTo(t,i[r],i[r-1],!0)}}var cn={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,a,r,o=(t.data.datasets||[]).length,s=e.propagate,l=[];for(n=0;n<o;++n)r=null,(a=(i=t.getDatasetMeta(n)).dataset)&&a._model&&a instanceof Nt.Line&&(r={visible:t.isDatasetVisible(n),fill:on(a,n,o),chart:t,el:a}),i.$filler=r,l.push(r);for(n=0;n<o;++n)(r=l[n])&&(r.fill=ln(l,n,s),r.boundary=sn(r),r.mapper=un(r))},beforeDatasetDraw:function(t,e){var i=e.meta.$filler;if(i){var n=t.ctx,a=i.el,r=a._view,o=a._children||[],s=i.mapper,l=r.backgroundColor||ot.global.defaultColor;s&&l&&o.length&&(ut.canvas.clipArea(n,t.chartArea),function(t,e,i,n,a,r){var o,s,l,u,d,h,c,f=e.length,g=n.spanGaps,m=[],p=[],v=0,y=0;for(t.beginPath(),o=0,s=f+!!r;o<s;++o)d=i(u=e[l=o%f]._view,l,n),h=dn(u),c=dn(d),h&&c?(v=m.push(u),y=p.push(d)):v&&y&&(g?(h&&m.push(u),c&&p.push(d)):(hn(t,m,p,v,y),v=y=0,m=[],p=[]));hn(t,m,p,v,y),t.closePath(),t.fillStyle=a,t.fill()}(n,o,s,r,l,a._loop),ut.canvas.unclipArea(n))}}},fn=ut.noop,gn=ut.valueOrDefault;function mn(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}ot._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return ut.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:ut.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style="background-color:'+t.data.datasets[i].backgroundColor+'"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("</li>");return e.push("</ul>"),e.join("")}});var pn=gt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:fn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:fn,beforeSetDimensions:fn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:fn,beforeBuildLabels:fn,buildLabels:function(){var t=this,e=t.options.labels||{},i=ut.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:fn,beforeFit:fn,fit:function(){var t=this,e=t.options,i=e.labels,n=e.display,a=t.ctx,r=ut.options._parseFont(i),o=r.size,s=t.legendHitBoxes=[],l=t.minSize,u=t.isHorizontal();if(u?(l.width=t.maxWidth,l.height=n?10:0):(l.width=n?10:0,l.height=t.maxHeight),n)if(a.font=r.string,u){var d=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="top",ut.each(t.legendItems,function(t,e){var n=mn(i,o)+o/2+a.measureText(t.text).width;(0===e||d[d.length-1]+n+i.padding>l.width)&&(h+=o+i.padding,d[d.length-(e>0?0:1)]=i.padding),s[e]={left:0,top:0,width:n,height:o},d[d.length-1]+=n+i.padding}),l.height+=h}else{var c=i.padding,f=t.columnWidths=[],g=i.padding,m=0,p=0,v=o+c;ut.each(t.legendItems,function(t,e){var n=mn(i,o)+o/2+a.measureText(t.text).width;e>0&&p+v>l.height-c&&(g+=m+i.padding,f.push(m),m=0,p=0),m=Math.max(m,n),p+=v,s[e]={left:0,top:0,width:n,height:o}}),g+=m,f.push(m),l.width+=g}t.width=l.width,t.height=l.height},afterFit:fn,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,n=ot.global,a=n.defaultColor,r=n.elements.line,o=t.width,s=t.lineWidths;if(e.display){var l,u=t.ctx,d=gn(i.fontColor,n.defaultFontColor),h=ut.options._parseFont(i),c=h.size;u.textAlign="left",u.textBaseline="middle",u.lineWidth=.5,u.strokeStyle=d,u.fillStyle=d,u.font=h.string;var f=mn(i,c),g=t.legendHitBoxes,m=t.isHorizontal();l=m?{x:t.left+(o-s[0])/2+i.padding,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var p=c+i.padding;ut.each(t.legendItems,function(n,d){var h=u.measureText(n.text).width,v=f+c/2+h,y=l.x,b=l.y;m?d>0&&y+v+i.padding>t.left+t.minSize.width&&(b=l.y+=p,l.line++,y=l.x=t.left+(o-s[l.line])/2+i.padding):d>0&&b+p>t.top+t.minSize.height&&(y=l.x=y+t.columnWidths[l.line]+i.padding,b=l.y=t.top+i.padding,l.line++),function(t,i,n){if(!(isNaN(f)||f<=0)){u.save();var o=gn(n.lineWidth,r.borderWidth);if(u.fillStyle=gn(n.fillStyle,a),u.lineCap=gn(n.lineCap,r.borderCapStyle),u.lineDashOffset=gn(n.lineDashOffset,r.borderDashOffset),u.lineJoin=gn(n.lineJoin,r.borderJoinStyle),u.lineWidth=o,u.strokeStyle=gn(n.strokeStyle,a),u.setLineDash&&u.setLineDash(gn(n.lineDash,r.borderDash)),e.labels&&e.labels.usePointStyle){var s=f*Math.SQRT2/2,l=t+f/2,d=i+c/2;ut.canvas.drawPoint(u,n.pointStyle,s,l,d)}else 0!==o&&u.strokeRect(t,i,f,c),u.fillRect(t,i,f,c);u.restore()}}(y,b,n),g[d].left=y,g[d].top=b,function(t,e,i,n){var a=c/2,r=f+a+t,o=e+a;u.fillText(i.text,r,o),i.hidden&&(u.beginPath(),u.lineWidth=2,u.moveTo(r,o),u.lineTo(r+n,o),u.stroke())}(y,b,n,h),m?l.x+=v+i.padding:l.y+=p})}},_getLegendItemAt:function(t,e){var i,n,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,i=0;i<a.length;++i)if(t>=(n=a[i]).left&&t<=n.left+n.width&&e>=n.top&&e<=n.top+n.height)return r.legendItems[i];return null},handleEvent:function(t){var e,i=this,n=i.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!n.onHover&&!n.onLeave)return}else{if("click"!==a)return;if(!n.onClick)return}e=i._getLegendItemAt(t.x,t.y),"click"===a?e&&n.onClick&&n.onClick.call(i,t.native,e):(n.onLeave&&e!==i._hoveredItem&&(i._hoveredItem&&n.onLeave.call(i,t.native,i._hoveredItem),i._hoveredItem=e),n.onHover&&e&&n.onHover.call(i,t.native,e))}});function vn(t,e){var i=new pn({ctx:t.ctx,options:e,chart:t});xe.configure(t,i,e),xe.addBox(t,i),t.legend=i}var yn={id:"legend",_element:pn,beforeInit:function(t){var e=t.options.legend;e&&vn(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(ut.mergeIf(e,ot.global.legend),i?(xe.configure(t,i,e),i.options=e):vn(t,e)):i&&(xe.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}},bn=ut.noop;ot._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var xn=gt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:bn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:bn,beforeSetDimensions:bn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:bn,beforeBuildLabels:bn,buildLabels:bn,afterBuildLabels:bn,beforeFit:bn,fit:function(){var t=this,e=t.options,i=e.display,n=t.minSize,a=ut.isArray(e.text)?e.text.length:1,r=ut.options._parseFont(e),o=i?a*r.lineHeight+2*e.padding:0;t.isHorizontal()?(n.width=t.maxWidth,n.height=o):(n.width=o,n.height=t.maxHeight),t.width=n.width,t.height=n.height},afterFit:bn,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=t.options;if(i.display){var n,a,r,o=ut.options._parseFont(i),s=o.lineHeight,l=s/2+i.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=ut.valueOrDefault(i.fontColor,ot.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,n=f-h):(a="left"===i.position?h+l:f-l,r=d+(c-d)/2,n=c-d,u=Math.PI*("left"===i.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=i.text;if(ut.isArray(g))for(var m=0,p=0;p<g.length;++p)e.fillText(g[p],0,m,n),m+=s;else e.fillText(g,0,0,n);e.restore()}}});function _n(t,e){var i=new xn({ctx:t.ctx,options:e,chart:t});xe.configure(t,i,e),xe.addBox(t,i),t.titleBlock=i}var kn={},wn=cn,Mn=yn,Sn={id:"title",_element:xn,beforeInit:function(t){var e=t.options.title;e&&_n(t,e)},beforeUpdate:function(t){var e=t.options.title,i=t.titleBlock;e?(ut.mergeIf(e,ot.global.title),i?(xe.configure(t,i,e),i.options=e):_n(t,e)):i&&(xe.removeBox(t,i),delete t.titleBlock)}};for(var Dn in kn.filler=wn,kn.legend=Mn,kn.title=Sn,ai.helpers=ut,function(){function t(t,e,i){var n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}function e(t){return null!=t&&"none"!==t}function i(i,n,a){var r=document.defaultView,o=ut._getParentNode(i),s=r.getComputedStyle(i)[n],l=r.getComputedStyle(o)[n],u=e(s),d=e(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?t(s,i,a):h,d?t(l,o,a):h):"none"}ut.where=function(t,e){if(ut.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return ut.each(t,function(t){e(t)&&i.push(t)}),i},ut.findIndex=Array.prototype.findIndex?function(t,e,i){return t.findIndex(e,i)}:function(t,e,i){i=void 0===i?t:i;for(var n=0,a=t.length;n<a;++n)if(e.call(i,t[n],n,t))return n;return-1},ut.findNextWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=-1);for(var n=i+1;n<t.length;n++){var a=t[n];if(e(a))return a}},ut.findPreviousWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=t.length);for(var n=i-1;n>=0;n--){var a=t[n];if(e(a))return a}},ut.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},ut.almostEquals=function(t,e,i){return Math.abs(t-e)<i},ut.almostWhole=function(t,e){var i=Math.round(t);return i-e<t&&i+e>t},ut.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},ut.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},ut.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},ut.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},ut.toRadians=function(t){return t*(Math.PI/180)},ut.toDegrees=function(t){return t*(180/Math.PI)},ut._decimalPlaces=function(t){if(ut.isFinite(t)){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}},ut.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),r=Math.atan2(n,i);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},ut.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},ut.aliasPixel=function(t){return t%2==0?0:.5},ut._alignPixel=function(t,e,i){var n=t.currentDevicePixelRatio,a=i/2;return Math.round((e-a)*n)/n+a},ut.splineCurve=function(t,e,i,n){var a=t.skip?e:t,r=e,o=i.skip?e:i,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=n*(u=isNaN(u)?0:u),c=n*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},ut.EPSILON=Number.EPSILON||1e-14,ut.splineCurveMonotone=function(t){var e,i,n,a,r,o,s,l,u,d=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=d.length;for(e=0;e<h;++e)if(!(n=d[e]).model.skip){if(i=e>0?d[e-1]:null,(a=e<h-1?d[e+1]:null)&&!a.model.skip){var c=a.model.x-n.model.x;n.deltaK=0!==c?(a.model.y-n.model.y)/c:0}!i||i.model.skip?n.mK=n.deltaK:!a||a.model.skip?n.mK=i.deltaK:this.sign(i.deltaK)!==this.sign(n.deltaK)?n.mK=0:n.mK=(i.deltaK+n.deltaK)/2}for(e=0;e<h-1;++e)n=d[e],a=d[e+1],n.model.skip||a.model.skip||(ut.almostEquals(n.deltaK,0,this.EPSILON)?n.mK=a.mK=0:(r=n.mK/n.deltaK,o=a.mK/n.deltaK,(l=Math.pow(r,2)+Math.pow(o,2))<=9||(s=3/Math.sqrt(l),n.mK=r*s*n.deltaK,a.mK=o*s*n.deltaK)));for(e=0;e<h;++e)(n=d[e]).model.skip||(i=e>0?d[e-1]:null,a=e<h-1?d[e+1]:null,i&&!i.model.skip&&(u=(n.model.x-i.model.x)/3,n.model.controlPointPreviousX=n.model.x-u,n.model.controlPointPreviousY=n.model.y-u*n.mK),a&&!a.model.skip&&(u=(a.model.x-n.model.x)/3,n.model.controlPointNextX=n.model.x+u,n.model.controlPointNextY=n.model.y+u*n.mK))},ut.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},ut.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},ut.niceNum=function(t,e){var i=Math.floor(ut.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},ut.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},ut.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(i=s[0].clientX,n=s[0].clientY):(i=a.clientX,n=a.clientY);var l=parseFloat(ut.getStyle(r,"padding-left")),u=parseFloat(ut.getStyle(r,"padding-top")),d=parseFloat(ut.getStyle(r,"padding-right")),h=parseFloat(ut.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:i=Math.round((i-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:n=Math.round((n-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},ut.getConstraintWidth=function(t){return i(t,"max-width","clientWidth")},ut.getConstraintHeight=function(t){return i(t,"max-height","clientHeight")},ut._calculatePadding=function(t,e,i){return(e=ut.getStyle(t,e)).indexOf("%")>-1?i*parseInt(e,10)/100:parseInt(e,10)},ut._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},ut.getMaximumWidth=function(t){var e=ut._getParentNode(t);if(!e)return t.clientWidth;var i=e.clientWidth,n=i-ut._calculatePadding(e,"padding-left",i)-ut._calculatePadding(e,"padding-right",i),a=ut.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},ut.getMaximumHeight=function(t){var e=ut._getParentNode(t);if(!e)return t.clientHeight;var i=e.clientHeight,n=i-ut._calculatePadding(e,"padding-top",i)-ut._calculatePadding(e,"padding-bottom",i),a=ut.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},ut.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},ut.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,r=t.width;n.height=a*i,n.width=r*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=r+"px")}},ut.fontString=function(t,e,i){return e+" "+t+"px "+i},ut.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},r=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},r=n.garbageCollect=[],n.font=e),t.font=e;var o=0;ut.each(i,function(e){null!=e&&!0!==ut.isArray(e)?o=ut.measureText(t,a,r,o,e):ut.isArray(e)&&ut.each(e,function(e){null==e||ut.isArray(e)||(o=ut.measureText(t,a,r,o,e))})});var s=r.length/2;if(s>i.length){for(var l=0;l<s;l++)delete a[r[l]];r.splice(0,s)}return o},ut.measureText=function(t,e,i,n,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,i.push(a)),r>n&&(n=r),n},ut.numberOfLabelLines=function(t){var e=1;return ut.each(t,function(t){ut.isArray(t)&&t.length>e&&(e=t.length)}),e},ut.color=G?function(t){return t instanceof CanvasGradient&&(t=ot.global.defaultColor),G(t)}:function(t){return console.error("Color.js not found!"),t},ut.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:ut.color(t).saturate(.5).darken(.1).rgbString()}}(),ai._adapters=si,ai.Animation=pt,ai.animationService=vt,ai.controllers=ue,ai.DatasetController=kt,ai.defaults=ot,ai.Element=gt,ai.elements=Nt,ai.Interaction=pe,ai.layouts=xe,ai.platform=Ve,ai.plugins=He,ai.Scale=fi,ai.scaleService=Ee,ai.Ticks=li,ai.Tooltip=Je,ai.helpers.each(en,function(t,e){ai.scaleService.registerScaleType(e,t,t._defaults)}),kn)kn.hasOwnProperty(Dn)&&ai.plugins.register(kn[Dn]);ai.platform.initialize();var Cn=ai;return"undefined"!=typeof window&&(window.Chart=ai),ai.Chart=ai,ai.Legend=kn.legend._element,ai.Title=kn.title._element,ai.pluginService=ai.plugins,ai.PluginBase=ai.Element.extend({}),ai.canvasHelpers=ai.helpers.canvas,ai.layoutService=ai.layouts,ai.LinearScaleBase=yi,ai.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){ai[t]=function(e,i){return new ai(e,ai.helpers.merge(i||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),Cn});
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Chart=e()}(this,(function(){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function t(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},i=e((function(t){var e={};for(var i in n)n.hasOwnProperty(i)&&(e[n[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=e[t];if(i)return i;var a,r,o,s=1/0;for(var l in n)if(n.hasOwnProperty(l)){var u=n[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d<s&&(s=d,a=l)}return a},a.keyword.rgb=function(t){return n[t]},a.rgb.xyz=function(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));i.rgb,i.hsl,i.hsv,i.hwb,i.cmyk,i.xyz,i.lab,i.lch,i.hex,i.keyword,i.ansi16,i.ansi256,i.hcg,i.apple,i.gray;function a(t){var e=function(){for(var t={},e=Object.keys(i),n=e.length,a=0;a<n;a++)t[e[a]]={distance:-1,parent:null};return t}(),n=[t];for(e[t].distance=0;n.length;)for(var a=n.pop(),r=Object.keys(i[a]),o=r.length,s=0;s<o;s++){var l=r[s],u=e[l];-1===u.distance&&(u.distance=e[a].distance+1,u.parent=a,n.unshift(l))}return e}function r(t,e){return function(n){return e(t(n))}}function o(t,e){for(var n=[e[t].parent,t],a=i[e[t].parent][t],o=e[t].parent;e[o].parent;)n.unshift(e[o].parent),a=r(i[e[o].parent][o],a),o=e[o].parent;return a.conversion=n,a}var s={};Object.keys(i).forEach((function(t){s[t]={},Object.defineProperty(s[t],"channels",{value:i[t].channels}),Object.defineProperty(s[t],"labels",{value:i[t].labels});var e=function(t){for(var e=a(t),n={},i=Object.keys(e),r=i.length,s=0;s<r;s++){var l=i[s];null!==e[l].parent&&(n[l]=o(l,e))}return n}(t);Object.keys(e).forEach((function(n){var i=e[n];s[t][n]=function(t){var e=function(e){if(null==e)return e;arguments.length>1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a<i;a++)n[a]=Math.round(n[a]);return n};return"conversion"in t&&(e.conversion=t.conversion),e}(i),s[t][n].raw=function(t){var e=function(e){return null==e?e:(arguments.length>1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var l=s,u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},d={getRgba:h,getHsla:c,getRgb:function(t){var e=h(t);return e&&e.slice(0,3)},getHsl:function(t){var e=c(t);return e&&e.slice(0,3)},getHwb:f,getAlpha:function(t){var e=h(t);if(e)return e[3];if(e=c(t))return e[3];if(e=f(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+b(t[0])+b(t[1])+b(t[2])+(e>=0&&e<1?b(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:g,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return m(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:m,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return y[t.slice(0,3)]}};function h(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;r<e.length;r++)e[r]=parseInt(i[r]+i[r],16);a&&(n=Math.round(parseInt(a+a,16)/255*100)/100)}else if(i=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=i[2],i=i[1];for(r=0;r<e.length;r++)e[r]=parseInt(i.slice(2*r,2*r+2),16);a&&(n=Math.round(parseInt(a,16)/255*100)/100)}else if(i=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(i[r+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(i[r+1]));n=parseFloat(i[4])}else if(i=t.match(/(\w+)/)){if("transparent"==i[1])return[0,0,0,0];if(!(e=u[i[1]]))return}for(r=0;r<e.length;r++)e[r]=v(e[r],0,255);return n=n||0==n?v(n,0,1):1,e[3]=n,e}}function c(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[v(parseInt(e[1]),0,360),v(parseFloat(e[2]),0,100),v(parseFloat(e[3]),0,100),v(isNaN(n)?1:n,0,1)]}}}function f(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[v(parseInt(e[1]),0,360),v(parseFloat(e[2]),0,100),v(parseFloat(e[3]),0,100),v(isNaN(n)?1:n,0,1)]}}}function g(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function m(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function v(t,e,n){return Math.min(Math.max(e,t),n)}function b(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y={};for(var x in u)y[u[x]]=x;var _=function(t){return t instanceof _?t:this instanceof _?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=d.getRgba(t))?this.setValues("rgb",e):(e=d.getHsla(t))?this.setValues("hsl",e):(e=d.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new _(t);var e};_.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return d.hexString(this.values.rgb)},rgbString:function(){return d.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return d.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return d.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return d.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return d.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return d.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return d.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new _,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},_.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},_.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},_.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},_.prototype.setValues=function(t,e){var n,i,a=this.values,r=this.spaces,o=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];s=e.a}else if(void 0!==e[r[t][0]]){var u=r[t];for(n=0;n<t.length;n++)a[t][n]=e[u[n]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(n=0;n<t.length;n++)i=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(i);for(var d in r)d!==t&&(a[d]=l[t][d](a[t]));return!0},_.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},_.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=_);var w=_;function k(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}var M,S={noop:function(){},uid:(M=0,function(){return M++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return S.valueOrDefault(S.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,i){var a,r,o;if(S.isArray(t))if(r=t.length,i)for(a=r-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;a<r;a++)e.call(n,t[a],a);else if(S.isObject(t))for(r=(o=Object.keys(t)).length,a=0;a<r;a++)e.call(n,t[o[a]],o[a])},arrayEquals:function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n<i;++n)if(a=t[n],r=e[n],a instanceof Array&&r instanceof Array){if(!S.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},clone:function(t){if(S.isArray(t))return t.map(S.clone);if(S.isObject(t)){for(var e=Object.create(t),n=Object.keys(t),i=n.length,a=0;a<i;++a)e[n[a]]=S.clone(t[n[a]]);return e}return t},_merger:function(t,e,n,i){if(k(t)){var a=e[t],r=n[t];S.isObject(a)&&S.isObject(r)?S.merge(a,r,i):e[t]=S.clone(r)}},_mergerIf:function(t,e,n){if(k(t)){var i=e[t],a=n[t];S.isObject(i)&&S.isObject(a)?S.mergeIf(i,a):e.hasOwnProperty(t)||(e[t]=S.clone(a))}},merge:function(t,e,n){var i,a,r,o,s,l=S.isArray(e)?e:[e],u=l.length;if(!S.isObject(t))return t;for(i=(n=n||{}).merger||S._merger,a=0;a<u;++a)if(e=l[a],S.isObject(e))for(s=0,o=(r=Object.keys(e)).length;s<o;++s)i(r[s],t,e,n);return t},mergeIf:function(t,e){return S.merge(t,e,{merger:S._mergerIf})},extend:Object.assign||function(t){return S.merge(t,[].slice.call(arguments,1),{merger:function(t,e,n){e[t]=n[t]}})},inherits:function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=S.inherits,t&&S.extend(n.prototype,t),n.__super__=e.prototype,n},_deprecated:function(t,e,n,i){void 0!==e&&console.warn(t+': "'+n+'" is deprecated. Please use "'+i+'" instead')}},D=S;S.callCallback=S.callback,S.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},S.getValueOrDefault=S.valueOrDefault,S.getValueAtIndexOrDefault=S.valueAtIndexOrDefault;var C={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-C.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*C.easeInBounce(2*t):.5*C.easeOutBounce(2*t-1)+.5}},P={effects:C};D.easingEffects=C;var T=Math.PI,O=T/180,A=2*T,F=T/2,I=T/4,L=2*T/3,R={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),s<u&&l<d?(t.arc(s,l,o,-T,-F),t.arc(u,l,o,-F,0),t.arc(u,d,o,0,F),t.arc(s,d,o,F,T)):s<u?(t.moveTo(s,n),t.arc(u,l,o,-F,F),t.arc(s,l,o,F,T+F)):l<d?(t.arc(s,l,o,-T,0),t.arc(s,d,o,0,T)):t.arc(s,l,o,-T,T),t.closePath(),t.moveTo(e,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a,r){var o,s,l,u,d,h=(r||0)*O;if(e&&"object"==typeof e&&("[object HTMLImageElement]"===(o=e.toString())||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,a),t.rotate(h),t.drawImage(e,-e.width/2,-e.height/2,e.width,e.height),void t.restore();if(!(isNaN(n)||n<=0)){switch(t.beginPath(),e){default:t.arc(i,a,n,0,A),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=L,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=L,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),t.closePath();break;case"rectRounded":u=n-(d=.516*n),s=Math.cos(h+I)*u,l=Math.sin(h+I)*u,t.arc(i-s,a-l,d,h-T,h-F),t.arc(i+l,a-s,d,h-F,h),t.arc(i+s,a+l,d,h,h+F),t.arc(i-l,a+s,d,h+F,h+T),t.closePath();break;case"rect":if(!r){u=Math.SQRT1_2*n,t.rect(i-u,a-u,2*u,2*u);break}h+=I;case"rectRot":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+l,a-s),t.lineTo(i+s,a+l),t.lineTo(i-l,a+s),t.closePath();break;case"crossRot":h+=I;case"cross":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"star":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s),h+=I,s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"line":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l);break;case"dash":t.moveTo(i,a),t.lineTo(i+Math.cos(h)*n,a+Math.sin(h)*n)}t.fill(),t.stroke()}},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){var a=n.steppedLine;if(a){if("middle"===a){var r=(e.x+n.x)/2;t.lineTo(r,i?n.y:e.y),t.lineTo(r,i?e.y:n.y)}else"after"===a&&!i||"after"!==a&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y);t.lineTo(n.x,n.y)}else n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}},N=R;D.clear=R.clear,D.drawRoundedRectangle=function(t){t.beginPath(),R.roundedRect.apply(R,arguments)};var W={_set:function(t,e){return D.merge(this[t]||(this[t]={}),e)}};W._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var Y=W,z=D.valueOrDefault;var E={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,i,a;return D.isObject(t)?(e=+t.top||0,n=+t.right||0,i=+t.bottom||0,a=+t.left||0):e=n=i=a=+t||0,{top:e,right:n,bottom:i,left:a,height:e+i,width:a+n}},_parseFont:function(t){var e=Y.global,n=z(t.fontSize,e.defaultFontSize),i={family:z(t.fontFamily,e.defaultFontFamily),lineHeight:D.options.toLineHeight(z(t.lineHeight,e.defaultLineHeight),n),size:n,style:z(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return i.string=function(t){return!t||D.isNullOrUndef(t.size)||D.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(i),i},resolve:function(t,e,n,i){var a,r,o,s=!0;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&"function"==typeof o&&(o=o(e),s=!1),void 0!==n&&D.isArray(o)&&(o=o[n],s=!1),void 0!==o))return i&&!s&&(i.cacheable=!1),o}},V={_factorize:function(t){var e,n=[],i=Math.sqrt(t);for(e=1;e<i;e++)t%e==0&&(n.push(e),n.push(t/e));return i===(0|i)&&n.push(i),n.sort((function(t,e){return t-e})).pop(),n},log10:Math.log10||function(t){var e=Math.log(t)*Math.LOG10E,n=Math.round(e);return t===Math.pow(10,n)?n:e}},H=V;D.log10=V.log10;var B=D,j=P,U=N,G=E,q=H,Z={getRtlAdapter:function(t,e,n){return t?function(t,e){return{x:function(n){return t+t+e-n},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}}(e,n):{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}},overrideTextDirection:function(t,e){var n,i;"ltr"!==e&&"rtl"!==e||(i=[(n=t.canvas.style).getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",e,"important"),t.prevTextDirection=i)},restoreTextDirection:function(t){var e=t.prevTextDirection;void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}};B.easing=j,B.canvas=U,B.options=G,B.math=q,B.rtl=Z;var $=function(t){B.extend(this,t),this.initialize.apply(this,arguments)};B.extend($.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=B.extend({},t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,i=e._start,a=e._view;return n&&1!==t?(a||(a=e._view={}),i||(i=e._start={}),function(t,e,n,i){var a,r,o,s,l,u,d,h,c,f=Object.keys(n);for(a=0,r=f.length;a<r;++a)if(u=n[o=f[a]],e.hasOwnProperty(o)||(e[o]=u),(s=e[o])!==u&&"_"!==o[0]){if(t.hasOwnProperty(o)||(t[o]=s),(d=typeof u)===typeof(l=t[o]))if("string"===d){if((h=w(l)).valid&&(c=w(u)).valid){e[o]=c.mix(h,i).rgbString();continue}}else if(B.isFinite(l)&&B.isFinite(u)){e[o]=l+(u-l)*i;continue}e[o]=u}}(i,a,n,t),e):(e._view=B.extend({},n),e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return B.isNumber(this._model.x)&&B.isNumber(this._model.y)}}),$.extend=B.inherits;var X=$,K=X.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),J=K;Object.defineProperty(K.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(K.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),Y._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:B.noop,onComplete:B.noop}});var Q={animations:[],request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=n,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=B.findIndex(this.animations,(function(e){return e.chart===t}));-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=B.requestAnimFrame.call(window,(function(){t.request=null,t.startDigest()})))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r<a.length;)e=(t=a[r]).chart,n=t.numSteps,i=Math.floor((Date.now()-t.startTime)/t.duration*n)+1,t.currentStep=Math.min(i,n),B.callback(t.render,[e,t],e),B.callback(t.onAnimationProgress,[t],e),t.currentStep>=n?(B.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},tt=B.options.resolve,et=["push","pop","shift","splice","unshift"];function nt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(et.forEach((function(e){delete t[e]})),delete t._chartjs)}}var it=function(t,e){this.initialize(t,e)};B.extend(it.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&nt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);n.dataset=n.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,n=this,i=n.getDataset(),a=i.data||(i.data=[]);n._data!==a&&(n._data&&nt(n._data,n),a&&Object.isExtensible(a)&&(e=n,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),et.forEach((function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=i.apply(this,e);return B.each(t._chartjs.listeners,(function(t){"function"==typeof t[n]&&t[n].apply(t,e)})),a}})})))),n._data=a),n.resyncElements()},_configure:function(){this._config=B.merge(Object.create(null),[this.chart.options.datasets[this._type],this.getDataset()],{merger:function(t,e,n){"_meta"!==t&&"data"!==t&&B._merger(t,e,n)}})},_update:function(t){this._configure(),this._cachedDataOpts=null,this.update(t)},update:B.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},getStyle:function(t){var e,n=this.getMeta(),i=n.dataset;return this._configure(),i&&void 0===t?e=this._resolveDatasetElementOptions(i||{}):(t=t||0,e=this._resolveDataElementOptions(n.data[t]||{},t)),!1!==e.fill&&null!==e.fill||(e.backgroundColor=e.borderColor),e},_resolveDatasetElementOptions:function(t,e){var n,i,a,r,o=this,s=o.chart,l=o._config,u=t.custom||{},d=s.options.elements[o.datasetElementType.prototype._type]||{},h=o._datasetElementOptions,c={},f={chart:s,dataset:o.getDataset(),datasetIndex:o.index,hover:e};for(n=0,i=h.length;n<i;++n)a=h[n],r=e?"hover"+a.charAt(0).toUpperCase()+a.slice(1):a,c[a]=tt([u[r],l[r],d[r]],f);return c},_resolveDataElementOptions:function(t,e){var n=this,i=t&&t.custom,a=n._cachedDataOpts;if(a&&!i)return a;var r,o,s,l,u=n.chart,d=n._config,h=u.options.elements[n.dataElementType.prototype._type]||{},c=n._dataElementOptions,f={},g={chart:u,dataIndex:e,dataset:n.getDataset(),datasetIndex:n.index},m={cacheable:!i};if(i=i||{},B.isArray(c))for(o=0,s=c.length;o<s;++o)f[l=c[o]]=tt([i[l],d[l],h[l]],g,e,m);else for(o=0,s=(r=Object.keys(c)).length;o<s;++o)f[l=r[o]]=tt([i[l],d[c[l]],d[l],h[l]],g,e,m);return m.cacheable&&(n._cachedDataOpts=Object.freeze(f)),f},removeHoverStyle:function(t){B.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,r=B.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=tt([i.hoverBackgroundColor,e.hoverBackgroundColor,r(a.backgroundColor)],void 0,n),a.borderColor=tt([i.hoverBorderColor,e.hoverBorderColor,r(a.borderColor)],void 0,n),a.borderWidth=tt([i.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,n)},_removeDatasetHoverStyle:function(){var t=this.getMeta().dataset;t&&this.removeHoverStyle(t)},_setDatasetHoverStyle:function(){var t,e,n,i,a,r,o=this.getMeta().dataset,s={};if(o){for(r=o._model,a=this._resolveDatasetElementOptions(o,!0),t=0,e=(i=Object.keys(a)).length;t<e;++t)s[n=i[t]]=r[n],r[n]=a[n];o.$previousStyle=s}},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,n=t.data.length,i=e.length;i<n?t.data.splice(i,n-i):i>n&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),it.extend=B.inherits;var at=it,rt=2*Math.PI;function ot(t,e){var n=e.startAngle,i=e.endAngle,a=e.pixelMargin,r=a/e.outerRadius,o=e.x,s=e.y;t.beginPath(),t.arc(o,s,e.outerRadius,n-r,i+r),e.innerRadius>a?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function st(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+rt,ot(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=rt,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+rt,n.startAngle,!0),a=0;a<n.fullCircles;++a)t.stroke();for(t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.startAngle+rt),a=0;a<n.fullCircles;++a)t.stroke()}(t,e,n,i),i&&ot(t,n),t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.endAngle),t.arc(n.x,n.y,n.innerRadius,n.endAngle,n.startAngle,!0),t.closePath(),t.stroke()}Y._set("global",{elements:{arc:{backgroundColor:Y.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var lt=X.extend({_type:"arc",inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=B.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,r=i.distance,o=n.startAngle,s=n.endAngle;s<o;)s+=rt;for(;a>s;)a-=rt;for(;a<o;)a+=rt;var l=a>=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/rt)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+rt,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;t<a.fullCircles;++t)e.fill();a.endAngle=a.startAngle+n.circumference%rt}e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),e.fill(),n.borderWidth&&st(e,n,a),e.restore()}}),ut=B.valueOrDefault,dt=Y.global.defaultColor;Y._set("global",{elements:{line:{tension:.4,backgroundColor:dt,borderWidth:3,borderColor:dt,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var ht=X.extend({_type:"line",draw:function(){var t,e,n,i=this,a=i._view,r=i._chart.ctx,o=a.spanGaps,s=i._children.slice(),l=Y.global,u=l.elements.line,d=-1,h=i._loop;if(s.length){if(i._loop){for(t=0;t<s.length;++t)if(e=B.previousItem(s,t),!s[t]._view.skip&&e._view.skip){s=s.slice(t).concat(s.slice(0,t)),h=o;break}h&&s.push(s[0])}for(r.save(),r.lineCap=a.borderCapStyle||u.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||u.borderDash),r.lineDashOffset=ut(a.borderDashOffset,u.borderDashOffset),r.lineJoin=a.borderJoinStyle||u.borderJoinStyle,r.lineWidth=ut(a.borderWidth,u.borderWidth),r.strokeStyle=a.borderColor||l.defaultColor,r.beginPath(),(n=s[0]._view).skip||(r.moveTo(n.x,n.y),d=0),t=1;t<s.length;++t)n=s[t]._view,e=-1===d?B.previousItem(s,t):s[d],n.skip||(d!==t-1&&!o||-1===d?r.moveTo(n.x,n.y):B.canvas.lineTo(r,e._view,n),d=t);h&&r.closePath(),r.stroke(),r.restore()}}}),ct=B.valueOrDefault,ft=Y.global.defaultColor;function gt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}Y._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:ft,borderColor:ft,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var mt=X.extend({_type:"point",inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:gt,inXRange:gt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._chart.ctx,i=e.pointStyle,a=e.rotation,r=e.radius,o=e.x,s=e.y,l=Y.global,u=l.defaultColor;e.skip||(void 0===t||B.canvas._isPointInArea(e,t))&&(n.strokeStyle=e.borderColor||u,n.lineWidth=ct(e.borderWidth,l.elements.point.borderWidth),n.fillStyle=e.backgroundColor||u,B.canvas.drawPoint(n,i,r,o,s,a))}}),pt=Y.global.defaultColor;function vt(t){return t&&void 0!==t.width}function bt(t){var e,n,i,a,r;return vt(t)?(r=t.width/2,e=t.x-r,n=t.x+r,i=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(r=t.height/2,e=Math.min(t.x,t.base),n=Math.max(t.x,t.base),i=t.y-r,a=t.y+r),{left:e,top:i,right:n,bottom:a}}function yt(t,e,n){return t===e?n:t===n?e:t}function xt(t,e,n){var i,a,r,o,s=t.borderWidth,l=function(t){var e=t.borderSkipped,n={};return e?(t.horizontal?t.base>t.x&&(e=yt(e,"left","right")):t.base<t.y&&(e=yt(e,"bottom","top")),n[e]=!0,n):n}(t);return B.isObject(s)?(i=+s.top||0,a=+s.right||0,r=+s.bottom||0,o=+s.left||0):i=a=r=o=+s||0,{t:l.top||i<0?0:i>n?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function _t(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&bt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}Y._set("global",{elements:{rectangle:{backgroundColor:pt,borderColor:pt,borderSkipped:"bottom",borderWidth:0}}});var wt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=bt(t),n=e.right-e.left,i=e.bottom-e.top,a=xt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return _t(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return vt(n)?_t(n,t,null):_t(n,null,e)},inXRange:function(t){return _t(this._view,t,null)},inYRange:function(t){return _t(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return vt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return vt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),kt={},Mt=lt,St=ht,Dt=mt,Ct=wt;kt.Arc=Mt,kt.Line=St,kt.Point=Dt,kt.Rectangle=Ct;var Pt=B._deprecated,Tt=B.valueOrDefault;function Ot(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=B.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a<r;++a)o=Math.min(o,Math.abs(e[a]-e[a-1]));for(a=0,r=t.getTicks().length;a<r;++a)i=t.getPixelForTick(a),o=a>0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return B.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}Y._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),Y._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var At=at.extend({dataElementType:kt.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;at.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Pt("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Pt("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Pt("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Pt("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Pt("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e<n;++e)this.updateElement(i[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=i.getDataset(),o=i._resolveDataElementOptions(t,e);t._xScale=i.getScaleForId(a.xAxisID),t._yScale=i.getScaleForId(a.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderSkipped:o.borderSkipped,borderWidth:o.borderWidth,datasetLabel:r.label,label:i.chart.data.labels[e]},B.isArray(r.data[e])&&(t._model.borderSkipped=null),i._updateElementGeometry(t,e,n,o),t.pivot()},_updateElementGeometry:function(t,e,n,i){var a=this,r=t._model,o=a._getValueScale(),s=o.getBasePixel(),l=o.isHorizontal(),u=a._ruler||a.getRuler(),d=a.calculateBarValuePixels(a.index,e,i),h=a.calculateBarIndexPixels(a.index,e,u,i);r.horizontal=l,r.base=n?s:d.base,r.x=l?n?s:d.head:h.center,r.y=l?h.center:n?s:d.head,r.height=l?h.size:void 0,r.width=l?void 0:h.size},_getStacks:function(t){var e,n,i=this._getIndexScale(),a=i._getMatchingVisibleMetas(this._type),r=i.options.stacked,o=a.length,s=[];for(e=0;e<o&&(n=a[e],(!1===r||-1===s.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&s.push(n.stack),n.index!==t);++e);return s},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var n=this._getStacks(t),i=void 0!==e?n.indexOf(e):-1;return-1===i?n.length-1:i},getRuler:function(){var t,e,n=this._getIndexScale(),i=[];for(t=0,e=this.getMeta().data.length;t<e;++t)i.push(n.getPixelForValue(null,t,this.index));return{pixels:i,start:n._startPixel,end:n._endPixel,stackCount:this.getStackCount(),scale:n}},calculateBarValuePixels:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._getValueScale(),c=h.isHorizontal(),f=d.data.datasets,g=h._getMatchingVisibleMetas(this._type),m=h._parseValue(f[t].data[e]),p=n.minBarLength,v=h.options.stacked,b=this.getMeta().stack,y=void 0===m.start?0:m.max>=0&&m.min>=0?m.min:m.max,x=void 0===m.start?m.end:m.max>=0&&m.min>=0?m.max-m.min:m.min-m.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(m.min<0&&r<0||m.max>=0&&r>0)&&(y+=r));return o=h.getPixelForValue(y),l=(s=h.getPixelForValue(y+x))-o,void 0!==p&&Math.abs(l)<p&&(l=p,s=x>=0&&!c||x<0&&c?o-p:o+p),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=n.categoryPercentage;return null===o&&(o=r-(null===s?e.end-e.start:s-r)),null===s&&(s=r+r-o),i=r-(r-Math.min(o,s))/2*l,{chunk:Math.abs(s-o)/2*l/e.stackCount,ratio:n.barPercentage,start:i}}(e,n,i):Ot(e,n,i),r=this.getStackIndex(t,this.getMeta().stack),o=a.start+a.chunk*r+a.chunk/2,s=Math.min(Tt(i.maxBarThickness,1/0),a.chunk*a.ratio);return{base:o-s/2,head:o+s/2,center:o,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),n=this.getMeta().data,i=this.getDataset(),a=n.length,r=0;for(B.canvas.clipArea(t.ctx,t.chartArea);r<a;++r){var o=e._parseValue(i.data[r]);isNaN(o.min)||isNaN(o.max)||n[r].draw()}B.canvas.unclipArea(t.ctx)},_resolveDataElementOptions:function(){var t=this,e=B.extend({},at.prototype._resolveDataElementOptions.apply(t,arguments)),n=t._getIndexScale().options,i=t._getValueScale().options;return e.barPercentage=Tt(n.barPercentage,e.barPercentage),e.barThickness=Tt(n.barThickness,e.barThickness),e.categoryPercentage=Tt(n.categoryPercentage,e.categoryPercentage),e.maxBarThickness=Tt(n.maxBarThickness,e.maxBarThickness),e.minBarLength=Tt(i.minBarLength,e.minBarLength),e}}),Ft=B.valueOrDefault,It=B.options.resolve;Y._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}});var Lt=at.extend({dataElementType:kt.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(t){var e=this,n=e.getMeta().data;B.each(n,(function(n,i){e.updateElement(n,i,t)}))},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveDataElementOptions(t,e),u=i.getDataset().data[e],d=i.index,h=n?o.getPixelForDecimal(.5):o.getPixelForValue("object"==typeof u?u:NaN,e,d),c=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:n?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ft(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Ft(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Ft(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},_resolveDataElementOptions:function(t,e){var n=this,i=n.chart,a=n.getDataset(),r=t.custom||{},o=a.data[e]||{},s=at.prototype._resolveDataElementOptions.apply(n,arguments),l={chart:i,dataIndex:e,dataset:a,datasetIndex:n.index};return n._cachedDataOpts===s&&(s=B.extend({},s)),s.radius=It([r.radius,o.r,n._config.radius,i.options.elements.point.radius],l,e),s}}),Rt=B.valueOrDefault,Nt=Math.PI,Wt=2*Nt,Yt=Nt/2;Y._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-Yt,circumference:Wt,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.labels[t.index],i=": "+e.datasets[t.datasetIndex].data[t.index];return B.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}});var zt=at.extend({dataElementType:kt.Arc,linkScales:B.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e,n,i,a,r=this,o=r.chart,s=o.chartArea,l=o.options,u=1,d=1,h=0,c=0,f=r.getMeta(),g=f.data,m=l.cutoutPercentage/100||0,p=l.circumference,v=r._getRingWeight(r.index);if(p<Wt){var b=l.rotation%Wt,y=(b+=b>=Nt?-Wt:b<-Nt?Wt:0)+p,x=Math.cos(b),_=Math.sin(b),w=Math.cos(y),k=Math.sin(y),M=b<=0&&y>=0||y>=Wt,S=b<=Yt&&y>=Yt||y>=Wt+Yt,D=b<=-Yt&&y>=-Yt||y>=Nt+Yt,C=b===-Nt||y>=Nt?-1:Math.min(x,x*m,w,w*m),P=D?-1:Math.min(_,_*m,k,k*m),T=M?1:Math.max(x,x*m,w,w*m),O=S?1:Math.max(_,_*m,k,k*m);u=(T-C)/2,d=(O-P)/2,h=-(T+C)/2,c=-(O+P)/2}for(i=0,a=g.length;i<a;++i)g[i]._options=r._resolveDataElementOptions(g[i],i);for(o.borderWidth=r.getMaxBorderWidth(),e=(s.right-s.left-o.borderWidth)/u,n=(s.bottom-s.top-o.borderWidth)/d,o.outerRadius=Math.max(Math.min(e,n)/2,0),o.innerRadius=Math.max(o.outerRadius*m,0),o.radiusLength=(o.outerRadius-o.innerRadius)/(r._getVisibleDatasetWeightTotal()||1),o.offsetX=h*o.outerRadius,o.offsetY=c*o.outerRadius,f.total=r.calculateTotal(),r.outerRadius=o.outerRadius-o.radiusLength*r._getRingWeightOffset(r.index),r.innerRadius=Math.max(r.outerRadius-o.radiusLength*v,0),i=0,a=g.length;i<a;++i)r.updateElement(g[i],i,t)},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,o=a.options,s=o.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,d=o.rotation,h=o.rotation,c=i.getDataset(),f=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(c.data[e])*(o.circumference/Wt),g=n&&s.animateScale?0:i.innerRadius,m=n&&s.animateScale?0:i.outerRadius,p=t._options||{};B.extend(t,{_datasetIndex:i.index,_index:e,_model:{backgroundColor:p.backgroundColor,borderColor:p.borderColor,borderWidth:p.borderWidth,borderAlign:p.borderAlign,x:l+a.offsetX,y:u+a.offsetY,startAngle:d,endAngle:h,circumference:f,outerRadius:m,innerRadius:g,label:B.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;n&&s.animateRotate||(v.startAngle=0===e?o.rotation:i.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return B.each(n.data,(function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))})),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?Wt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e<n;++e)if(d.isDatasetVisible(e)){t=(i=d.getDatasetMeta(e)).data,e!==this.index&&(r=i.controller);break}if(!t)return 0;for(e=0,n=t.length;e<n;++e)a=t[e],r?(r._configure(),o=r._resolveDataElementOptions(a,e)):o=a._options,"inner"!==o.borderAlign&&(s=o.borderWidth,u=(l=o.hoverBorderWidth)>(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Rt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Rt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Rt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&(e+=this._getRingWeight(n));return e},_getRingWeight:function(t){return Math.max(Rt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});Y._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),Y._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Et=At.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Vt=B.valueOrDefault,Ht=B.options.resolve,Bt=B.canvas._isPointInArea;function jt(t,e){var n=t&&t.options.ticks||{},i=n.reverse,a=void 0===n.min?e:0,r=void 0===n.max?e:0;return{start:i?r:a,end:i?a:r}}function Ut(t,e,n){var i=n/2,a=jt(t,i),r=jt(e,i);return{top:r.end,right:a.end,bottom:r.start,left:a.start}}function Gt(t){var e,n,i,a;return B.isObject(t)?(e=t.top,n=t.right,i=t.bottom,a=t.left):e=n=i=a=t,{top:e,right:n,bottom:i,left:a}}Y._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var qt=at.extend({datasetElementType:kt.Line,dataElementType:kt.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.options,l=i._config,u=i._showLine=Vt(l.showLine,s.showLines);for(i._xScale=i.getScaleForId(a.xAxisID),i._yScale=i.getScaleForId(a.yAxisID),u&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=i._yScale,r._datasetIndex=i.index,r._children=o,r._model=i._resolveDatasetElementOptions(r),r.pivot()),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(u&&0!==r._model.tension&&i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i,a,r=this,o=r.getMeta(),s=t.custom||{},l=r.getDataset(),u=r.index,d=l.data[e],h=r._xScale,c=r._yScale,f=o.dataset._model,g=r._resolveDataElementOptions(t,e);i=h.getPixelForValue("object"==typeof d?d:NaN,e,u),a=n?c.getBasePixel():r.calculatePointY(d,e,u),t._xScale=h,t._yScale=c,t._options=g,t._datasetIndex=u,t._index=e,t._model={x:i,y:a,skip:s.skip||isNaN(i)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Vt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolveDatasetElementOptions:function(t){var e=this,n=e._config,i=t.custom||{},a=e.chart.options,r=a.elements.line,o=at.prototype._resolveDatasetElementOptions.apply(e,arguments);return o.spanGaps=Vt(n.spanGaps,a.spanGaps),o.tension=Vt(n.lineTension,r.tension),o.steppedLine=Ht([i.steppedLine,n.steppedLine,r.stepped]),o.clip=Gt(Vt(n.clip,Ut(e._xScale,e._yScale,o.borderWidth))),o},calculatePointY:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._yScale,c=0,f=0;if(h.options.stacked){for(s=+h.getRightValue(t),u=(l=d._getSortedVisibleDatasetMetas()).length,i=0;i<u&&(r=l[i]).index!==n;++i)a=d.data.datasets[r.index],"line"===r.type&&r.yAxisID===h.id&&((o=+h.getRightValue(a.data[e]))<0?f+=o||0:c+=o||0);return s<0?h.getPixelForValue(f+s):h.getPixelForValue(c+s)}return h.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,n,i,a=this.chart,r=this.getMeta(),o=r.dataset._model,s=a.chartArea,l=r.data||[];function u(t,e,n){return Math.max(Math.min(t,n),e)}if(o.spanGaps&&(l=l.filter((function(t){return!t._model.skip}))),"monotone"===o.cubicInterpolationMode)B.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)n=l[t]._model,i=B.splineCurve(B.previousItem(l,t)._model,n,B.nextItem(l,t)._model,o.tension),n.controlPointPreviousX=i.previous.x,n.controlPointPreviousY=i.previous.y,n.controlPointNextX=i.next.x,n.controlPointNextY=i.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)n=l[t]._model,Bt(n,s)&&(t>0&&Bt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&Bt(l[t+1]._model,s)&&(n.controlPointNextX=u(n.controlPointNextX,s.left,s.right),n.controlPointNextY=u(n.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,n=this.getMeta(),i=n.data||[],a=e.chartArea,r=e.canvas,o=0,s=i.length;for(this._showLine&&(t=n.dataset._model.clip,B.canvas.clipArea(e.ctx,{left:!1===t.left?0:a.left-t.left,right:!1===t.right?r.width:a.right+t.right,top:!1===t.top?0:a.top-t.top,bottom:!1===t.bottom?r.height:a.bottom+t.bottom}),n.dataset.draw(),B.canvas.unclipArea(e.ctx));o<s;++o)i[o].draw(a)},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Vt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Vt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Vt(n.hoverBorderWidth,n.borderWidth),e.radius=Vt(n.hoverRadius,n.radius)}}),Zt=B.options.resolve;Y._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var $t=at.extend({dataElementType:kt.Arc,linkScales:B.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i,a=this,r=a.getDataset(),o=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],u=a._angles=[],d=o.data;for(a._updateRadius(),o.count=a.countVisibleElements(),e=0,n=r.data.length;e<n;e++)l[e]=s,i=a._computeAngle(e),u[e]=i,s+=i;for(e=0,n=d.length;e<n;++e)d[e]._options=a._resolveDataElementOptions(d[e],e),a.updateElement(d[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,n=e.chartArea,i=e.options,a=Math.min(n.right-n.left,n.bottom-n.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(i.cutoutPercentage?e.outerRadius/100*i.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,n){var i=this,a=i.chart,r=i.getDataset(),o=a.options,s=o.animation,l=a.scale,u=a.data.labels,d=l.xCenter,h=l.yCenter,c=o.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(r.data[e]),g=i._starts[e],m=g+(t.hidden?0:i._angles[e]),p=s.animateScale?0:l.getDistanceFromCenterForValue(r.data[e]),v=t._options||{};B.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:d,y:h,innerRadius:0,outerRadius:n?p:f,startAngle:n&&s.animateRotate?c:g,endAngle:n&&s.animateRotate?c:m,label:B.valueAtIndexOrDefault(u,e,u[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return B.each(e.data,(function(e,i){isNaN(t.data[i])||e.hidden||n++})),n},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor,a=B.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=a(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=a(n.hoverBorderWidth,n.borderWidth)},_computeAngle:function(t){var e=this,n=this.getMeta().count,i=e.getDataset(),a=e.getMeta();if(isNaN(i.data[t])||a.data[t].hidden)return 0;var r={chart:e.chart,dataIndex:t,dataset:i,datasetIndex:e.index};return Zt([e.chart.options.elements.arc.angle,2*Math.PI/n],r,t)}});Y._set("pie",B.clone(Y.doughnut)),Y._set("pie",{cutoutPercentage:0});var Xt=zt,Kt=B.valueOrDefault;Y._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var Jt=at.extend({datasetElementType:kt.Line,dataElementType:kt.Point,linkScales:B.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.scale,l=i._config;for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=i.index,r._children=o,r._loop=!0,r._model=i._resolveDatasetElementOptions(r),r.pivot(),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),o=i.chart.scale,s=o.getPointPositionForValue(e,r.data[e]),l=i._resolveDataElementOptions(t,e),u=i.getMeta().dataset._model,d=n?o.xCenter:s.x,h=n?o.yCenter:s.y;t._scale=o,t._options=l,t._datasetIndex=i.index,t._index=e,t._model={x:d,y:h,skip:a.skip||isNaN(d)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:Kt(a.tension,u?u.tension:0),hitRadius:l.hitRadius}},_resolveDatasetElementOptions:function(){var t=this,e=t._config,n=t.chart.options,i=at.prototype._resolveDatasetElementOptions.apply(t,arguments);return i.spanGaps=Kt(e.spanGaps,n.spanGaps),i.tension=Kt(e.lineTension,n.elements.line.tension),i},updateBezierControlPoints:function(){var t,e,n,i,a=this.getMeta(),r=this.chart.chartArea,o=a.data||[];function s(t,e,n){return Math.max(Math.min(t,n),e)}for(a.dataset._model.spanGaps&&(o=o.filter((function(t){return!t._model.skip}))),t=0,e=o.length;t<e;++t)n=o[t]._model,i=B.splineCurve(B.previousItem(o,t,!0)._model,n,B.nextItem(o,t,!0)._model,n.tension),n.controlPointPreviousX=s(i.previous.x,r.left,r.right),n.controlPointPreviousY=s(i.previous.y,r.top,r.bottom),n.controlPointNextX=s(i.next.x,r.left,r.right),n.controlPointNextY=s(i.next.y,r.top,r.bottom)},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Kt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Kt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Kt(n.hoverBorderWidth,n.borderWidth),e.radius=Kt(n.hoverRadius,n.radius)}});Y._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),Y._set("global",{datasets:{scatter:{showLine:!1}}});var Qt={bar:At,bubble:Lt,doughnut:zt,horizontalBar:Et,line:qt,polarArea:$t,pie:Xt,radar:Jt,scatter:qt};function te(t,e){return t.native?{x:t.x,y:t.y}:B.getRelativePosition(t,e)}function ee(t,e){var n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas();for(i=0,r=l.length;i<r;++i)for(a=0,o=(n=l[i].data).length;a<o;++a)(s=n[a])._view.skip||e(s)}function ne(t,e){var n=[];return ee(t,(function(t){t.inRange(e.x,e.y)&&n.push(t)})),n}function ie(t,e,n,i){var a=Number.POSITIVE_INFINITY,r=[];return ee(t,(function(t){if(!n||t.inRange(e.x,e.y)){var o=t.getCenterPoint(),s=i(e,o);s<a?(r=[t],a=s):s===a&&r.push(t)}})),r}function ae(t){var e=-1!==t.indexOf("x"),n=-1!==t.indexOf("y");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function re(t,e,n){var i=te(e,t);n.axis=n.axis||"x";var a=ae(n.axis),r=n.intersect?ne(t,i):ie(t,i,!1,a),o=[];return r.length?(t._getSortedVisibleDatasetMetas().forEach((function(t){var e=t.data[r[0]._index];e&&!e._view.skip&&o.push(e)})),o):[]}var oe={modes:{single:function(t,e){var n=te(e,t),i=[];return ee(t,(function(t){if(t.inRange(n.x,n.y))return i.push(t),i})),i.slice(0,1)},label:re,index:re,dataset:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis),r=n.intersect?ne(t,i):ie(t,i,!1,a);return r.length>0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return re(t,e,{intersect:!1})},point:function(t,e){return ne(t,te(e,t))},nearest:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis);return ie(t,i,n.intersect,a)},x:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},se=B.extend;function le(t,e){return B.where(t,(function(t){return t.pos===e}))}function ue(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function de(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function he(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-de(o,t,"left","right"),a=e.outerHeight-de(o,t,"top","bottom"),i!==t.w||a!==t.h){t.w=i,t.h=a;var l=n.horizontal?[i,t.w]:[a,t.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function ce(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function fe(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;i<a;++i)(o=(r=t[i]).box).update(r.width||e.w,r.height||e.h,ce(r.horizontal,e)),he(e,n,r)&&(l=!0,u.length&&(s=!0)),o.fullWidth||u.push(r);return s&&fe(u,e,n)||l}function ge(t,e,n){var i,a,r,o,s=n.padding,l=e.x,u=e.y;for(i=0,a=t.length;i<a;++i)o=(r=t[i]).box,r.horizontal?(o.left=o.fullWidth?s.left:e.left,o.right=o.fullWidth?n.outerWidth-s.right:e.left+e.w,o.top=u,o.bottom=u+o.height,o.width=o.right-o.left,u=o.bottom):(o.left=l,o.right=l+o.width,o.top=e.top,o.bottom=e.top+e.h,o.height=o.bottom-o.top,l=o.right);e.x=l,e.y=u}Y._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var me,pe={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw:function(){e.draw.apply(e,arguments)}}]},t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,e,n){if(t){var i=t.options.layout||{},a=B.options.toPadding(i.padding),r=e-a.width,o=n-a.height,s=function(t){var e=function(t){var e,n,i,a=[];for(e=0,n=(t||[]).length;e<n;++e)i=t[e],a.push({index:e,box:i,pos:i.position,horizontal:i.isHorizontal(),weight:i.weight});return a}(t),n=ue(le(e,"left"),!0),i=ue(le(e,"right")),a=ue(le(e,"top"),!0),r=ue(le(e,"bottom"));return{leftAndTop:n.concat(a),rightAndBottom:i.concat(r),chartArea:le(e,"chartArea"),vertical:n.concat(i),horizontal:a.concat(r)}}(t.boxes),l=s.vertical,u=s.horizontal,d=Object.freeze({outerWidth:e,outerHeight:n,padding:a,availableWidth:r,vBoxMaxWidth:r/2/l.length,hBoxMaxHeight:o/2}),h=se({maxPadding:se({},a),w:r,h:o,x:a.left,y:a.top},a);!function(t,e){var n,i,a;for(n=0,i=t.length;n<i;++n)(a=t[n]).width=a.horizontal?a.box.fullWidth&&e.availableWidth:e.vBoxMaxWidth,a.height=a.horizontal&&e.hBoxMaxHeight}(l.concat(u),d),fe(l,h,d),fe(u,h,d)&&fe(l,h,d),function(t){var e=t.maxPadding;function n(n){var i=Math.max(e[n]-t[n],0);return t[n]+=i,i}t.y+=n("top"),t.x+=n("left"),n("right"),n("bottom")}(h),ge(s.leftAndTop,h,d),h.x+=h.w,h.y+=h.h,ge(s.rightAndBottom,h,d),t.chartArea={left:h.left,top:h.top,right:h.left+h.w,bottom:h.top+h.h},B.each(s.chartArea,(function(e){var n=e.box;se(n,t.chartArea),n.update(h.w,h.h)}))}}},ve=(me=Object.freeze({__proto__:null,default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&me.default||me,be="$chartjs",ye="chartjs-size-monitor",xe="chartjs-render-monitor",_e="chartjs-render-animation",we=["animationstart","webkitAnimationStart"],ke={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function Me(t,e){var n=B.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var Se=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function De(t,e,n){t.addEventListener(e,n,Se)}function Ce(t,e,n){t.removeEventListener(e,n,Se)}function Pe(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Te(t){var e=document.createElement("div");return e.className=t||"",e}function Oe(t,e,n){var i,a,r,o,s=t[be]||(t[be]={}),l=s.resizer=function(t){var e=Te(ye),n=Te(ye+"-expand"),i=Te(ye+"-shrink");n.appendChild(Te()),i.appendChild(Te()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return De(n,"scroll",a.bind(n,"expand")),De(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Pe("resize",n)),i&&i.clientWidth<a&&n.canvas&&e(Pe("resize",n))}},r=!1,o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,B.requestAnimFrame.call(window,(function(){r=!1,i.apply(a,o)})))}));!function(t,e){var n=t[be]||(t[be]={}),i=n.renderProxy=function(t){t.animationName===_e&&e()};B.each(we,(function(e){De(t,e,i)})),n.reflow=!!t.offsetParent,t.classList.add(xe)}(t,(function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}}))}function Ae(t){var e=t[be]||{},n=e.resizer;delete e.resizer,function(t){var e=t[be]||{},n=e.renderProxy;n&&(B.each(we,(function(e){Ce(t,e,n)})),delete e.renderProxy),t.classList.remove(xe)}(t),n&&n.parentNode&&n.parentNode.removeChild(n)}var Fe={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(t){if(!this.disableCSSInjection){var e=t.getRootNode?t.getRootNode():document;!function(t,e){var n=t[be]||(t[be]={});if(!n.containsStyles){n.containsStyles=!0,e="/* Chart.js */\n"+e;var i=document.createElement("style");i.setAttribute("type","text/css"),i.appendChild(document.createTextNode(e)),t.appendChild(i)}}(e.host?e:document.head,ve)}},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(this._ensureLoaded(t),function(t,e){var n=t.style,i=t.getAttribute("height"),a=t.getAttribute("width");if(t[be]={initial:{height:i,width:a,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===a||""===a){var r=Me(t,"width");void 0!==r&&(t.width=r)}if(null===i||""===i)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=Me(t,"height");void 0!==r&&(t.height=o)}}(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[be]){var n=e[be].initial;["height","width"].forEach((function(t){var i=n[t];B.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)})),B.each(n.style||{},(function(t,n){e.style[n]=t})),e.width=e.width,delete e[be]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[be]||(n[be]={});De(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(function(t,e){var n=ke[t.type]||t.type,i=B.getRelativePosition(t,e);return Pe(n,e,i.x,i.y,t)}(e,t))})}else Oe(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[be]||{}).proxies||{})[t.id+"_"+e];a&&Ce(i,e,a)}else Ae(i)}};B.addEvent=De,B.removeEvent=Ce;var Ie=Fe._enabled?Fe:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Le=B.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Ie);Y._set("global",{plugins:{}});var Re={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach((function(t){-1===e.indexOf(t)&&e.push(t)})),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach((function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)})),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if("function"==typeof(s=(r=(a=l[i]).plugin)[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],i=[],a=t&&t.config||{},r=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach((function(t){if(-1===n.indexOf(t)){var e=t.id,a=r[e];!1!==a&&(!0===a&&(a=B.clone(Y.global.plugins[e])),n.push(t),i.push({plugin:t,options:a||{}}))}})),e.descriptors=i,e.id=this._cacheId,i},_invalidate:function(t){delete t.$plugins}},Ne={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=B.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?B.merge(Object.create(null),[Y.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=B.extend(this.defaults[t],e))},addScalesToLayout:function(t){B.each(t.scales,(function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,pe.addBox(t,e)}))}},We=B.valueOrDefault,Ye=B.rtl.getRtlAdapter;Y._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:B.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:B.noop,beforeBody:B.noop,beforeLabel:B.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),B.isNullOrUndef(t.value)?n+=t.yLabel:n+=t.value,n},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:B.noop,afterBody:B.noop,beforeFooter:B.noop,footer:B.noop,afterFooter:B.noop}}});var ze={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:i/r,y:a/r}},nearest:function(t,e){var n,i,a,r=e.x,o=e.y,s=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var l=t[n];if(l&&l.hasValue()){var u=l.getCenterPoint(),d=B.distanceBetweenPoints(e,u);d<s&&(s=d,a=l)}}if(a){var h=a.tooltipPosition();r=h.x,o=h.y}return{x:r,y:o}}};function Ee(t,e){return e&&(B.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ve(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function He(t){var e=Y.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:We(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:We(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:We(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:We(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:We(t.titleFontStyle,e.defaultFontStyle),titleFontSize:We(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:We(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:We(t.footerFontStyle,e.defaultFontStyle),footerFontSize:We(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Be(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function je(t){return Ee([],Ve(t))}var Ue=X.extend({initialize:function(){this._model=He(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Ee(o,Ve(i)),o=Ee(o,Ve(a)),o=Ee(o,Ve(r))},getBeforeBody:function(){return je(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return B.each(t,(function(t){var r={before:[],lines:[],after:[]};Ee(r.before,Ve(i.beforeLabel.call(n,t,e))),Ee(r.lines,i.label.call(n,t,e)),Ee(r.after,Ve(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return je(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Ee(r,Ve(n)),r=Ee(r,Ve(i)),r=Ee(r,Ve(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=He(c),m=h._active,p=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},y={width:f.width,height:f.height},x={x:f.caretX,y:f.caretY};if(m.length){g.opacity=1;var _=[],w=[];x=ze[c.position].call(h,m,h._eventPosition);var k=[];for(e=0,n=m.length;e<n;++e)k.push((i=m[e],a=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,d=void 0,a=i._xScale,r=i._yScale||i._scale,o=i._index,s=i._datasetIndex,l=i._chart.getDatasetMeta(s).controller,u=l._getIndexScale(),d=l._getValueScale(),{xLabel:a?a.getLabelForIndex(o,s):"",yLabel:r?r.getLabelForIndex(o,s):"",label:u?""+u.getLabelForIndex(o,s):"",value:d?""+d.getLabelForIndex(o,s):"",index:o,datasetIndex:s,x:i._model.x,y:i._model.y}));c.filter&&(k=k.filter((function(t){return c.filter(t,p)}))),c.itemSort&&(k=k.sort((function(t,e){return c.itemSort(t,e,p)}))),B.each(k,(function(t){_.push(c.callbacks.labelColor.call(h,t,h._chart)),w.push(c.callbacks.labelTextColor.call(h,t,h._chart))})),g.title=h.getTitle(k,p),g.beforeBody=h.getBeforeBody(k,p),g.body=h.getBody(k,p),g.afterBody=h.getAfterBody(k,p),g.footer=h.getFooter(k,p),g.x=x.x,g.y=x.y,g.caretPadding=c.caretPadding,g.labelColors=_,g.labelTextColors=w,g.dataPoints=k,y=function(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce((function(t,e){return t+e.before.length+e.lines.length+e.after.length}),0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;i+=s*u,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*d,i+=o?(o-1)*e.bodySpacing:0,i+=l?e.footerMarginTop:0,i+=l*h,i+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,n.measureText(t).width+c)};return n.font=B.fontString(u,e._titleFontStyle,e._titleFontFamily),B.each(e.title,f),n.font=B.fontString(d,e._bodyFontStyle,e._bodyFontFamily),B.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,B.each(r,(function(t){B.each(t.before,f),B.each(t.lines,f),B.each(t.after,f)})),c=0,n.font=B.fontString(h,e._footerFontStyle,e._footerFontFamily),B.each(e.footer,f),{width:a+=2*e.xPadding,height:i}}(this,g),b=function(t,e,n,i){var a=t.x,r=t.y,o=t.caretSize,s=t.caretPadding,l=t.cornerRadius,u=n.xAlign,d=n.yAlign,h=o+s,c=l+s;return"right"===u?a-=e.width:"center"===u&&((a-=e.width/2)+e.width>i.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,y,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,y),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=y.width,g.height=y.height,g.caretX=x.x,g.caretY=x.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=Ye(e.rtl,e.x,e.width);for(t.x=Be(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=B.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r<s;++r)n.fillText(o[r],l.x(t.x),t.y+i/2),t.y+=i+a,r+1===s&&(t.y+=e.titleMarginBottom-a)}},drawBody:function(t,e,n){var i,a,r,o,s,l,u,d,h=e.bodyFontSize,c=e.bodySpacing,f=e._bodyAlign,g=e.body,m=e.displayColors,p=0,v=m?Be(e,"left"):0,b=Ye(e.rtl,e.x,e.width),y=function(e){n.fillText(e,b.x(t.x+p),t.y+h/2),t.y+=h+c},x=b.textAlign(f);for(n.textAlign=f,n.textBaseline="middle",n.font=B.fontString(h,e._bodyFontStyle,e._bodyFontFamily),t.x=Be(e,x),n.fillStyle=e.bodyFontColor,B.each(e.beforeBody,y),p=m&&"right"!==x?"center"===f?h/2+1:h+2:0,s=0,u=g.length;s<u;++s){for(i=g[s],a=e.labelTextColors[s],r=e.labelColors[s],n.fillStyle=a,B.each(i.before,y),l=0,d=(o=i.lines).length;l<d;++l){if(m){var _=b.x(v);n.fillStyle=e.legendColorBackground,n.fillRect(b.leftForLtr(_,h),t.y,h,h),n.lineWidth=1,n.strokeStyle=r.borderColor,n.strokeRect(b.leftForLtr(_,h),t.y,h,h),n.fillStyle=r.backgroundColor,n.fillRect(b.leftForLtr(b.xPlus(_,1),h-2),t.y+1,h-2,h-2),n.fillStyle=a}y(o[l])}B.each(i.after,y)}p=0,B.each(e.afterBody,y),t.y-=c},drawFooter:function(t,e,n){var i,a,r=e.footer,o=r.length;if(o){var s=Ye(e.rtl,e.x,e.width);for(t.x=Be(e,e._footerAlign),t.y+=e.footerMarginTop,n.textAlign=s.textAlign(e._footerAlign),n.textBaseline="middle",i=e.footerFontSize,n.fillStyle=e.footerFontColor,n.font=B.fontString(i,e._footerFontStyle,e._footerFontFamily),a=0;a<o;++a)n.fillText(r[a],s.x(t.x),t.y+i/2),t.y+=i+e.footerSpacing}},drawBackground:function(t,e,n,i){n.fillStyle=e.backgroundColor,n.strokeStyle=e.borderColor,n.lineWidth=e.borderWidth;var a=e.xAlign,r=e.yAlign,o=t.x,s=t.y,l=i.width,u=i.height,d=e.cornerRadius;n.beginPath(),n.moveTo(o+d,s),"top"===r&&this.drawCaret(t,i),n.lineTo(o+l-d,s),n.quadraticCurveTo(o+l,s,o+l,s+d),"center"===r&&"right"===a&&this.drawCaret(t,i),n.lineTo(o+l,s+u-d),n.quadraticCurveTo(o+l,s+u,o+l-d,s+u),"bottom"===r&&this.drawCaret(t,i),n.lineTo(o+d,s+u),n.quadraticCurveTo(o,s+u,o,s+u-d),"center"===r&&"left"===a&&this.drawCaret(t,i),n.lineTo(o,s+d),n.quadraticCurveTo(o,s,o+d,s),n.closePath(),n.fill(),e.borderWidth>0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,B.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),B.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!B.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),Ge=ze,qe=Ue;qe.positioners=Ge;var Ze=B.valueOrDefault;function $e(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)o=n[t][a],r=Ze(o.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?B.merge(e[t][a],[Ne.getScaleDefaults(r),o]):B.merge(e[t][a],o)}else B._merger(t,e,n,i)}})}function Xe(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||Object.create(null),r=n[t];"scales"===t?e[t]=$e(a,r):"scale"===t?e[t]=B.merge(a,[Ne.getScaleDefaults(r.type),r]):B._merger(t,e,n,i)}})}function Ke(t){var e=t.options;B.each(t.scales,(function(e){pe.removeBox(t,e)})),e=Xe(Y.global,Y[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Je(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(B.findIndex(t,a)>=0);return i}function Qe(t){return"top"===t||"bottom"===t}function tn(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}Y._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var en=function(t,e){return this.construct(t,e),this};B.extend(en.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||Object.create(null)).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(Y.global,Y[t.type],t.options||{}),t}(e);var i=Le.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=B.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,en.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Re.notify(t,"beforeInit"),B.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Re.notify(t,"afterInit"),t},clear:function(){return B.canvas.clear(this),this},stop:function(){return Q.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(B.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:B.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",B.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Re.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;B.each(e.xAxes,(function(t,n){t.id||(t.id=Je(e.xAxes,"x-axis-",n))})),B.each(e.yAxes,(function(t,n){t.id||(t.id=Je(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),B.each(i,(function(e){var i=e.options,r=i.id,o=Ze(i.type,e.dtype);Qe(i.position)!==Qe(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Ne.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),B.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Ne.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t<e;t++){var r=a[t],o=n.getDatasetMeta(t),s=r.type||n.config.type;if(o.type&&o.type!==s&&(n.destroyDatasetMeta(t),o=n.getDatasetMeta(t)),o.type=s,o.order=r.order||0,o.index=t,o.controller)o.controller.updateIndex(t),o.controller.linkScales();else{var l=Qt[o.type];if(void 0===l)throw new Error('"'+o.type+'" is not a chart type.');o.controller=new l(n,t),i.push(o.controller)}}return i},resetElements:function(){var t=this;B.each(t.data.datasets,(function(e,n){t.getDatasetMeta(n).controller.reset()}),t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,n,i=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),Ke(i),Re._invalidate(i),!1!==Re.notify(i,"beforeUpdate")){i.tooltip._data=i.data;var a=i.buildOrUpdateControllers();for(e=0,n=i.data.datasets.length;e<n;e++)i.getDatasetMeta(e).controller.buildOrUpdateElements();i.updateLayout(),i.options.animation&&i.options.animation.duration&&B.each(a,(function(t){t.reset()})),i.updateDatasets(),i.tooltip.initialize(),i.lastActive=[],Re.notify(i,"afterUpdate"),i._layers.sort(tn("z","_idx")),i._bufferedRender?i._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:i.render(t)}},updateLayout:function(){var t=this;!1!==Re.notify(t,"beforeLayout")&&(pe.update(this,this.width,this.height),t._layers=[],B.each(t.boxes,(function(e){e._configure&&e._configure(),t._layers.push.apply(t._layers,e._layers())}),t),t._layers.forEach((function(t,e){t._idx=e})),Re.notify(t,"afterScaleUpdate"),Re.notify(t,"afterLayout"))},updateDatasets:function(){if(!1!==Re.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Re.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),n={meta:e,index:t};!1!==Re.notify(this,"beforeDatasetUpdate",[n])&&(e.controller._update(),Re.notify(this,"afterDatasetUpdate",[n]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var n=e.options.animation,i=Ze(t.duration,n&&n.duration),a=t.lazy;if(!1!==Re.notify(e,"beforeRender")){var r=function(t){Re.notify(e,"afterRender"),B.callback(n&&n.onComplete,[t],e)};if(n&&i){var o=new J({numSteps:i/16.66,easing:t.easing||n.easing,render:function(t,e){var n=B.easing.effects[e.easing],i=e.currentStep,a=i/e.numSteps;t.draw(n(a),a,i)},onAnimationProgress:n.onProgress,onAnimationComplete:r});Q.addAnimation(e,o,i,a)}else e.draw(),r(new J({numSteps:0,chart:e}));return e}},draw:function(t){var e,n,i=this;if(i.clear(),B.isNullOrUndef(t)&&(t=1),i.transition(t),!(i.width<=0||i.height<=0)&&!1!==Re.notify(i,"beforeDraw",[t])){for(n=i._layers,e=0;e<n.length&&n[e].z<=0;++e)n[e].draw(i.chartArea);for(i.drawDatasets(t);e<n.length;++e)n[e].draw(i.chartArea);i._drawTooltip(t),Re.notify(i,"afterDraw",[t])}},transition:function(t){for(var e=0,n=(this.data.datasets||[]).length;e<n;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},_getSortedDatasetMetas:function(t){var e,n,i=[];for(e=0,n=(this.data.datasets||[]).length;e<n;++e)t&&!this.isDatasetVisible(e)||i.push(this.getDatasetMeta(e));return i.sort(tn("order","index")),i},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(t){var e,n;if(!1!==Re.notify(this,"beforeDatasetsDraw",[t])){for(n=(e=this._getSortedVisibleDatasetMetas()).length-1;n>=0;--n)this.drawDataset(e[n],t);Re.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Re.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Re.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Re.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Re.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return oe.modes.single(this,t)},getElementsAtEvent:function(t){return oe.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return oe.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=oe.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return oe.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var t,e,n=this,i=n.canvas;for(n.stop(),t=0,e=n.data.datasets.length;t<e;++t)n.destroyDatasetMeta(t);i&&(n.unbindEvents(),B.canvas.clear(n),Le.releaseContext(n.ctx),n.canvas=null,n.ctx=null),Re.notify(n,"destroy"),delete en.instances[n.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new qe({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};B.each(t.options.events,(function(i){Le.addEventListener(t,i,n),e[i]=n})),t.options.responsive&&(n=function(){t.resize()},Le.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,B.each(e,(function(e,n){Le.removeEventListener(t,n,e)})))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?"set":"remove";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o+"HoverStyle"](i);"dataset"===e&&this.getDatasetMeta(t[0]._datasetIndex).controller["_"+o+"DatasetHoverStyle"]()},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==Re.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);n&&(i=n._start?n.handleEvent(t):i|n.handleEvent(t)),Re.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,n=this,i=n.options||{},a=i.hover;return n.lastActive=n.lastActive||[],"mouseout"===t.type?n.active=[]:n.active=n.getElementsAtEventForMode(t,a.mode,a),B.callback(i.onHover||i.hover.onHover,[t.native,n.active],n),"mouseup"!==t.type&&"click"!==t.type||i.onClick&&i.onClick.call(n,t.native,n.active),n.lastActive.length&&n.updateHoverStyle(n.lastActive,a.mode,!1),n.active.length&&a.mode&&n.updateHoverStyle(n.active,a.mode,!0),e=!B.arrayEquals(n.active,n.lastActive),n.lastActive=n.active,e}}),en.instances={};var nn=en;en.Controller=en,en.types={},B.configMerge=Xe,B.scaleMerge=$e;function an(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function rn(t){this.options=t||{}}B.extend(rn.prototype,{formats:an,parse:an,format:an,add:an,diff:an,startOf:an,endOf:an,_create:function(t){return t}}),rn.override=function(t){B.extend(rn.prototype,t)};var on={_date:rn},sn={formatters:{values:function(t){return B.isArray(t)?t:""+t},linear:function(t,e,n){var i=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=B.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=B.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(B.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},ln=B.isArray,un=B.isNullOrUndef,dn=B.valueOrDefault,hn=B.valueAtIndexOrDefault;function cn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=r<e?i:-i)<s-1e-6||o>l+1e-6)))return o}function fn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,m,p,v=n.length,b=[],y=[],x=[],_=0,w=0;for(a=0;a<v;++a){if(s=n[a].label,l=n[a].major?e.major:e.minor,t.font=u=l.string,d=i[u]=i[u]||{data:{},gc:[]},h=l.lineHeight,c=f=0,un(s)||ln(s)){if(ln(s))for(r=0,o=s.length;r<o;++r)g=s[r],un(g)||ln(g)||(c=B.measureText(t,d.data,d.gc,c,g),f+=h)}else c=B.measureText(t,d.data,d.gc,c,s),f=h;b.push(c),y.push(f),x.push(h/2),_=Math.max(c,_),w=Math.max(f,w)}function k(t){return{width:b[t]||0,height:y[t]||0,offset:x[t]||0}}return function(t,e){B.each(t,(function(t){var n,i=t.gc,a=i.length/2;if(a>e){for(n=0;n<a;++n)delete t.data[i[n]];i.splice(0,a)}}))}(i,v),m=b.indexOf(_),p=y.indexOf(w),{first:k(0),last:k(v-1),widest:k(m),highest:k(p)}}function gn(t){return t.drawTicks?t.tickMarkLength:0}function mn(t){var e,n;return t.display?(e=B.options._parseFont(t),n=B.options.toPadding(t.padding),e.lineHeight+n.height):0}function pn(t,e){return B.extend(B.options._parseFont({fontFamily:dn(e.fontFamily,t.fontFamily),fontSize:dn(e.fontSize,t.fontSize),fontStyle:dn(e.fontStyle,t.fontStyle),lineHeight:dn(e.lineHeight,t.lineHeight)}),{color:B.options.resolve([e.fontColor,t.fontColor,Y.global.defaultFontColor])})}function vn(t){var e=pn(t,t.minor);return{minor:e,major:t.major.enabled?pn(t,t.major):e}}function bn(t){var e,n,i,a=[];for(n=0,i=t.length;n<i;++n)void 0!==(e=t[n])._index&&a.push(e);return a}function yn(t,e,n,i){var a,r,o,s,l=dn(n,0),u=Math.min(dn(i,t.length),t.length),d=0;for(e=Math.ceil(e),i&&(e=(a=i-n)/Math.floor(a/e)),s=l;s<0;)d++,s=Math.round(l+d*e);for(r=Math.max(l,0);r<u;r++)o=t[r],r===s?(o._index=r,d++,s=Math.round(l+d*e)):delete o.label}Y._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:sn.formatters.values,minor:{},major:{}}});var xn=X.extend({zeroLineIndex:0,getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){B.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,s,l=this,u=l.options.ticks,d=u.sampleSize;if(l.beforeUpdate(),l.maxWidth=t,l.maxHeight=e,l.margins=B.extend({left:0,right:0,top:0,bottom:0},n),l._ticks=null,l.ticks=null,l._labelSizes=null,l._maxLabelLines=0,l.longestLabelWidth=0,l.longestTextCache=l.longestTextCache||{},l._gridLineItems=null,l._labelItems=null,l.beforeSetDimensions(),l.setDimensions(),l.afterSetDimensions(),l.beforeDataLimits(),l.determineDataLimits(),l.afterDataLimits(),l.beforeBuildTicks(),o=l.buildTicks()||[],(!(o=l.afterBuildTicks(o)||o)||!o.length)&&l.ticks)for(o=[],i=0,a=l.ticks.length;i<a;++i)o.push({value:l.ticks[i],major:!1});return l._ticks=o,s=d<o.length,r=l._convertTicksToLabels(s?function(t,e){for(var n=[],i=t.length/e,a=0,r=t.length;a<r;a+=i)n.push(t[Math.floor(a)]);return n}(o,d):o),l._configure(),l.beforeCalculateTickRotation(),l.calculateTickRotation(),l.afterCalculateTickRotation(),l.beforeFit(),l.fit(),l.afterFit(),l._ticksToDraw=u.display&&(u.autoSkip||"auto"===u.source)?l._autoSkip(o):o,s&&(r=l._convertTicksToLabels(l._ticksToDraw)),l.ticks=r,l.afterUpdate(),l.minSize},_configure:function(){var t,e,n=this,i=n.options.ticks.reverse;n.isHorizontal()?(t=n.left,e=n.right):(t=n.top,e=n.bottom,i=!i),n._startPixel=t,n._endPixel=e,n._reversePixels=i,n._length=e-t},afterUpdate:function(){B.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){B.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){B.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){B.callback(this.options.beforeDataLimits,[this])},determineDataLimits:B.noop,afterDataLimits:function(){B.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){B.callback(this.options.beforeBuildTicks,[this])},buildTicks:B.noop,afterBuildTicks:function(t){var e=this;return ln(t)&&t.length?B.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=B.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){B.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){B.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){B.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t,e,n,i,a,r,o,s=this,l=s.options,u=l.ticks,d=s.getTicks().length,h=u.minRotation||0,c=u.maxRotation,f=h;!s._isVisible()||!u.display||h>=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-gn(l.gridLines)-u.padding-mn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=B.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){B.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){B.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=gn(o)+mn(r)),u?s&&(e.height=gn(o)+mn(r)):e.height=t.maxHeight,a.display&&s){var d=vn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,m=h.highest,p=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,y=B.toRadians(t.labelRotation),x=Math.cos(y),_=Math.sin(y),w=_*g.width+x*(m.height-(b?m.offset:0))+(b?0:p);e.height=Math.min(t.maxHeight,e.height+w+v);var k,M,S=t.getPixelForTick(0)-t.left,D=t.right-t.getPixelForTick(t.getTicks().length-1);b?(k=l?x*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):x*f.width+_*f.offset):(k=c.width/2,M=f.width/2),t.paddingLeft=Math.max((k-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-D)*t.width/(t.width-D),0)+3}else{var C=a.mirror?0:g.width+v+p;e.width=Math.min(t.maxWidth,e.width+C),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){B.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(un(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;n<i;++n)t[n].label=e[n];return e},_getLabelSizes:function(){var t=this,e=t._labelSizes;return e||(t._labelSizes=e=fn(t.ctx,vn(t.options.ticks),t.getTicks(),t.longestTextCache),t.longestLabelWidth=e.widest.width),e},_parseValue:function(t){var e,n,i,a;return ln(t)?(e=+this.getRightValue(t[0]),n=+this.getRightValue(t[1]),i=Math.min(e,n),a=Math.max(e,n)):(e=void 0,n=t=+this.getRightValue(t),i=t,a=t),{min:i,max:a,start:e,end:n}},_getScaleLabel:function(t){var e=this._parseValue(t);return void 0!==e.start?"["+e.start+", "+e.end+"]":+this.getRightValue(t)},getLabelForIndex:B.noop,getPixelForValue:B.noop,getValueForPixel:B.noop,getPixelForTick:function(t){var e=this.options.offset,n=this._ticks.length,i=1/Math.max(n-(e?0:1),1);return t<0||t>n-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;e<n;e++)t[e].major&&i.push(e);return i}(t):[],u=l.length,d=l[0],h=l[u-1];if(u>s)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;i<t.length;i++)a=t[i],i===o?(a._index=i,o=e[++r*n]):delete a.label}(t,l,u/s),bn(t);if(i=function(t,e,n,i){var a,r,o,s,l=function(t){var e,n,i=t.length;if(i<2)return!1;for(n=t[0],e=1;e<i;++e)if(t[e]-t[e-1]!==n)return!1;return n}(t),u=(e.length-1)/i;if(!l)return Math.max(u,1);for(o=0,s=(a=B.math._factorize(l)).length-1;o<s;o++)if((r=a[o])>u)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e<n;e++)yn(t,i,l[e],l[e+1]);return a=u>1?(h-d)/(u-1):null,yn(t,i,B.isNullOrUndef(a)?0:d-a,d),yn(t,i,h,B.isNullOrUndef(a)?t.length:h+a),bn(t)}return yn(t,i),bn(t)},_tickSize:function(){var t=this.options.ticks,e=B.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i<o*n?s/n:o/i},_isVisible:function(){var t,e,n,i=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=i.data.datasets.length;t<e;++t)if(i.isDatasetVisible(t)&&((n=i.getDatasetMeta(t)).xAxisID===this.id||n.yAxisID===this.id))return!0;return!1},_computeGridLineItems:function(t){var e,n,i,a,r,o,s,l,u,d,h,c,f,g,m,p,v,b=this,y=b.chart,x=b.options,_=x.gridLines,w=x.position,k=_.offsetGridLines,M=b.isHorizontal(),S=b._ticksToDraw,D=S.length+(k?1:0),C=gn(_),P=[],T=_.drawBorder?hn(_.lineWidth,0,0):0,O=T/2,A=B._alignPixel,F=function(t){return A(y,t,T)};for("top"===w?(e=F(b.bottom),s=b.bottom-C,u=e-O,h=F(t.top)+O,f=t.bottom):"bottom"===w?(e=F(b.top),h=t.top,f=F(t.bottom)-O,s=e+O,u=b.top+C):"left"===w?(e=F(b.right),o=b.right-C,l=e-O,d=F(t.left)+O,c=t.right):(e=F(b.left),d=t.left,c=F(t.right)-O,o=e+O,l=b.left+C),n=0;n<D;++n)i=S[n]||{},un(i.label)&&n<S.length||(n===b.zeroLineIndex&&x.offset===k?(g=_.zeroLineWidth,m=_.zeroLineColor,p=_.zeroLineBorderDash||[],v=_.zeroLineBorderDashOffset||0):(g=hn(_.lineWidth,n,1),m=hn(_.color,n,"rgba(0,0,0,0.1)"),p=_.borderDash||[],v=_.borderDashOffset||0),void 0!==(a=cn(b,i._index||n,k))&&(r=A(y,a,g),M?o=l=d=c=r:s=u=h=f=r,P.push({tx1:o,ty1:s,tx2:l,ty2:u,x1:d,y1:h,x2:c,y2:f,width:g,color:m,borderDash:p,borderDashOffset:v})));return P.ticksLength=D,P.borderValue=e,P},_computeLabelItems:function(){var t,e,n,i,a,r,o,s,l,u,d,h,c=this,f=c.options,g=f.ticks,m=f.position,p=g.mirror,v=c.isHorizontal(),b=c._ticksToDraw,y=vn(g),x=g.padding,_=gn(f.gridLines),w=-B.toRadians(c.labelRotation),k=[];for("top"===m?(r=c.bottom-_-x,o=w?"left":"center"):"bottom"===m?(r=c.top+_+x,o=w?"right":"center"):"left"===m?(a=c.right-(p?0:_)-x,o=p?"left":"right"):(a=c.left+(p?0:_)+x,o=p?"right":"left"),t=0,e=b.length;t<e;++t)i=(n=b[t]).label,un(i)||(s=c.getPixelForTick(n._index||t)+g.labelOffset,u=(l=n.major?y.major:y.minor).lineHeight,d=ln(i)?i.length:1,v?(a=s,h="top"===m?((w?1:.5)-d)*u:(w?0:.5)*u):(r=s,h=(1-d)*u/2),k.push({x:a,y:r,rotation:w,label:i,font:l,textOffset:h,textAlign:o}));return k},_drawGrid:function(t){var e=this,n=e.options.gridLines;if(n.display){var i,a,r,o,s,l=e.ctx,u=e.chart,d=B._alignPixel,h=n.drawBorder?hn(n.lineWidth,0,0):0,c=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));for(r=0,o=c.length;r<o;++r)i=(s=c[r]).width,a=s.color,i&&a&&(l.save(),l.lineWidth=i,l.strokeStyle=a,l.setLineDash&&(l.setLineDash(s.borderDash),l.lineDashOffset=s.borderDashOffset),l.beginPath(),n.drawTicks&&(l.moveTo(s.tx1,s.ty1),l.lineTo(s.tx2,s.ty2)),n.drawOnChartArea&&(l.moveTo(s.x1,s.y1),l.lineTo(s.x2,s.y2)),l.stroke(),l.restore());if(h){var f,g,m,p,v=h,b=hn(n.lineWidth,c.ticksLength-1,1),y=c.borderValue;e.isHorizontal()?(f=d(u,e.left,v)-v/2,g=d(u,e.right,b)+b/2,m=p=y):(m=d(u,e.top,v)-v/2,p=d(u,e.bottom,b)+b/2,f=g=y),l.lineWidth=h,l.strokeStyle=hn(n.color,0),l.beginPath(),l.moveTo(f,m),l.lineTo(g,p),l.stroke()}}},_drawLabels:function(){var t=this;if(t.options.ticks.display){var e,n,i,a,r,o,s,l,u=t.ctx,d=t._labelItems||(t._labelItems=t._computeLabelItems());for(e=0,i=d.length;e<i;++e){if(o=(r=d[e]).font,u.save(),u.translate(r.x,r.y),u.rotate(r.rotation),u.font=o.string,u.fillStyle=o.color,u.textBaseline="middle",u.textAlign=r.textAlign,s=r.label,l=r.textOffset,ln(s))for(n=0,a=s.length;n<a;++n)u.fillText(""+s[n],0,l),l+=o.lineHeight;else u.fillText(s,0,l);u.restore()}}},_drawTitle:function(){var t=this,e=t.ctx,n=t.options,i=n.scaleLabel;if(i.display){var a,r,o=dn(i.fontColor,Y.global.defaultFontColor),s=B.options._parseFont(i),l=B.options.toPadding(i.padding),u=s.lineHeight/2,d=n.position,h=0;if(t.isHorizontal())a=t.left+t.width/2,r="bottom"===d?t.bottom-u-l.bottom:t.top+u+l.top;else{var c="left"===d;a=c?t.left+u+l.top:t.right-u-l.top,r=t.top+t.height/2,h=c?-.5*Math.PI:.5*Math.PI}e.save(),e.translate(a,r),e.rotate(h),e.textAlign="center",e.textBaseline="middle",e.fillStyle=o,e.font=s.string,e.fillText(i.labelString,0,0),e.restore()}},draw:function(t){this._isVisible()&&(this._drawGrid(t),this._drawTitle(),this._drawLabels())},_layers:function(){var t=this,e=t.options,n=e.ticks&&e.ticks.z||0,i=e.gridLines&&e.gridLines.z||0;return t._isVisible()&&n!==i&&t.draw===t._draw?[{z:i,draw:function(){t._drawGrid.apply(t,arguments),t._drawTitle.apply(t,arguments)}},{z:n,draw:function(){t._drawLabels.apply(t,arguments)}}]:[{z:n,draw:function(){t.draw.apply(t,arguments)}}]},_getMatchingVisibleMetas:function(t){var e=this,n=e.isHorizontal();return e.chart._getSortedVisibleDatasetMetas().filter((function(i){return(!t||i.type===t)&&(n?i.xAxisID===e.id:i.yAxisID===e.id)}))}});xn.prototype._draw=xn.prototype.draw;var _n=xn,wn=B.isNullOrUndef,kn=_n.extend({determineDataLimits:function(){var t,e=this,n=e._getLabels(),i=e.options.ticks,a=i.min,r=i.max,o=0,s=n.length-1;void 0!==a&&(t=n.indexOf(a))>=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;_n.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return wn(e)||wn(n)||(t=o.chart.data.datasets[n].data[e]),wn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=B.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),Mn={position:"bottom"};kn._defaults=Mn;var Sn=B.noop,Dn=B.isNullOrUndef;var Cn=_n.extend({getRightValue:function(t){return"string"==typeof t?+t:_n.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=B.sign(t.min),i=B.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:Sn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:B.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,m=B.niceNum((g-f)/u/l)*l;if(m<1e-14&&Dn(d)&&Dn(h))return[f,g];(r=Math.ceil(g/m)-Math.floor(f/m))>u&&(m=B.niceNum(r*m/u/l)*l),s||Dn(c)?n=Math.pow(10,B._decimalPlaces(m)):(n=Math.pow(10,c),m=Math.ceil(m*n)/n),i=Math.floor(f/m)*m,a=Math.ceil(g/m)*m,s&&(!Dn(d)&&B.almostWhole(d/m,m/1e3)&&(i=d),!Dn(h)&&B.almostWhole(h/m,m/1e3)&&(a=h)),r=(a-i)/m,r=B.almostEquals(r,Math.round(r),m/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Dn(d)?i:d);for(var p=1;p<r;++p)o.push(Math.round((i+p*m)*n)/n);return o.push(Dn(h)?a:h),o}(i,t);t.handleDirectionalChanges(),t.max=B.max(a),t.min=B.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),_n.prototype.convertTicksToLabels.call(t)},_configure:function(){var t,e=this,n=e.getTicks(),i=e.min,a=e.max;_n.prototype._configure.call(e),e.options.offset&&n.length&&(i-=t=(a-i)/Math.max(n.length-1,1)/2,a+=t),e._startValue=i,e._endValue=a,e._valueRange=a-i}}),Pn={position:"left",ticks:{callback:sn.formatters.linear}};function Tn(t,e,n,i){var a,r,o=t.options,s=function(t,e,n){var i=[n.type,void 0===e&&void 0===n.stack?n.index:"",n.stack].join(".");return void 0===t[i]&&(t[i]={pos:[],neg:[]}),t[i]}(e,o.stacked,n),l=s.pos,u=s.neg,d=i.length;for(a=0;a<d;++a)r=t._parseValue(i[a]),isNaN(r.min)||isNaN(r.max)||n.data[a].hidden||(l[a]=l[a]||0,u[a]=u[a]||0,o.relativePoints?l[a]=100:r.min<0||r.max<0?u[a]+=r.min:l[a]+=r.max)}function On(t,e,n){var i,a,r=n.length;for(i=0;i<r;++i)a=t._parseValue(n[i]),isNaN(a.min)||isNaN(a.max)||e.data[i].hidden||(t.min=Math.min(t.min,a.min),t.max=Math.max(t.max,a.max))}var An=Cn.extend({determineDataLimits:function(){var t,e,n,i,a=this,r=a.options,o=a.chart.data.datasets,s=a._getMatchingVisibleMetas(),l=r.stacked,u={},d=s.length;if(a.min=Number.POSITIVE_INFINITY,a.max=Number.NEGATIVE_INFINITY,void 0===l)for(t=0;!l&&t<d;++t)l=void 0!==(e=s[t]).stack;for(t=0;t<d;++t)n=o[(e=s[t]).index].data,l?Tn(a,u,e,n):On(a,e,n);B.each(u,(function(t){i=t.pos.concat(t.neg),a.min=Math.min(a.min,B.min(i)),a.max=Math.max(a.max,B.max(i))})),a.min=B.isFinite(a.min)&&!isNaN(a.min)?a.min:0,a.max=B.isFinite(a.max)&&!isNaN(a.max)?a.max:1,a.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=B.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){return this.getPixelForDecimal((+this.getRightValue(t)-this._startValue)/this._valueRange)},getValueForPixel:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange},getPixelForTick:function(t){var e=this.ticksAsNumbers;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])}}),Fn=Pn;An._defaults=Fn;var In=B.valueOrDefault,Ln=B.math.log10;var Rn={position:"left",ticks:{callback:sn.formatters.logarithmic}};function Nn(t,e){return B.isFinite(t)&&t>=0?t:e}var Wn=_n.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e)&&void 0!==e.stack){c=!0;break}if(s.stacked||c){var f={};for(t=0;t<u.length;t++){var g=[(e=l.getDatasetMeta(t)).type,void 0===s.stacked&&void 0===e.stack?t:"",e.stack].join(".");if(l.isDatasetVisible(t)&&h(e))for(void 0===f[g]&&(f[g]=[]),a=0,r=(i=u[t].data).length;a<r;a++){var m=f[g];n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(m[a]=m[a]||0,m[a]+=n.max)}}B.each(f,(function(t){if(t.length>0){var e=B.min(t),n=B.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e))for(a=0,r=(i=u[t].data).length;a<r;a++)n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(o.min=Math.min(n.min,o.min),o.max=Math.max(n.max,o.max),0!==n.min&&(o.minNotZero=Math.min(n.min,o.minNotZero)));o.min=B.isFinite(o.min)?o.min:null,o.max=B.isFinite(o.max)?o.max:null,o.minNotZero=B.isFinite(o.minNotZero)?o.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=Nn(e.min,t.min),t.max=Nn(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(Ln(t.min))-1),t.max=Math.pow(10,Math.floor(Ln(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(Ln(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(Ln(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Ln(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:Nn(e.min),max:Nn(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Ln(e.min)))),o=Math.floor(Ln(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Ln(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Ln(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(n<o||n===o&&i<s);var u=In(t.max,r);return a.push(u),a}(i,t);t.max=B.max(a),t.min=B.min(a),e.reverse?(n=!n,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),n&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),_n.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){var e=this.tickValues;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Ln(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;_n.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,Y.global.defaultFontSize)/t._length),t._startValue=Ln(e),t._valueOffset=n,t._valueRange=(Ln(t.max)-Ln(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Ln(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),Yn=Rn;Wn._defaults=Yn;var zn=B.valueOrDefault,En=B.valueAtIndexOrDefault,Vn=B.options.resolve,Hn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:sn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Bn(t){var e=t.ticks;return e.display&&t.display?zn(e.fontSize,Y.global.defaultFontSize)+2*e.backdropPaddingY:0}function jn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n,end:e}:{start:e,end:e+n}}function Un(t){return 0===t||180===t?"center":t<180?"left":"right"}function Gn(t,e,n,i){var a,r,o=n.y+i/2;if(B.isArray(e))for(a=0,r=e.length;a<r;++a)t.fillText(e[a],n.x,o),o+=i;else t.fillText(e,n.x,o)}function qn(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function Zn(t){return B.isNumber(t)?t:0}var $n=Cn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Bn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;B.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);B.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Bn(this.options))},convertTicksToLabels:function(){var t=this;Cn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=B.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=B.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;e<d;e++){i=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,u=t.pointLabels[e],n=B.isArray(u)?{w:B.longestText(s,s.font,u),h:u.length*l}:{w:s.measureText(u).width,h:l},t._pointLabelSizes[e]=n;var h=t.getIndexAngle(e),c=B.toDegrees(h)%360,f=jn(c,i.x,n.w,0,180),g=jn(c,i.y,n.h,90,270);f.start<r.l&&(r.l=f.start,o.l=h),f.end>r.r&&(r.r=f.end,o.r=h),g.start<r.t&&(r.t=g.start,o.t=h),g.end>r.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Zn(a),r=Zn(r),o=Zn(o),s=Zn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(B.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=zn(s.lineWidth,o.lineWidth),u=zn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Bn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=B.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=En(i.fontColor,s,Y.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=B.toDegrees(h);e.textAlign=Un(c),qn(c,t._pointLabelSizes[s],u),Gn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&B.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=En(e.color,i-1),u=En(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d<s;d++)a=t.getPointPosition(d,n),r.lineTo(a.x,a.y)}r.closePath(),r.stroke(),r.restore()}}(i,o,e,n))})),s.display&&l&&u){for(a.save(),a.lineWidth=l,a.strokeStyle=u,a.setLineDash&&(a.setLineDash(Vn([s.borderDash,o.borderDash,[]])),a.lineDashOffset=Vn([s.borderDashOffset,o.borderDashOffset,0])),t=i.chart.data.labels.length-1;t>=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=B.options._parseFont(n),s=zn(n.fontColor,Y.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",B.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:B.noop}),Xn=Hn;$n._defaults=Xn;var Kn=B._deprecated,Jn=B.options.resolve,Qn=B.valueOrDefault,ti=Number.MIN_SAFE_INTEGER||-9007199254740991,ei=Number.MAX_SAFE_INTEGER||9007199254740991,ni={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ii=Object.keys(ni);function ai(t,e){return t-e}function ri(t){return B.valueOrDefault(t.time.min,t.ticks.min)}function oi(t){return B.valueOrDefault(t.time.max,t.ticks.max)}function si(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function li(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),B.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),B.isFinite(o)||(o=n.parse(o))),o)}function ui(t,e){if(B.isNullOrUndef(e))return null;var n=t.options.time,i=li(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function di(t,e,n,i){var a,r,o,s=ii.length;for(a=ii.indexOf(t);a<s-1;++a)if(o=(r=ni[ii[a]]).steps?r.steps:ei,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return ii[a];return ii[s-1]}function hi(t,e,n){var i,a,r=[],o={},s=e.length;for(i=0;i<s;++i)o[a=e[i]]=i,r.push({value:a,major:!1});return 0!==s&&n?function(t,e,n,i){var a,r,o=t._adapter,s=+o.startOf(e[0].value,i),l=e[e.length-1].value;for(a=s;a<=l;a=+o.add(a,1,i))(r=n[a])>=0&&(e[r].major=!0);return e}(t,r,o,n):r}var ci=_n.extend({initialize:function(){this.mergeTicksOptions(),_n.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new on._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),B.mergeIf(n.displayFormats,i.formats()),_n.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),_n.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=ei,f=ti,g=[],m=[],p=[],v=s._getLabels();for(t=0,n=v.length;t<n;++t)p.push(ui(s,v[t]));for(t=0,n=(l.data.datasets||[]).length;t<n;++t)if(l.isDatasetVisible(t))if(a=l.data.datasets[t].data,B.isObject(a[0]))for(m[t]=[],e=0,i=a.length;e<i;++e)r=ui(s,a[e]),g.push(r),m[t][e]=r;else m[t]=p.slice(0),o||(g=g.concat(p),o=!0);else m[t]=[];p.length&&(c=Math.min(c,p[0]),f=Math.max(f,p[p.length-1])),g.length&&(g=n>1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}(g).sort(ai):g.sort(ai),c=Math.min(c,g[0]),f=Math.max(f,g[g.length-1])),c=ui(s,ri(d))||c,f=ui(s,oi(d))||f,c=c===ei?+u.startOf(Date.now(),h):c,f=f===ti?+u.endOf(Date.now(),h)+1:f,s.min=Math.min(c,f),s.max=Math.max(c+1,f),s._table=[],s._timestamps={data:g,datasets:m,labels:p}},buildTicks:function(){var t,e,n,i=this,a=i.min,r=i.max,o=i.options,s=o.ticks,l=o.time,u=i._timestamps,d=[],h=i.getLabelCapacity(a),c=s.source,f=o.distribution;for(u="data"===c||"auto"===c&&"series"===f?u.data:"labels"===c?u.labels:function(t,e,n,i){var a,r=t._adapter,o=t.options,s=o.time,l=s.unit||di(s.minUnit,e,n,i),u=Jn([s.stepSize,s.unitStepSize,1]),d="week"===l&&s.isoWeekday,h=e,c=[];if(d&&(h=+r.startOf(h,"isoWeek",d)),h=+r.startOf(h,d?"day":l),r.diff(n,e,l)>1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a<n;a=+r.add(a,u,l))c.push(a);return a!==n&&"ticks"!==o.bounds||c.push(a),c}(i,a,r,h),"ticks"===o.bounds&&u.length&&(a=u[0],r=u[u.length-1]),a=ui(i,ri(o))||a,r=ui(i,oi(o))||r,t=0,e=u.length;t<e;++t)(n=u[t])>=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?di(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ii.length-1;r>=ii.indexOf(n);r--)if(o=ii[r],ni[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ii[n?ii.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ii.indexOf(t)+1,n=ii.length;e<n;++e)if(ni[ii[e]].common)return ii[e]}(i._unit):void 0,i._table=function(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(i._timestamps.data,a,r,f),i._offsets=function(t,e,n,i,a){var r,o,s=0,l=0;return a.offset&&e.length&&(r=si(t,"time",e[0],"pos"),s=1===e.length?1-r:(si(t,"time",e[1],"pos")-r)/2,o=si(t,"time",e[e.length-1],"pos"),l=1===e.length?o:(o-si(t,"time",e[e.length-2],"pos"))/2),{start:s,end:l,factor:1/(s+1+l)}}(i._table,d,0,0,o),s.reverse&&d.reverse(),hi(i,d,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n._adapter,a=n.chart.data,r=n.options.time,o=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return B.isObject(s)&&(o=n.getRightValue(s)),r.tooltipFormat?i.format(li(n,o),r.tooltipFormat):"string"==typeof o?o:i.format(li(n,o),r.displayFormats.datetime)},tickFormatFunction:function(t,e,n,i){var a=this._adapter,r=this.options,o=r.time.displayFormats,s=o[this._unit],l=this._majorUnit,u=o[l],d=n[e],h=r.ticks,c=l&&u&&d&&d.major,f=a.format(t,i||(c?u:s)),g=c?h.major:h.minor,m=Jn([g.callback,g.userCallback,h.callback,h.userCallback]);return m?m(f,e,n):f},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(t[e].value,e,t));return i},getPixelForOffset:function(t){var e=this._offsets,n=si(this._table,"time",t,"pos");return this.getPixelForDecimal((e.start+n)*e.factor)},getPixelForValue:function(t,e,n){var i=null;if(void 0!==e&&void 0!==n&&(i=this._timestamps.datasets[n][e]),null===i&&(i=ui(this,t)),null!==i)return this.getPixelForOffset(i)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this._offsets,n=this.getDecimalForPixel(t)/e.factor-e.end,i=si(this._table,"pos",n,"time");return this._adapter._create(i)},_getLabelSize:function(t){var e=this.options.ticks,n=this.ctx.measureText(t).width,i=B.toRadians(this.isHorizontal()?e.maxRotation:e.minRotation),a=Math.cos(i),r=Math.sin(i),o=Qn(e.fontSize,Y.global.defaultFontSize);return{w:n*a+o*r,h:n*r+o*a}},getLabelWidth:function(t){return this._getLabelSize(t).w},getLabelCapacity:function(t){var e=this,n=e.options.time,i=n.displayFormats,a=i[n.unit]||i.millisecond,r=e.tickFormatFunction(t,0,hi(e,[t],e._majorUnit),a),o=e._getLabelSize(r),s=Math.floor(e.isHorizontal()?e.width/o.w:e.height/o.h);return e.options.offset&&s--,s>0?s:1}}),fi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};ci._defaults=fi;var gi={category:kn,linear:An,logarithmic:Wn,radialLinear:$n,time:ci},mi=e((function(e,n){e.exports=function(){var n,i;function a(){return n.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function u(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function d(t,e){var n,i=[];for(n=0;n<t.length;++n)i.push(e(t[n],n));return i}function h(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){for(var n in e)h(e,n)&&(t[n]=e[n]);return h(e,"toString")&&(t.toString=e.toString),h(e,"valueOf")&&(t.valueOf=e.valueOf),t}function f(t,e,n,i){return Ie(t,e,n,i,!0).utc()}function g(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}function m(t){if(null==t._isValid){var e=g(t),n=i.call(e.parsedDateParts,(function(t){return null!=t})),a=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(a=a&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return a;t._isValid=a}return t._isValid}function p(t){var e=f(NaN);return null!=t?c(g(e),t):g(e).userInvalidated=!0,e}i=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1};var v=a.momentProperties=[];function b(t,e){var n,i,a;if(s(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),s(e._i)||(t._i=e._i),s(e._f)||(t._f=e._f),s(e._l)||(t._l=e._l),s(e._strict)||(t._strict=e._strict),s(e._tzm)||(t._tzm=e._tzm),s(e._isUTC)||(t._isUTC=e._isUTC),s(e._offset)||(t._offset=e._offset),s(e._pf)||(t._pf=g(e)),s(e._locale)||(t._locale=e._locale),v.length>0)for(n=0;n<v.length;n++)s(a=e[i=v[n]])||(t[i]=a);return t}var y=!1;function x(t){b(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===y&&(y=!0,a.updateOffset(this),y=!1)}function _(t){return t instanceof x||null!=t&&null!=t._isAMomentObject}function w(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function k(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=w(e)),n}function M(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;i<a;i++)(n&&t[i]!==e[i]||!n&&k(t[i])!==k(e[i]))&&o++;return o+r}function S(t){!1===a.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function D(t,e){var n=!0;return c((function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,t),n){for(var i,r=[],o=0;o<arguments.length;o++){if(i="","object"==typeof arguments[o]){for(var s in i+="\n["+o+"] ",arguments[0])i+=s+": "+arguments[0][s]+", ";i=i.slice(0,-2)}else i=arguments[o];r.push(i)}S(t+"\nArguments: "+Array.prototype.slice.call(r).join("")+"\n"+(new Error).stack),n=!1}return e.apply(this,arguments)}),e)}var C,P={};function T(t,e){null!=a.deprecationHandler&&a.deprecationHandler(t,e),P[t]||(S(e),P[t]=!0)}function O(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function A(t,e){var n,i=c({},t);for(n in e)h(e,n)&&(o(t[n])&&o(e[n])?(i[n]={},c(i[n],t[n]),c(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)h(t,n)&&!h(e,n)&&o(t[n])&&(i[n]=c({},i[n]));return i}function F(t){null!=t&&this.set(t)}a.suppressDeprecationWarnings=!1,a.deprecationHandler=null,C=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)h(t,e)&&n.push(e);return n};var I={};function L(t,e){var n=t.toLowerCase();I[n]=I[n+"s"]=I[e]=t}function R(t){return"string"==typeof t?I[t]||I[t.toLowerCase()]:void 0}function N(t){var e,n,i={};for(n in t)h(t,n)&&(e=R(n))&&(i[e]=t[n]);return i}var W={};function Y(t,e){W[t]=e}function z(t,e,n){var i=""+Math.abs(t),a=e-i.length;return(t>=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}var E=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,H={},B={};function j(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(B[t]=a),e&&(B[e[0]]=function(){return z(a.apply(this,arguments),e[1],e[2])}),n&&(B[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=G(e,t.localeData()),H[e]=H[e]||function(t){var e,n,i,a=t.match(E);for(e=0,n=a.length;e<n;e++)B[a[e]]?a[e]=B[a[e]]:a[e]=(i=a[e]).match(/\[[\s\S]/)?i.replace(/^\[|\]$/g,""):i.replace(/\\/g,"");return function(e){var i,r="";for(i=0;i<n;i++)r+=O(a[i])?a[i].call(e,t):a[i];return r}}(e),H[e](t)):t.localeData().invalidDate()}function G(t,e){var n=5;function i(t){return e.longDateFormat(t)||t}for(V.lastIndex=0;n>=0&&V.test(t);)t=t.replace(V,i),V.lastIndex=0,n-=1;return t}var q=/\d/,Z=/\d\d/,$=/\d{3}/,X=/\d{4}/,K=/[+-]?\d{6}/,J=/\d\d?/,Q=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,it=/[+-]?\d{1,6}/,at=/\d+/,rt=/[+-]?\d+/,ot=/Z|[+-]\d\d:?\d\d/gi,st=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function dt(t,e,n){ut[t]=O(e)?e:function(t,i){return t&&n?n:e}}function ht(t,e){return h(ut,t)?ut[t](e._strict,e._locale):new RegExp(ct(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,a){return e||n||i||a}))))}function ct(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ft={};function gt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n<t.length;n++)ft[t[n]]=i}function mt(t,e){gt(t,(function(t,n,i,a){i._w=i._w||{},e(t,i._w,i,a)}))}function pt(t,e,n){null!=e&&h(ft,t)&&ft[t](e,n._a,n,t)}var vt=0,bt=1,yt=2,xt=3,_t=4,wt=5,kt=6,Mt=7,St=8;function Dt(t){return Ct(t)?366:365}function Ct(t){return t%4==0&&t%100!=0||t%400==0}j("Y",0,0,(function(){var t=this.year();return t<=9999?""+t:"+"+t})),j(0,["YY",2],0,(function(){return this.year()%100})),j(0,["YYYY",4],0,"year"),j(0,["YYYYY",5],0,"year"),j(0,["YYYYYY",6,!0],0,"year"),L("year","y"),Y("year",1),dt("Y",rt),dt("YY",J,Z),dt("YYYY",nt,X),dt("YYYYY",it,K),dt("YYYYYY",it,K),gt(["YYYYY","YYYYYY"],vt),gt("YYYY",(function(t,e){e[vt]=2===t.length?a.parseTwoDigitYear(t):k(t)})),gt("YY",(function(t,e){e[vt]=a.parseTwoDigitYear(t)})),gt("Y",(function(t,e){e[vt]=parseInt(t,10)})),a.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)};var Pt,Tt=Ot("FullYear",!0);function Ot(t,e){return function(n){return null!=n?(Ft(this,t,n),a.updateOffset(this,e),this):At(this,t)}}function At(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Ft(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&Ct(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),It(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function It(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=function(t,e){return(t%e+e)%e}(e,12);return t+=(e-n)/12,1===n?Ct(t)?29:28:31-n%7%2}Pt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},j("M",["MM",2],"Mo",(function(){return this.month()+1})),j("MMM",0,0,(function(t){return this.localeData().monthsShort(this,t)})),j("MMMM",0,0,(function(t){return this.localeData().months(this,t)})),L("month","M"),Y("month",8),dt("M",J),dt("MM",J,Z),dt("MMM",(function(t,e){return e.monthsShortRegex(t)})),dt("MMMM",(function(t,e){return e.monthsRegex(t)})),gt(["M","MM"],(function(t,e){e[bt]=k(t)-1})),gt(["MMM","MMMM"],(function(t,e,n,i){var a=n._locale.monthsParse(t,i,n._strict);null!=a?e[bt]=a:g(n).invalidMonth=t}));var Lt=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Rt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Nt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Wt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)r=f([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(a=Pt.call(this._shortMonthsParse,o))?a:null:-1!==(a=Pt.call(this._longMonthsParse,o))?a:null:"MMM"===e?-1!==(a=Pt.call(this._shortMonthsParse,o))?a:-1!==(a=Pt.call(this._longMonthsParse,o))?a:null:-1!==(a=Pt.call(this._longMonthsParse,o))?a:-1!==(a=Pt.call(this._shortMonthsParse,o))?a:null}function Yt(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=k(e);else if(!l(e=t.localeData().monthsParse(e)))return t;return n=Math.min(t.date(),It(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function zt(t){return null!=t?(Yt(this,t),a.updateOffset(this,!0),this):At(this,"Month")}var Et=lt,Vt=lt;function Ht(){function t(t,e){return e.length-t.length}var e,n,i=[],a=[],r=[];for(e=0;e<12;e++)n=f([2e3,e]),i.push(this.monthsShort(n,"")),a.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(i.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)i[e]=ct(i[e]),a[e]=ct(a[e]);for(e=0;e<24;e++)r[e]=ct(r[e]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+i.join("|")+")","i")}function Bt(t,e,n,i,a,r,o){var s;return t<100&&t>=0?(s=new Date(t+400,e,n,i,a,r,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,n,i,a,r,o),s}function jt(t){var e;if(t<100&&t>=0){var n=Array.prototype.slice.call(arguments);n[0]=t+400,e=new Date(Date.UTC.apply(null,n)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function Ut(t,e,n){var i=7+e-n;return-(7+jt(t,0,i).getUTCDay()-e)%7+i-1}function Gt(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+Ut(t,i,a);return s<=0?o=Dt(r=t-1)+s:s>Dt(t)?(r=t+1,o=s-Dt(t)):(r=t,o=s),{year:r,dayOfYear:o}}function qt(t,e,n){var i,a,r=Ut(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+Zt(a=t.year()-1,e,n):o>Zt(t.year(),e,n)?(i=o-Zt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Zt(t,e,n){var i=Ut(t,e,n),a=Ut(t+1,e,n);return(Dt(t)-i+a)/7}function $t(t,e){return t.slice(e,7).concat(t.slice(0,e))}j("w",["ww",2],"wo","week"),j("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),Y("week",5),Y("isoWeek",5),dt("w",J),dt("ww",J,Z),dt("W",J),dt("WW",J,Z),mt(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=k(t)})),j("d",0,"do","day"),j("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),j("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),j("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),j("e",0,0,"weekday"),j("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),Y("day",11),Y("weekday",11),Y("isoWeekday",11),dt("d",J),dt("e",J),dt("E",J),dt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),dt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),dt("dddd",(function(t,e){return e.weekdaysRegex(t)})),mt(["dd","ddd","dddd"],(function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t})),mt(["d","e","E"],(function(t,e,n,i){e[i]=k(t)}));var Xt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Kt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Jt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Qt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null}var te=lt,ee=lt,ne=lt;function ie(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ct(s[e]),l[e]=ct(l[e]),u[e]=ct(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function ae(){return this.hours()%12||12}function re(t,e){j(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function oe(t,e){return e._meridiemParse}j("H",["HH",2],0,"hour"),j("h",["hh",2],0,ae),j("k",["kk",2],0,(function(){return this.hours()||24})),j("hmm",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)})),j("hmmss",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)+z(this.seconds(),2)})),j("Hmm",0,0,(function(){return""+this.hours()+z(this.minutes(),2)})),j("Hmmss",0,0,(function(){return""+this.hours()+z(this.minutes(),2)+z(this.seconds(),2)})),re("a",!0),re("A",!1),L("hour","h"),Y("hour",13),dt("a",oe),dt("A",oe),dt("H",J),dt("h",J),dt("k",J),dt("HH",J,Z),dt("hh",J,Z),dt("kk",J,Z),dt("hmm",Q),dt("hmmss",tt),dt("Hmm",Q),dt("Hmmss",tt),gt(["H","HH"],xt),gt(["k","kk"],(function(t,e,n){var i=k(t);e[xt]=24===i?0:i})),gt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),gt(["h","hh"],(function(t,e,n){e[xt]=k(t),g(n).bigHour=!0})),gt("hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i)),g(n).bigHour=!0})),gt("hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a)),g(n).bigHour=!0})),gt("Hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i))})),gt("Hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a))}));var se,le=Ot("Hours",!0),ue={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Rt,monthsShort:Nt,week:{dow:0,doy:6},weekdays:Xt,weekdaysMin:Jt,weekdaysShort:Kt,meridiemParse:/[ap]\.?m?\.?/i},de={},he={};function ce(t){return t?t.toLowerCase().replace("_","-"):t}function fe(n){var i=null;if(!de[n]&&e&&e.exports)try{i=se._abbr,t(),ge(i)}catch(t){}return de[n]}function ge(t,e){var n;return t&&((n=s(e)?pe(t):me(t,e))?se=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),se._abbr}function me(t,e){if(null!==e){var n,i=ue;if(e.abbr=t,null!=de[t])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=de[t]._config;else if(null!=e.parentLocale)if(null!=de[e.parentLocale])i=de[e.parentLocale]._config;else{if(null==(n=fe(e.parentLocale)))return he[e.parentLocale]||(he[e.parentLocale]=[]),he[e.parentLocale].push({name:t,config:e}),null;i=n._config}return de[t]=new F(A(i,e)),he[t]&&he[t].forEach((function(t){me(t.name,t.config)})),ge(t),de[t]}return delete de[t],null}function pe(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return se;if(!r(t)){if(e=fe(t))return e;t=[t]}return function(t){for(var e,n,i,a,r=0;r<t.length;){for(e=(a=ce(t[r]).split("-")).length,n=(n=ce(t[r+1]))?n.split("-"):null;e>0;){if(i=fe(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&M(a,n,!0)>=e-1)break;e--}r++}return se}(t)}function ve(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[bt]<0||n[bt]>11?bt:n[yt]<1||n[yt]>It(n[vt],n[bt])?yt:n[xt]<0||n[xt]>24||24===n[xt]&&(0!==n[_t]||0!==n[wt]||0!==n[kt])?xt:n[_t]<0||n[_t]>59?_t:n[wt]<0||n[wt]>59?wt:n[kt]<0||n[kt]>999?kt:-1,g(t)._overflowDayOfYear&&(e<vt||e>yt)&&(e=yt),g(t)._overflowWeeks&&-1===e&&(e=Mt),g(t)._overflowWeekday&&-1===e&&(e=St),g(t).overflow=e),t}function be(t,e,n){return null!=t?t:null!=e?e:n}function ye(t){var e,n,i,r,o,s=[];if(!t._d){for(i=function(t){var e=new Date(a.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[yt]&&null==t._a[bt]&&function(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=be(e.GG,t._a[vt],qt(Le(),1,4).year),i=be(e.W,1),((a=be(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=qt(Le(),r,o);n=be(e.gg,t._a[vt],u.year),i=be(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>Zt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=Gt(n,i,a,r,o),t._a[vt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=be(t._a[vt],i[vt]),(t._dayOfYear>Dt(o)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=jt(o,0,t._dayOfYear),t._a[bt]=n.getUTCMonth(),t._a[yt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=i[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[xt]&&0===t._a[_t]&&0===t._a[wt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[xt]=0),t._d=(t._useUTC?jt:Bt).apply(null,s),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[xt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(g(t).weekdayMismatch=!0)}}var xe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_e=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,we=/Z|[+-]\d\d(?::?\d\d)?/,ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Me=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Se=/^\/?Date\((\-?\d+)/i;function De(t){var e,n,i,a,r,o,s=t._i,l=xe.exec(s)||_e.exec(s);if(l){for(g(t).iso=!0,e=0,n=ke.length;e<n;e++)if(ke[e][1].exec(l[1])){a=ke[e][0],i=!1!==ke[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,n=Me.length;e<n;e++)if(Me[e][1].exec(l[3])){r=(l[2]||" ")+Me[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(l[4]){if(!we.exec(l[4]))return void(t._isValid=!1);o="Z"}t._f=a+(r||"")+(o||""),Ae(t)}else t._isValid=!1}var Ce=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function Pe(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}var Te={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Oe(t){var e,n,i,a,r,o,s,l=Ce.exec(t._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(l){var u=(e=l[4],n=l[3],i=l[2],a=l[5],r=l[6],o=l[7],s=[Pe(e),Nt.indexOf(n),parseInt(i,10),parseInt(a,10),parseInt(r,10)],o&&s.push(parseInt(o,10)),s);if(!function(t,e,n){return!t||Kt.indexOf(t)===new Date(e[0],e[1],e[2]).getDay()||(g(n).weekdayMismatch=!0,n._isValid=!1,!1)}(l[1],u,t))return;t._a=u,t._tzm=function(t,e,n){if(t)return Te[t];if(e)return 0;var i=parseInt(n,10),a=i%100;return(i-a)/100*60+a}(l[8],l[9],l[10]),t._d=jt.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),g(t).rfc2822=!0}else t._isValid=!1}function Ae(t){if(t._f!==a.ISO_8601)if(t._f!==a.RFC_2822){t._a=[],g(t).empty=!0;var e,n,i,r,o,s=""+t._i,l=s.length,u=0;for(i=G(t._f,t._locale).match(E)||[],e=0;e<i.length;e++)r=i[e],(n=(s.match(ht(r,t))||[])[0])&&((o=s.substr(0,s.indexOf(n))).length>0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),u+=n.length),B[r]?(n?g(t).empty=!1:g(t).unusedTokens.push(r),pt(r,n,t)):t._strict&&!n&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[xt]<=12&&!0===g(t).bigHour&&t._a[xt]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[xt]=function(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}(t._locale,t._a[xt],t._meridiem),ye(t),ve(t)}else Oe(t);else De(t)}function Fe(t){var e=t._i,n=t._f;return t._locale=t._locale||pe(t._l),null===e||void 0===n&&""===e?p({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),_(e)?new x(ve(e)):(u(e)?t._d=e:r(n)?function(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=b({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],Ae(e),m(e)&&(r+=g(e).charsLeftOver,r+=10*g(e).unusedTokens.length,g(e).score=r,(null==i||r<i)&&(i=r,n=e));c(t,n||e)}(t):n?Ae(t):function(t){var e=t._i;s(e)?t._d=new Date(a.now()):u(e)?t._d=new Date(e.valueOf()):"string"==typeof e?function(t){var e=Se.exec(t._i);null===e?(De(t),!1===t._isValid&&(delete t._isValid,Oe(t),!1===t._isValid&&(delete t._isValid,a.createFromInputFallback(t)))):t._d=new Date(+e[1])}(t):r(e)?(t._a=d(e.slice(0),(function(t){return parseInt(t,10)})),ye(t)):o(e)?function(t){if(!t._d){var e=N(t._i);t._a=d([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],(function(t){return t&&parseInt(t,10)})),ye(t)}}(t):l(e)?t._d=new Date(e):a.createFromInputFallback(t)}(t),m(t)||(t._d=null),t))}function Ie(t,e,n,i,a){var s,l={};return!0!==n&&!1!==n||(i=n,n=void 0),(o(t)&&function(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}(t)||r(t)&&0===t.length)&&(t=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=a,l._l=n,l._i=t,l._f=e,l._strict=i,(s=new x(ve(Fe(l))))._nextDay&&(s.add(1,"d"),s._nextDay=void 0),s}function Le(t,e,n,i){return Ie(t,e,n,i,!1)}a.createFromInputFallback=D("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",(function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))})),a.ISO_8601=function(){},a.RFC_2822=function(){};var Re=D("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Le.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:p()})),Ne=D("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Le.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:p()}));function We(t,e){var n,i;if(1===e.length&&r(e[0])&&(e=e[0]),!e.length)return Le();for(n=e[0],i=1;i<e.length;++i)e[i].isValid()&&!e[i][t](n)||(n=e[i]);return n}var Ye=["year","quarter","month","week","day","hour","minute","second","millisecond"];function ze(t){var e=N(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||e.isoWeek||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=function(t){for(var e in t)if(-1===Pt.call(Ye,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var n=!1,i=0;i<Ye.length;++i)if(t[Ye[i]]){if(n)return!1;parseFloat(t[Ye[i]])!==k(t[Ye[i]])&&(n=!0)}return!0}(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=pe(),this._bubble()}function Ee(t){return t instanceof ze}function Ve(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function He(t,e){j(t,0,0,(function(){var t=this.utcOffset(),n="+";return t<0&&(t=-t,n="-"),n+z(~~(t/60),2)+e+z(~~t%60,2)}))}He("Z",":"),He("ZZ",""),dt("Z",st),dt("ZZ",st),gt(["Z","ZZ"],(function(t,e,n){n._useUTC=!0,n._tzm=je(st,t)}));var Be=/([\+\-]|\d\d)/gi;function je(t,e){var n=(e||"").match(t);if(null===n)return null;var i=((n[n.length-1]||[])+"").match(Be)||["-",0,0],a=60*i[1]+k(i[2]);return 0===a?0:"+"===i[0]?a:-a}function Ue(t,e){var n,i;return e._isUTC?(n=e.clone(),i=(_(t)||u(t)?t.valueOf():Le(t).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+i),a.updateOffset(n,!1),n):Le(t).local()}function Ge(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function qe(){return!!this.isValid()&&this._isUTC&&0===this._offset}a.updateOffset=function(){};var Ze=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$e=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Xe(t,e){var n,i,a,r,o,s,u=t,d=null;return Ee(t)?u={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(u={},e?u[e]=t:u.milliseconds=t):(d=Ze.exec(t))?(n="-"===d[1]?-1:1,u={y:0,d:k(d[yt])*n,h:k(d[xt])*n,m:k(d[_t])*n,s:k(d[wt])*n,ms:k(Ve(1e3*d[kt]))*n}):(d=$e.exec(t))?(n="-"===d[1]?-1:1,u={y:Ke(d[2],n),M:Ke(d[3],n),w:Ke(d[4],n),d:Ke(d[5],n),h:Ke(d[6],n),m:Ke(d[7],n),s:Ke(d[8],n)}):null==u?u={}:"object"==typeof u&&("from"in u||"to"in u)&&(r=Le(u.from),o=Le(u.to),a=r.isValid()&&o.isValid()?(o=Ue(o,r),r.isBefore(o)?s=Je(r,o):((s=Je(o,r)).milliseconds=-s.milliseconds,s.months=-s.months),s):{milliseconds:0,months:0},(u={}).ms=a.milliseconds,u.M=a.months),i=new ze(u),Ee(t)&&h(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function Je(t,e){var n={};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function Qe(t,e){return function(n,i){var a;return null===i||isNaN(+i)||(T(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),a=n,n=i,i=a),tn(this,Xe(n="string"==typeof n?+n:n,i),t),this}}function tn(t,e,n,i){var r=e._milliseconds,o=Ve(e._days),s=Ve(e._months);t.isValid()&&(i=null==i||i,s&&Yt(t,At(t,"Month")+s*n),o&&Ft(t,"Date",At(t,"Date")+o*n),r&&t._d.setTime(t._d.valueOf()+r*n),i&&a.updateOffset(t,o||s))}Xe.fn=ze.prototype,Xe.invalid=function(){return Xe(NaN)};var en=Qe(1,"add"),nn=Qe(-1,"subtract");function an(t,e){var n=12*(e.year()-t.year())+(e.month()-t.month()),i=t.clone().add(n,"months");return-(n+(e-i<0?(e-i)/(i-t.clone().add(n-1,"months")):(e-i)/(t.clone().add(n+1,"months")-i)))||0}function rn(t){var e;return void 0===t?this._locale._abbr:(null!=(e=pe(t))&&(this._locale=e),this)}a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var on=D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(t){return void 0===t?this.localeData():this.locale(t)}));function sn(){return this._locale}var ln=1e3,un=60*ln,dn=60*un,hn=3506328*dn;function cn(t,e){return(t%e+e)%e}function fn(t,e,n){return t<100&&t>=0?new Date(t+400,e,n)-hn:new Date(t,e,n).valueOf()}function gn(t,e,n){return t<100&&t>=0?Date.UTC(t+400,e,n)-hn:Date.UTC(t,e,n)}function mn(t,e){j(0,[t,t.length],0,e)}function pn(t,e,n,i,a){var r;return null==t?qt(this,i,a).year:(e>(r=Zt(t,i,a))&&(e=r),vn.call(this,t,e,n,i,a))}function vn(t,e,n,i,a){var r=Gt(t,e,n,i,a),o=jt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}j(0,["gg",2],0,(function(){return this.weekYear()%100})),j(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),mn("gggg","weekYear"),mn("ggggg","weekYear"),mn("GGGG","isoWeekYear"),mn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),Y("weekYear",1),Y("isoWeekYear",1),dt("G",rt),dt("g",rt),dt("GG",J,Z),dt("gg",J,Z),dt("GGGG",nt,X),dt("gggg",nt,X),dt("GGGGG",it,K),dt("ggggg",it,K),mt(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=k(t)})),mt(["gg","GG"],(function(t,e,n,i){e[i]=a.parseTwoDigitYear(t)})),j("Q",0,"Qo","quarter"),L("quarter","Q"),Y("quarter",7),dt("Q",q),gt("Q",(function(t,e){e[bt]=3*(k(t)-1)})),j("D",["DD",2],"Do","date"),L("date","D"),Y("date",9),dt("D",J),dt("DD",J,Z),dt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),gt(["D","DD"],yt),gt("Do",(function(t,e){e[yt]=k(t.match(J)[0])}));var bn=Ot("Date",!0);j("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),Y("dayOfYear",4),dt("DDD",et),dt("DDDD",$),gt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=k(t)})),j("m",["mm",2],0,"minute"),L("minute","m"),Y("minute",14),dt("m",J),dt("mm",J,Z),gt(["m","mm"],_t);var yn=Ot("Minutes",!1);j("s",["ss",2],0,"second"),L("second","s"),Y("second",15),dt("s",J),dt("ss",J,Z),gt(["s","ss"],wt);var xn,_n=Ot("Seconds",!1);for(j("S",0,0,(function(){return~~(this.millisecond()/100)})),j(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),j(0,["SSS",3],0,"millisecond"),j(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),j(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),j(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),j(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),j(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),j(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),L("millisecond","ms"),Y("millisecond",16),dt("S",et,q),dt("SS",et,Z),dt("SSS",et,$),xn="SSSS";xn.length<=9;xn+="S")dt(xn,at);function wn(t,e){e[kt]=k(1e3*("0."+t))}for(xn="S";xn.length<=9;xn+="S")gt(xn,wn);var kn=Ot("Milliseconds",!1);j("z",0,0,"zoneAbbr"),j("zz",0,0,"zoneName");var Mn=x.prototype;function Sn(t){return t}Mn.add=en,Mn.calendar=function(t,e){var n=t||Le(),i=Ue(n,this).startOf("day"),r=a.calendarFormat(this,i)||"sameElse",o=e&&(O(e[r])?e[r].call(this,n):e[r]);return this.format(o||this.localeData().calendar(r,this,Le(n)))},Mn.clone=function(){return new x(this)},Mn.diff=function(t,e,n){var i,a,r;if(!this.isValid())return NaN;if(!(i=Ue(t,this)).isValid())return NaN;switch(a=6e4*(i.utcOffset()-this.utcOffset()),e=R(e)){case"year":r=an(this,i)/12;break;case"month":r=an(this,i);break;case"quarter":r=an(this,i)/3;break;case"second":r=(this-i)/1e3;break;case"minute":r=(this-i)/6e4;break;case"hour":r=(this-i)/36e5;break;case"day":r=(this-i-a)/864e5;break;case"week":r=(this-i-a)/6048e5;break;default:r=this-i}return n?r:w(r)},Mn.endOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?gn:fn;switch(t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=dn-cn(e+(this._isUTC?0:this.utcOffset()*un),dn)-1;break;case"minute":e=this._d.valueOf(),e+=un-cn(e,un)-1;break;case"second":e=this._d.valueOf(),e+=ln-cn(e,ln)-1}return this._d.setTime(e),a.updateOffset(this,!0),this},Mn.format=function(t){t||(t=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},Mn.from=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.fromNow=function(t){return this.from(Le(),t)},Mn.to=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.toNow=function(t){return this.to(Le(),t)},Mn.get=function(t){return O(this[t=R(t)])?this[t]():this},Mn.invalidAt=function(){return g(this).overflow},Mn.isAfter=function(t,e){var n=_(t)?t:Le(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf())},Mn.isBefore=function(t,e){var n=_(t)?t:Le(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf())},Mn.isBetween=function(t,e,n,i){var a=_(t)?t:Le(t),r=_(e)?e:Le(e);return!!(this.isValid()&&a.isValid()&&r.isValid())&&("("===(i=i||"()")[0]?this.isAfter(a,n):!this.isBefore(a,n))&&(")"===i[1]?this.isBefore(r,n):!this.isAfter(r,n))},Mn.isSame=function(t,e){var n,i=_(t)?t:Le(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()===i.valueOf():(n=i.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf()))},Mn.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},Mn.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},Mn.isValid=function(){return m(this)},Mn.lang=on,Mn.locale=rn,Mn.localeData=sn,Mn.max=Ne,Mn.min=Re,Mn.parsingFlags=function(){return c({},g(this))},Mn.set=function(t,e){if("object"==typeof t)for(var n=function(t){var e=[];for(var n in t)e.push({unit:n,priority:W[n]});return e.sort((function(t,e){return t.priority-e.priority})),e}(t=N(t)),i=0;i<n.length;i++)this[n[i].unit](t[n[i].unit]);else if(O(this[t=R(t)]))return this[t](e);return this},Mn.startOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?gn:fn;switch(t){case"year":e=n(this.year(),0,1);break;case"quarter":e=n(this.year(),this.month()-this.month()%3,1);break;case"month":e=n(this.year(),this.month(),1);break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=n(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=cn(e+(this._isUTC?0:this.utcOffset()*un),dn);break;case"minute":e=this._d.valueOf(),e-=cn(e,un);break;case"second":e=this._d.valueOf(),e-=cn(e,ln)}return this._d.setTime(e),a.updateOffset(this,!0),this},Mn.subtract=nn,Mn.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},Mn.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},Mn.toDate=function(){return new Date(this.valueOf())},Mn.toISOString=function(t){if(!this.isValid())return null;var e=!0!==t,n=e?this.clone().utc():this;return n.year()<0||n.year()>9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Mn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a=e+'[")]';return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+a)},Mn.toJSON=function(){return this.isValid()?this.toISOString():null},Mn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Mn.unix=function(){return Math.floor(this.valueOf()/1e3)},Mn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Mn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Mn.year=Tt,Mn.isLeapYear=function(){return Ct(this.year())},Mn.weekYear=function(t){return pn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Mn.isoWeekYear=function(t){return pn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Mn.quarter=Mn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Mn.month=zt,Mn.daysInMonth=function(){return It(this.year(),this.month())},Mn.week=Mn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Mn.isoWeek=Mn.isoWeeks=function(t){var e=qt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Mn.weeksInYear=function(){var t=this.localeData()._week;return Zt(this.year(),t.dow,t.doy)},Mn.isoWeeksInYear=function(){return Zt(this.year(),1,4)},Mn.date=bn,Mn.day=Mn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},Mn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Mn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Mn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Mn.hour=Mn.hours=le,Mn.minute=Mn.minutes=yn,Mn.second=Mn.seconds=_n,Mn.millisecond=Mn.milliseconds=kn,Mn.utcOffset=function(t,e,n){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=je(st,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(i=Ge(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!e||this._changeInProgress?tn(this,Xe(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Ge(this)},Mn.utc=function(t){return this.utcOffset(0,t)},Mn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ge(this),"m")),this},Mn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=je(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Mn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Le(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Mn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Mn.isUtc=qe,Mn.isUTC=qe,Mn.zoneAbbr=function(){return this._isUTC?"UTC":""},Mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Mn.dates=D("dates accessor is deprecated. Use date instead.",bn),Mn.months=D("months accessor is deprecated. Use month instead",zt),Mn.years=D("years accessor is deprecated. Use year instead",Tt),Mn.zone=D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),Mn.isDSTShifted=D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(b(t,this),(t=Fe(t))._a){var e=t._isUTC?f(t._a):Le(t._a);this._isDSTShifted=this.isValid()&&M(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}));var Dn=F.prototype;function Cn(t,e,n,i){var a=pe(),r=f().set(i,e);return a[n](r,t)}function Pn(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Cn(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=Cn(t,i,n,"month");return a}function Tn(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var a,r=pe(),o=t?r._week.dow:0;if(null!=n)return Cn(e,(n+o)%7,i,"day");var s=[];for(a=0;a<7;a++)s[a]=Cn(e,(a+o)%7,i,"day");return s}Dn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return O(i)?i.call(e,n):i},Dn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])},Dn.invalidDate=function(){return this._invalidDate},Dn.ordinal=function(t){return this._ordinal.replace("%d",t)},Dn.preparse=Sn,Dn.postformat=Sn,Dn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return O(a)?a(t,e,n,i):a.replace(/%d/i,t)},Dn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return O(n)?n(e):n.replace(/%s/i,e)},Dn.set=function(t){var e,n;for(n in t)O(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Dn.months=function(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Lt).test(e)?"format":"standalone"][t.month()]:r(this._months)?this._months:this._months.standalone},Dn.monthsShort=function(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Lt.test(e)?"format":"standalone"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Dn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return Wt.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=f([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Dn.monthsRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=Vt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Dn.monthsShortRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=Et),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Dn.week=function(t){return qt(t,this._week.dow,this._week.doy).week},Dn.firstDayOfYear=function(){return this._week.doy},Dn.firstDayOfWeek=function(){return this._week.dow},Dn.weekdays=function(t,e){var n=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?$t(n,this._week.dow):t?n[t.day()]:n},Dn.weekdaysMin=function(t){return!0===t?$t(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},Dn.weekdaysShort=function(t){return!0===t?$t(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},Dn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return Qt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Dn.weekdaysRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=te),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Dn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ee),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Dn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ne),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Dn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},Dn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ge("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),a.lang=D("moment.lang is deprecated. Use moment.locale instead.",ge),a.langData=D("moment.langData is deprecated. Use moment.localeData instead.",pe);var On=Math.abs;function An(t,e,n,i){var a=Xe(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function Fn(t){return t<0?Math.floor(t):Math.ceil(t)}function In(t){return 4800*t/146097}function Ln(t){return 146097*t/4800}function Rn(t){return function(){return this.as(t)}}var Nn=Rn("ms"),Wn=Rn("s"),Yn=Rn("m"),zn=Rn("h"),En=Rn("d"),Vn=Rn("w"),Hn=Rn("M"),Bn=Rn("Q"),jn=Rn("y");function Un(t){return function(){return this.isValid()?this._data[t]:NaN}}var Gn=Un("milliseconds"),qn=Un("seconds"),Zn=Un("minutes"),$n=Un("hours"),Xn=Un("days"),Kn=Un("months"),Jn=Un("years"),Qn=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,M:11};function ei(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}var ni=Math.abs;function ii(t){return(t>0)-(t<0)||+t}function ai(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=ni(this._milliseconds)/1e3,i=ni(this._days),a=ni(this._months);t=w(n/60),e=w(t/60),n%=60,t%=60;var r=w(a/12),o=a%=12,s=i,l=e,u=t,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=ii(this._months)!==ii(h)?"-":"",g=ii(this._days)!==ii(h)?"-":"",m=ii(this._milliseconds)!==ii(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(o?f+o+"M":"")+(s?g+s+"D":"")+(l||u||d?"T":"")+(l?m+l+"H":"")+(u?m+u+"M":"")+(d?m+d+"S":"")}var ri=ze.prototype;return ri.isValid=function(){return this._isValid},ri.abs=function(){var t=this._data;return this._milliseconds=On(this._milliseconds),this._days=On(this._days),this._months=On(this._months),t.milliseconds=On(t.milliseconds),t.seconds=On(t.seconds),t.minutes=On(t.minutes),t.hours=On(t.hours),t.months=On(t.months),t.years=On(t.years),this},ri.add=function(t,e){return An(this,t,e,1)},ri.subtract=function(t,e){return An(this,t,e,-1)},ri.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=R(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+In(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(Ln(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},ri.asMilliseconds=Nn,ri.asSeconds=Wn,ri.asMinutes=Yn,ri.asHours=zn,ri.asDays=En,ri.asWeeks=Vn,ri.asMonths=Hn,ri.asQuarters=Bn,ri.asYears=jn,ri.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},ri._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*Fn(Ln(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=w(r/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,o+=w(n/24),a=w(In(o)),s+=a,o-=Fn(Ln(a)),i=w(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},ri.clone=function(){return Xe(this)},ri.get=function(t){return t=R(t),this.isValid()?this[t+"s"]():NaN},ri.milliseconds=Gn,ri.seconds=qn,ri.minutes=Zn,ri.hours=$n,ri.days=Xn,ri.weeks=function(){return w(this.days()/7)},ri.months=Kn,ri.years=Jn,ri.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var i=Xe(t).abs(),a=Qn(i.as("s")),r=Qn(i.as("m")),o=Qn(i.as("h")),s=Qn(i.as("d")),l=Qn(i.as("M")),u=Qn(i.as("y")),d=a<=ti.ss&&["s",a]||a<ti.s&&["ss",a]||r<=1&&["m"]||r<ti.m&&["mm",r]||o<=1&&["h"]||o<ti.h&&["hh",o]||s<=1&&["d"]||s<ti.d&&["dd",s]||l<=1&&["M"]||l<ti.M&&["MM",l]||u<=1&&["y"]||["yy",u];return d[2]=e,d[3]=+t>0,d[4]=n,ei.apply(null,d)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},ri.toISOString=ai,ri.toString=ai,ri.toJSON=ai,ri.locale=rn,ri.localeData=sn,ri.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ai),ri.lang=on,j("X",0,0,"unix"),j("x",0,0,"valueOf"),dt("x",rt),dt("X",/[+-]?\d+(\.\d{1,3})?/),gt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))})),gt("x",(function(t,e,n){n._d=new Date(k(t))})),a.version="2.24.0",n=Le,a.fn=Mn,a.min=function(){return We("isBefore",[].slice.call(arguments,0))},a.max=function(){return We("isAfter",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=f,a.unix=function(t){return Le(1e3*t)},a.months=function(t,e){return Pn(t,e,"months")},a.isDate=u,a.locale=ge,a.invalid=p,a.duration=Xe,a.isMoment=_,a.weekdays=function(t,e,n){return Tn(t,e,n,"weekdays")},a.parseZone=function(){return Le.apply(null,arguments).parseZone()},a.localeData=pe,a.isDuration=Ee,a.monthsShort=function(t,e){return Pn(t,e,"monthsShort")},a.weekdaysMin=function(t,e,n){return Tn(t,e,n,"weekdaysMin")},a.defineLocale=me,a.updateLocale=function(t,e){if(null!=e){var n,i,a=ue;null!=(i=fe(t))&&(a=i._config),e=A(a,e),(n=new F(e)).parentLocale=de[t],de[t]=n,ge(t)}else null!=de[t]&&(null!=de[t].parentLocale?de[t]=de[t].parentLocale:null!=de[t]&&delete de[t]);return de[t]},a.locales=function(){return C(de)},a.weekdaysShort=function(t,e,n){return Tn(t,e,n,"weekdaysShort")},a.normalizeUnits=R,a.relativeTimeRounding=function(t){return void 0===t?Qn:"function"==typeof t&&(Qn=t,!0)},a.relativeTimeThreshold=function(t,e){return void 0!==ti[t]&&(void 0===e?ti[t]:(ti[t]=e,"s"===t&&(ti.ss=e-1),!0))},a.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},a.prototype=Mn,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()})),pi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};on._date.override("function"==typeof mi?{_id:"moment",formats:function(){return pi},parse:function(t,e){return"string"==typeof t&&"string"==typeof e?t=mi(t,e):t instanceof mi||(t=mi(t)),t.isValid()?t.valueOf():null},format:function(t,e){return mi(t).format(e)},add:function(t,e,n){return mi(t).add(e,n).valueOf()},diff:function(t,e,n){return mi(t).diff(mi(e),n)},startOf:function(t,e,n){return t=mi(t),"isoWeek"===e?t.isoWeekday(n).valueOf():t.startOf(e).valueOf()},endOf:function(t,e){return mi(t).endOf(e).valueOf()},_create:function(t){return mi(t)}}:{}),Y._set("global",{plugins:{filler:{propagate:!0}}});var vi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return B.isArray(e)?function(t,n){return e[n]}:function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};function bi(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return"-"!==r[0]&&"+"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function yi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a<l;++a)r="start"===u||"end"===u?o.getPointPositionForValue(a,"start"===u?e:n):o.getBasePosition(a),s.gridLines.circular&&(r.cx=i.x,r.cy=i.y,r.angle=o.getIndexAngle(a)-Math.PI/2),d.push(r);return d}(t):function(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePixel&&(r=i.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(B.isFinite(r))return{x:(e=i.isHorizontal())?r:null,y:e?null:r}}return null}(t)}function xi(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function _i(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),vi[n](t))}function wi(t){return t&&!t.skip}function ki(t,e,n,i,a){var r,o,s,l;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<i;++r)B.canvas.lineTo(t,e[r-1],e[r]);if(void 0===n[0].angle)for(t.lineTo(n[a-1].x,n[a-1].y),r=a-1;r>0;--r)B.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function Mi(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,m=i.spanGaps,p=[],v=[],b=0,y=0;for(t.beginPath(),o=0,s=g;o<s;++o)d=n(u=e[l=o%g]._view,l,i),h=wi(u),c=wi(d),r&&void 0===f&&h&&(s=g+(f=o+1)),h&&c?(b=p.push(u),y=v.push(d)):b&&y&&(m?(h&&p.push(u),c&&v.push(d)):(ki(t,p,v,b,y),b=y=0,p=[],v=[]));ki(t,p,v,b,y),t.closePath(),t.fillStyle=a,t.fill()}var Si={id:"filler",afterDatasetsUpdate:function(t,e){var n,i,a,r,o=(t.data.datasets||[]).length,s=e.propagate,l=[];for(i=0;i<o;++i)r=null,(a=(n=t.getDatasetMeta(i)).dataset)&&a._model&&a instanceof kt.Line&&(r={visible:t.isDatasetVisible(i),fill:bi(a,i,o),chart:t,el:a}),n.$filler=r,l.push(r);for(i=0;i<o;++i)(r=l[i])&&(r.fill=xi(l,i,s),r.boundary=yi(r),r.mapper=_i(r))},beforeDatasetsDraw:function(t){var e,n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas(),u=t.ctx;for(n=l.length-1;n>=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||Y.global.defaultColor,o&&s&&r.length&&(B.canvas.clipArea(u,t.chartArea),Mi(u,r,o,a,s,i._loop),B.canvas.unclipArea(u)))}},Di=B.rtl.getRtlAdapter,Ci=B.noop,Pi=B.valueOrDefault;function Ti(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}Y._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;e<n;e++)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=r[e].backgroundColor,r[e].label&&i.appendChild(document.createTextNode(r[e].label));return a.outerHTML}});var Oi=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:Ci,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ci,beforeSetDimensions:Ci,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ci,beforeBuildLabels:Ci,buildLabels:function(){var t=this,e=t.options.labels||{},n=B.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter((function(n){return e.filter(n,t.chart.data)}))),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:Ci,beforeFit:Ci,fit:function(){var t=this,e=t.options,n=e.labels,i=e.display,a=t.ctx,r=B.options._parseFont(n),o=r.size,s=t.legendHitBoxes=[],l=t.minSize,u=t.isHorizontal();if(u?(l.width=t.maxWidth,l.height=i?10:0):(l.width=i?10:0,l.height=t.maxHeight),i){if(a.font=r.string,u){var d=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="middle",B.each(t.legendItems,(function(t,e){var i=Ti(n,o)+o/2+a.measureText(t.text).width;(0===e||d[d.length-1]+i+2*n.padding>l.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],m=n.padding,p=0,v=0;B.each(t.legendItems,(function(t,e){var i=Ti(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(m+=p+n.padding,f.push(p),g.push(v),p=0,v=0),p=Math.max(p,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),m+=p,f.push(p),g.push(v),l.width+=m}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Ci,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=Y.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=Di(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Pi(n.fontColor,i.defaultFontColor),g=B.options._parseFont(n),m=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var p=Ti(n,m),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},y=t.isHorizontal();d=y?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},B.rtl.overrideTextDirection(t.ctx,e.textDirection);var x=m+n.padding;B.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=p+m/2+f,_=d.x,w=d.y;h.setWidth(t.minSize.width),y?i>0&&_+g+n.padding>t.left+t.minSize.width&&(w=d.y+=x,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&w+x>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,w=d.y=t.top+b(o,s[d.line]));var k=h.x(_);!function(t,e,i){if(!(isNaN(p)||p<=0)){c.save();var o=Pi(i.lineWidth,r.borderWidth);if(c.fillStyle=Pi(i.fillStyle,a),c.lineCap=Pi(i.lineCap,r.borderCapStyle),c.lineDashOffset=Pi(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Pi(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Pi(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Pi(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=p*Math.SQRT2/2,l=h.xPlus(t,p/2),u=e+m/2;B.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,p),e,p,m),0!==o&&c.strokeRect(h.leftForLtr(t,p),e,p,m);c.restore()}}(k,w,e),v[i].left=h.leftForLtr(k,v[i].width),v[i].top=w,function(t,e,n,i){var a=m/2,r=h.xPlus(t,p+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(k,w,e,f),y?d.x+=g+n.padding:d.y+=x})),B.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n<a.length;++n)if(t>=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Oi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.legend=n}var Fi={id:"legend",_element:Oi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(B.mergeIf(e,Y.global.legend),n?(pe.configure(t,n,e),n.options=e):Ai(t,e)):n&&(pe.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ii=B.noop;Y._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Li=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ii,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ii,beforeSetDimensions:Ii,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ii,beforeBuildLabels:Ii,buildLabels:Ii,afterBuildLabels:Ii,beforeFit:Ii,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(B.isArray(n.text)?n.text.length:1)*B.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ii,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=B.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=B.valueOrDefault(n.fontColor,Y.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(B.isArray(g))for(var m=0,p=0;p<g.length;++p)e.fillText(g[p],0,m,i),m+=s;else e.fillText(g,0,0,i);e.restore()}}});function Ri(t,e){var n=new Li({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.titleBlock=n}var Ni={},Wi=Si,Yi=Fi,zi={id:"title",_element:Li,beforeInit:function(t){var e=t.options.title;e&&Ri(t,e)},beforeUpdate:function(t){var e=t.options.title,n=t.titleBlock;e?(B.mergeIf(e,Y.global.title),n?(pe.configure(t,n,e),n.options=e):Ri(t,e)):n&&(pe.removeBox(t,n),delete t.titleBlock)}};for(var Ei in Ni.filler=Wi,Ni.legend=Yi,Ni.title=zi,nn.helpers=B,function(){function t(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!==t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function e(t){return null!=t&&"none"!==t}function n(n,i,a){var r=document.defaultView,o=B._getParentNode(n),s=r.getComputedStyle(n)[i],l=r.getComputedStyle(o)[i],u=e(s),d=e(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?t(s,n,a):h,d?t(l,o,a):h):"none"}B.where=function(t,e){if(B.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return B.each(t,(function(t){e(t)&&n.push(t)})),n},B.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},B.findNextWhere=function(t,e,n){B.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},B.findPreviousWhere=function(t,e,n){B.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},B.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},B.almostEquals=function(t,e,n){return Math.abs(t-e)<n},B.almostWhole=function(t,e){var n=Math.round(t);return n-e<=t&&n+e>=t},B.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},B.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},B.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},B.toRadians=function(t){return t*(Math.PI/180)},B.toDegrees=function(t){return t*(180/Math.PI)},B._decimalPlaces=function(t){if(B.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},B.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},B.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},B.aliasPixel=function(t){return t%2==0?0:.5},B._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},B.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},B.EPSILON=Number.EPSILON||1e-14,B.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e<h;++e)if(!(i=d[e]).model.skip){if(n=e>0?d[e-1]:null,(a=e<h-1?d[e+1]:null)&&!a.model.skip){var c=a.model.x-i.model.x;i.deltaK=0!==c?(a.model.y-i.model.y)/c:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}for(e=0;e<h-1;++e)i=d[e],a=d[e+1],i.model.skip||a.model.skip||(B.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(r=i.mK/i.deltaK,o=a.mK/i.deltaK,(l=Math.pow(r,2)+Math.pow(o,2))<=9||(s=3/Math.sqrt(l),i.mK=r*s*i.deltaK,a.mK=o*s*i.deltaK)));for(e=0;e<h;++e)(i=d[e]).model.skip||(n=e>0?d[e-1]:null,a=e<h-1?d[e+1]:null,n&&!n.model.skip&&(u=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-u,i.model.controlPointPreviousY=i.model.y-u*i.mK),a&&!a.model.skip&&(u=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+u,i.model.controlPointNextY=i.model.y+u*i.mK))},B.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},B.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},B.niceNum=function(t,e){var n=Math.floor(B.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},B.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},B.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(B.getStyle(r,"padding-left")),u=parseFloat(B.getStyle(r,"padding-top")),d=parseFloat(B.getStyle(r,"padding-right")),h=parseFloat(B.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},B.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},B.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},B._calculatePadding=function(t,e,n){return(e=B.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},B._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},B.getMaximumWidth=function(t){var e=B._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-B._calculatePadding(e,"padding-left",n)-B._calculatePadding(e,"padding-right",n),a=B.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},B.getMaximumHeight=function(t){var e=B._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-B._calculatePadding(e,"padding-top",n)-B._calculatePadding(e,"padding-bottom",n),a=B.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},B.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},B.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},B.fontString=function(t,e,n){return e+" "+t+"px "+n},B.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;o<c;o++)if(null!=(u=n[o])&&!0!==B.isArray(u))h=B.measureText(t,a,r,h,u);else if(B.isArray(u))for(s=0,l=u.length;s<l;s++)null==(d=u[s])||B.isArray(d)||(h=B.measureText(t,a,r,h,d));var f=r.length/2;if(f>n.length){for(o=0;o<f;o++)delete a[r[o]];r.splice(0,f)}return h},B.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},B.numberOfLabelLines=function(t){var e=1;return B.each(t,(function(t){B.isArray(t)&&t.length>e&&(e=t.length)})),e},B.color=w?function(t){return t instanceof CanvasGradient&&(t=Y.global.defaultColor),w(t)}:function(t){return console.error("Color.js not found!"),t},B.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:B.color(t).saturate(.5).darken(.1).rgbString()}}(),nn._adapters=on,nn.Animation=J,nn.animationService=Q,nn.controllers=Qt,nn.DatasetController=at,nn.defaults=Y,nn.Element=X,nn.elements=kt,nn.Interaction=oe,nn.layouts=pe,nn.platform=Le,nn.plugins=Re,nn.Scale=_n,nn.scaleService=Ne,nn.Ticks=sn,nn.Tooltip=qe,nn.helpers.each(gi,(function(t,e){nn.scaleService.registerScaleType(e,t,t._defaults)})),Ni)Ni.hasOwnProperty(Ei)&&nn.plugins.register(Ni[Ei]);nn.platform.initialize();var Vi=nn;return"undefined"!=typeof window&&(window.Chart=nn),nn.Chart=nn,nn.Legend=Ni.legend._element,nn.Title=Ni.title._element,nn.pluginService=nn.plugins,nn.PluginBase=nn.Element.extend({}),nn.canvasHelpers=nn.helpers.canvas,nn.layoutService=nn.layouts,nn.LinearScaleBase=Cn,nn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){nn[t]=function(e,n){return new nn(e,nn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Vi}));
diff --git a/borrowed/chartjs/Chart.css b/borrowed/chartjs/Chart.css
old mode 100644
new mode 100755
diff --git a/borrowed/chartjs/Chart.js b/borrowed/chartjs/Chart.js
old mode 100644
new mode 100755
index 637085791..e9c53c3ba
--- a/borrowed/chartjs/Chart.js
+++ b/borrowed/chartjs/Chart.js
@@ -1,808 +1,1234 @@
/*!
- * Chart.js v2.8.0
+ * Chart.js v2.9.4
* https://www.chartjs.org
- * (c) 2019 Chart.js Contributors
+ * (c) 2020 Chart.js Contributors
* Released under the MIT License
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) :
typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) :
-(global.Chart = factory(global.moment));
+(global = global || self, global.Chart = factory(global.moment));
}(this, (function (moment) { 'use strict';
moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;
-/* MIT license */
+function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+}
+
+function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+}
-var conversions = {
- rgb2hsl: rgb2hsl,
- rgb2hsv: rgb2hsv,
- rgb2hwb: rgb2hwb,
- rgb2cmyk: rgb2cmyk,
- rgb2keyword: rgb2keyword,
- rgb2xyz: rgb2xyz,
- rgb2lab: rgb2lab,
- rgb2lch: rgb2lch,
-
- hsl2rgb: hsl2rgb,
- hsl2hsv: hsl2hsv,
- hsl2hwb: hsl2hwb,
- hsl2cmyk: hsl2cmyk,
- hsl2keyword: hsl2keyword,
-
- hsv2rgb: hsv2rgb,
- hsv2hsl: hsv2hsl,
- hsv2hwb: hsv2hwb,
- hsv2cmyk: hsv2cmyk,
- hsv2keyword: hsv2keyword,
-
- hwb2rgb: hwb2rgb,
- hwb2hsl: hwb2hsl,
- hwb2hsv: hwb2hsv,
- hwb2cmyk: hwb2cmyk,
- hwb2keyword: hwb2keyword,
-
- cmyk2rgb: cmyk2rgb,
- cmyk2hsl: cmyk2hsl,
- cmyk2hsv: cmyk2hsv,
- cmyk2hwb: cmyk2hwb,
- cmyk2keyword: cmyk2keyword,
-
- keyword2rgb: keyword2rgb,
- keyword2hsl: keyword2hsl,
- keyword2hsv: keyword2hsv,
- keyword2hwb: keyword2hwb,
- keyword2cmyk: keyword2cmyk,
- keyword2lab: keyword2lab,
- keyword2xyz: keyword2xyz,
-
- xyz2rgb: xyz2rgb,
- xyz2lab: xyz2lab,
- xyz2lch: xyz2lch,
-
- lab2xyz: lab2xyz,
- lab2rgb: lab2rgb,
- lab2lch: lab2lch,
-
- lch2lab: lch2lab,
- lch2xyz: lch2xyz,
- lch2rgb: lch2rgb
+var colorName = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
};
+var conversions = createCommonjsModule(function (module) {
+/* MIT license */
-function rgb2hsl(rgb) {
- var r = rgb[0]/255,
- g = rgb[1]/255,
- b = rgb[2]/255,
- min = Math.min(r, g, b),
- max = Math.max(r, g, b),
- delta = max - min,
- h, s, l;
- if (max == min)
- h = 0;
- else if (r == max)
- h = (g - b) / delta;
- else if (g == max)
- h = 2 + (b - r) / delta;
- else if (b == max)
- h = 4 + (r - g)/ delta;
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+// values that give correct `typeof` results).
+// do not use box values types (i.e. Number(), String(), etc.)
- h = Math.min(h * 60, 360);
+var reverseKeywords = {};
+for (var key in colorName) {
+ if (colorName.hasOwnProperty(key)) {
+ reverseKeywords[colorName[key]] = key;
+ }
+}
+
+var convert = module.exports = {
+ rgb: {channels: 3, labels: 'rgb'},
+ hsl: {channels: 3, labels: 'hsl'},
+ hsv: {channels: 3, labels: 'hsv'},
+ hwb: {channels: 3, labels: 'hwb'},
+ cmyk: {channels: 4, labels: 'cmyk'},
+ xyz: {channels: 3, labels: 'xyz'},
+ lab: {channels: 3, labels: 'lab'},
+ lch: {channels: 3, labels: 'lch'},
+ hex: {channels: 1, labels: ['hex']},
+ keyword: {channels: 1, labels: ['keyword']},
+ ansi16: {channels: 1, labels: ['ansi16']},
+ ansi256: {channels: 1, labels: ['ansi256']},
+ hcg: {channels: 3, labels: ['h', 'c', 'g']},
+ apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+ gray: {channels: 1, labels: ['gray']}
+};
- if (h < 0)
- h += 360;
+// hide .channels and .labels properties
+for (var model in convert) {
+ if (convert.hasOwnProperty(model)) {
+ if (!('channels' in convert[model])) {
+ throw new Error('missing channels property: ' + model);
+ }
- l = (min + max) / 2;
+ if (!('labels' in convert[model])) {
+ throw new Error('missing channel labels property: ' + model);
+ }
- if (max == min)
- s = 0;
- else if (l <= 0.5)
- s = delta / (max + min);
- else
- s = delta / (2 - max - min);
+ if (convert[model].labels.length !== convert[model].channels) {
+ throw new Error('channel and label counts mismatch: ' + model);
+ }
- return [h, s * 100, l * 100];
+ var channels = convert[model].channels;
+ var labels = convert[model].labels;
+ delete convert[model].channels;
+ delete convert[model].labels;
+ Object.defineProperty(convert[model], 'channels', {value: channels});
+ Object.defineProperty(convert[model], 'labels', {value: labels});
+ }
}
-function rgb2hsv(rgb) {
- var r = rgb[0],
- g = rgb[1],
- b = rgb[2],
- min = Math.min(r, g, b),
- max = Math.max(r, g, b),
- delta = max - min,
- h, s, v;
+convert.rgb.hsl = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var min = Math.min(r, g, b);
+ var max = Math.max(r, g, b);
+ var delta = max - min;
+ var h;
+ var s;
+ var l;
- if (max == 0)
- s = 0;
- else
- s = (delta/max * 1000)/10;
+ if (max === min) {
+ h = 0;
+ } else if (r === max) {
+ h = (g - b) / delta;
+ } else if (g === max) {
+ h = 2 + (b - r) / delta;
+ } else if (b === max) {
+ h = 4 + (r - g) / delta;
+ }
- if (max == min)
- h = 0;
- else if (r == max)
- h = (g - b) / delta;
- else if (g == max)
- h = 2 + (b - r) / delta;
- else if (b == max)
- h = 4 + (r - g) / delta;
+ h = Math.min(h * 60, 360);
- h = Math.min(h * 60, 360);
+ if (h < 0) {
+ h += 360;
+ }
- if (h < 0)
- h += 360;
+ l = (min + max) / 2;
- v = ((max / 255) * 1000) / 10;
+ if (max === min) {
+ s = 0;
+ } else if (l <= 0.5) {
+ s = delta / (max + min);
+ } else {
+ s = delta / (2 - max - min);
+ }
- return [h, s, v];
-}
+ return [h, s * 100, l * 100];
+};
-function rgb2hwb(rgb) {
- var r = rgb[0],
- g = rgb[1],
- b = rgb[2],
- h = rgb2hsl(rgb)[0],
- w = 1/255 * Math.min(r, Math.min(g, b)),
- b = 1 - 1/255 * Math.max(r, Math.max(g, b));
+convert.rgb.hsv = function (rgb) {
+ var rdif;
+ var gdif;
+ var bdif;
+ var h;
+ var s;
+
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var v = Math.max(r, g, b);
+ var diff = v - Math.min(r, g, b);
+ var diffc = function (c) {
+ return (v - c) / 6 / diff + 1 / 2;
+ };
- return [h, w * 100, b * 100];
-}
+ if (diff === 0) {
+ h = s = 0;
+ } else {
+ s = diff / v;
+ rdif = diffc(r);
+ gdif = diffc(g);
+ bdif = diffc(b);
+
+ if (r === v) {
+ h = bdif - gdif;
+ } else if (g === v) {
+ h = (1 / 3) + rdif - bdif;
+ } else if (b === v) {
+ h = (2 / 3) + gdif - rdif;
+ }
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ }
+
+ return [
+ h * 360,
+ s * 100,
+ v * 100
+ ];
+};
-function rgb2cmyk(rgb) {
- var r = rgb[0] / 255,
- g = rgb[1] / 255,
- b = rgb[2] / 255,
- c, m, y, k;
+convert.rgb.hwb = function (rgb) {
+ var r = rgb[0];
+ var g = rgb[1];
+ var b = rgb[2];
+ var h = convert.rgb.hsl(rgb)[0];
+ var w = 1 / 255 * Math.min(r, Math.min(g, b));
- k = Math.min(1 - r, 1 - g, 1 - b);
- c = (1 - r - k) / (1 - k) || 0;
- m = (1 - g - k) / (1 - k) || 0;
- y = (1 - b - k) / (1 - k) || 0;
- return [c * 100, m * 100, y * 100, k * 100];
-}
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+ return [h, w * 100, b * 100];
+};
-function rgb2keyword(rgb) {
- return reverseKeywords[JSON.stringify(rgb)];
+convert.rgb.cmyk = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var c;
+ var m;
+ var y;
+ var k;
+
+ k = Math.min(1 - r, 1 - g, 1 - b);
+ c = (1 - r - k) / (1 - k) || 0;
+ m = (1 - g - k) / (1 - k) || 0;
+ y = (1 - b - k) / (1 - k) || 0;
+
+ return [c * 100, m * 100, y * 100, k * 100];
+};
+
+/**
+ * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+ * */
+function comparativeDistance(x, y) {
+ return (
+ Math.pow(x[0] - y[0], 2) +
+ Math.pow(x[1] - y[1], 2) +
+ Math.pow(x[2] - y[2], 2)
+ );
}
-function rgb2xyz(rgb) {
- var r = rgb[0] / 255,
- g = rgb[1] / 255,
- b = rgb[2] / 255;
+convert.rgb.keyword = function (rgb) {
+ var reversed = reverseKeywords[rgb];
+ if (reversed) {
+ return reversed;
+ }
- // assume sRGB
- r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
- g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
- b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
+ var currentClosestDistance = Infinity;
+ var currentClosestKeyword;
- var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
- var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
- var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+ for (var keyword in colorName) {
+ if (colorName.hasOwnProperty(keyword)) {
+ var value = colorName[keyword];
- return [x * 100, y *100, z * 100];
-}
+ // Compute comparative distance
+ var distance = comparativeDistance(rgb, value);
-function rgb2lab(rgb) {
- var xyz = rgb2xyz(rgb),
- x = xyz[0],
- y = xyz[1],
- z = xyz[2],
- l, a, b;
+ // Check if its less, if so set as closest
+ if (distance < currentClosestDistance) {
+ currentClosestDistance = distance;
+ currentClosestKeyword = keyword;
+ }
+ }
+ }
- x /= 95.047;
- y /= 100;
- z /= 108.883;
+ return currentClosestKeyword;
+};
- x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
+convert.keyword.rgb = function (keyword) {
+ return colorName[keyword];
+};
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
+convert.rgb.xyz = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
- return [l, a, b];
-}
+ // assume sRGB
+ r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
+ g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
+ b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
-function rgb2lch(args) {
- return lab2lch(rgb2lab(args));
-}
+ var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+ var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+ var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
-function hsl2rgb(hsl) {
- var h = hsl[0] / 360,
- s = hsl[1] / 100,
- l = hsl[2] / 100,
- t1, t2, t3, rgb, val;
+ return [x * 100, y * 100, z * 100];
+};
- if (s == 0) {
- val = l * 255;
- return [val, val, val];
- }
+convert.rgb.lab = function (rgb) {
+ var xyz = convert.rgb.xyz(rgb);
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
- if (l < 0.5)
- t2 = l * (1 + s);
- else
- t2 = l + s - l * s;
- t1 = 2 * l - t2;
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
- rgb = [0, 0, 0];
- for (var i = 0; i < 3; i++) {
- t3 = h + 1 / 3 * - (i - 1);
- t3 < 0 && t3++;
- t3 > 1 && t3--;
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- if (6 * t3 < 1)
- val = t1 + (t2 - t1) * 6 * t3;
- else if (2 * t3 < 1)
- val = t2;
- else if (3 * t3 < 2)
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
- else
- val = t1;
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
- rgb[i] = val * 255;
- }
+ return [l, a, b];
+};
- return rgb;
-}
+convert.hsl.rgb = function (hsl) {
+ var h = hsl[0] / 360;
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var t1;
+ var t2;
+ var t3;
+ var rgb;
+ var val;
-function hsl2hsv(hsl) {
- var h = hsl[0],
- s = hsl[1] / 100,
- l = hsl[2] / 100,
- sv, v;
+ if (s === 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
- if(l === 0) {
- // no need to do calc on black
- // also avoids divide by 0 error
- return [0, 0, 0];
- }
+ if (l < 0.5) {
+ t2 = l * (1 + s);
+ } else {
+ t2 = l + s - l * s;
+ }
- l *= 2;
- s *= (l <= 1) ? l : 2 - l;
- v = (l + s) / 2;
- sv = (2 * s) / (l + s);
- return [h, sv * 100, v * 100];
-}
+ t1 = 2 * l - t2;
-function hsl2hwb(args) {
- return rgb2hwb(hsl2rgb(args));
-}
+ rgb = [0, 0, 0];
+ for (var i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ if (t3 < 0) {
+ t3++;
+ }
+ if (t3 > 1) {
+ t3--;
+ }
-function hsl2cmyk(args) {
- return rgb2cmyk(hsl2rgb(args));
-}
+ if (6 * t3 < 1) {
+ val = t1 + (t2 - t1) * 6 * t3;
+ } else if (2 * t3 < 1) {
+ val = t2;
+ } else if (3 * t3 < 2) {
+ val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+ } else {
+ val = t1;
+ }
-function hsl2keyword(args) {
- return rgb2keyword(hsl2rgb(args));
-}
+ rgb[i] = val * 255;
+ }
+ return rgb;
+};
-function hsv2rgb(hsv) {
- var h = hsv[0] / 60,
- s = hsv[1] / 100,
- v = hsv[2] / 100,
- hi = Math.floor(h) % 6;
+convert.hsl.hsv = function (hsl) {
+ var h = hsl[0];
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var smin = s;
+ var lmin = Math.max(l, 0.01);
+ var sv;
+ var v;
+
+ l *= 2;
+ s *= (l <= 1) ? l : 2 - l;
+ smin *= lmin <= 1 ? lmin : 2 - lmin;
+ v = (l + s) / 2;
+ sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+ return [h, sv * 100, v * 100];
+};
- var f = h - Math.floor(h),
- p = 255 * v * (1 - s),
- q = 255 * v * (1 - (s * f)),
- t = 255 * v * (1 - (s * (1 - f))),
- v = 255 * v;
+convert.hsv.rgb = function (hsv) {
+ var h = hsv[0] / 60;
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var hi = Math.floor(h) % 6;
+
+ var f = h - Math.floor(h);
+ var p = 255 * v * (1 - s);
+ var q = 255 * v * (1 - (s * f));
+ var t = 255 * v * (1 - (s * (1 - f)));
+ v *= 255;
+
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+};
- switch(hi) {
- case 0:
- return [v, t, p];
- case 1:
- return [q, v, p];
- case 2:
- return [p, v, t];
- case 3:
- return [p, q, v];
- case 4:
- return [t, p, v];
- case 5:
- return [v, p, q];
- }
-}
+convert.hsv.hsl = function (hsv) {
+ var h = hsv[0];
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var vmin = Math.max(v, 0.01);
+ var lmin;
+ var sl;
+ var l;
+
+ l = (2 - s) * v;
+ lmin = (2 - s) * vmin;
+ sl = s * vmin;
+ sl /= (lmin <= 1) ? lmin : 2 - lmin;
+ sl = sl || 0;
+ l /= 2;
+
+ return [h, sl * 100, l * 100];
+};
-function hsv2hsl(hsv) {
- var h = hsv[0],
- s = hsv[1] / 100,
- v = hsv[2] / 100,
- sl, l;
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+ var h = hwb[0] / 360;
+ var wh = hwb[1] / 100;
+ var bl = hwb[2] / 100;
+ var ratio = wh + bl;
+ var i;
+ var v;
+ var f;
+ var n;
- l = (2 - s) * v;
- sl = s * v;
- sl /= (l <= 1) ? l : 2 - l;
- sl = sl || 0;
- l /= 2;
- return [h, sl * 100, l * 100];
-}
+ // wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
-function hsv2hwb(args) {
- return rgb2hwb(hsv2rgb(args))
-}
+ i = Math.floor(6 * h);
+ v = 1 - bl;
+ f = 6 * h - i;
-function hsv2cmyk(args) {
- return rgb2cmyk(hsv2rgb(args));
-}
+ if ((i & 0x01) !== 0) {
+ f = 1 - f;
+ }
-function hsv2keyword(args) {
- return rgb2keyword(hsv2rgb(args));
-}
+ n = wh + f * (v - wh); // linear interpolation
-// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
-function hwb2rgb(hwb) {
- var h = hwb[0] / 360,
- wh = hwb[1] / 100,
- bl = hwb[2] / 100,
- ratio = wh + bl,
- i, v, f, n;
+ var r;
+ var g;
+ var b;
+ switch (i) {
+ default:
+ case 6:
+ case 0: r = v; g = n; b = wh; break;
+ case 1: r = n; g = v; b = wh; break;
+ case 2: r = wh; g = v; b = n; break;
+ case 3: r = wh; g = n; b = v; break;
+ case 4: r = n; g = wh; b = v; break;
+ case 5: r = v; g = wh; b = n; break;
+ }
- // wh + bl cant be > 1
- if (ratio > 1) {
- wh /= ratio;
- bl /= ratio;
- }
+ return [r * 255, g * 255, b * 255];
+};
- i = Math.floor(6 * h);
- v = 1 - bl;
- f = 6 * h - i;
- if ((i & 0x01) != 0) {
- f = 1 - f;
- }
- n = wh + f * (v - wh); // linear interpolation
+convert.cmyk.rgb = function (cmyk) {
+ var c = cmyk[0] / 100;
+ var m = cmyk[1] / 100;
+ var y = cmyk[2] / 100;
+ var k = cmyk[3] / 100;
+ var r;
+ var g;
+ var b;
- switch (i) {
- default:
- case 6:
- case 0: r = v; g = n; b = wh; break;
- case 1: r = n; g = v; b = wh; break;
- case 2: r = wh; g = v; b = n; break;
- case 3: r = wh; g = n; b = v; break;
- case 4: r = n; g = wh; b = v; break;
- case 5: r = v; g = wh; b = n; break;
- }
+ r = 1 - Math.min(1, c * (1 - k) + k);
+ g = 1 - Math.min(1, m * (1 - k) + k);
+ b = 1 - Math.min(1, y * (1 - k) + k);
- return [r * 255, g * 255, b * 255];
-}
+ return [r * 255, g * 255, b * 255];
+};
-function hwb2hsl(args) {
- return rgb2hsl(hwb2rgb(args));
-}
+convert.xyz.rgb = function (xyz) {
+ var x = xyz[0] / 100;
+ var y = xyz[1] / 100;
+ var z = xyz[2] / 100;
+ var r;
+ var g;
+ var b;
-function hwb2hsv(args) {
- return rgb2hsv(hwb2rgb(args));
-}
+ r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+ g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+ b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
-function hwb2cmyk(args) {
- return rgb2cmyk(hwb2rgb(args));
-}
+ // assume sRGB
+ r = r > 0.0031308
+ ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
+ : r * 12.92;
-function hwb2keyword(args) {
- return rgb2keyword(hwb2rgb(args));
-}
+ g = g > 0.0031308
+ ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
+ : g * 12.92;
-function cmyk2rgb(cmyk) {
- var c = cmyk[0] / 100,
- m = cmyk[1] / 100,
- y = cmyk[2] / 100,
- k = cmyk[3] / 100,
- r, g, b;
+ b = b > 0.0031308
+ ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
+ : b * 12.92;
- r = 1 - Math.min(1, c * (1 - k) + k);
- g = 1 - Math.min(1, m * (1 - k) + k);
- b = 1 - Math.min(1, y * (1 - k) + k);
- return [r * 255, g * 255, b * 255];
-}
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
-function cmyk2hsl(args) {
- return rgb2hsl(cmyk2rgb(args));
-}
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var x;
+ var y;
+ var z;
+
+ y = (l + 16) / 116;
+ x = a / 500 + y;
+ z = y - b / 200;
+
+ var y2 = Math.pow(y, 3);
+ var x2 = Math.pow(x, 3);
+ var z2 = Math.pow(z, 3);
+ y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+ x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+ z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+ x *= 95.047;
+ y *= 100;
+ z *= 108.883;
+
+ return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var hr;
+ var h;
+ var c;
+
+ hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ c = Math.sqrt(a * a + b * b);
+
+ return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+ var l = lch[0];
+ var c = lch[1];
+ var h = lch[2];
+ var a;
+ var b;
+ var hr;
+
+ hr = h / 360 * 2 * Math.PI;
+ a = c * Math.cos(hr);
+ b = c * Math.sin(hr);
+
+ return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+ var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
+
+ value = Math.round(value / 50);
+
+ if (value === 0) {
+ return 30;
+ }
+
+ var ansi = 30
+ + ((Math.round(b / 255) << 2)
+ | (Math.round(g / 255) << 1)
+ | Math.round(r / 255));
+
+ if (value === 2) {
+ ansi += 60;
+ }
+
+ return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+ // optimization here; we already know the value and don't need to get
+ // it converted for us.
+ return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+
+ // we use the extended greyscale palette here, with the exception of
+ // black and white. normal palette only has 4 greyscale shades.
+ if (r === g && g === b) {
+ if (r < 8) {
+ return 16;
+ }
+
+ if (r > 248) {
+ return 231;
+ }
+
+ return Math.round(((r - 8) / 247) * 24) + 232;
+ }
+
+ var ansi = 16
+ + (36 * Math.round(r / 255 * 5))
+ + (6 * Math.round(g / 255 * 5))
+ + Math.round(b / 255 * 5);
+
+ return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+ var color = args % 10;
+
+ // handle greyscale
+ if (color === 0 || color === 7) {
+ if (args > 50) {
+ color += 3.5;
+ }
+
+ color = color / 10.5 * 255;
+
+ return [color, color, color];
+ }
+
+ var mult = (~~(args > 50) + 1) * 0.5;
+ var r = ((color & 1) * mult) * 255;
+ var g = (((color >> 1) & 1) * mult) * 255;
+ var b = (((color >> 2) & 1) * mult) * 255;
+
+ return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+ // handle greyscale
+ if (args >= 232) {
+ var c = (args - 232) * 10 + 8;
+ return [c, c, c];
+ }
+
+ args -= 16;
+
+ var rem;
+ var r = Math.floor(args / 36) / 5 * 255;
+ var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+ var b = (rem % 6) / 5 * 255;
+
+ return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+ var integer = ((Math.round(args[0]) & 0xFF) << 16)
+ + ((Math.round(args[1]) & 0xFF) << 8)
+ + (Math.round(args[2]) & 0xFF);
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+ var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+ if (!match) {
+ return [0, 0, 0];
+ }
+
+ var colorString = match[0];
+
+ if (match[0].length === 3) {
+ colorString = colorString.split('').map(function (char) {
+ return char + char;
+ }).join('');
+ }
+
+ var integer = parseInt(colorString, 16);
+ var r = (integer >> 16) & 0xFF;
+ var g = (integer >> 8) & 0xFF;
+ var b = integer & 0xFF;
+
+ return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var max = Math.max(Math.max(r, g), b);
+ var min = Math.min(Math.min(r, g), b);
+ var chroma = (max - min);
+ var grayscale;
+ var hue;
+
+ if (chroma < 1) {
+ grayscale = min / (1 - chroma);
+ } else {
+ grayscale = 0;
+ }
+
+ if (chroma <= 0) {
+ hue = 0;
+ } else
+ if (max === r) {
+ hue = ((g - b) / chroma) % 6;
+ } else
+ if (max === g) {
+ hue = 2 + (b - r) / chroma;
+ } else {
+ hue = 4 + (r - g) / chroma + 4;
+ }
+
+ hue /= 6;
+ hue %= 1;
+
+ return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var c = 1;
+ var f = 0;
+
+ if (l < 0.5) {
+ c = 2.0 * s * l;
+ } else {
+ c = 2.0 * s * (1.0 - l);
+ }
+
+ if (c < 1.0) {
+ f = (l - 0.5 * c) / (1.0 - c);
+ }
+
+ return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+
+ var c = s * v;
+ var f = 0;
+
+ if (c < 1.0) {
+ f = (v - c) / (1 - c);
+ }
+
+ return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+ var h = hcg[0] / 360;
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ if (c === 0.0) {
+ return [g * 255, g * 255, g * 255];
+ }
+
+ var pure = [0, 0, 0];
+ var hi = (h % 1) * 6;
+ var v = hi % 1;
+ var w = 1 - v;
+ var mg = 0;
+
+ switch (Math.floor(hi)) {
+ case 0:
+ pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+ case 1:
+ pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+ case 2:
+ pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+ case 3:
+ pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+ case 4:
+ pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+ default:
+ pure[0] = 1; pure[1] = 0; pure[2] = w;
+ }
+
+ mg = (1.0 - c) * g;
+
+ return [
+ (c * pure[0] + mg) * 255,
+ (c * pure[1] + mg) * 255,
+ (c * pure[2] + mg) * 255
+ ];
+};
+
+convert.hcg.hsv = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var v = c + g * (1.0 - c);
+ var f = 0;
+
+ if (v > 0.0) {
+ f = c / v;
+ }
+
+ return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var l = g * (1.0 - c) + 0.5 * c;
+ var s = 0;
+
+ if (l > 0.0 && l < 0.5) {
+ s = c / (2 * l);
+ } else
+ if (l >= 0.5 && l < 1.0) {
+ s = c / (2 * (1 - l));
+ }
+
+ return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+ var v = c + g * (1.0 - c);
+ return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+ var w = hwb[1] / 100;
+ var b = hwb[2] / 100;
+ var v = 1 - b;
+ var c = v - w;
+ var g = 0;
+
+ if (c < 1) {
+ g = (v - c) / (1 - c);
+ }
+
+ return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+ return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+ return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+ return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = convert.gray.hsv = function (args) {
+ return [0, 0, args[0]];
+};
+
+convert.gray.hwb = function (gray) {
+ return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+ return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+ return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+ var val = Math.round(gray[0] / 100 * 255) & 0xFF;
+ var integer = (val << 16) + (val << 8) + val;
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+ var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+ return [val / 255 * 100];
+};
+});
+var conversions_1 = conversions.rgb;
+var conversions_2 = conversions.hsl;
+var conversions_3 = conversions.hsv;
+var conversions_4 = conversions.hwb;
+var conversions_5 = conversions.cmyk;
+var conversions_6 = conversions.xyz;
+var conversions_7 = conversions.lab;
+var conversions_8 = conversions.lch;
+var conversions_9 = conversions.hex;
+var conversions_10 = conversions.keyword;
+var conversions_11 = conversions.ansi16;
+var conversions_12 = conversions.ansi256;
+var conversions_13 = conversions.hcg;
+var conversions_14 = conversions.apple;
+var conversions_15 = conversions.gray;
+
+/*
+ this function routes a model to all other models.
+
+ all functions that are routed have a property `.conversion` attached
+ to the returned synthetic function. This property is an array
+ of strings, each with the steps in between the 'from' and 'to'
+ color models (inclusive).
+
+ conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+ var graph = {};
+ // https://jsperf.com/object-keys-vs-for-in-with-closure/3
+ var models = Object.keys(conversions);
+
+ for (var len = models.length, i = 0; i < len; i++) {
+ graph[models[i]] = {
+ // http://jsperf.com/1-vs-infinity
+ // micro-opt, but this is simple.
+ distance: -1,
+ parent: null
+ };
+ }
-function cmyk2hsv(args) {
- return rgb2hsv(cmyk2rgb(args));
+ return graph;
}
-function cmyk2hwb(args) {
- return rgb2hwb(cmyk2rgb(args));
-}
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+ var graph = buildGraph();
+ var queue = [fromModel]; // unshift -> queue -> pop
-function cmyk2keyword(args) {
- return rgb2keyword(cmyk2rgb(args));
-}
+ graph[fromModel].distance = 0;
+ while (queue.length) {
+ var current = queue.pop();
+ var adjacents = Object.keys(conversions[current]);
-function xyz2rgb(xyz) {
- var x = xyz[0] / 100,
- y = xyz[1] / 100,
- z = xyz[2] / 100,
- r, g, b;
+ for (var len = adjacents.length, i = 0; i < len; i++) {
+ var adjacent = adjacents[i];
+ var node = graph[adjacent];
- r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
- g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
- b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+ if (node.distance === -1) {
+ node.distance = graph[current].distance + 1;
+ node.parent = current;
+ queue.unshift(adjacent);
+ }
+ }
+ }
- // assume sRGB
- r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
- : r = (r * 12.92);
+ return graph;
+}
- g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
- : g = (g * 12.92);
+function link(from, to) {
+ return function (args) {
+ return to(from(args));
+ };
+}
- b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
- : b = (b * 12.92);
+function wrapConversion(toModel, graph) {
+ var path = [graph[toModel].parent, toModel];
+ var fn = conversions[graph[toModel].parent][toModel];
- r = Math.min(Math.max(0, r), 1);
- g = Math.min(Math.max(0, g), 1);
- b = Math.min(Math.max(0, b), 1);
+ var cur = graph[toModel].parent;
+ while (graph[cur].parent) {
+ path.unshift(graph[cur].parent);
+ fn = link(conversions[graph[cur].parent][cur], fn);
+ cur = graph[cur].parent;
+ }
- return [r * 255, g * 255, b * 255];
+ fn.conversion = path;
+ return fn;
}
-function xyz2lab(xyz) {
- var x = xyz[0],
- y = xyz[1],
- z = xyz[2],
- l, a, b;
+var route = function (fromModel) {
+ var graph = deriveBFS(fromModel);
+ var conversion = {};
- x /= 95.047;
- y /= 100;
- z /= 108.883;
+ var models = Object.keys(graph);
+ for (var len = models.length, i = 0; i < len; i++) {
+ var toModel = models[i];
+ var node = graph[toModel];
- x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
+ if (node.parent === null) {
+ // no possible conversion, or this node is the source model.
+ continue;
+ }
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
+ conversion[toModel] = wrapConversion(toModel, graph);
+ }
- return [l, a, b];
-}
+ return conversion;
+};
-function xyz2lch(args) {
- return lab2lch(xyz2lab(args));
-}
+var convert = {};
+
+var models = Object.keys(conversions);
-function lab2xyz(lab) {
- var l = lab[0],
- a = lab[1],
- b = lab[2],
- x, y, z, y2;
+function wrapRaw(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
- if (l <= 8) {
- y = (l * 100) / 903.3;
- y2 = (7.787 * (y / 100)) + (16 / 116);
- } else {
- y = 100 * Math.pow((l + 16) / 116, 3);
- y2 = Math.pow(y / 100, 1/3);
- }
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
- x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);
+ return fn(args);
+ };
- z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
- return [x, y, z];
+ return wrappedFn;
}
-function lab2lch(lab) {
- var l = lab[0],
- a = lab[1],
- b = lab[2],
- hr, h, c;
+function wrapRounded(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
- hr = Math.atan2(b, a);
- h = hr * 360 / 2 / Math.PI;
- if (h < 0) {
- h += 360;
- }
- c = Math.sqrt(a * a + b * b);
- return [l, c, h];
-}
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
-function lab2rgb(args) {
- return xyz2rgb(lab2xyz(args));
-}
+ var result = fn(args);
-function lch2lab(lch) {
- var l = lch[0],
- c = lch[1],
- h = lch[2],
- a, b, hr;
+ // we're assuming the result is an array here.
+ // see notice in conversions.js; don't use box types
+ // in conversion functions.
+ if (typeof result === 'object') {
+ for (var len = result.length, i = 0; i < len; i++) {
+ result[i] = Math.round(result[i]);
+ }
+ }
- hr = h / 360 * 2 * Math.PI;
- a = c * Math.cos(hr);
- b = c * Math.sin(hr);
- return [l, a, b];
-}
-
-function lch2xyz(args) {
- return lab2xyz(lch2lab(args));
-}
-
-function lch2rgb(args) {
- return lab2rgb(lch2lab(args));
-}
-
-function keyword2rgb(keyword) {
- return cssKeywords[keyword];
-}
-
-function keyword2hsl(args) {
- return rgb2hsl(keyword2rgb(args));
-}
-
-function keyword2hsv(args) {
- return rgb2hsv(keyword2rgb(args));
-}
-
-function keyword2hwb(args) {
- return rgb2hwb(keyword2rgb(args));
-}
-
-function keyword2cmyk(args) {
- return rgb2cmyk(keyword2rgb(args));
-}
-
-function keyword2lab(args) {
- return rgb2lab(keyword2rgb(args));
-}
-
-function keyword2xyz(args) {
- return rgb2xyz(keyword2rgb(args));
-}
-
-var cssKeywords = {
- aliceblue: [240,248,255],
- antiquewhite: [250,235,215],
- aqua: [0,255,255],
- aquamarine: [127,255,212],
- azure: [240,255,255],
- beige: [245,245,220],
- bisque: [255,228,196],
- black: [0,0,0],
- blanchedalmond: [255,235,205],
- blue: [0,0,255],
- blueviolet: [138,43,226],
- brown: [165,42,42],
- burlywood: [222,184,135],
- cadetblue: [95,158,160],
- chartreuse: [127,255,0],
- chocolate: [210,105,30],
- coral: [255,127,80],
- cornflowerblue: [100,149,237],
- cornsilk: [255,248,220],
- crimson: [220,20,60],
- cyan: [0,255,255],
- darkblue: [0,0,139],
- darkcyan: [0,139,139],
- darkgoldenrod: [184,134,11],
- darkgray: [169,169,169],
- darkgreen: [0,100,0],
- darkgrey: [169,169,169],
- darkkhaki: [189,183,107],
- darkmagenta: [139,0,139],
- darkolivegreen: [85,107,47],
- darkorange: [255,140,0],
- darkorchid: [153,50,204],
- darkred: [139,0,0],
- darksalmon: [233,150,122],
- darkseagreen: [143,188,143],
- darkslateblue: [72,61,139],
- darkslategray: [47,79,79],
- darkslategrey: [47,79,79],
- darkturquoise: [0,206,209],
- darkviolet: [148,0,211],
- deeppink: [255,20,147],
- deepskyblue: [0,191,255],
- dimgray: [105,105,105],
- dimgrey: [105,105,105],
- dodgerblue: [30,144,255],
- firebrick: [178,34,34],
- floralwhite: [255,250,240],
- forestgreen: [34,139,34],
- fuchsia: [255,0,255],
- gainsboro: [220,220,220],
- ghostwhite: [248,248,255],
- gold: [255,215,0],
- goldenrod: [218,165,32],
- gray: [128,128,128],
- green: [0,128,0],
- greenyellow: [173,255,47],
- grey: [128,128,128],
- honeydew: [240,255,240],
- hotpink: [255,105,180],
- indianred: [205,92,92],
- indigo: [75,0,130],
- ivory: [255,255,240],
- khaki: [240,230,140],
- lavender: [230,230,250],
- lavenderblush: [255,240,245],
- lawngreen: [124,252,0],
- lemonchiffon: [255,250,205],
- lightblue: [173,216,230],
- lightcoral: [240,128,128],
- lightcyan: [224,255,255],
- lightgoldenrodyellow: [250,250,210],
- lightgray: [211,211,211],
- lightgreen: [144,238,144],
- lightgrey: [211,211,211],
- lightpink: [255,182,193],
- lightsalmon: [255,160,122],
- lightseagreen: [32,178,170],
- lightskyblue: [135,206,250],
- lightslategray: [119,136,153],
- lightslategrey: [119,136,153],
- lightsteelblue: [176,196,222],
- lightyellow: [255,255,224],
- lime: [0,255,0],
- limegreen: [50,205,50],
- linen: [250,240,230],
- magenta: [255,0,255],
- maroon: [128,0,0],
- mediumaquamarine: [102,205,170],
- mediumblue: [0,0,205],
- mediumorchid: [186,85,211],
- mediumpurple: [147,112,219],
- mediumseagreen: [60,179,113],
- mediumslateblue: [123,104,238],
- mediumspringgreen: [0,250,154],
- mediumturquoise: [72,209,204],
- mediumvioletred: [199,21,133],
- midnightblue: [25,25,112],
- mintcream: [245,255,250],
- mistyrose: [255,228,225],
- moccasin: [255,228,181],
- navajowhite: [255,222,173],
- navy: [0,0,128],
- oldlace: [253,245,230],
- olive: [128,128,0],
- olivedrab: [107,142,35],
- orange: [255,165,0],
- orangered: [255,69,0],
- orchid: [218,112,214],
- palegoldenrod: [238,232,170],
- palegreen: [152,251,152],
- paleturquoise: [175,238,238],
- palevioletred: [219,112,147],
- papayawhip: [255,239,213],
- peachpuff: [255,218,185],
- peru: [205,133,63],
- pink: [255,192,203],
- plum: [221,160,221],
- powderblue: [176,224,230],
- purple: [128,0,128],
- rebeccapurple: [102, 51, 153],
- red: [255,0,0],
- rosybrown: [188,143,143],
- royalblue: [65,105,225],
- saddlebrown: [139,69,19],
- salmon: [250,128,114],
- sandybrown: [244,164,96],
- seagreen: [46,139,87],
- seashell: [255,245,238],
- sienna: [160,82,45],
- silver: [192,192,192],
- skyblue: [135,206,235],
- slateblue: [106,90,205],
- slategray: [112,128,144],
- slategrey: [112,128,144],
- snow: [255,250,250],
- springgreen: [0,255,127],
- steelblue: [70,130,180],
- tan: [210,180,140],
- teal: [0,128,128],
- thistle: [216,191,216],
- tomato: [255,99,71],
- turquoise: [64,224,208],
- violet: [238,130,238],
- wheat: [245,222,179],
- white: [255,255,255],
- whitesmoke: [245,245,245],
- yellow: [255,255,0],
- yellowgreen: [154,205,50]
-};
+ return result;
+ };
-var reverseKeywords = {};
-for (var key in cssKeywords) {
- reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
-}
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
-var convert = function() {
- return new Converter();
-};
+ return wrappedFn;
+}
-for (var func in conversions) {
- // export Raw versions
- convert[func + "Raw"] = (function(func) {
- // accept array or plain args
- return function(arg) {
- if (typeof arg == "number")
- arg = Array.prototype.slice.call(arguments);
- return conversions[func](arg);
- }
- })(func);
-
- var pair = /(\w+)2(\w+)/.exec(func),
- from = pair[1],
- to = pair[2];
-
- // export rgb2hsl and ["rgb"]["hsl"]
- convert[from] = convert[from] || {};
-
- convert[from][to] = convert[func] = (function(func) {
- return function(arg) {
- if (typeof arg == "number")
- arg = Array.prototype.slice.call(arguments);
-
- var val = conversions[func](arg);
- if (typeof val == "string" || val === undefined)
- return val; // keyword
-
- for (var i = 0; i < val.length; i++)
- val[i] = Math.round(val[i]);
- return val;
- }
- })(func);
-}
-
-
-/* Converter does lazy conversion and caching */
-var Converter = function() {
- this.convs = {};
-};
+models.forEach(function (fromModel) {
+ convert[fromModel] = {};
-/* Either get the values for a space or
- set the values for a space, depending on args */
-Converter.prototype.routeSpace = function(space, args) {
- var values = args[0];
- if (values === undefined) {
- // color.rgb()
- return this.getValues(space);
- }
- // color.rgb(10, 10, 10)
- if (typeof values == "number") {
- values = Array.prototype.slice.call(args);
- }
+ Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+ Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
- return this.setValues(space, values);
-};
-
-/* Set the values for a space, invalidating cache */
-Converter.prototype.setValues = function(space, values) {
- this.space = space;
- this.convs = {};
- this.convs[space] = values;
- return this;
-};
+ var routes = route(fromModel);
+ var routeModels = Object.keys(routes);
-/* Get the values for a space. If there's already
- a conversion for the space, fetch it, otherwise
- compute it */
-Converter.prototype.getValues = function(space) {
- var vals = this.convs[space];
- if (!vals) {
- var fspace = this.space,
- from = this.convs[fspace];
- vals = convert[fspace][space](from);
-
- this.convs[space] = vals;
- }
- return vals;
-};
+ routeModels.forEach(function (toModel) {
+ var fn = routes[toModel];
-["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) {
- Converter.prototype[space] = function(vals) {
- return this.routeSpace(space, arguments);
- };
+ convert[fromModel][toModel] = wrapRounded(fn);
+ convert[fromModel][toModel].raw = wrapRaw(fn);
+ });
});
var colorConvert = convert;
-var colorName = {
+var colorName$1 = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
@@ -1025,7 +1451,7 @@ function getRgba(string) {
if (match[1] == "transparent") {
return [0, 0, 0, 0];
}
- rgb = colorName[match[1]];
+ rgb = colorName$1[match[1]];
if (!rgb) {
return;
}
@@ -1187,8 +1613,8 @@ function hexDouble(num) {
//create a list of reverse color names
var reverseNames = {};
-for (var name in colorName) {
- reverseNames[colorName[name]] = name;
+for (var name in colorName$1) {
+ reverseNames[colorName$1[name]] = name;
}
/* MIT license */
@@ -1677,6 +2103,10 @@ if (typeof window !== 'undefined') {
var chartjsColor = Color;
+function isValidKey(key) {
+ return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;
+}
+
/**
* @namespace Chart.helpers
*/
@@ -1852,7 +2282,7 @@ var helpers = {
}
if (helpers.isObject(source)) {
- var target = {};
+ var target = Object.create(source);
var keys = Object.keys(source);
var klen = keys.length;
var k = 0;
@@ -1873,6 +2303,12 @@ var helpers = {
* @private
*/
_merger: function(key, target, source, options) {
+ if (!isValidKey(key)) {
+ // We want to ensure we do not copy prototypes over
+ // as this can pollute global namespaces
+ return;
+ }
+
var tval = target[key];
var sval = source[key];
@@ -1888,6 +2324,12 @@ var helpers = {
* @private
*/
_mergerIf: function(key, target, source) {
+ if (!isValidKey(key)) {
+ // We want to ensure we do not copy prototypes over
+ // as this can pollute global namespaces
+ return;
+ }
+
var tval = target[key];
var sval = source[key];
@@ -1952,14 +2394,12 @@ var helpers = {
* @param {object} argN - Additional objects containing properties to merge in target.
* @returns {object} The `target` object.
*/
- extend: function(target) {
- var setFn = function(value, key) {
- target[key] = value;
- };
- for (var i = 1, ilen = arguments.length; i < ilen; ++i) {
- helpers.each(arguments[i], setFn);
- }
- return target;
+ extend: Object.assign || function(target) {
+ return helpers.merge(target, [].slice.call(arguments, 1), {
+ merger: function(key, dst, src) {
+ dst[key] = src[key];
+ }
+ });
},
/**
@@ -1985,6 +2425,13 @@ var helpers = {
ChartElement.__super__ = me.prototype;
return ChartElement;
+ },
+
+ _deprecated: function(scope, value, previous, current) {
+ if (value !== undefined) {
+ console.warn(scope + ': "' + previous +
+ '" is deprecated. Please use "' + current + '" instead');
+ }
}
};
@@ -2346,7 +2793,11 @@ var exports$1 = {
if (style && typeof style === 'object') {
type = style.toString();
if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
- ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);
+ ctx.save();
+ ctx.translate(x, y);
+ ctx.rotate(rad);
+ ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);
+ ctx.restore();
return;
}
}
@@ -2538,6 +2989,8 @@ var defaults = {
}
};
+// TODO(v3): remove 'global' from namespace. all default are global and
+// there's inconsistency around which options are under 'global'
defaults._set('global', {
defaultColor: 'rgba(0,0,0,0.1)',
defaultFontColor: '#666',
@@ -2596,8 +3049,6 @@ var helpers_options = {
case '%':
value /= 100;
break;
- default:
- break;
}
return size * value;
@@ -2662,9 +3113,12 @@ var helpers_options = {
* is called with `context` as first argument and the result becomes the new input.
* @param {number} [index] - If defined and the current value is an array, the value
* at `index` become the new input.
+ * @param {object} [info] - object to return information about resolution in
+ * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable.
* @since 2.7.0
*/
- resolve: function(inputs, context, index) {
+ resolve: function(inputs, context, index, info) {
+ var cacheable = true;
var i, ilen, value;
for (i = 0, ilen = inputs.length; i < ilen; ++i) {
@@ -2674,24 +3128,161 @@ var helpers_options = {
}
if (context !== undefined && typeof value === 'function') {
value = value(context);
+ cacheable = false;
}
if (index !== undefined && helpers_core.isArray(value)) {
value = value[index];
+ cacheable = false;
}
if (value !== undefined) {
+ if (info && !cacheable) {
+ info.cacheable = false;
+ }
return value;
}
}
}
};
+/**
+ * @alias Chart.helpers.math
+ * @namespace
+ */
+var exports$2 = {
+ /**
+ * Returns an array of factors sorted from 1 to sqrt(value)
+ * @private
+ */
+ _factorize: function(value) {
+ var result = [];
+ var sqrt = Math.sqrt(value);
+ var i;
+
+ for (i = 1; i < sqrt; i++) {
+ if (value % i === 0) {
+ result.push(i);
+ result.push(value / i);
+ }
+ }
+ if (sqrt === (sqrt | 0)) { // if value is a square number
+ result.push(sqrt);
+ }
+
+ result.sort(function(a, b) {
+ return a - b;
+ }).pop();
+ return result;
+ },
+
+ log10: Math.log10 || function(x) {
+ var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.
+ // Check for whole powers of 10,
+ // which due to floating point rounding error should be corrected.
+ var powerOf10 = Math.round(exponent);
+ var isPowerOf10 = x === Math.pow(10, powerOf10);
+
+ return isPowerOf10 ? powerOf10 : exponent;
+ }
+};
+
+var helpers_math = exports$2;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.math.log10 instead.
+ * @namespace Chart.helpers.log10
+ * @deprecated since version 2.9.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers_core.log10 = exports$2.log10;
+
+var getRtlAdapter = function(rectX, width) {
+ return {
+ x: function(x) {
+ return rectX + rectX + width - x;
+ },
+ setWidth: function(w) {
+ width = w;
+ },
+ textAlign: function(align) {
+ if (align === 'center') {
+ return align;
+ }
+ return align === 'right' ? 'left' : 'right';
+ },
+ xPlus: function(x, value) {
+ return x - value;
+ },
+ leftForLtr: function(x, itemWidth) {
+ return x - itemWidth;
+ },
+ };
+};
+
+var getLtrAdapter = function() {
+ return {
+ x: function(x) {
+ return x;
+ },
+ setWidth: function(w) { // eslint-disable-line no-unused-vars
+ },
+ textAlign: function(align) {
+ return align;
+ },
+ xPlus: function(x, value) {
+ return x + value;
+ },
+ leftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars
+ return x;
+ },
+ };
+};
+
+var getAdapter = function(rtl, rectX, width) {
+ return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();
+};
+
+var overrideTextDirection = function(ctx, direction) {
+ var style, original;
+ if (direction === 'ltr' || direction === 'rtl') {
+ style = ctx.canvas.style;
+ original = [
+ style.getPropertyValue('direction'),
+ style.getPropertyPriority('direction'),
+ ];
+
+ style.setProperty('direction', direction, 'important');
+ ctx.prevTextDirection = original;
+ }
+};
+
+var restoreTextDirection = function(ctx) {
+ var original = ctx.prevTextDirection;
+ if (original !== undefined) {
+ delete ctx.prevTextDirection;
+ ctx.canvas.style.setProperty('direction', original[0], original[1]);
+ }
+};
+
+var helpers_rtl = {
+ getRtlAdapter: getAdapter,
+ overrideTextDirection: overrideTextDirection,
+ restoreTextDirection: restoreTextDirection,
+};
+
var helpers$1 = helpers_core;
var easing = helpers_easing;
var canvas = helpers_canvas;
var options = helpers_options;
+var math = helpers_math;
+var rtl = helpers_rtl;
helpers$1.easing = easing;
helpers$1.canvas = canvas;
helpers$1.options = options;
+helpers$1.math = math;
+helpers$1.rtl = rtl;
function interpolate(start, view, model, ease) {
var keys = Object.keys(model);
@@ -2748,6 +3339,7 @@ var Element = function(configuration) {
};
helpers$1.extend(Element.prototype, {
+ _type: undefined,
initialize: function() {
this.hidden = false;
@@ -2756,7 +3348,7 @@ helpers$1.extend(Element.prototype, {
pivot: function() {
var me = this;
if (!me._view) {
- me._view = helpers$1.clone(me._model);
+ me._view = helpers$1.extend({}, me._model);
}
me._start = {};
return me;
@@ -2770,7 +3362,7 @@ helpers$1.extend(Element.prototype, {
// No animation -> No Transition
if (!model || ease === 1) {
- me._view = model;
+ me._view = helpers$1.extend({}, model);
me._start = null;
return me;
}
@@ -2804,7 +3396,7 @@ Element.extend = helpers$1.inherits;
var core_element = Element;
-var exports$2 = core_element.extend({
+var exports$3 = core_element.extend({
chart: null, // the animation associated chart instance
currentStep: 0, // the current animation step
numSteps: 60, // default number of steps
@@ -2815,7 +3407,7 @@ var exports$2 = core_element.extend({
onAnimationComplete: null, // user specified callback to fire when the animation finishes
});
-var core_animation = exports$2;
+var core_animation = exports$3;
// DEPRECATIONS
@@ -2825,7 +3417,7 @@ var core_animation = exports$2;
* @deprecated since version 2.6.0
* @todo remove at version 3
*/
-Object.defineProperty(exports$2.prototype, 'animationObject', {
+Object.defineProperty(exports$3.prototype, 'animationObject', {
get: function() {
return this;
}
@@ -2837,7 +3429,7 @@ Object.defineProperty(exports$2.prototype, 'animationObject', {
* @deprecated since version 2.6.0
* @todo remove at version 3
*/
-Object.defineProperty(exports$2.prototype, 'chartInstance', {
+Object.defineProperty(exports$3.prototype, 'chartInstance', {
get: function() {
return this.chart;
},
@@ -3055,12 +3647,42 @@ helpers$1.extend(DatasetController.prototype, {
*/
dataElementType: null,
+ /**
+ * Dataset element option keys to be resolved in _resolveDatasetElementOptions.
+ * A derived controller may override this to resolve controller-specific options.
+ * The keys defined here are for backward compatibility for legend styles.
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderCapStyle',
+ 'borderColor',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'borderWidth'
+ ],
+
+ /**
+ * Data element option keys to be resolved in _resolveDataElementOptions.
+ * A derived controller may override this to resolve controller-specific options.
+ * The keys defined here are for backward compatibility for legend styles.
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'pointStyle'
+ ],
+
initialize: function(chart, datasetIndex) {
var me = this;
me.chart = chart;
me.index = datasetIndex;
me.linkScales();
me.addElements();
+ me._type = me.getMeta().type;
},
updateIndex: function(datasetIndex) {
@@ -3070,13 +3692,16 @@ helpers$1.extend(DatasetController.prototype, {
linkScales: function() {
var me = this;
var meta = me.getMeta();
+ var chart = me.chart;
+ var scales = chart.scales;
var dataset = me.getDataset();
+ var scalesOpts = chart.options.scales;
- if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {
- meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;
+ if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {
+ meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;
}
- if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {
- meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;
+ if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {
+ meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;
}
},
@@ -3121,7 +3746,7 @@ helpers$1.extend(DatasetController.prototype, {
},
reset: function() {
- this.update(true);
+ this._update(true);
},
/**
@@ -3197,6 +3822,31 @@ helpers$1.extend(DatasetController.prototype, {
me.resyncElements();
},
+ /**
+ * Returns the merged user-supplied and default dataset-level options
+ * @private
+ */
+ _configure: function() {
+ var me = this;
+ me._config = helpers$1.merge(Object.create(null), [
+ me.chart.options.datasets[me._type],
+ me.getDataset(),
+ ], {
+ merger: function(key, target, source) {
+ if (key !== '_meta' && key !== 'data') {
+ helpers$1._merger(key, target, source);
+ }
+ }
+ });
+ },
+
+ _update: function(reset) {
+ var me = this;
+ me._configure();
+ me._cachedDataOpts = null;
+ me.update(reset);
+ },
+
update: helpers$1.noop,
transition: function(easingValue) {
@@ -3229,6 +3879,127 @@ helpers$1.extend(DatasetController.prototype, {
}
},
+ /**
+ * Returns a set of predefined style properties that should be used to represent the dataset
+ * or the data if the index is specified
+ * @param {number} index - data index
+ * @return {IStyleInterface} style object
+ */
+ getStyle: function(index) {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = meta.dataset;
+ var style;
+
+ me._configure();
+ if (dataset && index === undefined) {
+ style = me._resolveDatasetElementOptions(dataset || {});
+ } else {
+ index = index || 0;
+ style = me._resolveDataElementOptions(meta.data[index] || {}, index);
+ }
+
+ if (style.fill === false || style.fill === null) {
+ style.backgroundColor = style.borderColor;
+ }
+
+ return style;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDatasetElementOptions: function(element, hover) {
+ var me = this;
+ var chart = me.chart;
+ var datasetOpts = me._config;
+ var custom = element.custom || {};
+ var options = chart.options.elements[me.datasetElementType.prototype._type] || {};
+ var elementOptions = me._datasetElementOptions;
+ var values = {};
+ var i, ilen, key, readKey;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataset: me.getDataset(),
+ datasetIndex: me.index,
+ hover: hover
+ };
+
+ for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
+ key = elementOptions[i];
+ readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;
+ values[key] = resolve([
+ custom[readKey],
+ datasetOpts[readKey],
+ options[readKey]
+ ], context);
+ }
+
+ return values;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDataElementOptions: function(element, index) {
+ var me = this;
+ var custom = element && element.custom;
+ var cached = me._cachedDataOpts;
+ if (cached && !custom) {
+ return cached;
+ }
+ var chart = me.chart;
+ var datasetOpts = me._config;
+ var options = chart.options.elements[me.dataElementType.prototype._type] || {};
+ var elementOptions = me._dataElementOptions;
+ var values = {};
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: me.getDataset(),
+ datasetIndex: me.index
+ };
+
+ // `resolve` sets cacheable to `false` if any option is indexed or scripted
+ var info = {cacheable: !custom};
+
+ var keys, i, ilen, key;
+
+ custom = custom || {};
+
+ if (helpers$1.isArray(elementOptions)) {
+ for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
+ key = elementOptions[i];
+ values[key] = resolve([
+ custom[key],
+ datasetOpts[key],
+ options[key]
+ ], context, index, info);
+ }
+ } else {
+ keys = Object.keys(elementOptions);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve([
+ custom[key],
+ datasetOpts[elementOptions[key]],
+ datasetOpts[key],
+ options[key]
+ ], context, index, info);
+ }
+ }
+
+ if (info.cacheable) {
+ me._cachedDataOpts = Object.freeze(values);
+ }
+
+ return values;
+ },
+
removeHoverStyle: function(element) {
helpers$1.merge(element._model, element.$previousStyle || {});
delete element.$previousStyle;
@@ -3252,6 +4023,42 @@ helpers$1.extend(DatasetController.prototype, {
model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
},
+ /**
+ * @private
+ */
+ _removeDatasetHoverStyle: function() {
+ var element = this.getMeta().dataset;
+
+ if (element) {
+ this.removeHoverStyle(element);
+ }
+ },
+
+ /**
+ * @private
+ */
+ _setDatasetHoverStyle: function() {
+ var element = this.getMeta().dataset;
+ var prev = {};
+ var i, ilen, key, keys, hoverOptions, model;
+
+ if (!element) {
+ return;
+ }
+
+ model = element._model;
+ hoverOptions = this._resolveDatasetElementOptions(element, true);
+
+ keys = Object.keys(hoverOptions);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ prev[key] = model[key];
+ model[key] = hoverOptions[key];
+ }
+
+ element.$previousStyle = prev;
+ },
+
/**
* @private
*/
@@ -3320,6 +4127,8 @@ DatasetController.extend = helpers$1.inherits;
var core_datasetController = DatasetController;
+var TAU = Math.PI * 2;
+
core_defaults._set('global', {
elements: {
arc: {
@@ -3329,9 +4138,86 @@ core_defaults._set('global', {
borderAlign: 'center'
}
}
-});
+});
+
+function clipArc(ctx, arc) {
+ var startAngle = arc.startAngle;
+ var endAngle = arc.endAngle;
+ var pixelMargin = arc.pixelMargin;
+ var angleMargin = pixelMargin / arc.outerRadius;
+ var x = arc.x;
+ var y = arc.y;
+
+ // Draw an inner border by cliping the arc and drawing a double-width border
+ // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
+ ctx.beginPath();
+ ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);
+ if (arc.innerRadius > pixelMargin) {
+ angleMargin = pixelMargin / arc.innerRadius;
+ ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);
+ } else {
+ ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);
+ }
+ ctx.closePath();
+ ctx.clip();
+}
+
+function drawFullCircleBorders(ctx, vm, arc, inner) {
+ var endAngle = arc.endAngle;
+ var i;
+
+ if (inner) {
+ arc.endAngle = arc.startAngle + TAU;
+ clipArc(ctx, arc);
+ arc.endAngle = endAngle;
+ if (arc.endAngle === arc.startAngle && arc.fullCircles) {
+ arc.endAngle += TAU;
+ arc.fullCircles--;
+ }
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.stroke();
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.stroke();
+ }
+}
+
+function drawBorder(ctx, vm, arc) {
+ var inner = vm.borderAlign === 'inner';
+
+ if (inner) {
+ ctx.lineWidth = vm.borderWidth * 2;
+ ctx.lineJoin = 'round';
+ } else {
+ ctx.lineWidth = vm.borderWidth;
+ ctx.lineJoin = 'bevel';
+ }
+
+ if (arc.fullCircles) {
+ drawFullCircleBorders(ctx, vm, arc, inner);
+ }
+
+ if (inner) {
+ clipArc(ctx, arc);
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ ctx.stroke();
+}
var element_arc = core_element.extend({
+ _type: 'arc',
+
inLabelRange: function(mouseX) {
var vm = this._view;
@@ -3346,20 +4232,20 @@ var element_arc = core_element.extend({
if (vm) {
var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});
- var angle = pointRelativePosition.angle;
+ var angle = pointRelativePosition.angle;
var distance = pointRelativePosition.distance;
// Sanitise angle range
var startAngle = vm.startAngle;
var endAngle = vm.endAngle;
while (endAngle < startAngle) {
- endAngle += 2.0 * Math.PI;
+ endAngle += TAU;
}
while (angle > endAngle) {
- angle -= 2.0 * Math.PI;
+ angle -= TAU;
}
while (angle < startAngle) {
- angle += 2.0 * Math.PI;
+ angle += TAU;
}
// Check if within the range of the open/close angle
@@ -3400,51 +4286,44 @@ var element_arc = core_element.extend({
draw: function() {
var ctx = this._chart.ctx;
var vm = this._view;
- var sA = vm.startAngle;
- var eA = vm.endAngle;
var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;
- var angleMargin;
+ var arc = {
+ x: vm.x,
+ y: vm.y,
+ innerRadius: vm.innerRadius,
+ outerRadius: Math.max(vm.outerRadius - pixelMargin, 0),
+ pixelMargin: pixelMargin,
+ startAngle: vm.startAngle,
+ endAngle: vm.endAngle,
+ fullCircles: Math.floor(vm.circumference / TAU)
+ };
+ var i;
ctx.save();
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.strokeStyle = vm.borderColor;
+
+ if (arc.fullCircles) {
+ arc.endAngle = arc.startAngle + TAU;
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.fill();
+ }
+ arc.endAngle = arc.startAngle + vm.circumference % TAU;
+ }
+
ctx.beginPath();
- ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);
- ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
+ ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
ctx.closePath();
-
- ctx.fillStyle = vm.backgroundColor;
ctx.fill();
if (vm.borderWidth) {
- if (vm.borderAlign === 'inner') {
- // Draw an inner border by cliping the arc and drawing a double-width border
- // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
- ctx.beginPath();
- angleMargin = pixelMargin / vm.outerRadius;
- ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin);
- if (vm.innerRadius > pixelMargin) {
- angleMargin = pixelMargin / vm.innerRadius;
- ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true);
- } else {
- ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2);
- }
- ctx.closePath();
- ctx.clip();
-
- ctx.beginPath();
- ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);
- ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
- ctx.closePath();
-
- ctx.lineWidth = vm.borderWidth * 2;
- ctx.lineJoin = 'round';
- } else {
- ctx.lineWidth = vm.borderWidth;
- ctx.lineJoin = 'bevel';
- }
-
- ctx.strokeStyle = vm.borderColor;
- ctx.stroke();
+ drawBorder(ctx, vm, arc);
}
ctx.restore();
@@ -3473,6 +4352,8 @@ core_defaults._set('global', {
});
var element_line = core_element.extend({
+ _type: 'line',
+
draw: function() {
var me = this;
var vm = me._view;
@@ -3482,11 +4363,27 @@ var element_line = core_element.extend({
var globalDefaults = core_defaults.global;
var globalOptionLineElements = globalDefaults.elements.line;
var lastDrawnIndex = -1;
- var index, current, previous, currentVM;
+ var closePath = me._loop;
+ var index, previous, currentVM;
+
+ if (!points.length) {
+ return;
+ }
- // If we are looping, adding the first point again
- if (me._loop && points.length) {
- points.push(points[0]);
+ if (me._loop) {
+ for (index = 0; index < points.length; ++index) {
+ previous = helpers$1.previousItem(points, index);
+ // If the line has an open path, shift the point array
+ if (!points[index]._view.skip && previous._view.skip) {
+ points = points.slice(index).concat(points.slice(0, index));
+ closePath = spanGaps;
+ break;
+ }
+ }
+ // If the line has a close path, add the first point again
+ if (closePath) {
+ points.push(points[0]);
+ }
}
ctx.save();
@@ -3506,35 +4403,34 @@ var element_line = core_element.extend({
// Stroke Line
ctx.beginPath();
- lastDrawnIndex = -1;
- for (index = 0; index < points.length; ++index) {
- current = points[index];
- previous = helpers$1.previousItem(points, index);
- currentVM = current._view;
+ // First point moves to it's starting position no matter what
+ currentVM = points[0]._view;
+ if (!currentVM.skip) {
+ ctx.moveTo(currentVM.x, currentVM.y);
+ lastDrawnIndex = 0;
+ }
- // First point moves to it's starting position no matter what
- if (index === 0) {
- if (!currentVM.skip) {
- ctx.moveTo(currentVM.x, currentVM.y);
- lastDrawnIndex = index;
- }
- } else {
- previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];
+ for (index = 1; index < points.length; ++index) {
+ currentVM = points[index]._view;
+ previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];
- if (!currentVM.skip) {
- if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
- // There was a gap and this is the first point after the gap
- ctx.moveTo(currentVM.x, currentVM.y);
- } else {
- // Line to next point
- helpers$1.canvas.lineTo(ctx, previous._view, current._view);
- }
- lastDrawnIndex = index;
+ if (!currentVM.skip) {
+ if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
+ // There was a gap and this is the first point after the gap
+ ctx.moveTo(currentVM.x, currentVM.y);
+ } else {
+ // Line to next point
+ helpers$1.canvas.lineTo(ctx, previous._view, currentVM);
}
+ lastDrawnIndex = index;
}
}
+ if (closePath) {
+ ctx.closePath();
+ }
+
ctx.stroke();
ctx.restore();
}
@@ -3571,6 +4467,8 @@ function yRange(mouseY) {
}
var element_point = core_element.extend({
+ _type: 'point',
+
inRange: function(mouseX, mouseY) {
var vm = this._view;
return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;
@@ -3753,6 +4651,8 @@ function inRange(vm, x, y) {
}
var element_rectangle = core_element.extend({
+ _type: 'rectangle',
+
draw: function() {
var ctx = this._chart.ctx;
var vm = this._view;
@@ -3842,7 +4742,8 @@ elements.Line = Line;
elements.Point = Point;
elements.Rectangle = Rectangle;
-var resolve$1 = helpers$1.options.resolve;
+var deprecated = helpers$1._deprecated;
+var valueOrDefault$3 = helpers$1.valueOrDefault;
core_defaults._set('bar', {
hover: {
@@ -3852,8 +4753,6 @@ core_defaults._set('bar', {
scales: {
xAxes: [{
type: 'category',
- categoryPercentage: 0.8,
- barPercentage: 0.9,
offset: true,
gridLines: {
offsetGridLines: true
@@ -3866,22 +4765,30 @@ core_defaults._set('bar', {
}
});
+core_defaults._set('global', {
+ datasets: {
+ bar: {
+ categoryPercentage: 0.8,
+ barPercentage: 0.9
+ }
+ }
+});
+
/**
* Computes the "optimal" sample size to maintain bars equally sized while preventing overlap.
* @private
*/
function computeMinSampleSize(scale, pixels) {
- var min = scale.isHorizontal() ? scale.width : scale.height;
- var ticks = scale.getTicks();
+ var min = scale._length;
var prev, curr, i, ilen;
for (i = 1, ilen = pixels.length; i < ilen; ++i) {
min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));
}
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {
curr = scale.getPixelForTick(i);
- min = i > 0 ? Math.min(min, curr - prev) : min;
+ min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;
prev = curr;
}
@@ -3898,10 +4805,13 @@ function computeFitCategoryTraits(index, ruler, options) {
var thickness = options.barThickness;
var count = ruler.stackCount;
var curr = ruler.pixels[index];
+ var min = helpers$1.isNullOrUndef(thickness)
+ ? computeMinSampleSize(ruler.scale, ruler.pixels)
+ : -1;
var size, ratio;
if (helpers$1.isNullOrUndef(thickness)) {
- size = ruler.min * options.categoryPercentage;
+ size = min * options.categoryPercentage;
ratio = options.barPercentage;
} else {
// When bar thickness is enforced, category and bar percentages are ignored.
@@ -3957,15 +4867,37 @@ var controller_bar = core_datasetController.extend({
dataElementType: elements.Rectangle,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderSkipped',
+ 'borderWidth',
+ 'barPercentage',
+ 'barThickness',
+ 'categoryPercentage',
+ 'maxBarThickness',
+ 'minBarLength'
+ ],
+
initialize: function() {
var me = this;
- var meta;
+ var meta, scaleOpts;
core_datasetController.prototype.initialize.apply(me, arguments);
meta = me.getMeta();
meta.stack = me.getDataset().stack;
meta.bar = true;
+
+ scaleOpts = me._getIndexScale().options;
+ deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');
+ deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');
+ deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');
+ deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');
+ deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');
},
update: function(reset) {
@@ -3984,7 +4916,7 @@ var controller_bar = core_datasetController.extend({
var me = this;
var meta = me.getMeta();
var dataset = me.getDataset();
- var options = me._resolveElementOptions(rectangle, index);
+ var options = me._resolveDataElementOptions(rectangle, index);
rectangle._xScale = me.getScaleForId(meta.xAxisID);
rectangle._yScale = me.getScaleForId(meta.yAxisID);
@@ -3999,7 +4931,11 @@ var controller_bar = core_datasetController.extend({
label: me.chart.data.labels[index]
};
- me._updateElementGeometry(rectangle, index, reset);
+ if (helpers$1.isArray(dataset.data[index])) {
+ rectangle._model.borderSkipped = null;
+ }
+
+ me._updateElementGeometry(rectangle, index, reset, options);
rectangle.pivot();
},
@@ -4007,15 +4943,15 @@ var controller_bar = core_datasetController.extend({
/**
* @private
*/
- _updateElementGeometry: function(rectangle, index, reset) {
+ _updateElementGeometry: function(rectangle, index, reset, options) {
var me = this;
var model = rectangle._model;
var vscale = me._getValueScale();
var base = vscale.getBasePixel();
var horizontal = vscale.isHorizontal();
var ruler = me._ruler || me.getRuler();
- var vpixels = me.calculateBarValuePixels(me.index, index);
- var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);
+ var vpixels = me.calculateBarValuePixels(me.index, index, options);
+ var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);
model.horizontal = horizontal;
model.base = reset ? base : vpixels.base;
@@ -4033,21 +4969,27 @@ var controller_bar = core_datasetController.extend({
*/
_getStacks: function(last) {
var me = this;
- var chart = me.chart;
var scale = me._getIndexScale();
+ var metasets = scale._getMatchingVisibleMetas(me._type);
var stacked = scale.options.stacked;
- var ilen = last === undefined ? chart.data.datasets.length : last + 1;
+ var ilen = metasets.length;
var stacks = [];
var i, meta;
for (i = 0; i < ilen; ++i) {
- meta = chart.getDatasetMeta(i);
- if (meta.bar && chart.isDatasetVisible(i) &&
- (stacked === false ||
- (stacked === true && stacks.indexOf(meta.stack) === -1) ||
- (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {
+ meta = metasets[i];
+ // stacked | meta.stack
+ // | found | not found | undefined
+ // false | x | x | x
+ // true | | x |
+ // undefined | | x | x
+ if (stacked === false || stacks.indexOf(meta.stack) === -1 ||
+ (stacked === undefined && meta.stack === undefined)) {
stacks.push(meta.stack);
}
+ if (meta.index === last) {
+ break;
+ }
}
return stacks;
@@ -4085,28 +5027,18 @@ var controller_bar = core_datasetController.extend({
getRuler: function() {
var me = this;
var scale = me._getIndexScale();
- var stackCount = me.getStackCount();
- var datasetIndex = me.index;
- var isHorizontal = scale.isHorizontal();
- var start = isHorizontal ? scale.left : scale.top;
- var end = start + (isHorizontal ? scale.width : scale.height);
var pixels = [];
- var i, ilen, min;
+ var i, ilen;
for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
- pixels.push(scale.getPixelForValue(null, i, datasetIndex));
+ pixels.push(scale.getPixelForValue(null, i, me.index));
}
- min = helpers$1.isNullOrUndef(scale.options.barThickness)
- ? computeMinSampleSize(scale, pixels)
- : -1;
-
return {
- min: min,
pixels: pixels,
- start: start,
- end: end,
- stackCount: stackCount,
+ start: scale._startPixel,
+ end: scale._endPixel,
+ stackCount: me.getStackCount(),
scale: scale
};
},
@@ -4115,31 +5047,35 @@ var controller_bar = core_datasetController.extend({
* Note: pixel values are not clamped to the scale area.
* @private
*/
- calculateBarValuePixels: function(datasetIndex, index) {
+ calculateBarValuePixels: function(datasetIndex, index, options) {
var me = this;
var chart = me.chart;
- var meta = me.getMeta();
var scale = me._getValueScale();
var isHorizontal = scale.isHorizontal();
var datasets = chart.data.datasets;
- var value = +scale.getRightValue(datasets[datasetIndex].data[index]);
- var minBarLength = scale.options.minBarLength;
+ var metasets = scale._getMatchingVisibleMetas(me._type);
+ var value = scale._parseValue(datasets[datasetIndex].data[index]);
+ var minBarLength = options.minBarLength;
var stacked = scale.options.stacked;
- var stack = meta.stack;
- var start = 0;
- var i, imeta, ivalue, base, head, size;
+ var stack = me.getMeta().stack;
+ var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;
+ var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;
+ var ilen = metasets.length;
+ var i, imeta, ivalue, base, head, size, stackLength;
if (stacked || (stacked === undefined && stack !== undefined)) {
- for (i = 0; i < datasetIndex; ++i) {
- imeta = chart.getDatasetMeta(i);
+ for (i = 0; i < ilen; ++i) {
+ imeta = metasets[i];
+
+ if (imeta.index === datasetIndex) {
+ break;
+ }
- if (imeta.bar &&
- imeta.stack === stack &&
- imeta.controller._getValueScaleId() === scale.id &&
- chart.isDatasetVisible(i)) {
+ if (imeta.stack === stack) {
+ stackLength = scale._parseValue(datasets[imeta.index].data[index]);
+ ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;
- ivalue = +scale.getRightValue(datasets[i].data[index]);
- if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {
+ if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {
start += ivalue;
}
}
@@ -4147,12 +5083,12 @@ var controller_bar = core_datasetController.extend({
}
base = scale.getPixelForValue(start);
- head = scale.getPixelForValue(start + value);
+ head = scale.getPixelForValue(start + length);
size = head - base;
if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
size = minBarLength;
- if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {
+ if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {
head = base - minBarLength;
} else {
head = base + minBarLength;
@@ -4170,9 +5106,8 @@ var controller_bar = core_datasetController.extend({
/**
* @private
*/
- calculateBarIndexPixels: function(datasetIndex, index, ruler) {
+ calculateBarIndexPixels: function(datasetIndex, index, ruler, options) {
var me = this;
- var options = ruler.scale.options;
var range = options.barThickness === 'flex'
? computeFlexCategoryTraits(index, ruler, options)
: computeFitCategoryTraits(index, ruler, options);
@@ -4180,7 +5115,7 @@ var controller_bar = core_datasetController.extend({
var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);
var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);
var size = Math.min(
- helpers$1.valueOrDefault(options.maxBarThickness, Infinity),
+ valueOrDefault$3(options.maxBarThickness, Infinity),
range.chunk * range.ratio);
return {
@@ -4203,7 +5138,8 @@ var controller_bar = core_datasetController.extend({
helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);
for (; i < ilen; ++i) {
- if (!isNaN(scale.getRightValue(dataset.data[i]))) {
+ var val = scale._parseValue(dataset.data[i]);
+ if (!isNaN(val.min) && !isNaN(val.max)) {
rects[i].draw();
}
}
@@ -4214,46 +5150,25 @@ var controller_bar = core_datasetController.extend({
/**
* @private
*/
- _resolveElementOptions: function(rectangle, index) {
+ _resolveDataElementOptions: function() {
var me = this;
- var chart = me.chart;
- var datasets = chart.data.datasets;
- var dataset = datasets[me.index];
- var custom = rectangle.custom || {};
- var options = chart.options.elements.rectangle;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderSkipped',
- 'borderWidth'
- ];
+ var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));
+ var indexOpts = me._getIndexScale().options;
+ var valueOpts = me._getValueScale().options;
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$1([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
- }
+ values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);
+ values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);
+ values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);
+ values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);
+ values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);
return values;
}
+
});
-var valueOrDefault$3 = helpers$1.valueOrDefault;
-var resolve$2 = helpers$1.options.resolve;
+var valueOrDefault$4 = helpers$1.valueOrDefault;
+var resolve$1 = helpers$1.options.resolve;
core_defaults._set('bubble', {
hover: {
@@ -4294,6 +5209,22 @@ var controller_bubble = core_datasetController.extend({
*/
dataElementType: elements.Point,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ 'hoverRadius',
+ 'hitRadius',
+ 'pointStyle',
+ 'rotation'
+ ],
+
/**
* @protected
*/
@@ -4317,7 +5248,7 @@ var controller_bubble = core_datasetController.extend({
var custom = point.custom || {};
var xScale = me.getScaleForId(meta.xAxisID);
var yScale = me.getScaleForId(meta.yAxisID);
- var options = me._resolveElementOptions(point, index);
+ var options = me._resolveDataElementOptions(point, index);
var data = me.getDataset().data[index];
var dsIndex = me.index;
@@ -4360,25 +5291,22 @@ var controller_bubble = core_datasetController.extend({
radius: model.radius
};
- model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth);
+ model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
model.radius = options.radius + options.hoverRadius;
},
/**
* @private
*/
- _resolveElementOptions: function(point, index) {
+ _resolveDataElementOptions: function(point, index) {
var me = this;
var chart = me.chart;
- var datasets = chart.data.datasets;
- var dataset = datasets[me.index];
+ var dataset = me.getDataset();
var custom = point.custom || {};
- var options = chart.options.elements.point;
- var data = dataset.data[index];
- var values = {};
- var i, ilen, key;
+ var data = dataset.data[index] || {};
+ var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments);
// Scriptable options
var context = {
@@ -4388,42 +5316,28 @@ var controller_bubble = core_datasetController.extend({
datasetIndex: me.index
};
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- 'hoverRadius',
- 'hitRadius',
- 'pointStyle',
- 'rotation'
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$2([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
+ // In case values were cached (and thus frozen), we need to clone the values
+ if (me._cachedDataOpts === values) {
+ values = helpers$1.extend({}, values);
}
// Custom radius resolution
- values.radius = resolve$2([
+ values.radius = resolve$1([
custom.radius,
- data ? data.r : undefined,
- dataset.radius,
- options.radius
+ data.r,
+ me._config.radius,
+ chart.options.elements.point.radius
], context, index);
return values;
}
});
-var resolve$3 = helpers$1.options.resolve;
-var valueOrDefault$4 = helpers$1.valueOrDefault;
+var valueOrDefault$5 = helpers$1.valueOrDefault;
+
+var PI$1 = Math.PI;
+var DOUBLE_PI$1 = PI$1 * 2;
+var HALF_PI$1 = PI$1 / 2;
core_defaults._set('doughnut', {
animation: {
@@ -4436,25 +5350,25 @@ core_defaults._set('doughnut', {
mode: 'single'
},
legendCallback: function(chart) {
- var text = [];
- text.push('<ul class="' + chart.id + '-legend">');
-
+ var list = document.createElement('ul');
var data = chart.data;
var datasets = data.datasets;
var labels = data.labels;
+ var i, ilen, listItem, listItemSpan;
+ list.setAttribute('class', chart.id + '-legend');
if (datasets.length) {
- for (var i = 0; i < datasets[0].data.length; ++i) {
- text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>');
+ for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
if (labels[i]) {
- text.push(labels[i]);
+ listItem.appendChild(document.createTextNode(labels[i]));
}
- text.push('</li>');
}
}
- text.push('</ul>');
- return text.join('');
+ return list.outerHTML;
},
legend: {
labels: {
@@ -4463,20 +5377,14 @@ core_defaults._set('doughnut', {
if (data.labels.length && data.datasets.length) {
return data.labels.map(function(label, i) {
var meta = chart.getDatasetMeta(0);
- var ds = data.datasets[0];
- var arc = meta.data[i];
- var custom = arc && arc.custom || {};
- var arcOpts = chart.options.elements.arc;
- var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
- var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
- var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
+ var style = meta.controller.getStyle(i);
return {
text: label,
- fillStyle: fill,
- strokeStyle: stroke,
- lineWidth: bw,
- hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
+ fillStyle: style.backgroundColor,
+ strokeStyle: style.borderColor,
+ lineWidth: style.borderWidth,
+ hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
// Extra data used for toggling the correct item
index: i
@@ -4508,10 +5416,10 @@ core_defaults._set('doughnut', {
cutoutPercentage: 50,
// The rotation of the chart, where the first data arc begins.
- rotation: Math.PI * -0.5,
+ rotation: -HALF_PI$1,
// The total circumference of the chart.
- circumference: Math.PI * 2.0,
+ circumference: DOUBLE_PI$1,
// Need to override these to give a nice default
tooltips: {
@@ -4544,6 +5452,19 @@ var controller_doughnut = core_datasetController.extend({
linkScales: helpers$1.noop,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ],
+
// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
getRingIndex: function(datasetIndex) {
var ringIndex = 0;
@@ -4562,46 +5483,52 @@ var controller_doughnut = core_datasetController.extend({
var chart = me.chart;
var chartArea = chart.chartArea;
var opts = chart.options;
- var availableWidth = chartArea.right - chartArea.left;
- var availableHeight = chartArea.bottom - chartArea.top;
- var minSize = Math.min(availableWidth, availableHeight);
- var offset = {x: 0, y: 0};
+ var ratioX = 1;
+ var ratioY = 1;
+ var offsetX = 0;
+ var offsetY = 0;
var meta = me.getMeta();
var arcs = meta.data;
- var cutoutPercentage = opts.cutoutPercentage;
+ var cutout = opts.cutoutPercentage / 100 || 0;
var circumference = opts.circumference;
var chartWeight = me._getRingWeight(me.index);
- var i, ilen;
+ var maxWidth, maxHeight, i, ilen;
- // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc
- if (circumference < Math.PI * 2.0) {
- var startAngle = opts.rotation % (Math.PI * 2.0);
- startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);
+ // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc
+ if (circumference < DOUBLE_PI$1) {
+ var startAngle = opts.rotation % DOUBLE_PI$1;
+ startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;
var endAngle = startAngle + circumference;
- var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};
- var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};
- var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);
- var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);
- var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);
- var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);
- var cutout = cutoutPercentage / 100.0;
- var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};
- var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};
- var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};
- minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
- offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};
+ var startX = Math.cos(startAngle);
+ var startY = Math.sin(startAngle);
+ var endX = Math.cos(endAngle);
+ var endY = Math.sin(endAngle);
+ var contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1;
+ var contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1;
+ var contains180 = startAngle === -PI$1 || endAngle >= PI$1;
+ var contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1;
+ var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);
+ var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);
+ var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);
+ var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);
+ ratioX = (maxX - minX) / 2;
+ ratioY = (maxY - minY) / 2;
+ offsetX = -(maxX + minX) / 2;
+ offsetY = -(maxY + minY) / 2;
}
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arcs[i]._options = me._resolveElementOptions(arcs[i], i);
+ arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
}
chart.borderWidth = me.getMaxBorderWidth();
- chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);
- chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);
+ maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;
+ maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;
+ chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);
+ chart.innerRadius = Math.max(chart.outerRadius * cutout, 0);
chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);
- chart.offsetX = offset.x * chart.outerRadius;
- chart.offsetY = offset.y * chart.outerRadius;
+ chart.offsetX = offsetX * chart.outerRadius;
+ chart.offsetY = offsetY * chart.outerRadius;
meta.total = me.calculateTotal();
@@ -4624,7 +5551,7 @@ var controller_doughnut = core_datasetController.extend({
var startAngle = opts.rotation; // non reset case handled later
var endAngle = opts.rotation; // non reset case handled later
var dataset = me.getDataset();
- var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));
+ var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);
var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
var options = arc._options || {};
@@ -4690,7 +5617,7 @@ var controller_doughnut = core_datasetController.extend({
calculateCircumference: function(value) {
var total = this.getMeta().total;
if (total > 0 && !isNaN(value)) {
- return (Math.PI * 2.0) * (Math.abs(value) / total);
+ return DOUBLE_PI$1 * (Math.abs(value) / total);
}
return 0;
},
@@ -4722,7 +5649,12 @@ var controller_doughnut = core_datasetController.extend({
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
arc = arcs[i];
- options = controller ? controller._resolveElementOptions(arc, i) : arc._options;
+ if (controller) {
+ controller._configure();
+ options = controller._resolveDataElementOptions(arc, i);
+ } else {
+ options = arc._options;
+ }
if (options.borderAlign !== 'inner') {
borderWidth = options.borderWidth;
hoverWidth = options.hoverBorderWidth;
@@ -4748,51 +5680,9 @@ var controller_doughnut = core_datasetController.extend({
borderWidth: model.borderWidth,
};
- model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
- },
-
- /**
- * @private
- */
- _resolveElementOptions: function(arc, index) {
- var me = this;
- var chart = me.chart;
- var dataset = me.getDataset();
- var custom = arc.custom || {};
- var options = chart.options.elements.arc;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'borderAlign',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$3([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
+ model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
},
/**
@@ -4815,7 +5705,7 @@ var controller_doughnut = core_datasetController.extend({
* @private
*/
_getRingWeight: function(dataSetIndex) {
- return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
+ return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
},
/**
@@ -4842,8 +5732,6 @@ core_defaults._set('horizontalBar', {
yAxes: [{
type: 'category',
position: 'left',
- categoryPercentage: 0.8,
- barPercentage: 0.9,
offset: true,
gridLines: {
offsetGridLines: true
@@ -4863,6 +5751,15 @@ core_defaults._set('horizontalBar', {
}
});
+core_defaults._set('global', {
+ datasets: {
+ horizontalBar: {
+ categoryPercentage: 0.8,
+ barPercentage: 0.9
+ }
+ }
+});
+
var controller_horizontalBar = controller_bar.extend({
/**
* @private
@@ -4879,8 +5776,8 @@ var controller_horizontalBar = controller_bar.extend({
}
});
-var valueOrDefault$5 = helpers$1.valueOrDefault;
-var resolve$4 = helpers$1.options.resolve;
+var valueOrDefault$6 = helpers$1.valueOrDefault;
+var resolve$2 = helpers$1.options.resolve;
var isPointInArea = helpers$1.canvas._isPointInArea;
core_defaults._set('line', {
@@ -4903,40 +5800,116 @@ core_defaults._set('line', {
}
});
-function lineEnabled(dataset, options) {
- return valueOrDefault$5(dataset.showLine, options.showLines);
+function scaleClip(scale, halfBorderWidth) {
+ var tickOpts = scale && scale.options.ticks || {};
+ var reverse = tickOpts.reverse;
+ var min = tickOpts.min === undefined ? halfBorderWidth : 0;
+ var max = tickOpts.max === undefined ? halfBorderWidth : 0;
+ return {
+ start: reverse ? max : min,
+ end: reverse ? min : max
+ };
+}
+
+function defaultClip(xScale, yScale, borderWidth) {
+ var halfBorderWidth = borderWidth / 2;
+ var x = scaleClip(xScale, halfBorderWidth);
+ var y = scaleClip(yScale, halfBorderWidth);
+
+ return {
+ top: y.end,
+ right: x.end,
+ bottom: y.start,
+ left: x.start
+ };
+}
+
+function toClip(value) {
+ var t, r, b, l;
+
+ if (helpers$1.isObject(value)) {
+ t = value.top;
+ r = value.right;
+ b = value.bottom;
+ l = value.left;
+ } else {
+ t = r = b = l = value;
+ }
+
+ return {
+ top: t,
+ right: r,
+ bottom: b,
+ left: l
+ };
}
+
var controller_line = core_datasetController.extend({
datasetElementType: elements.Line,
dataElementType: elements.Point,
+ /**
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderCapStyle',
+ 'borderColor',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'borderWidth',
+ 'cubicInterpolationMode',
+ 'fill'
+ ],
+
+ /**
+ * @private
+ */
+ _dataElementOptions: {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ },
+
update: function(reset) {
var me = this;
var meta = me.getMeta();
var line = meta.dataset;
var points = meta.data || [];
- var scale = me.getScaleForId(meta.yAxisID);
- var dataset = me.getDataset();
- var showLine = lineEnabled(dataset, me.chart.options);
+ var options = me.chart.options;
+ var config = me._config;
+ var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);
var i, ilen;
+ me._xScale = me.getScaleForId(meta.xAxisID);
+ me._yScale = me.getScaleForId(meta.yAxisID);
+
// Update Line
if (showLine) {
// Compatibility: If the properties are defined with only the old name, use those values
- if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
- dataset.lineTension = dataset.tension;
+ if (config.tension !== undefined && config.lineTension === undefined) {
+ config.lineTension = config.tension;
}
// Utility
- line._scale = scale;
+ line._scale = me._yScale;
line._datasetIndex = me.index;
// Data
line._children = points;
// Model
- line._model = me._resolveLineOptions(line);
+ line._model = me._resolveDatasetElementOptions(line);
line.pivot();
}
@@ -4963,12 +5936,12 @@ var controller_line = core_datasetController.extend({
var dataset = me.getDataset();
var datasetIndex = me.index;
var value = dataset.data[index];
- var yScale = me.getScaleForId(meta.yAxisID);
- var xScale = me.getScaleForId(meta.xAxisID);
+ var xScale = me._xScale;
+ var yScale = me._yScale;
var lineModel = meta.dataset._model;
var x, y;
- var options = me._resolvePointOptions(point, index);
+ var options = me._resolveDataElementOptions(point, index);
x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);
y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
@@ -4992,7 +5965,7 @@ var controller_line = core_datasetController.extend({
backgroundColor: options.backgroundColor,
borderColor: options.borderColor,
borderWidth: options.borderWidth,
- tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0),
+ tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),
steppedLine: lineModel ? lineModel.steppedLine : false,
// Tooltip
hitRadius: options.hitRadius
@@ -5002,91 +5975,21 @@ var controller_line = core_datasetController.extend({
/**
* @private
*/
- _resolvePointOptions: function(element, index) {
- var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
- var custom = element.custom || {};
- var options = chart.options.elements.point;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var ELEMENT_OPTIONS = {
- backgroundColor: 'pointBackgroundColor',
- borderColor: 'pointBorderColor',
- borderWidth: 'pointBorderWidth',
- hitRadius: 'pointHitRadius',
- hoverBackgroundColor: 'pointHoverBackgroundColor',
- hoverBorderColor: 'pointHoverBorderColor',
- hoverBorderWidth: 'pointHoverBorderWidth',
- hoverRadius: 'pointHoverRadius',
- pointStyle: 'pointStyle',
- radius: 'pointRadius',
- rotation: 'pointRotation'
- };
- var keys = Object.keys(ELEMENT_OPTIONS);
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$4([
- custom[key],
- dataset[ELEMENT_OPTIONS[key]],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
- },
-
- /**
- * @private
- */
- _resolveLineOptions: function(element) {
+ _resolveDatasetElementOptions: function(element) {
var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
+ var config = me._config;
var custom = element.custom || {};
- var options = chart.options;
- var elementOptions = options.elements.line;
- var values = {};
- var i, ilen, key;
-
- var keys = [
- 'backgroundColor',
- 'borderWidth',
- 'borderColor',
- 'borderCapStyle',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'fill',
- 'cubicInterpolationMode'
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$4([
- custom[key],
- dataset[key],
- elementOptions[key]
- ]);
- }
+ var options = me.chart.options;
+ var lineOptions = options.elements.line;
+ var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
// The default behavior of lines is to break at null values, according
// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
// This option gives lines the ability to span gaps
- values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps);
- values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension);
- values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);
+ values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);
+ values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);
+ values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));
return values;
},
@@ -5094,18 +5997,25 @@ var controller_line = core_datasetController.extend({
calculatePointY: function(value, index, datasetIndex) {
var me = this;
var chart = me.chart;
- var meta = me.getMeta();
- var yScale = me.getScaleForId(meta.yAxisID);
+ var yScale = me._yScale;
var sumPos = 0;
var sumNeg = 0;
- var i, ds, dsMeta;
+ var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;
if (yScale.options.stacked) {
- for (i = 0; i < datasetIndex; i++) {
- ds = chart.data.datasets[i];
- dsMeta = chart.getDatasetMeta(i);
- if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
- var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));
+ rightValue = +yScale.getRightValue(value);
+ metasets = chart._getSortedVisibleDatasetMetas();
+ ilen = metasets.length;
+
+ for (i = 0; i < ilen; ++i) {
+ dsMeta = metasets[i];
+ if (dsMeta.index === datasetIndex) {
+ break;
+ }
+
+ ds = chart.data.datasets[dsMeta.index];
+ if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {
+ stackedRightValue = +yScale.getRightValue(ds.data[index]);
if (stackedRightValue < 0) {
sumNeg += stackedRightValue || 0;
} else {
@@ -5114,13 +6024,11 @@ var controller_line = core_datasetController.extend({
}
}
- var rightValue = Number(yScale.getRightValue(value));
if (rightValue < 0) {
return yScale.getPixelForValue(sumNeg + rightValue);
}
return yScale.getPixelForValue(sumPos + rightValue);
}
-
return yScale.getPixelForValue(value);
},
@@ -5185,18 +6093,19 @@ var controller_line = core_datasetController.extend({
var meta = me.getMeta();
var points = meta.data || [];
var area = chart.chartArea;
- var ilen = points.length;
- var halfBorderWidth;
+ var canvas = chart.canvas;
var i = 0;
+ var ilen = points.length;
+ var clip;
- if (lineEnabled(me.getDataset(), chart.options)) {
- halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;
+ if (me._showLine) {
+ clip = meta.dataset._model.clip;
helpers$1.canvas.clipArea(chart.ctx, {
- left: area.left,
- right: area.right,
- top: area.top - halfBorderWidth,
- bottom: area.bottom + halfBorderWidth
+ left: clip.left === false ? 0 : area.left - clip.left,
+ right: clip.right === false ? canvas.width : area.right + clip.right,
+ top: clip.top === false ? 0 : area.top - clip.top,
+ bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom
});
meta.dataset.draw();
@@ -5225,14 +6134,14 @@ var controller_line = core_datasetController.extend({
radius: model.radius
};
- model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
- model.radius = valueOrDefault$5(options.hoverRadius, options.radius);
+ model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$6(options.hoverRadius, options.radius);
},
});
-var resolve$5 = helpers$1.options.resolve;
+var resolve$3 = helpers$1.options.resolve;
core_defaults._set('polarArea', {
scale: {
@@ -5259,25 +6168,25 @@ core_defaults._set('polarArea', {
startAngle: -0.5 * Math.PI,
legendCallback: function(chart) {
- var text = [];
- text.push('<ul class="' + chart.id + '-legend">');
-
+ var list = document.createElement('ul');
var data = chart.data;
var datasets = data.datasets;
var labels = data.labels;
+ var i, ilen, listItem, listItemSpan;
+ list.setAttribute('class', chart.id + '-legend');
if (datasets.length) {
- for (var i = 0; i < datasets[0].data.length; ++i) {
- text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>');
+ for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
if (labels[i]) {
- text.push(labels[i]);
+ listItem.appendChild(document.createTextNode(labels[i]));
}
- text.push('</li>');
}
}
- text.push('</ul>');
- return text.join('');
+ return list.outerHTML;
},
legend: {
labels: {
@@ -5286,20 +6195,14 @@ core_defaults._set('polarArea', {
if (data.labels.length && data.datasets.length) {
return data.labels.map(function(label, i) {
var meta = chart.getDatasetMeta(0);
- var ds = data.datasets[0];
- var arc = meta.data[i];
- var custom = arc.custom || {};
- var arcOpts = chart.options.elements.arc;
- var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
- var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
- var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
+ var style = meta.controller.getStyle(i);
return {
text: label,
- fillStyle: fill,
- strokeStyle: stroke,
- lineWidth: bw,
- hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
+ fillStyle: style.backgroundColor,
+ strokeStyle: style.borderColor,
+ lineWidth: style.borderWidth,
+ hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
// Extra data used for toggling the correct item
index: i
@@ -5343,6 +6246,33 @@ var controller_polarArea = core_datasetController.extend({
linkScales: helpers$1.noop,
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ],
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.chart.scale.id;
+ },
+
update: function(reset) {
var me = this;
var dataset = me.getDataset();
@@ -5365,7 +6295,7 @@ var controller_polarArea = core_datasetController.extend({
}
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arcs[i]._options = me._resolveElementOptions(arcs[i], i);
+ arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
me.updateElement(arcs[i], i, reset);
}
},
@@ -5468,48 +6398,6 @@ var controller_polarArea = core_datasetController.extend({
model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);
},
- /**
- * @private
- */
- _resolveElementOptions: function(arc, index) {
- var me = this;
- var chart = me.chart;
- var dataset = me.getDataset();
- var custom = arc.custom || {};
- var options = chart.options.elements.arc;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var keys = [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'borderAlign',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$5([
- custom[key],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
- },
-
/**
* @private
*/
@@ -5531,7 +6419,7 @@ var controller_polarArea = core_datasetController.extend({
datasetIndex: me.index
};
- return resolve$5([
+ return resolve$3([
me.chart.options.elements.arc.angle,
(2 * Math.PI) / count
], context, index);
@@ -5546,40 +6434,85 @@ core_defaults._set('pie', {
// Pie charts are Doughnut chart with different defaults
var controller_pie = controller_doughnut;
-var valueOrDefault$6 = helpers$1.valueOrDefault;
-var resolve$6 = helpers$1.options.resolve;
+var valueOrDefault$7 = helpers$1.valueOrDefault;
core_defaults._set('radar', {
+ spanGaps: false,
scale: {
type: 'radialLinear'
},
elements: {
line: {
+ fill: 'start',
tension: 0 // no bezier in radar
}
}
});
var controller_radar = core_datasetController.extend({
-
datasetElementType: elements.Line,
dataElementType: elements.Point,
linkScales: helpers$1.noop,
+ /**
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderWidth',
+ 'borderColor',
+ 'borderCapStyle',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'fill'
+ ],
+
+ /**
+ * @private
+ */
+ _dataElementOptions: {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.chart.scale.id;
+ },
+
update: function(reset) {
var me = this;
var meta = me.getMeta();
var line = meta.dataset;
var points = meta.data || [];
var scale = me.chart.scale;
- var dataset = me.getDataset();
+ var config = me._config;
var i, ilen;
// Compatibility: If the properties are defined with only the old name, use those values
- if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
- dataset.lineTension = dataset.tension;
+ if (config.tension !== undefined && config.lineTension === undefined) {
+ config.lineTension = config.tension;
}
// Utility
@@ -5589,7 +6522,7 @@ var controller_radar = core_datasetController.extend({
line._children = points;
line._loop = true;
// Model
- line._model = me._resolveLineOptions(line);
+ line._model = me._resolveDatasetElementOptions(line);
line.pivot();
@@ -5613,7 +6546,7 @@ var controller_radar = core_datasetController.extend({
var dataset = me.getDataset();
var scale = me.chart.scale;
var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);
- var options = me._resolvePointOptions(point, index);
+ var options = me._resolveDataElementOptions(point, index);
var lineModel = me.getMeta().dataset._model;
var x = reset ? scale.xCenter : pointPosition.x;
var y = reset ? scale.yCenter : pointPosition.y;
@@ -5636,7 +6569,7 @@ var controller_radar = core_datasetController.extend({
backgroundColor: options.backgroundColor,
borderColor: options.borderColor,
borderWidth: options.borderWidth,
- tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),
+ tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),
// Tooltip
hitRadius: options.hitRadius
@@ -5646,84 +6579,14 @@ var controller_radar = core_datasetController.extend({
/**
* @private
*/
- _resolvePointOptions: function(element, index) {
- var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
- var custom = element.custom || {};
- var options = chart.options.elements.point;
- var values = {};
- var i, ilen, key;
-
- // Scriptable options
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- var ELEMENT_OPTIONS = {
- backgroundColor: 'pointBackgroundColor',
- borderColor: 'pointBorderColor',
- borderWidth: 'pointBorderWidth',
- hitRadius: 'pointHitRadius',
- hoverBackgroundColor: 'pointHoverBackgroundColor',
- hoverBorderColor: 'pointHoverBorderColor',
- hoverBorderWidth: 'pointHoverBorderWidth',
- hoverRadius: 'pointHoverRadius',
- pointStyle: 'pointStyle',
- radius: 'pointRadius',
- rotation: 'pointRotation'
- };
- var keys = Object.keys(ELEMENT_OPTIONS);
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$6([
- custom[key],
- dataset[ELEMENT_OPTIONS[key]],
- dataset[key],
- options[key]
- ], context, index);
- }
-
- return values;
- },
-
- /**
- * @private
- */
- _resolveLineOptions: function(element) {
+ _resolveDatasetElementOptions: function() {
var me = this;
- var chart = me.chart;
- var dataset = chart.data.datasets[me.index];
- var custom = element.custom || {};
- var options = chart.options.elements.line;
- var values = {};
- var i, ilen, key;
-
- var keys = [
- 'backgroundColor',
- 'borderWidth',
- 'borderColor',
- 'borderCapStyle',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'fill'
- ];
-
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve$6([
- custom[key],
- dataset[key],
- options[key]
- ]);
- }
+ var config = me._config;
+ var options = me.chart.options;
+ var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
- values.tension = valueOrDefault$6(dataset.lineTension, options.tension);
+ values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);
return values;
},
@@ -5735,6 +6598,13 @@ var controller_radar = core_datasetController.extend({
var points = meta.data || [];
var i, ilen, model, controlPoints;
+ // Only consider points that are drawn in case the spanGaps option is used
+ if (meta.dataset._model.spanGaps) {
+ points = points.filter(function(pt) {
+ return !pt._model.skip;
+ });
+ }
+
function capControlPoint(pt, min, max) {
return Math.max(Math.min(pt, max), min);
}
@@ -5768,10 +6638,10 @@ var controller_radar = core_datasetController.extend({
radius: model.radius
};
- model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);
- model.radius = valueOrDefault$6(options.hoverRadius, options.radius);
+ model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$7(options.hoverRadius, options.radius);
}
});
@@ -5793,8 +6663,6 @@ core_defaults._set('scatter', {
}]
},
- showLines: false,
-
tooltips: {
callbacks: {
title: function() {
@@ -5807,6 +6675,14 @@ core_defaults._set('scatter', {
}
});
+core_defaults._set('global', {
+ datasets: {
+ scatter: {
+ showLine: false
+ }
+ }
+});
+
// Scatter charts use line controllers
var controller_scatter = controller_line;
@@ -5849,17 +6725,13 @@ function getRelativePosition(e, chart) {
* @param {function} handler - the callback to execute for each visible item
*/
function parseVisibleItems(chart, handler) {
- var datasets = chart.data.datasets;
- var meta, i, j, ilen, jlen;
-
- for (i = 0, ilen = datasets.length; i < ilen; ++i) {
- if (!chart.isDatasetVisible(i)) {
- continue;
- }
+ var metasets = chart._getSortedVisibleDatasetMetas();
+ var metadata, i, j, ilen, jlen, element;
- meta = chart.getDatasetMeta(i);
- for (j = 0, jlen = meta.data.length; j < jlen; ++j) {
- var element = meta.data[j];
+ for (i = 0, ilen = metasets.length; i < ilen; ++i) {
+ metadata = metasets[i].data;
+ for (j = 0, jlen = metadata.length; j < jlen; ++j) {
+ element = metadata[j];
if (!element._view.skip) {
handler(element);
}
@@ -5944,15 +6816,12 @@ function indexMode(chart, e, options) {
return [];
}
- chart.data.datasets.forEach(function(dataset, datasetIndex) {
- if (chart.isDatasetVisible(datasetIndex)) {
- var meta = chart.getDatasetMeta(datasetIndex);
- var element = meta.data[items[0]._index];
+ chart._getSortedVisibleDatasetMetas().forEach(function(meta) {
+ var element = meta.data[items[0]._index];
- // don't count items that are skipped (null data)
- if (element && !element._view.skip) {
- elements.push(element);
- }
+ // don't count items that are skipped (null data)
+ if (element && !element._view.skip) {
+ elements.push(element);
}
});
@@ -6133,55 +7002,194 @@ var core_interaction = {
}
};
+var extend = helpers$1.extend;
+
function filterByPosition(array, position) {
return helpers$1.where(array, function(v) {
- return v.position === position;
+ return v.pos === position;
});
}
function sortByWeight(array, reverse) {
- array.forEach(function(v, i) {
- v._tmpIndex_ = i;
- return v;
- });
- array.sort(function(a, b) {
+ return array.sort(function(a, b) {
var v0 = reverse ? b : a;
var v1 = reverse ? a : b;
return v0.weight === v1.weight ?
- v0._tmpIndex_ - v1._tmpIndex_ :
+ v0.index - v1.index :
v0.weight - v1.weight;
});
- array.forEach(function(v) {
- delete v._tmpIndex_;
- });
}
-function findMaxPadding(boxes) {
- var top = 0;
- var left = 0;
- var bottom = 0;
- var right = 0;
- helpers$1.each(boxes, function(box) {
- if (box.getPadding) {
- var boxPadding = box.getPadding();
- top = Math.max(top, boxPadding.top);
- left = Math.max(left, boxPadding.left);
- bottom = Math.max(bottom, boxPadding.bottom);
- right = Math.max(right, boxPadding.right);
- }
- });
+function wrapBoxes(boxes) {
+ var layoutBoxes = [];
+ var i, ilen, box;
+
+ for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {
+ box = boxes[i];
+ layoutBoxes.push({
+ index: i,
+ box: box,
+ pos: box.position,
+ horizontal: box.isHorizontal(),
+ weight: box.weight
+ });
+ }
+ return layoutBoxes;
+}
+
+function setLayoutDims(layouts, params) {
+ var i, ilen, layout;
+ for (i = 0, ilen = layouts.length; i < ilen; ++i) {
+ layout = layouts[i];
+ // store width used instead of chartArea.w in fitBoxes
+ layout.width = layout.horizontal
+ ? layout.box.fullWidth && params.availableWidth
+ : params.vBoxMaxWidth;
+ // store height used instead of chartArea.h in fitBoxes
+ layout.height = layout.horizontal && params.hBoxMaxHeight;
+ }
+}
+
+function buildLayoutBoxes(boxes) {
+ var layoutBoxes = wrapBoxes(boxes);
+ var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);
+ var right = sortByWeight(filterByPosition(layoutBoxes, 'right'));
+ var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);
+ var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));
+
return {
- top: top,
- left: left,
- bottom: bottom,
- right: right
+ leftAndTop: left.concat(top),
+ rightAndBottom: right.concat(bottom),
+ chartArea: filterByPosition(layoutBoxes, 'chartArea'),
+ vertical: left.concat(right),
+ horizontal: top.concat(bottom)
};
}
-function addSizeByPosition(boxes, size) {
- helpers$1.each(boxes, function(box) {
- size[box.position] += box.isHorizontal() ? box.height : box.width;
- });
+function getCombinedMax(maxPadding, chartArea, a, b) {
+ return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);
+}
+
+function updateDims(chartArea, params, layout) {
+ var box = layout.box;
+ var maxPadding = chartArea.maxPadding;
+ var newWidth, newHeight;
+
+ if (layout.size) {
+ // this layout was already counted for, lets first reduce old size
+ chartArea[layout.pos] -= layout.size;
+ }
+ layout.size = layout.horizontal ? box.height : box.width;
+ chartArea[layout.pos] += layout.size;
+
+ if (box.getPadding) {
+ var boxPadding = box.getPadding();
+ maxPadding.top = Math.max(maxPadding.top, boxPadding.top);
+ maxPadding.left = Math.max(maxPadding.left, boxPadding.left);
+ maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);
+ maxPadding.right = Math.max(maxPadding.right, boxPadding.right);
+ }
+
+ newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');
+ newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');
+
+ if (newWidth !== chartArea.w || newHeight !== chartArea.h) {
+ chartArea.w = newWidth;
+ chartArea.h = newHeight;
+
+ // return true if chart area changed in layout's direction
+ var sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h];
+ return sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1]));
+ }
+}
+
+function handleMaxPadding(chartArea) {
+ var maxPadding = chartArea.maxPadding;
+
+ function updatePos(pos) {
+ var change = Math.max(maxPadding[pos] - chartArea[pos], 0);
+ chartArea[pos] += change;
+ return change;
+ }
+ chartArea.y += updatePos('top');
+ chartArea.x += updatePos('left');
+ updatePos('right');
+ updatePos('bottom');
+}
+
+function getMargins(horizontal, chartArea) {
+ var maxPadding = chartArea.maxPadding;
+
+ function marginForPositions(positions) {
+ var margin = {left: 0, top: 0, right: 0, bottom: 0};
+ positions.forEach(function(pos) {
+ margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);
+ });
+ return margin;
+ }
+
+ return horizontal
+ ? marginForPositions(['left', 'right'])
+ : marginForPositions(['top', 'bottom']);
+}
+
+function fitBoxes(boxes, chartArea, params) {
+ var refitBoxes = [];
+ var i, ilen, layout, box, refit, changed;
+
+ for (i = 0, ilen = boxes.length; i < ilen; ++i) {
+ layout = boxes[i];
+ box = layout.box;
+
+ box.update(
+ layout.width || chartArea.w,
+ layout.height || chartArea.h,
+ getMargins(layout.horizontal, chartArea)
+ );
+ if (updateDims(chartArea, params, layout)) {
+ changed = true;
+ if (refitBoxes.length) {
+ // Dimensions changed and there were non full width boxes before this
+ // -> we have to refit those
+ refit = true;
+ }
+ }
+ if (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case
+ refitBoxes.push(layout);
+ }
+ }
+
+ return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;
+}
+
+function placeBoxes(boxes, chartArea, params) {
+ var userPadding = params.padding;
+ var x = chartArea.x;
+ var y = chartArea.y;
+ var i, ilen, layout, box;
+
+ for (i = 0, ilen = boxes.length; i < ilen; ++i) {
+ layout = boxes[i];
+ box = layout.box;
+ if (layout.horizontal) {
+ box.left = box.fullWidth ? userPadding.left : chartArea.left;
+ box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;
+ box.top = y;
+ box.bottom = y + box.height;
+ box.width = box.right - box.left;
+ y = box.bottom;
+ } else {
+ box.left = x;
+ box.right = x + box.width;
+ box.top = chartArea.top;
+ box.bottom = chartArea.top + chartArea.h;
+ box.height = box.bottom - box.top;
+ x = box.right;
+ }
+ }
+
+ chartArea.x = x;
+ chartArea.y = y;
}
core_defaults._set('global', {
@@ -6233,6 +7241,14 @@ var core_layouts = {
item.fullWidth = item.fullWidth || false;
item.position = item.position || 'top';
item.weight = item.weight || 0;
+ item._layers = item._layers || function() {
+ return [{
+ z: 0,
+ draw: function() {
+ item.draw.apply(item, arguments);
+ }
+ }];
+ };
chart.boxes.push(item);
},
@@ -6283,26 +7299,12 @@ var core_layouts = {
var layoutOptions = chart.options.layout || {};
var padding = helpers$1.options.toPadding(layoutOptions.padding);
- var leftPadding = padding.left;
- var rightPadding = padding.right;
- var topPadding = padding.top;
- var bottomPadding = padding.bottom;
-
- var leftBoxes = filterByPosition(chart.boxes, 'left');
- var rightBoxes = filterByPosition(chart.boxes, 'right');
- var topBoxes = filterByPosition(chart.boxes, 'top');
- var bottomBoxes = filterByPosition(chart.boxes, 'bottom');
- var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');
-
- // Sort boxes by weight. A higher weight is further away from the chart area
- sortByWeight(leftBoxes, true);
- sortByWeight(rightBoxes, false);
- sortByWeight(topBoxes, true);
- sortByWeight(bottomBoxes, false);
-
- var verticalBoxes = leftBoxes.concat(rightBoxes);
- var horizontalBoxes = topBoxes.concat(bottomBoxes);
- var outerBoxes = verticalBoxes.concat(horizontalBoxes);
+
+ var availableWidth = width - padding.width;
+ var availableHeight = height - padding.height;
+ var boxes = buildLayoutBoxes(chart.boxes);
+ var verticalBoxes = boxes.vertical;
+ var horizontalBoxes = boxes.horizontal;
// Essentially we now have any number of boxes on each of the 4 sides.
// Our canvas looks like the following.
@@ -6330,201 +7332,57 @@ var core_layouts = {
// | B2 (Full Width) |
// |----------------------------------------------------|
//
- // What we do to find the best sizing, we do the following
- // 1. Determine the minimum size of the chart area.
- // 2. Split the remaining width equally between each vertical axis
- // 3. Split the remaining height equally between each horizontal axis
- // 4. Give each layout the maximum size it can be. The layout will return it's minimum size
- // 5. Adjust the sizes of each axis based on it's minimum reported size.
- // 6. Refit each axis
- // 7. Position each axis in the final location
- // 8. Tell the chart the final location of the chart area
- // 9. Tell any axes that overlay the chart area the positions of the chart area
-
- // Step 1
- var chartWidth = width - leftPadding - rightPadding;
- var chartHeight = height - topPadding - bottomPadding;
- var chartAreaWidth = chartWidth / 2; // min 50%
-
- // Step 2
- var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length;
-
- // Step 3
- // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837)
- // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length;
-
- // Step 4
- var maxChartAreaWidth = chartWidth;
- var maxChartAreaHeight = chartHeight;
- var outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding};
- var minBoxSizes = [];
- var maxPadding;
-
- function getMinimumBoxSize(box) {
- var minSize;
- var isHorizontal = box.isHorizontal();
-
- if (isHorizontal) {
- minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2);
- maxChartAreaHeight -= minSize.height;
- } else {
- minSize = box.update(verticalBoxWidth, maxChartAreaHeight);
- maxChartAreaWidth -= minSize.width;
- }
-
- minBoxSizes.push({
- horizontal: isHorizontal,
- width: minSize.width,
- box: box,
- });
- }
-
- helpers$1.each(outerBoxes, getMinimumBoxSize);
- // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)
- maxPadding = findMaxPadding(outerBoxes);
-
- // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could
- // be if the axes are drawn at their minimum sizes.
- // Steps 5 & 6
-
- // Function to fit a box
- function fitBox(box) {
- var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minBox) {
- return minBox.box === box;
- });
-
- if (minBoxSize) {
- if (minBoxSize.horizontal) {
- var scaleMargin = {
- left: Math.max(outerBoxSizes.left, maxPadding.left),
- right: Math.max(outerBoxSizes.right, maxPadding.right),
- top: 0,
- bottom: 0
- };
-
- // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends
- // on the margin. Sometimes they need to increase in size slightly
- box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);
- } else {
- box.update(minBoxSize.width, maxChartAreaHeight);
- }
- }
- }
-
- // Update, and calculate the left and right margins for the horizontal boxes
- helpers$1.each(verticalBoxes, fitBox);
- addSizeByPosition(verticalBoxes, outerBoxSizes);
-
- // Set the Left and Right margins for the horizontal boxes
- helpers$1.each(horizontalBoxes, fitBox);
- addSizeByPosition(horizontalBoxes, outerBoxSizes);
-
- function finalFitVerticalBox(box) {
- var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function(minSize) {
- return minSize.box === box;
- });
-
- var scaleMargin = {
- left: 0,
- right: 0,
- top: outerBoxSizes.top,
- bottom: outerBoxSizes.bottom
- };
-
- if (minBoxSize) {
- box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin);
- }
- }
-
- // Let the left layout know the final margin
- helpers$1.each(verticalBoxes, finalFitVerticalBox);
-
- // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)
- outerBoxSizes = {top: topPadding, left: leftPadding, bottom: bottomPadding, right: rightPadding};
- addSizeByPosition(outerBoxes, outerBoxSizes);
-
- // We may be adding some padding to account for rotated x axis labels
- var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0);
- outerBoxSizes.left += leftPaddingAddition;
- outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0);
-
- var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0);
- outerBoxSizes.top += topPaddingAddition;
- outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0);
-
- // Figure out if our chart area changed. This would occur if the dataset layout label rotation
- // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do
- // without calling `fit` again
- var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom;
- var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right;
+ var params = Object.freeze({
+ outerWidth: width,
+ outerHeight: height,
+ padding: padding,
+ availableWidth: availableWidth,
+ vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,
+ hBoxMaxHeight: availableHeight / 2
+ });
+ var chartArea = extend({
+ maxPadding: extend({}, padding),
+ w: availableWidth,
+ h: availableHeight,
+ x: padding.left,
+ y: padding.top
+ }, padding);
- if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {
- helpers$1.each(verticalBoxes, function(box) {
- box.height = newMaxChartAreaHeight;
- });
+ setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);
- helpers$1.each(horizontalBoxes, function(box) {
- if (!box.fullWidth) {
- box.width = newMaxChartAreaWidth;
- }
- });
+ // First fit vertical boxes
+ fitBoxes(verticalBoxes, chartArea, params);
- maxChartAreaHeight = newMaxChartAreaHeight;
- maxChartAreaWidth = newMaxChartAreaWidth;
+ // Then fit horizontal boxes
+ if (fitBoxes(horizontalBoxes, chartArea, params)) {
+ // if the area changed, re-fit vertical boxes
+ fitBoxes(verticalBoxes, chartArea, params);
}
- // Step 7 - Position the boxes
- var left = leftPadding + leftPaddingAddition;
- var top = topPadding + topPaddingAddition;
-
- function placeBox(box) {
- if (box.isHorizontal()) {
- box.left = box.fullWidth ? leftPadding : outerBoxSizes.left;
- box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth;
- box.top = top;
- box.bottom = top + box.height;
-
- // Move to next point
- top = box.bottom;
-
- } else {
-
- box.left = left;
- box.right = left + box.width;
- box.top = outerBoxSizes.top;
- box.bottom = outerBoxSizes.top + maxChartAreaHeight;
-
- // Move to next point
- left = box.right;
- }
- }
+ handleMaxPadding(chartArea);
- helpers$1.each(leftBoxes.concat(topBoxes), placeBox);
+ // Finally place the boxes to correct coordinates
+ placeBoxes(boxes.leftAndTop, chartArea, params);
- // Account for chart width and height
- left += maxChartAreaWidth;
- top += maxChartAreaHeight;
+ // Move to opposite side of chart
+ chartArea.x += chartArea.w;
+ chartArea.y += chartArea.h;
- helpers$1.each(rightBoxes, placeBox);
- helpers$1.each(bottomBoxes, placeBox);
+ placeBoxes(boxes.rightAndBottom, chartArea, params);
- // Step 8
chart.chartArea = {
- left: outerBoxSizes.left,
- top: outerBoxSizes.top,
- right: outerBoxSizes.left + maxChartAreaWidth,
- bottom: outerBoxSizes.top + maxChartAreaHeight
+ left: chartArea.left,
+ top: chartArea.top,
+ right: chartArea.left + chartArea.w,
+ bottom: chartArea.top + chartArea.h
};
- // Step 9
- helpers$1.each(chartAreaBoxes, function(box) {
- box.left = chart.chartArea.left;
- box.top = chart.chartArea.top;
- box.right = chart.chartArea.right;
- box.bottom = chart.chartArea.bottom;
-
- box.update(maxChartAreaWidth, maxChartAreaHeight);
+ // Finally update boxes in chartArea (radial scale for example)
+ helpers$1.each(boxes.chartArea, function(layout) {
+ var box = layout.box;
+ extend(box, chart.chartArea);
+ box.update(chartArea.w, chartArea.h);
});
}
};
@@ -6545,16 +7403,13 @@ var platform_basic = {
}
};
-var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n at keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n";
+var platform_dom = "/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n at keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n";
var platform_dom$1 = /*#__PURE__*/Object.freeze({
-default: platform_dom
+__proto__: null,
+'default': platform_dom
});
-function getCjsExportFromNamespace (n) {
- return n && n.default || n;
-}
-
var stylesheet = getCjsExportFromNamespace(platform_dom$1);
var EXPANDO_KEY = '$chartjs';
@@ -6844,17 +7699,22 @@ function removeResizeListener(node) {
}
}
-function injectCSS(platform, css) {
+/**
+ * Injects CSS styles inline if the styles are not already present.
+ * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the <style>.
+ * @param {string} css - the CSS to be injected.
+ */
+function injectCSS(rootNode, css) {
// https://stackoverflow.com/q/3922139
- var style = platform._style || document.createElement('style');
- if (!platform._style) {
- platform._style = style;
+ var expando = rootNode[EXPANDO_KEY] || (rootNode[EXPANDO_KEY] = {});
+ if (!expando.containsStyles) {
+ expando.containsStyles = true;
css = '/* Chart.js */\n' + css;
+ var style = document.createElement('style');
style.setAttribute('type', 'text/css');
- document.getElementsByTagName('head')[0].appendChild(style);
+ style.appendChild(document.createTextNode(css));
+ rootNode.appendChild(style);
}
-
- style.appendChild(document.createTextNode(css));
}
var platform_dom$2 = {
@@ -6875,18 +7735,18 @@ var platform_dom$2 = {
_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',
/**
+ * Initializes resources that depend on platform options.
+ * @param {HTMLCanvasElement} canvas - The Canvas element.
* @private
*/
- _ensureLoaded: function() {
- if (this._loaded) {
- return;
- }
-
- this._loaded = true;
-
- // https://github.com/chartjs/Chart.js/issues/5208
+ _ensureLoaded: function(canvas) {
if (!this.disableCSSInjection) {
- injectCSS(this, stylesheet);
+ // If the canvas is in a shadow DOM, then the styles must also be inserted
+ // into the same shadow DOM.
+ // https://github.com/chartjs/Chart.js/issues/5763
+ var root = canvas.getRootNode ? canvas.getRootNode() : document;
+ var targetNode = root.host ? root : document.head;
+ injectCSS(targetNode, stylesheet);
}
},
@@ -6908,10 +7768,6 @@ var platform_dom$2 = {
// https://github.com/chartjs/Chart.js/issues/2807
var context = item && item.getContext && item.getContext('2d');
- // Load platform resources on first chart creation, to make possible to change
- // platform options after importing the library (e.g. `disableCSSInjection`).
- this._ensureLoaded();
-
// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is
// inside an iframe or when running in a protected environment. We could guess the
// types from their toString() value but let's keep things flexible and assume it's
@@ -6920,6 +7776,9 @@ var platform_dom$2 = {
// https://github.com/chartjs/Chart.js/issues/4102
// https://github.com/chartjs/Chart.js/issues/4152
if (context && context.canvas === item) {
+ // Load platform resources on first chart creation, to make it possible to
+ // import the library before setting platform options.
+ this._ensureLoaded(item);
initCanvas(item, config);
return context;
}
@@ -7252,7 +8111,7 @@ var core_scaleService = {
},
getScaleDefaults: function(type) {
// Return the scale defaults merged with the global settings so that we always use the latest ones
- return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {};
+ return this.defaults.hasOwnProperty(type) ? helpers$1.merge(Object.create(null), [core_defaults.scale, this.defaults[type]]) : {};
},
updateScaleDefaults: function(type, additions) {
var me = this;
@@ -7272,7 +8131,8 @@ var core_scaleService = {
}
};
-var valueOrDefault$7 = helpers$1.valueOrDefault;
+var valueOrDefault$8 = helpers$1.valueOrDefault;
+var getRtlHelper = helpers$1.rtl.getRtlAdapter;
core_defaults._set('global', {
tooltips: {
@@ -7510,28 +8370,32 @@ function getBaseModel(tooltipOpts) {
xAlign: tooltipOpts.xAlign,
yAlign: tooltipOpts.yAlign,
+ // Drawing direction and text direction
+ rtl: tooltipOpts.rtl,
+ textDirection: tooltipOpts.textDirection,
+
// Body
bodyFontColor: tooltipOpts.bodyFontColor,
- _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),
- _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),
+ _bodyFontFamily: valueOrDefault$8(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),
+ _bodyFontStyle: valueOrDefault$8(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),
_bodyAlign: tooltipOpts.bodyAlign,
- bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),
+ bodyFontSize: valueOrDefault$8(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),
bodySpacing: tooltipOpts.bodySpacing,
// Title
titleFontColor: tooltipOpts.titleFontColor,
- _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),
- _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),
- titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),
+ _titleFontFamily: valueOrDefault$8(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),
+ _titleFontStyle: valueOrDefault$8(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),
+ titleFontSize: valueOrDefault$8(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),
_titleAlign: tooltipOpts.titleAlign,
titleSpacing: tooltipOpts.titleSpacing,
titleMarginBottom: tooltipOpts.titleMarginBottom,
// Footer
footerFontColor: tooltipOpts.footerFontColor,
- _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),
- _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),
- footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),
+ _footerFontFamily: valueOrDefault$8(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),
+ _footerFontStyle: valueOrDefault$8(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),
+ footerFontSize: valueOrDefault$8(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),
_footerAlign: tooltipOpts.footerAlign,
footerSpacing: tooltipOpts.footerSpacing,
footerMarginTop: tooltipOpts.footerMarginTop,
@@ -7758,7 +8622,7 @@ function getBeforeAfterBodyLines(callback) {
return pushOrConcat([], splitNewlines(callback));
}
-var exports$3 = core_element.extend({
+var exports$4 = core_element.extend({
initialize: function() {
this._model = getBaseModel(this._options);
this._lastActive = [];
@@ -8016,25 +8880,28 @@ var exports$3 = core_element.extend({
drawTitle: function(pt, vm, ctx) {
var title = vm.title;
+ var length = title.length;
+ var titleFontSize, titleSpacing, i;
+
+ if (length) {
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- if (title.length) {
pt.x = getAlignedX(vm, vm._titleAlign);
- ctx.textAlign = vm._titleAlign;
- ctx.textBaseline = 'top';
+ ctx.textAlign = rtlHelper.textAlign(vm._titleAlign);
+ ctx.textBaseline = 'middle';
- var titleFontSize = vm.titleFontSize;
- var titleSpacing = vm.titleSpacing;
+ titleFontSize = vm.titleFontSize;
+ titleSpacing = vm.titleSpacing;
ctx.fillStyle = vm.titleFontColor;
ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);
- var i, len;
- for (i = 0, len = title.length; i < len; ++i) {
- ctx.fillText(title[i], pt.x, pt.y);
+ for (i = 0; i < length; ++i) {
+ ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFontSize / 2);
pt.y += titleFontSize + titleSpacing; // Line Height and spacing
- if (i + 1 === title.length) {
+ if (i + 1 === length) {
pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing
}
}
@@ -8047,60 +8914,68 @@ var exports$3 = core_element.extend({
var bodyAlign = vm._bodyAlign;
var body = vm.body;
var drawColorBoxes = vm.displayColors;
- var labelColors = vm.labelColors;
var xLinePadding = 0;
var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;
- var textColor;
-
- ctx.textAlign = bodyAlign;
- ctx.textBaseline = 'top';
- ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
- pt.x = getAlignedX(vm, bodyAlign);
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- // Before Body
var fillLineOfText = function(line) {
- ctx.fillText(line, pt.x + xLinePadding, pt.y);
+ ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyFontSize / 2);
pt.y += bodyFontSize + bodySpacing;
};
+ var bodyItem, textColor, labelColors, lines, i, j, ilen, jlen;
+ var bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);
+
+ ctx.textAlign = bodyAlign;
+ ctx.textBaseline = 'middle';
+ ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
+
+ pt.x = getAlignedX(vm, bodyAlignForCalculation);
+
// Before body lines
ctx.fillStyle = vm.bodyFontColor;
helpers$1.each(vm.beforeBody, fillLineOfText);
- xLinePadding = drawColorBoxes && bodyAlign !== 'right'
+ xLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right'
? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2)
: 0;
// Draw body lines now
- helpers$1.each(body, function(bodyItem, i) {
+ for (i = 0, ilen = body.length; i < ilen; ++i) {
+ bodyItem = body[i];
textColor = vm.labelTextColors[i];
+ labelColors = vm.labelColors[i];
+
ctx.fillStyle = textColor;
helpers$1.each(bodyItem.before, fillLineOfText);
- helpers$1.each(bodyItem.lines, function(line) {
+ lines = bodyItem.lines;
+ for (j = 0, jlen = lines.length; j < jlen; ++j) {
// Draw Legend-like boxes if needed
if (drawColorBoxes) {
+ var rtlColorX = rtlHelper.x(colorX);
+
// Fill a white rect so that colours merge nicely if the opacity is < 1
ctx.fillStyle = vm.legendColorBackground;
- ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize);
+ ctx.fillRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
// Border
ctx.lineWidth = 1;
- ctx.strokeStyle = labelColors[i].borderColor;
- ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize);
+ ctx.strokeStyle = labelColors.borderColor;
+ ctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
// Inner square
- ctx.fillStyle = labelColors[i].backgroundColor;
- ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);
+ ctx.fillStyle = labelColors.backgroundColor;
+ ctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), bodyFontSize - 2), pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);
ctx.fillStyle = textColor;
}
- fillLineOfText(line);
- });
+ fillLineOfText(lines[j]);
+ }
helpers$1.each(bodyItem.after, fillLineOfText);
- });
+ }
// Reset back to 0 for after body
xLinePadding = 0;
@@ -8112,21 +8987,27 @@ var exports$3 = core_element.extend({
drawFooter: function(pt, vm, ctx) {
var footer = vm.footer;
+ var length = footer.length;
+ var footerFontSize, i;
+
+ if (length) {
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- if (footer.length) {
pt.x = getAlignedX(vm, vm._footerAlign);
pt.y += vm.footerMarginTop;
- ctx.textAlign = vm._footerAlign;
- ctx.textBaseline = 'top';
+ ctx.textAlign = rtlHelper.textAlign(vm._footerAlign);
+ ctx.textBaseline = 'middle';
+
+ footerFontSize = vm.footerFontSize;
ctx.fillStyle = vm.footerFontColor;
- ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
+ ctx.font = helpers$1.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
- helpers$1.each(footer, function(line) {
- ctx.fillText(line, pt.x, pt.y);
- pt.y += vm.footerFontSize + vm.footerSpacing;
- });
+ for (i = 0; i < length; ++i) {
+ ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFontSize / 2);
+ pt.y += footerFontSize + vm.footerSpacing;
+ }
}
},
@@ -8206,6 +9087,8 @@ var exports$3 = core_element.extend({
// Draw Title, Body, and Footer
pt.y += vm.yPadding;
+ helpers$1.rtl.overrideTextDirection(ctx, vm.textDirection);
+
// Titles
this.drawTitle(pt, vm, ctx);
@@ -8215,6 +9098,8 @@ var exports$3 = core_element.extend({
// Footer
this.drawFooter(pt, vm, ctx);
+ helpers$1.rtl.restoreTextDirection(ctx, vm.textDirection);
+
ctx.restore();
}
},
@@ -8237,6 +9122,9 @@ var exports$3 = core_element.extend({
me._active = [];
} else {
me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);
+ if (options.reverse) {
+ me._active.reverse();
+ }
}
// Remember Last Actives
@@ -8266,10 +9154,10 @@ var exports$3 = core_element.extend({
*/
var positioners_1 = positioners;
-var core_tooltip = exports$3;
+var core_tooltip = exports$4;
core_tooltip.positioners = positioners_1;
-var valueOrDefault$8 = helpers$1.valueOrDefault;
+var valueOrDefault$9 = helpers$1.valueOrDefault;
core_defaults._set('global', {
elements: {},
@@ -8298,7 +9186,7 @@ core_defaults._set('global', {
* returns a deep copy of the result, thus doesn't alter inputs.
*/
function mergeScaleConfig(/* config objects ... */) {
- return helpers$1.merge({}, [].slice.call(arguments), {
+ return helpers$1.merge(Object.create(null), [].slice.call(arguments), {
merger: function(key, target, source, options) {
if (key === 'xAxes' || key === 'yAxes') {
var slen = source[key].length;
@@ -8310,7 +9198,7 @@ function mergeScaleConfig(/* config objects ... */) {
for (i = 0; i < slen; ++i) {
scale = source[key][i];
- type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear');
+ type = valueOrDefault$9(scale.type, key === 'xAxes' ? 'category' : 'linear');
if (i >= target[key].length) {
target[key].push({});
@@ -8338,9 +9226,9 @@ function mergeScaleConfig(/* config objects ... */) {
* a deep copy of the result, thus doesn't alter inputs.
*/
function mergeConfig(/* config objects ... */) {
- return helpers$1.merge({}, [].slice.call(arguments), {
+ return helpers$1.merge(Object.create(null), [].slice.call(arguments), {
merger: function(key, target, source, options) {
- var tval = target[key] || {};
+ var tval = target[key] || Object.create(null);
var sval = source[key];
if (key === 'scales') {
@@ -8357,7 +9245,7 @@ function mergeConfig(/* config objects ... */) {
}
function initConfig(config) {
- config = config || {};
+ config = config || Object.create(null);
// Do NOT use mergeConfig for the data object because this method merges arrays
// and so would change references to labels and datasets, preventing data updates.
@@ -8394,10 +9282,31 @@ function updateConfig(chart) {
chart.tooltip.initialize();
}
+function nextAvailableScaleId(axesOpts, prefix, index) {
+ var id;
+ var hasId = function(obj) {
+ return obj.id === id;
+ };
+
+ do {
+ id = prefix + index++;
+ } while (helpers$1.findIndex(axesOpts, hasId) >= 0);
+
+ return id;
+}
+
function positionIsHorizontal(position) {
return position === 'top' || position === 'bottom';
}
+function compare2Level(l1, l2) {
+ return function(a, b) {
+ return a[l1] === b[l1]
+ ? a[l2] - b[l2]
+ : a[l1] - b[l1];
+ };
+}
+
var Chart = function(item, config) {
this.construct(item, config);
return this;
@@ -8426,6 +9335,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
me.aspectRatio = height ? width / height : null;
me.options = config.options;
me._bufferedRender = false;
+ me._layers = [];
/**
* Provided for backward compatibility, Chart and Chart.Controller have been merged,
@@ -8482,9 +9392,6 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
me.resize(true);
}
- // Make sure scales have IDs and are built before we build any controllers.
- me.ensureScalesHaveIDs();
- me.buildOrUpdateScales();
me.initToolTip();
// After init plugin notification
@@ -8551,11 +9458,15 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
var scaleOptions = options.scale;
helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) {
- xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);
+ if (!xAxisOptions.id) {
+ xAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);
+ }
});
helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) {
- yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);
+ if (!yAxisOptions.id) {
+ yAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);
+ }
});
if (scaleOptions) {
@@ -8599,7 +9510,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
helpers$1.each(items, function(item) {
var scaleOptions = item.options;
var id = scaleOptions.id;
- var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype);
+ var scaleType = valueOrDefault$9(scaleOptions.type, item.dtype);
if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {
scaleOptions.position = item.dposition;
@@ -8651,19 +9562,24 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
buildOrUpdateControllers: function() {
var me = this;
var newControllers = [];
+ var datasets = me.data.datasets;
+ var i, ilen;
- helpers$1.each(me.data.datasets, function(dataset, datasetIndex) {
- var meta = me.getDatasetMeta(datasetIndex);
+ for (i = 0, ilen = datasets.length; i < ilen; i++) {
+ var dataset = datasets[i];
+ var meta = me.getDatasetMeta(i);
var type = dataset.type || me.config.type;
if (meta.type && meta.type !== type) {
- me.destroyDatasetMeta(datasetIndex);
- meta = me.getDatasetMeta(datasetIndex);
+ me.destroyDatasetMeta(i);
+ meta = me.getDatasetMeta(i);
}
meta.type = type;
+ meta.order = dataset.order || 0;
+ meta.index = i;
if (meta.controller) {
- meta.controller.updateIndex(datasetIndex);
+ meta.controller.updateIndex(i);
meta.controller.linkScales();
} else {
var ControllerClass = controllers[meta.type];
@@ -8671,10 +9587,10 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
throw new Error('"' + meta.type + '" is not a chart type.');
}
- meta.controller = new ControllerClass(me, datasetIndex);
+ meta.controller = new ControllerClass(me, i);
newControllers.push(meta.controller);
}
- }, me);
+ }
return newControllers;
},
@@ -8700,6 +9616,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
update: function(config) {
var me = this;
+ var i, ilen;
if (!config || typeof config !== 'object') {
// backwards compatibility
@@ -8726,9 +9643,9 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
var newControllers = me.buildOrUpdateControllers();
// Make sure all dataset controllers have correct meta data counts
- helpers$1.each(me.data.datasets, function(dataset, datasetIndex) {
- me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();
- }, me);
+ for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) {
+ me.getDatasetMeta(i).controller.buildOrUpdateElements();
+ }
me.updateLayout();
@@ -8752,6 +9669,8 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
// Do this before render so that any plugins that need final scale updates can use it
core_plugins.notify(me, 'afterUpdate');
+ me._layers.sort(compare2Level('z', '_idx'));
+
if (me._bufferedRender) {
me._bufferedRequest = {
duration: config.duration,
@@ -8777,6 +9696,20 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
core_layouts.update(this, this.width, this.height);
+ me._layers = [];
+ helpers$1.each(me.boxes, function(box) {
+ // _configure is called twice, once in core.scale.update and once here.
+ // Here the boxes are fully updated and at their final positions.
+ if (box._configure) {
+ box._configure();
+ }
+ me._layers.push.apply(me._layers, box._layers());
+ }, me);
+
+ me._layers.forEach(function(item, index) {
+ item._idx = index;
+ });
+
/**
* Provided for backward compatibility, use `afterLayout` instead.
* @method IPlugin#afterScaleUpdate
@@ -8824,7 +9757,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
return;
}
- meta.controller.update();
+ meta.controller._update();
core_plugins.notify(me, 'afterDatasetUpdate', [args]);
},
@@ -8841,7 +9774,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
}
var animationOptions = me.options.animation;
- var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration);
+ var duration = valueOrDefault$9(config.duration, animationOptions && animationOptions.duration);
var lazy = config.lazy;
if (core_plugins.notify(me, 'beforeRender') === false) {
@@ -8883,6 +9816,7 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
draw: function(easingValue) {
var me = this;
+ var i, layers;
me.clear();
@@ -8900,12 +9834,21 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
return;
}
- // Draw all the scales
- helpers$1.each(me.boxes, function(box) {
- box.draw(me.chartArea);
- }, me);
+ // Because of plugin hooks (before/afterDatasetsDraw), datasets can't
+ // currently be part of layers. Instead, we draw
+ // layers <= 0 before(default, backward compat), and the rest after
+ layers = me._layers;
+ for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {
+ layers[i].draw(me.chartArea);
+ }
me.drawDatasets(easingValue);
+
+ // Rest of layers
+ for (; i < layers.length; ++i) {
+ layers[i].draw(me.chartArea);
+ }
+
me._drawTooltip(easingValue);
core_plugins.notify(me, 'afterDraw', [easingValue]);
@@ -8926,6 +9869,33 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
me.tooltip.transition(easingValue);
},
+ /**
+ * @private
+ */
+ _getSortedDatasetMetas: function(filterVisible) {
+ var me = this;
+ var datasets = me.data.datasets || [];
+ var result = [];
+ var i, ilen;
+
+ for (i = 0, ilen = datasets.length; i < ilen; ++i) {
+ if (!filterVisible || me.isDatasetVisible(i)) {
+ result.push(me.getDatasetMeta(i));
+ }
+ }
+
+ result.sort(compare2Level('order', 'index'));
+
+ return result;
+ },
+
+ /**
+ * @private
+ */
+ _getSortedVisibleDatasetMetas: function() {
+ return this._getSortedDatasetMetas(true);
+ },
+
/**
* Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`
* hook, in which case, plugins will not be called on `afterDatasetsDraw`.
@@ -8933,16 +9903,15 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
*/
drawDatasets: function(easingValue) {
var me = this;
+ var metasets, i;
if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {
return;
}
- // Draw datasets reversed to support proper line stacking
- for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {
- if (me.isDatasetVisible(i)) {
- me.drawDataset(i, easingValue);
- }
+ metasets = me._getSortedVisibleDatasetMetas();
+ for (i = metasets.length - 1; i >= 0; --i) {
+ me.drawDataset(metasets[i], easingValue);
}
core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);
@@ -8953,12 +9922,11 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
* hook, in which case, plugins will not be called on `afterDatasetDraw`.
* @private
*/
- drawDataset: function(index, easingValue) {
+ drawDataset: function(meta, easingValue) {
var me = this;
- var meta = me.getDatasetMeta(index);
var args = {
meta: meta,
- index: index,
+ index: meta.index,
easingValue: easingValue
};
@@ -9038,7 +10006,9 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
controller: null,
hidden: null, // See isDatasetVisible() comment
xAxisID: null,
- yAxisID: null
+ yAxisID: null,
+ order: dataset.order || 0,
+ index: datasetIndex
};
}
@@ -9164,15 +10134,19 @@ helpers$1.extend(Chart.prototype, /** @lends Chart */ {
},
updateHoverStyle: function(elements, mode, enabled) {
- var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';
+ var prefix = enabled ? 'set' : 'remove';
var element, i, ilen;
for (i = 0, ilen = elements.length; i < ilen; ++i) {
element = elements[i];
if (element) {
- this.getDatasetMeta(element._datasetIndex).controller[method](element);
+ this.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);
}
}
+
+ if (mode === 'dataset') {
+ this.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();
+ }
},
/**
@@ -9388,7 +10362,7 @@ var core_helpers = function() {
};
helpers$1.almostWhole = function(x, epsilon) {
var rounded = Math.round(x);
- return (((rounded - epsilon) < x) && ((rounded + epsilon) > x));
+ return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);
};
helpers$1.max = function(array) {
return array.reduce(function(max, value) {
@@ -9417,19 +10391,6 @@ var core_helpers = function() {
}
return x > 0 ? 1 : -1;
};
- helpers$1.log10 = Math.log10 ?
- function(x) {
- return Math.log10(x);
- } :
- function(x) {
- var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.
- // Check for whole powers of 10,
- // which due to floating point rounding error should be corrected.
- var powerOf10 = Math.round(exponent);
- var isPowerOf10 = x === Math.pow(10, powerOf10);
-
- return isPowerOf10 ? powerOf10 : exponent;
- };
helpers$1.toRadians = function(degrees) {
return degrees * (Math.PI / 180);
};
@@ -9870,25 +10831,30 @@ var core_helpers = function() {
ctx.font = font;
var longest = 0;
- helpers$1.each(arrayOfThings, function(thing) {
+ var ilen = arrayOfThings.length;
+ var i, j, jlen, thing, nestedThing;
+ for (i = 0; i < ilen; i++) {
+ thing = arrayOfThings[i];
+
// Undefined strings and arrays should not be measured
if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {
longest = helpers$1.measureText(ctx, data, gc, longest, thing);
} else if (helpers$1.isArray(thing)) {
// if it is an array lets measure each element
// to do maybe simplify this function a bit so we can do this more recursively?
- helpers$1.each(thing, function(nestedThing) {
+ for (j = 0, jlen = thing.length; j < jlen; j++) {
+ nestedThing = thing[j];
// Undefined strings and arrays should not be measured
if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {
longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);
}
- });
+ }
}
- });
+ }
var gcLen = gc.length / 2;
if (gcLen > arrayOfThings.length) {
- for (var i = 0; i < gcLen; i++) {
+ for (i = 0; i < gcLen; i++) {
delete data[gc[i]];
}
gc.splice(0, gcLen);
@@ -9906,6 +10872,10 @@ var core_helpers = function() {
}
return longest;
};
+
+ /**
+ * @deprecated
+ */
helpers$1.numberOfLabelLines = function(arrayOfThings) {
var numberOfLines = 1;
helpers$1.each(arrayOfThings, function(thing) {
@@ -10103,7 +11073,9 @@ var core_ticks = {
var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));
if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation
var logTick = helpers$1.log10(Math.abs(tickValue));
- tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta));
+ var numExponential = Math.floor(logTick) - Math.floor(logDelta);
+ numExponential = Math.max(Math.min(numExponential, 20), 0);
+ tickString = tickValue.toExponential(numExponential);
} else {
var numDecimal = -1 * Math.floor(logDelta);
numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places
@@ -10129,7 +11101,9 @@ var core_ticks = {
}
};
-var valueOrDefault$9 = helpers$1.valueOrDefault;
+var isArray = helpers$1.isArray;
+var isNullOrUndef = helpers$1.isNullOrUndef;
+var valueOrDefault$a = helpers$1.valueOrDefault;
var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;
core_defaults._set('scale', {
@@ -10140,7 +11114,7 @@ core_defaults._set('scale', {
// grid line settings
gridLines: {
display: true,
- color: 'rgba(0, 0, 0, 0.1)',
+ color: 'rgba(0,0,0,0.1)',
lineWidth: 1,
drawBorder: true,
drawOnChartArea: true,
@@ -10189,41 +11163,270 @@ core_defaults._set('scale', {
}
});
-function labelsFromTicks(ticks) {
- var labels = [];
- var i, ilen;
+/** Returns a new array containing numItems from arr */
+function sample(arr, numItems) {
+ var result = [];
+ var increment = arr.length / numItems;
+ var i = 0;
+ var len = arr.length;
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
- labels.push(ticks[i].label);
+ for (; i < len; i += increment) {
+ result.push(arr[Math.floor(i)]);
}
-
- return labels;
+ return result;
}
function getPixelForGridLine(scale, index, offsetGridLines) {
- var lineValue = scale.getPixelForTick(index);
+ var length = scale.getTicks().length;
+ var validIndex = Math.min(index, length - 1);
+ var lineValue = scale.getPixelForTick(validIndex);
+ var start = scale._startPixel;
+ var end = scale._endPixel;
+ var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.
+ var offset;
if (offsetGridLines) {
- if (scale.getTicks().length === 1) {
- lineValue -= scale.isHorizontal() ?
- Math.max(lineValue - scale.left, scale.right - lineValue) :
- Math.max(lineValue - scale.top, scale.bottom - lineValue);
+ if (length === 1) {
+ offset = Math.max(lineValue - start, end - lineValue);
} else if (index === 0) {
- lineValue -= (scale.getPixelForTick(1) - lineValue) / 2;
+ offset = (scale.getPixelForTick(1) - lineValue) / 2;
} else {
- lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;
+ offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;
+ }
+ lineValue += validIndex < index ? offset : -offset;
+
+ // Return undefined if the pixel is out of the range
+ if (lineValue < start - epsilon || lineValue > end + epsilon) {
+ return;
}
}
return lineValue;
}
-function computeTextSize(context, tick, font) {
- return helpers$1.isArray(tick) ?
- helpers$1.longestText(context, font, tick) :
- context.measureText(tick).width;
+function garbageCollect(caches, length) {
+ helpers$1.each(caches, function(cache) {
+ var gc = cache.gc;
+ var gcLen = gc.length / 2;
+ var i;
+ if (gcLen > length) {
+ for (i = 0; i < gcLen; ++i) {
+ delete cache.data[gc[i]];
+ }
+ gc.splice(0, gcLen);
+ }
+ });
+}
+
+/**
+ * Returns {width, height, offset} objects for the first, last, widest, highest tick
+ * labels where offset indicates the anchor point offset from the top in pixels.
+ */
+function computeLabelSizes(ctx, tickFonts, ticks, caches) {
+ var length = ticks.length;
+ var widths = [];
+ var heights = [];
+ var offsets = [];
+ var widestLabelSize = 0;
+ var highestLabelSize = 0;
+ var i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel, widest, highest;
+
+ for (i = 0; i < length; ++i) {
+ label = ticks[i].label;
+ tickFont = ticks[i].major ? tickFonts.major : tickFonts.minor;
+ ctx.font = fontString = tickFont.string;
+ cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};
+ lineHeight = tickFont.lineHeight;
+ width = height = 0;
+ // Undefined labels and arrays should not be measured
+ if (!isNullOrUndef(label) && !isArray(label)) {
+ width = helpers$1.measureText(ctx, cache.data, cache.gc, width, label);
+ height = lineHeight;
+ } else if (isArray(label)) {
+ // if it is an array let's measure each element
+ for (j = 0, jlen = label.length; j < jlen; ++j) {
+ nestedLabel = label[j];
+ // Undefined labels and arrays should not be measured
+ if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {
+ width = helpers$1.measureText(ctx, cache.data, cache.gc, width, nestedLabel);
+ height += lineHeight;
+ }
+ }
+ }
+ widths.push(width);
+ heights.push(height);
+ offsets.push(lineHeight / 2);
+ widestLabelSize = Math.max(width, widestLabelSize);
+ highestLabelSize = Math.max(height, highestLabelSize);
+ }
+ garbageCollect(caches, length);
+
+ widest = widths.indexOf(widestLabelSize);
+ highest = heights.indexOf(highestLabelSize);
+
+ function valueAt(idx) {
+ return {
+ width: widths[idx] || 0,
+ height: heights[idx] || 0,
+ offset: offsets[idx] || 0
+ };
+ }
+
+ return {
+ first: valueAt(0),
+ last: valueAt(length - 1),
+ widest: valueAt(widest),
+ highest: valueAt(highest)
+ };
+}
+
+function getTickMarkLength(options) {
+ return options.drawTicks ? options.tickMarkLength : 0;
+}
+
+function getScaleLabelHeight(options) {
+ var font, padding;
+
+ if (!options.display) {
+ return 0;
+ }
+
+ font = helpers$1.options._parseFont(options);
+ padding = helpers$1.options.toPadding(options.padding);
+
+ return font.lineHeight + padding.height;
+}
+
+function parseFontOptions(options, nestedOpts) {
+ return helpers$1.extend(helpers$1.options._parseFont({
+ fontFamily: valueOrDefault$a(nestedOpts.fontFamily, options.fontFamily),
+ fontSize: valueOrDefault$a(nestedOpts.fontSize, options.fontSize),
+ fontStyle: valueOrDefault$a(nestedOpts.fontStyle, options.fontStyle),
+ lineHeight: valueOrDefault$a(nestedOpts.lineHeight, options.lineHeight)
+ }), {
+ color: helpers$1.options.resolve([nestedOpts.fontColor, options.fontColor, core_defaults.global.defaultFontColor])
+ });
+}
+
+function parseTickFontOptions(options) {
+ var minor = parseFontOptions(options, options.minor);
+ var major = options.major.enabled ? parseFontOptions(options, options.major) : minor;
+
+ return {minor: minor, major: major};
+}
+
+function nonSkipped(ticksToFilter) {
+ var filtered = [];
+ var item, index, len;
+ for (index = 0, len = ticksToFilter.length; index < len; ++index) {
+ item = ticksToFilter[index];
+ if (typeof item._index !== 'undefined') {
+ filtered.push(item);
+ }
+ }
+ return filtered;
+}
+
+function getEvenSpacing(arr) {
+ var len = arr.length;
+ var i, diff;
+
+ if (len < 2) {
+ return false;
+ }
+
+ for (diff = arr[0], i = 1; i < len; ++i) {
+ if (arr[i] - arr[i - 1] !== diff) {
+ return false;
+ }
+ }
+ return diff;
+}
+
+function calculateSpacing(majorIndices, ticks, axisLength, ticksLimit) {
+ var evenMajorSpacing = getEvenSpacing(majorIndices);
+ var spacing = (ticks.length - 1) / ticksLimit;
+ var factors, factor, i, ilen;
+
+ // If the major ticks are evenly spaced apart, place the minor ticks
+ // so that they divide the major ticks into even chunks
+ if (!evenMajorSpacing) {
+ return Math.max(spacing, 1);
+ }
+
+ factors = helpers$1.math._factorize(evenMajorSpacing);
+ for (i = 0, ilen = factors.length - 1; i < ilen; i++) {
+ factor = factors[i];
+ if (factor > spacing) {
+ return factor;
+ }
+ }
+ return Math.max(spacing, 1);
+}
+
+function getMajorIndices(ticks) {
+ var result = [];
+ var i, ilen;
+ for (i = 0, ilen = ticks.length; i < ilen; i++) {
+ if (ticks[i].major) {
+ result.push(i);
+ }
+ }
+ return result;
+}
+
+function skipMajors(ticks, majorIndices, spacing) {
+ var count = 0;
+ var next = majorIndices[0];
+ var i, tick;
+
+ spacing = Math.ceil(spacing);
+ for (i = 0; i < ticks.length; i++) {
+ tick = ticks[i];
+ if (i === next) {
+ tick._index = i;
+ count++;
+ next = majorIndices[count * spacing];
+ } else {
+ delete tick.label;
+ }
+ }
+}
+
+function skip(ticks, spacing, majorStart, majorEnd) {
+ var start = valueOrDefault$a(majorStart, 0);
+ var end = Math.min(valueOrDefault$a(majorEnd, ticks.length), ticks.length);
+ var count = 0;
+ var length, i, tick, next;
+
+ spacing = Math.ceil(spacing);
+ if (majorEnd) {
+ length = majorEnd - majorStart;
+ spacing = length / Math.floor(length / spacing);
+ }
+
+ next = start;
+
+ while (next < 0) {
+ count++;
+ next = Math.round(start + count * spacing);
+ }
+
+ for (i = Math.max(start, 0); i < end; i++) {
+ tick = ticks[i];
+ if (i === next) {
+ tick._index = i;
+ count++;
+ next = Math.round(start + count * spacing);
+ } else {
+ delete tick.label;
+ }
+ }
}
-var core_scale = core_element.extend({
+var Scale = core_element.extend({
+
+ zeroLineIndex: 0,
+
/**
* Get the padding needed for the scale
* @method getPadding
@@ -10248,40 +11451,45 @@ var core_scale = core_element.extend({
return this._ticks;
},
+ /**
+ * @private
+ */
+ _getLabels: function() {
+ var data = this.chart.data;
+ return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];
+ },
+
// These methods are ordered by lifecyle. Utilities then follow.
// Any function defined here is inherited by all scale types.
// Any function can be extended by the scale type
+ /**
+ * Provided for backward compatibility, not available anymore
+ * @function Chart.Scale.mergeTicksOptions
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ */
mergeTicksOptions: function() {
- var ticks = this.options.ticks;
- if (ticks.minor === false) {
- ticks.minor = {
- display: false
- };
- }
- if (ticks.major === false) {
- ticks.major = {
- display: false
- };
- }
- for (var key in ticks) {
- if (key !== 'major' && key !== 'minor') {
- if (typeof ticks.minor[key] === 'undefined') {
- ticks.minor[key] = ticks[key];
- }
- if (typeof ticks.major[key] === 'undefined') {
- ticks.major[key] = ticks[key];
- }
- }
- }
+ // noop
},
+
beforeUpdate: function() {
helpers$1.callback(this.options.beforeUpdate, [this]);
},
+ /**
+ * @param {number} maxWidth - the max width in pixels
+ * @param {number} maxHeight - the max height in pixels
+ * @param {object} margins - the space between the edge of the other scales and edge of the chart
+ * This space comes from two sources:
+ * - padding - space that's required to show the labels at the edges of the scale
+ * - thickness of scales or legends in another orientation
+ */
update: function(maxWidth, maxHeight, margins) {
var me = this;
- var i, ilen, labels, label, ticks, tick;
+ var tickOpts = me.options.ticks;
+ var sampleSize = tickOpts.sampleSize;
+ var i, ilen, labels, ticks, samplingEnabled;
// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
me.beforeUpdate();
@@ -10296,9 +11504,14 @@ var core_scale = core_element.extend({
bottom: 0
}, margins);
+ me._ticks = null;
+ me.ticks = null;
+ me._labelSizes = null;
me._maxLabelLines = 0;
me.longestLabelWidth = 0;
me.longestTextCache = me.longestTextCache || {};
+ me._gridLineItems = null;
+ me._labelItems = null;
// Dimensions
me.beforeSetDimensions();
@@ -10326,49 +11539,81 @@ var core_scale = core_element.extend({
// Allow modification of ticks in callback.
ticks = me.afterBuildTicks(ticks) || ticks;
- me.beforeTickToLabelConversion();
-
- // New implementations should return the formatted tick labels but for BACKWARD
- // COMPAT, we still support no return (`this.ticks` internally changed by calling
- // this method and supposed to contain only string values).
- labels = me.convertTicksToLabels(ticks) || me.ticks;
-
- me.afterTickToLabelConversion();
-
- me.ticks = labels; // BACKWARD COMPATIBILITY
-
- // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!
-
- // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)
- for (i = 0, ilen = labels.length; i < ilen; ++i) {
- label = labels[i];
- tick = ticks[i];
- if (!tick) {
- ticks.push(tick = {
- label: label,
+ // Ensure ticks contains ticks in new tick format
+ if ((!ticks || !ticks.length) && me.ticks) {
+ ticks = [];
+ for (i = 0, ilen = me.ticks.length; i < ilen; ++i) {
+ ticks.push({
+ value: me.ticks[i],
major: false
});
- } else {
- tick.label = label;
}
}
me._ticks = ticks;
+ // Compute tick rotation and fit using a sampled subset of labels
+ // We generally don't need to compute the size of every single label for determining scale size
+ samplingEnabled = sampleSize < ticks.length;
+ labels = me._convertTicksToLabels(samplingEnabled ? sample(ticks, sampleSize) : ticks);
+
+ // _configure is called twice, once here, once from core.controller.updateLayout.
+ // Here we haven't been positioned yet, but dimensions are correct.
+ // Variables set in _configure are needed for calculateTickRotation, and
+ // it's ok that coordinates are not correct there, only dimensions matter.
+ me._configure();
+
// Tick Rotation
me.beforeCalculateTickRotation();
me.calculateTickRotation();
me.afterCalculateTickRotation();
- // Fit
+
me.beforeFit();
me.fit();
me.afterFit();
- //
+
+ // Auto-skip
+ me._ticksToDraw = tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto') ? me._autoSkip(ticks) : ticks;
+
+ if (samplingEnabled) {
+ // Generate labels using all non-skipped ticks
+ labels = me._convertTicksToLabels(me._ticksToDraw);
+ }
+
+ me.ticks = labels; // BACKWARD COMPATIBILITY
+
+ // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!
+
me.afterUpdate();
+ // TODO(v3): remove minSize as a public property and return value from all layout boxes. It is unused
+ // make maxWidth and maxHeight private
return me.minSize;
+ },
+
+ /**
+ * @private
+ */
+ _configure: function() {
+ var me = this;
+ var reversePixels = me.options.ticks.reverse;
+ var startPixel, endPixel;
+ if (me.isHorizontal()) {
+ startPixel = me.left;
+ endPixel = me.right;
+ } else {
+ startPixel = me.top;
+ endPixel = me.bottom;
+ // by default vertical scales are from bottom to top, so pixels are reversed
+ reversePixels = !reversePixels;
+ }
+ me._startPixel = startPixel;
+ me._endPixel = endPixel;
+ me._reversePixels = reversePixels;
+ me._length = endPixel - startPixel;
},
+
afterUpdate: function() {
helpers$1.callback(this.options.afterUpdate, [this]);
},
@@ -10421,7 +11666,7 @@ var core_scale = core_element.extend({
afterBuildTicks: function(ticks) {
var me = this;
// ticks is empty for old axis implementations here
- if (helpers$1.isArray(ticks) && ticks.length) {
+ if (isArray(ticks) && ticks.length) {
return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);
}
// Support old implementations (that modified `this.ticks` directly in buildTicks)
@@ -10449,40 +11694,39 @@ var core_scale = core_element.extend({
},
calculateTickRotation: function() {
var me = this;
- var context = me.ctx;
- var tickOpts = me.options.ticks;
- var labels = labelsFromTicks(me._ticks);
-
- // Get the width of each grid by calculating the difference
- // between x offsets between 0 and 1.
- var tickFont = helpers$1.options._parseFont(tickOpts);
- context.font = tickFont.string;
-
- var labelRotation = tickOpts.minRotation || 0;
-
- if (labels.length && me.options.display && me.isHorizontal()) {
- var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache);
- var labelWidth = originalLabelWidth;
- var cosRotation, sinRotation;
-
- // Allow 3 pixels x2 padding either side for label readability
- var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;
+ var options = me.options;
+ var tickOpts = options.ticks;
+ var numTicks = me.getTicks().length;
+ var minRotation = tickOpts.minRotation || 0;
+ var maxRotation = tickOpts.maxRotation;
+ var labelRotation = minRotation;
+ var labelSizes, maxLabelWidth, maxLabelHeight, maxWidth, tickWidth, maxHeight, maxLabelDiagonal;
+
+ if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {
+ me.labelRotation = minRotation;
+ return;
+ }
- // Max label rotation can be set or default to 90 - also act as a loop counter
- while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {
- var angleRadians = helpers$1.toRadians(labelRotation);
- cosRotation = Math.cos(angleRadians);
- sinRotation = Math.sin(angleRadians);
+ labelSizes = me._getLabelSizes();
+ maxLabelWidth = labelSizes.widest.width;
+ maxLabelHeight = labelSizes.highest.height - labelSizes.highest.offset;
- if (sinRotation * originalLabelWidth > me.maxHeight) {
- // go back one step
- labelRotation--;
- break;
- }
+ // Estimate the width of each grid based on the canvas width, the maximum
+ // label width and the number of tick intervals
+ maxWidth = Math.min(me.maxWidth, me.chart.width - maxLabelWidth);
+ tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);
- labelRotation++;
- labelWidth = cosRotation * originalLabelWidth;
- }
+ // Allow 3 pixels x2 padding either side for label readability
+ if (maxLabelWidth + 6 > tickWidth) {
+ tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));
+ maxHeight = me.maxHeight - getTickMarkLength(options.gridLines)
+ - tickOpts.padding - getScaleLabelHeight(options.scaleLabel);
+ maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);
+ labelRotation = helpers$1.toDegrees(Math.min(
+ Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)),
+ Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)
+ ));
+ labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));
}
me.labelRotation = labelRotation;
@@ -10504,111 +11748,99 @@ var core_scale = core_element.extend({
height: 0
};
- var labels = labelsFromTicks(me._ticks);
-
+ var chart = me.chart;
var opts = me.options;
var tickOpts = opts.ticks;
var scaleLabelOpts = opts.scaleLabel;
var gridLineOpts = opts.gridLines;
var display = me._isVisible();
- var position = opts.position;
+ var isBottom = opts.position === 'bottom';
var isHorizontal = me.isHorizontal();
- var parseFont = helpers$1.options._parseFont;
- var tickFont = parseFont(tickOpts);
- var tickMarkLength = opts.gridLines.tickMarkLength;
-
// Width
if (isHorizontal) {
- // subtract the margins to line up with the chartArea if we are a full width scale
- minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;
- } else {
- minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;
+ minSize.width = me.maxWidth;
+ } else if (display) {
+ minSize.width = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
}
// height
- if (isHorizontal) {
- minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;
- } else {
+ if (!isHorizontal) {
minSize.height = me.maxHeight; // fill all the height
- }
-
- // Are we showing a title for the scale?
- if (scaleLabelOpts.display && display) {
- var scaleLabelFont = parseFont(scaleLabelOpts);
- var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding);
- var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height;
-
- if (isHorizontal) {
- minSize.height += deltaHeight;
- } else {
- minSize.width += deltaHeight;
- }
+ } else if (display) {
+ minSize.height = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
}
// Don't bother fitting the ticks if we are not showing the labels
if (tickOpts.display && display) {
- var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache);
- var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels);
- var lineSpace = tickFont.size * 0.5;
- var tickPadding = me.options.ticks.padding;
-
- // Store max number of lines and widest label for _autoSkip
- me._maxLabelLines = tallestLabelHeightInLines;
- me.longestLabelWidth = largestTextWidth;
+ var tickFonts = parseTickFontOptions(tickOpts);
+ var labelSizes = me._getLabelSizes();
+ var firstLabelSize = labelSizes.first;
+ var lastLabelSize = labelSizes.last;
+ var widestLabelSize = labelSizes.widest;
+ var highestLabelSize = labelSizes.highest;
+ var lineSpace = tickFonts.minor.lineHeight * 0.4;
+ var tickPadding = tickOpts.padding;
if (isHorizontal) {
+ // A horizontal axis is more constrained by the height.
+ var isRotated = me.labelRotation !== 0;
var angleRadians = helpers$1.toRadians(me.labelRotation);
var cosRotation = Math.cos(angleRadians);
var sinRotation = Math.sin(angleRadians);
- // TODO - improve this calculation
- var labelHeight = (sinRotation * largestTextWidth)
- + (tickFont.lineHeight * tallestLabelHeightInLines)
- + lineSpace; // padding
+ var labelHeight = sinRotation * widestLabelSize.width
+ + cosRotation * (highestLabelSize.height - (isRotated ? highestLabelSize.offset : 0))
+ + (isRotated ? 0 : lineSpace); // padding
minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);
- me.ctx.font = tickFont.string;
- var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string);
- var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string);
var offsetLeft = me.getPixelForTick(0) - me.left;
- var offsetRight = me.right - me.getPixelForTick(labels.length - 1);
+ var offsetRight = me.right - me.getPixelForTick(me.getTicks().length - 1);
var paddingLeft, paddingRight;
// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned
// which means that the right padding is dominated by the font height
- if (me.labelRotation !== 0) {
- paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace);
- paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth);
+ if (isRotated) {
+ paddingLeft = isBottom ?
+ cosRotation * firstLabelSize.width + sinRotation * firstLabelSize.offset :
+ sinRotation * (firstLabelSize.height - firstLabelSize.offset);
+ paddingRight = isBottom ?
+ sinRotation * (lastLabelSize.height - lastLabelSize.offset) :
+ cosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset;
} else {
- paddingLeft = firstLabelWidth / 2;
- paddingRight = lastLabelWidth / 2;
+ paddingLeft = firstLabelSize.width / 2;
+ paddingRight = lastLabelSize.width / 2;
}
- me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges
- me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3;
+
+ // Adjust padding taking into account changes in offsets
+ // and add 3 px to move away from canvas edges
+ me.paddingLeft = Math.max((paddingLeft - offsetLeft) * me.width / (me.width - offsetLeft), 0) + 3;
+ me.paddingRight = Math.max((paddingRight - offsetRight) * me.width / (me.width - offsetRight), 0) + 3;
} else {
// A vertical axis is more constrained by the width. Labels are the
// dominant factor here, so get that length first and account for padding
- if (tickOpts.mirror) {
- largestTextWidth = 0;
- } else {
+ var labelWidth = tickOpts.mirror ? 0 :
// use lineSpace for consistency with horizontal axis
// tickPadding is not implemented for horizontal
- largestTextWidth += tickPadding + lineSpace;
- }
+ widestLabelSize.width + tickPadding + lineSpace;
- minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);
+ minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth);
- me.paddingTop = tickFont.size / 2;
- me.paddingBottom = tickFont.size / 2;
+ me.paddingTop = firstLabelSize.height / 2;
+ me.paddingBottom = lastLabelSize.height / 2;
}
}
me.handleMargins();
- me.width = minSize.width;
- me.height = minSize.height;
+ if (isHorizontal) {
+ me.width = me._length = chart.width - me.margins.left - me.margins.right;
+ me.height = minSize.height;
+ } else {
+ me.width = minSize.width;
+ me.height = me._length = chart.height - me.margins.top - me.margins.bottom;
+ }
},
/**
@@ -10618,10 +11850,10 @@ var core_scale = core_element.extend({
handleMargins: function() {
var me = this;
if (me.margins) {
- me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);
- me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);
- me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);
- me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);
+ me.margins.left = Math.max(me.paddingLeft, me.margins.left);
+ me.margins.top = Math.max(me.paddingTop, me.margins.top);
+ me.margins.right = Math.max(me.paddingRight, me.margins.right);
+ me.margins.bottom = Math.max(me.paddingBottom, me.margins.bottom);
}
},
@@ -10631,22 +11863,24 @@ var core_scale = core_element.extend({
// Shared Methods
isHorizontal: function() {
- return this.options.position === 'top' || this.options.position === 'bottom';
+ var pos = this.options.position;
+ return pos === 'top' || pos === 'bottom';
},
isFullWidth: function() {
- return (this.options.fullWidth);
+ return this.options.fullWidth;
},
// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not
getRightValue: function(rawValue) {
// Null and undefined values first
- if (helpers$1.isNullOrUndef(rawValue)) {
+ if (isNullOrUndef(rawValue)) {
return NaN;
}
// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values
if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {
return NaN;
}
+
// If it is in fact an object, dive in one more level
if (rawValue) {
if (this.isHorizontal()) {
@@ -10662,6 +11896,85 @@ var core_scale = core_element.extend({
return rawValue;
},
+ _convertTicksToLabels: function(ticks) {
+ var me = this;
+ var labels, i, ilen;
+
+ me.ticks = ticks.map(function(tick) {
+ return tick.value;
+ });
+
+ me.beforeTickToLabelConversion();
+
+ // New implementations should return the formatted tick labels but for BACKWARD
+ // COMPAT, we still support no return (`this.ticks` internally changed by calling
+ // this method and supposed to contain only string values).
+ labels = me.convertTicksToLabels(ticks) || me.ticks;
+
+ me.afterTickToLabelConversion();
+
+ // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ ticks[i].label = labels[i];
+ }
+
+ return labels;
+ },
+
+ /**
+ * @private
+ */
+ _getLabelSizes: function() {
+ var me = this;
+ var labelSizes = me._labelSizes;
+
+ if (!labelSizes) {
+ me._labelSizes = labelSizes = computeLabelSizes(me.ctx, parseTickFontOptions(me.options.ticks), me.getTicks(), me.longestTextCache);
+ me.longestLabelWidth = labelSizes.widest.width;
+ }
+
+ return labelSizes;
+ },
+
+ /**
+ * @private
+ */
+ _parseValue: function(value) {
+ var start, end, min, max;
+
+ if (isArray(value)) {
+ start = +this.getRightValue(value[0]);
+ end = +this.getRightValue(value[1]);
+ min = Math.min(start, end);
+ max = Math.max(start, end);
+ } else {
+ value = +this.getRightValue(value);
+ start = undefined;
+ end = value;
+ min = value;
+ max = value;
+ }
+
+ return {
+ min: min,
+ max: max,
+ start: start,
+ end: end
+ };
+ },
+
+ /**
+ * @private
+ */
+ _getScaleLabel: function(rawValue) {
+ var v = this._parseValue(rawValue);
+ if (v.start !== undefined) {
+ return '[' + v.start + ', ' + v.end + ']';
+ }
+
+ return +this.getRightValue(rawValue);
+ },
+
/**
* Used to get the value to display in the tooltip for the data at the given index
* @param index
@@ -10692,21 +12005,12 @@ var core_scale = core_element.extend({
getPixelForTick: function(index) {
var me = this;
var offset = me.options.offset;
- if (me.isHorizontal()) {
- var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
- var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);
- var pixel = (tickWidth * index) + me.paddingLeft;
-
- if (offset) {
- pixel += tickWidth / 2;
- }
+ var numTicks = me._ticks.length;
+ var tickWidth = 1 / Math.max(numTicks - (offset ? 0 : 1), 1);
- var finalVal = me.left + pixel;
- finalVal += me.isFullWidth() ? me.margins.left : 0;
- return finalVal;
- }
- var innerHeight = me.height - (me.paddingTop + me.paddingBottom);
- return me.top + (index * (innerHeight / (me._ticks.length - 1)));
+ return index < 0 || index > numTicks - 1
+ ? null
+ : me.getPixelForDecimal(index * tickWidth + (offset ? tickWidth / 2 : 0));
},
/**
@@ -10715,15 +12019,17 @@ var core_scale = core_element.extend({
*/
getPixelForDecimal: function(decimal) {
var me = this;
- if (me.isHorizontal()) {
- var innerWidth = me.width - (me.paddingLeft + me.paddingRight);
- var valueOffset = (innerWidth * decimal) + me.paddingLeft;
- var finalVal = me.left + valueOffset;
- finalVal += me.isFullWidth() ? me.margins.left : 0;
- return finalVal;
+ if (me._reversePixels) {
+ decimal = 1 - decimal;
}
- return me.top + (decimal * me.height);
+
+ return me._startPixel + decimal * me._length;
+ },
+
+ getDecimalForPixel: function(pixel) {
+ var decimal = (pixel - this._startPixel) / this._length;
+ return this._reversePixels ? 1 - decimal : decimal;
},
/**
@@ -10751,44 +12057,34 @@ var core_scale = core_element.extend({
*/
_autoSkip: function(ticks) {
var me = this;
- var isHorizontal = me.isHorizontal();
- var optionTicks = me.options.ticks.minor;
- var tickCount = ticks.length;
- var skipRatio = false;
- var maxTicks = optionTicks.maxTicksLimit;
-
- // Total space needed to display all ticks. First and last ticks are
- // drawn as their center at end of axis, so tickCount-1
- var ticksLength = me._tickSize() * (tickCount - 1);
-
- // Axis length
- var axisLength = isHorizontal
- ? me.width - (me.paddingLeft + me.paddingRight)
- : me.height - (me.paddingTop + me.PaddingBottom);
-
- var result = [];
- var i, tick;
-
- if (ticksLength > axisLength) {
- skipRatio = 1 + Math.floor(ticksLength / axisLength);
- }
+ var tickOpts = me.options.ticks;
+ var axisLength = me._length;
+ var ticksLimit = tickOpts.maxTicksLimit || axisLength / me._tickSize() + 1;
+ var majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];
+ var numMajorIndices = majorIndices.length;
+ var first = majorIndices[0];
+ var last = majorIndices[numMajorIndices - 1];
+ var i, ilen, spacing, avgMajorSpacing;
- // if they defined a max number of optionTicks,
- // increase skipRatio until that number is met
- if (tickCount > maxTicks) {
- skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks));
+ // If there are too many major ticks to display them all
+ if (numMajorIndices > ticksLimit) {
+ skipMajors(ticks, majorIndices, numMajorIndices / ticksLimit);
+ return nonSkipped(ticks);
}
- for (i = 0; i < tickCount; i++) {
- tick = ticks[i];
+ spacing = calculateSpacing(majorIndices, ticks, axisLength, ticksLimit);
- if (skipRatio > 1 && i % skipRatio > 0) {
- // leave tick in place but make sure it's not displayed (#4635)
- delete tick.label;
+ if (numMajorIndices > 0) {
+ for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {
+ skip(ticks, spacing, majorIndices[i], majorIndices[i + 1]);
}
- result.push(tick);
+ avgMajorSpacing = numMajorIndices > 1 ? (last - first) / (numMajorIndices - 1) : null;
+ skip(ticks, spacing, helpers$1.isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);
+ skip(ticks, spacing, last, helpers$1.isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);
+ return nonSkipped(ticks);
}
- return result;
+ skip(ticks, spacing);
+ return nonSkipped(ticks);
},
/**
@@ -10796,22 +12092,20 @@ var core_scale = core_element.extend({
*/
_tickSize: function() {
var me = this;
- var isHorizontal = me.isHorizontal();
- var optionTicks = me.options.ticks.minor;
+ var optionTicks = me.options.ticks;
// Calculate space needed by label in axis direction.
var rot = helpers$1.toRadians(me.labelRotation);
var cos = Math.abs(Math.cos(rot));
var sin = Math.abs(Math.sin(rot));
+ var labelSizes = me._getLabelSizes();
var padding = optionTicks.autoSkipPadding || 0;
- var w = (me.longestLabelWidth + padding) || 0;
-
- var tickFont = helpers$1.options._parseFont(optionTicks);
- var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0;
+ var w = labelSizes ? labelSizes.widest.width + padding : 0;
+ var h = labelSizes ? labelSizes.highest.height + padding : 0;
// Calculate space needed for 1 tick in axis direction.
- return isHorizontal
+ return me.isHorizontal()
? h * cos > w * sin ? w / cos : h / sin
: h * sin < w * cos ? h / cos : w / sin;
},
@@ -10843,152 +12137,93 @@ var core_scale = core_element.extend({
},
/**
- * Actually draw the scale on the canvas
- * @param {object} chartArea - the area of the chart to draw full grid lines on
+ * @private
*/
- draw: function(chartArea) {
+ _computeGridLineItems: function(chartArea) {
var me = this;
- var options = me.options;
-
- if (!me._isVisible()) {
- return;
- }
-
var chart = me.chart;
- var context = me.ctx;
- var globalDefaults = core_defaults.global;
- var defaultFontColor = globalDefaults.defaultFontColor;
- var optionTicks = options.ticks.minor;
- var optionMajorTicks = options.ticks.major || optionTicks;
+ var options = me.options;
var gridLines = options.gridLines;
- var scaleLabel = options.scaleLabel;
var position = options.position;
-
- var isRotated = me.labelRotation !== 0;
- var isMirrored = optionTicks.mirror;
+ var offsetGridLines = gridLines.offsetGridLines;
var isHorizontal = me.isHorizontal();
+ var ticks = me._ticksToDraw;
+ var ticksLength = ticks.length + (offsetGridLines ? 1 : 0);
- var parseFont = helpers$1.options._parseFont;
- var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();
- var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor);
- var tickFont = parseFont(optionTicks);
- var lineHeight = tickFont.lineHeight;
- var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor);
- var majorTickFont = parseFont(optionMajorTicks);
- var tickPadding = optionTicks.padding;
- var labelOffset = optionTicks.labelOffset;
-
- var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;
-
- var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor);
- var scaleLabelFont = parseFont(scaleLabel);
- var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);
- var labelRotationRadians = helpers$1.toRadians(me.labelRotation);
-
- var itemsToDraw = [];
-
+ var tl = getTickMarkLength(gridLines);
+ var items = [];
var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
+ var axisHalfWidth = axisWidth / 2;
var alignPixel = helpers$1._alignPixel;
- var borderValue, tickStart, tickEnd;
+ var alignBorderValue = function(pixel) {
+ return alignPixel(chart, pixel, axisWidth);
+ };
+ var borderValue, i, tick, lineValue, alignedLineValue;
+ var tx1, ty1, tx2, ty2, x1, y1, x2, y2, lineWidth, lineColor, borderDash, borderDashOffset;
if (position === 'top') {
- borderValue = alignPixel(chart, me.bottom, axisWidth);
- tickStart = me.bottom - tl;
- tickEnd = borderValue - axisWidth / 2;
+ borderValue = alignBorderValue(me.bottom);
+ ty1 = me.bottom - tl;
+ ty2 = borderValue - axisHalfWidth;
+ y1 = alignBorderValue(chartArea.top) + axisHalfWidth;
+ y2 = chartArea.bottom;
} else if (position === 'bottom') {
- borderValue = alignPixel(chart, me.top, axisWidth);
- tickStart = borderValue + axisWidth / 2;
- tickEnd = me.top + tl;
+ borderValue = alignBorderValue(me.top);
+ y1 = chartArea.top;
+ y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;
+ ty1 = borderValue + axisHalfWidth;
+ ty2 = me.top + tl;
} else if (position === 'left') {
- borderValue = alignPixel(chart, me.right, axisWidth);
- tickStart = me.right - tl;
- tickEnd = borderValue - axisWidth / 2;
+ borderValue = alignBorderValue(me.right);
+ tx1 = me.right - tl;
+ tx2 = borderValue - axisHalfWidth;
+ x1 = alignBorderValue(chartArea.left) + axisHalfWidth;
+ x2 = chartArea.right;
} else {
- borderValue = alignPixel(chart, me.left, axisWidth);
- tickStart = borderValue + axisWidth / 2;
- tickEnd = me.left + tl;
+ borderValue = alignBorderValue(me.left);
+ x1 = chartArea.left;
+ x2 = alignBorderValue(chartArea.right) - axisHalfWidth;
+ tx1 = borderValue + axisHalfWidth;
+ tx2 = me.left + tl;
}
- var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error.
+ for (i = 0; i < ticksLength; ++i) {
+ tick = ticks[i] || {};
- helpers$1.each(ticks, function(tick, index) {
// autoskipper skipped this tick (#4635)
- if (helpers$1.isNullOrUndef(tick.label)) {
- return;
+ if (isNullOrUndef(tick.label) && i < ticks.length) {
+ continue;
}
- var label = tick.label;
- var lineWidth, lineColor, borderDash, borderDashOffset;
- if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {
+ if (i === me.zeroLineIndex && options.offset === offsetGridLines) {
// Draw the first index specially
lineWidth = gridLines.zeroLineWidth;
lineColor = gridLines.zeroLineColor;
borderDash = gridLines.zeroLineBorderDash || [];
borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;
} else {
- lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index);
- lineColor = valueAtIndexOrDefault(gridLines.color, index);
+ lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, i, 1);
+ lineColor = valueAtIndexOrDefault(gridLines.color, i, 'rgba(0,0,0,0.1)');
borderDash = gridLines.borderDash || [];
borderDashOffset = gridLines.borderDashOffset || 0.0;
}
- // Common properties
- var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign;
- var labelCount = helpers$1.isArray(label) ? label.length : 1;
- var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines);
+ lineValue = getPixelForGridLine(me, tick._index || i, offsetGridLines);
- if (isHorizontal) {
- var labelYOffset = tl + tickPadding;
+ // Skip if the pixel is out of the range
+ if (lineValue === undefined) {
+ continue;
+ }
- if (lineValue < me.left - epsilon) {
- lineColor = 'rgba(0,0,0,0)';
- }
+ alignedLineValue = alignPixel(chart, lineValue, lineWidth);
- tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth);
- ty1 = tickStart;
- ty2 = tickEnd;
- labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option)
-
- if (position === 'top') {
- y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2;
- y2 = chartArea.bottom;
- textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight;
- textAlign = !isRotated ? 'center' : 'left';
- labelY = me.bottom - labelYOffset;
- } else {
- y1 = chartArea.top;
- y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2;
- textOffset = (!isRotated ? 0.5 : 0) * lineHeight;
- textAlign = !isRotated ? 'center' : 'right';
- labelY = me.top + labelYOffset;
- }
+ if (isHorizontal) {
+ tx1 = tx2 = x1 = x2 = alignedLineValue;
} else {
- var labelXOffset = (isMirrored ? 0 : tl) + tickPadding;
-
- if (lineValue < me.top - epsilon) {
- lineColor = 'rgba(0,0,0,0)';
- }
-
- tx1 = tickStart;
- tx2 = tickEnd;
- ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth);
- labelY = me.getPixelForTick(index) + labelOffset;
- textOffset = (1 - labelCount) * lineHeight / 2;
-
- if (position === 'left') {
- x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2;
- x2 = chartArea.right;
- textAlign = isMirrored ? 'left' : 'right';
- labelX = me.right - labelXOffset;
- } else {
- x1 = chartArea.left;
- x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2;
- textAlign = isMirrored ? 'right' : 'left';
- labelX = me.left + labelXOffset;
- }
+ ty1 = ty2 = y1 = y2 = alignedLineValue;
}
- itemsToDraw.push({
+ items.push({
tx1: tx1,
ty1: ty1,
tx2: tx2,
@@ -10997,114 +12232,146 @@ var core_scale = core_element.extend({
y1: y1,
x2: x2,
y2: y2,
- labelX: labelX,
- labelY: labelY,
- glWidth: lineWidth,
- glColor: lineColor,
- glBorderDash: borderDash,
- glBorderDashOffset: borderDashOffset,
- rotation: -1 * labelRotationRadians,
+ width: lineWidth,
+ color: lineColor,
+ borderDash: borderDash,
+ borderDashOffset: borderDashOffset,
+ });
+ }
+
+ items.ticksLength = ticksLength;
+ items.borderValue = borderValue;
+
+ return items;
+ },
+
+ /**
+ * @private
+ */
+ _computeLabelItems: function() {
+ var me = this;
+ var options = me.options;
+ var optionTicks = options.ticks;
+ var position = options.position;
+ var isMirrored = optionTicks.mirror;
+ var isHorizontal = me.isHorizontal();
+ var ticks = me._ticksToDraw;
+ var fonts = parseTickFontOptions(optionTicks);
+ var tickPadding = optionTicks.padding;
+ var tl = getTickMarkLength(options.gridLines);
+ var rotation = -helpers$1.toRadians(me.labelRotation);
+ var items = [];
+ var i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;
+
+ if (position === 'top') {
+ y = me.bottom - tl - tickPadding;
+ textAlign = !rotation ? 'center' : 'left';
+ } else if (position === 'bottom') {
+ y = me.top + tl + tickPadding;
+ textAlign = !rotation ? 'center' : 'right';
+ } else if (position === 'left') {
+ x = me.right - (isMirrored ? 0 : tl) - tickPadding;
+ textAlign = isMirrored ? 'left' : 'right';
+ } else {
+ x = me.left + (isMirrored ? 0 : tl) + tickPadding;
+ textAlign = isMirrored ? 'right' : 'left';
+ }
+
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ tick = ticks[i];
+ label = tick.label;
+
+ // autoskipper skipped this tick (#4635)
+ if (isNullOrUndef(label)) {
+ continue;
+ }
+
+ pixel = me.getPixelForTick(tick._index || i) + optionTicks.labelOffset;
+ font = tick.major ? fonts.major : fonts.minor;
+ lineHeight = font.lineHeight;
+ lineCount = isArray(label) ? label.length : 1;
+
+ if (isHorizontal) {
+ x = pixel;
+ textOffset = position === 'top'
+ ? ((!rotation ? 0.5 : 1) - lineCount) * lineHeight
+ : (!rotation ? 0.5 : 0) * lineHeight;
+ } else {
+ y = pixel;
+ textOffset = (1 - lineCount) * lineHeight / 2;
+ }
+
+ items.push({
+ x: x,
+ y: y,
+ rotation: rotation,
label: label,
- major: tick.major,
+ font: font,
textOffset: textOffset,
textAlign: textAlign
});
- });
+ }
+
+ return items;
+ },
+
+ /**
+ * @private
+ */
+ _drawGrid: function(chartArea) {
+ var me = this;
+ var gridLines = me.options.gridLines;
+
+ if (!gridLines.display) {
+ return;
+ }
+
+ var ctx = me.ctx;
+ var chart = me.chart;
+ var alignPixel = helpers$1._alignPixel;
+ var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
+ var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));
+ var width, color, i, ilen, item;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ width = item.width;
+ color = item.color;
- // Draw all of the tick labels, tick marks, and grid lines at the correct places
- helpers$1.each(itemsToDraw, function(itemToDraw) {
- var glWidth = itemToDraw.glWidth;
- var glColor = itemToDraw.glColor;
-
- if (gridLines.display && glWidth && glColor) {
- context.save();
- context.lineWidth = glWidth;
- context.strokeStyle = glColor;
- if (context.setLineDash) {
- context.setLineDash(itemToDraw.glBorderDash);
- context.lineDashOffset = itemToDraw.glBorderDashOffset;
+ if (width && color) {
+ ctx.save();
+ ctx.lineWidth = width;
+ ctx.strokeStyle = color;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(item.borderDash);
+ ctx.lineDashOffset = item.borderDashOffset;
}
- context.beginPath();
+ ctx.beginPath();
if (gridLines.drawTicks) {
- context.moveTo(itemToDraw.tx1, itemToDraw.ty1);
- context.lineTo(itemToDraw.tx2, itemToDraw.ty2);
+ ctx.moveTo(item.tx1, item.ty1);
+ ctx.lineTo(item.tx2, item.ty2);
}
if (gridLines.drawOnChartArea) {
- context.moveTo(itemToDraw.x1, itemToDraw.y1);
- context.lineTo(itemToDraw.x2, itemToDraw.y2);
- }
-
- context.stroke();
- context.restore();
- }
-
- if (optionTicks.display) {
- // Make sure we draw text in the correct color and font
- context.save();
- context.translate(itemToDraw.labelX, itemToDraw.labelY);
- context.rotate(itemToDraw.rotation);
- context.font = itemToDraw.major ? majorTickFont.string : tickFont.string;
- context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;
- context.textBaseline = 'middle';
- context.textAlign = itemToDraw.textAlign;
-
- var label = itemToDraw.label;
- var y = itemToDraw.textOffset;
- if (helpers$1.isArray(label)) {
- for (var i = 0; i < label.length; ++i) {
- // We just make sure the multiline element is a string here..
- context.fillText('' + label[i], 0, y);
- y += lineHeight;
- }
- } else {
- context.fillText(label, 0, y);
+ ctx.moveTo(item.x1, item.y1);
+ ctx.lineTo(item.x2, item.y2);
}
- context.restore();
- }
- });
-
- if (scaleLabel.display) {
- // Draw the scale label
- var scaleLabelX;
- var scaleLabelY;
- var rotation = 0;
- var halfLineHeight = scaleLabelFont.lineHeight / 2;
- if (isHorizontal) {
- scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width
- scaleLabelY = position === 'bottom'
- ? me.bottom - halfLineHeight - scaleLabelPadding.bottom
- : me.top + halfLineHeight + scaleLabelPadding.top;
- } else {
- var isLeft = position === 'left';
- scaleLabelX = isLeft
- ? me.left + halfLineHeight + scaleLabelPadding.top
- : me.right - halfLineHeight - scaleLabelPadding.top;
- scaleLabelY = me.top + ((me.bottom - me.top) / 2);
- rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
+ ctx.stroke();
+ ctx.restore();
}
-
- context.save();
- context.translate(scaleLabelX, scaleLabelY);
- context.rotate(rotation);
- context.textAlign = 'center';
- context.textBaseline = 'middle';
- context.fillStyle = scaleLabelFontColor; // render in correct colour
- context.font = scaleLabelFont.string;
- context.fillText(scaleLabel.labelString, 0, 0);
- context.restore();
}
if (axisWidth) {
// Draw the line at the edge of the axis
var firstLineWidth = axisWidth;
- var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0);
+ var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 1);
+ var borderValue = items.borderValue;
var x1, x2, y1, y2;
- if (isHorizontal) {
+ if (me.isHorizontal()) {
x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;
x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;
y1 = y2 = borderValue;
@@ -11114,59 +12381,214 @@ var core_scale = core_element.extend({
x1 = x2 = borderValue;
}
- context.lineWidth = axisWidth;
- context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);
- context.beginPath();
- context.moveTo(x1, y1);
- context.lineTo(x2, y2);
- context.stroke();
+ ctx.lineWidth = axisWidth;
+ ctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);
+ ctx.beginPath();
+ ctx.moveTo(x1, y1);
+ ctx.lineTo(x2, y2);
+ ctx.stroke();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawLabels: function() {
+ var me = this;
+ var optionTicks = me.options.ticks;
+
+ if (!optionTicks.display) {
+ return;
+ }
+
+ var ctx = me.ctx;
+ var items = me._labelItems || (me._labelItems = me._computeLabelItems());
+ var i, j, ilen, jlen, item, tickFont, label, y;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ tickFont = item.font;
+
+ // Make sure we draw text in the correct color and font
+ ctx.save();
+ ctx.translate(item.x, item.y);
+ ctx.rotate(item.rotation);
+ ctx.font = tickFont.string;
+ ctx.fillStyle = tickFont.color;
+ ctx.textBaseline = 'middle';
+ ctx.textAlign = item.textAlign;
+
+ label = item.label;
+ y = item.textOffset;
+ if (isArray(label)) {
+ for (j = 0, jlen = label.length; j < jlen; ++j) {
+ // We just make sure the multiline element is a string here..
+ ctx.fillText('' + label[j], 0, y);
+ y += tickFont.lineHeight;
+ }
+ } else {
+ ctx.fillText(label, 0, y);
+ }
+ ctx.restore();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawTitle: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var options = me.options;
+ var scaleLabel = options.scaleLabel;
+
+ if (!scaleLabel.display) {
+ return;
+ }
+
+ var scaleLabelFontColor = valueOrDefault$a(scaleLabel.fontColor, core_defaults.global.defaultFontColor);
+ var scaleLabelFont = helpers$1.options._parseFont(scaleLabel);
+ var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);
+ var halfLineHeight = scaleLabelFont.lineHeight / 2;
+ var position = options.position;
+ var rotation = 0;
+ var scaleLabelX, scaleLabelY;
+
+ if (me.isHorizontal()) {
+ scaleLabelX = me.left + me.width / 2; // midpoint of the width
+ scaleLabelY = position === 'bottom'
+ ? me.bottom - halfLineHeight - scaleLabelPadding.bottom
+ : me.top + halfLineHeight + scaleLabelPadding.top;
+ } else {
+ var isLeft = position === 'left';
+ scaleLabelX = isLeft
+ ? me.left + halfLineHeight + scaleLabelPadding.top
+ : me.right - halfLineHeight - scaleLabelPadding.top;
+ scaleLabelY = me.top + me.height / 2;
+ rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
+ }
+
+ ctx.save();
+ ctx.translate(scaleLabelX, scaleLabelY);
+ ctx.rotate(rotation);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+ ctx.fillStyle = scaleLabelFontColor; // render in correct colour
+ ctx.font = scaleLabelFont.string;
+ ctx.fillText(scaleLabel.labelString, 0, 0);
+ ctx.restore();
+ },
+
+ draw: function(chartArea) {
+ var me = this;
+
+ if (!me._isVisible()) {
+ return;
}
+
+ me._drawGrid(chartArea);
+ me._drawTitle();
+ me._drawLabels();
+ },
+
+ /**
+ * @private
+ */
+ _layers: function() {
+ var me = this;
+ var opts = me.options;
+ var tz = opts.ticks && opts.ticks.z || 0;
+ var gz = opts.gridLines && opts.gridLines.z || 0;
+
+ if (!me._isVisible() || tz === gz || me.draw !== me._draw) {
+ // backward compatibility: draw has been overridden by custom scale
+ return [{
+ z: tz,
+ draw: function() {
+ me.draw.apply(me, arguments);
+ }
+ }];
+ }
+
+ return [{
+ z: gz,
+ draw: function() {
+ me._drawGrid.apply(me, arguments);
+ me._drawTitle.apply(me, arguments);
+ }
+ }, {
+ z: tz,
+ draw: function() {
+ me._drawLabels.apply(me, arguments);
+ }
+ }];
+ },
+
+ /**
+ * @private
+ */
+ _getMatchingVisibleMetas: function(type) {
+ var me = this;
+ var isHorizontal = me.isHorizontal();
+ return me.chart._getSortedVisibleDatasetMetas()
+ .filter(function(meta) {
+ return (!type || meta.type === type)
+ && (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);
+ });
}
});
+Scale.prototype._draw = Scale.prototype.draw;
+
+var core_scale = Scale;
+
+var isNullOrUndef$1 = helpers$1.isNullOrUndef;
+
var defaultConfig = {
position: 'bottom'
};
var scale_category = core_scale.extend({
- /**
- * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those
- * else fall back to data.labels
- * @private
- */
- getLabels: function() {
- var data = this.chart.data;
- return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;
- },
-
determineDataLimits: function() {
var me = this;
- var labels = me.getLabels();
- me.minIndex = 0;
- me.maxIndex = labels.length - 1;
+ var labels = me._getLabels();
+ var ticksOpts = me.options.ticks;
+ var min = ticksOpts.min;
+ var max = ticksOpts.max;
+ var minIndex = 0;
+ var maxIndex = labels.length - 1;
var findIndex;
- if (me.options.ticks.min !== undefined) {
+ if (min !== undefined) {
// user specified min value
- findIndex = labels.indexOf(me.options.ticks.min);
- me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;
+ findIndex = labels.indexOf(min);
+ if (findIndex >= 0) {
+ minIndex = findIndex;
+ }
}
- if (me.options.ticks.max !== undefined) {
+ if (max !== undefined) {
// user specified max value
- findIndex = labels.indexOf(me.options.ticks.max);
- me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;
+ findIndex = labels.indexOf(max);
+ if (findIndex >= 0) {
+ maxIndex = findIndex;
+ }
}
- me.min = labels[me.minIndex];
- me.max = labels[me.maxIndex];
+ me.minIndex = minIndex;
+ me.maxIndex = maxIndex;
+ me.min = labels[minIndex];
+ me.max = labels[maxIndex];
},
buildTicks: function() {
var me = this;
- var labels = me.getLabels();
+ var labels = me._getLabels();
+ var minIndex = me.minIndex;
+ var maxIndex = me.maxIndex;
+
// If we are viewing some subset of labels, slice the original array
- me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);
+ me.ticks = (minIndex === 0 && maxIndex === labels.length - 1) ? labels : labels.slice(minIndex, maxIndex + 1);
},
getLabelForIndex: function(index, datasetIndex) {
@@ -11177,74 +12599,66 @@ var scale_category = core_scale.extend({
return me.getRightValue(chart.data.datasets[datasetIndex].data[index]);
}
- return me.ticks[index - me.minIndex];
+ return me._getLabels()[index];
},
- // Used to get data value locations. Value can either be an index or a numerical value
- getPixelForValue: function(value, index) {
+ _configure: function() {
var me = this;
var offset = me.options.offset;
- // 1 is added because we need the length but we have the indexes
- var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);
+ var ticks = me.ticks;
- // If value is a data object, then index is the index in the data array,
- // not the index of the scale. We need to change that.
- var valueCategory;
- if (value !== undefined && value !== null) {
- valueCategory = me.isHorizontal() ? value.x : value.y;
+ core_scale.prototype._configure.call(me);
+
+ if (!me.isHorizontal()) {
+ // For backward compatibility, vertical category scale reverse is inverted.
+ me._reversePixels = !me._reversePixels;
}
- if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
- var labels = me.getLabels();
- value = valueCategory || value;
- var idx = labels.indexOf(value);
- index = idx !== -1 ? idx : index;
+
+ if (!ticks) {
+ return;
}
- if (me.isHorizontal()) {
- var valueWidth = me.width / offsetAmt;
- var widthOffset = (valueWidth * (index - me.minIndex));
+ me._startValue = me.minIndex - (offset ? 0.5 : 0);
+ me._valueRange = Math.max(ticks.length - (offset ? 0 : 1), 1);
+ },
- if (offset) {
- widthOffset += (valueWidth / 2);
- }
+ // Used to get data value locations. Value can either be an index or a numerical value
+ getPixelForValue: function(value, index, datasetIndex) {
+ var me = this;
+ var valueCategory, labels, idx;
- return me.left + widthOffset;
+ if (!isNullOrUndef$1(index) && !isNullOrUndef$1(datasetIndex)) {
+ value = me.chart.data.datasets[datasetIndex].data[index];
}
- var valueHeight = me.height / offsetAmt;
- var heightOffset = (valueHeight * (index - me.minIndex));
- if (offset) {
- heightOffset += (valueHeight / 2);
+ // If value is a data object, then index is the index in the data array,
+ // not the index of the scale. We need to change that.
+ if (!isNullOrUndef$1(value)) {
+ valueCategory = me.isHorizontal() ? value.x : value.y;
}
-
- return me.top + heightOffset;
+ if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
+ labels = me._getLabels();
+ value = helpers$1.valueOrDefault(valueCategory, value);
+ idx = labels.indexOf(value);
+ index = idx !== -1 ? idx : index;
+ if (isNaN(index)) {
+ index = value;
+ }
+ }
+ return me.getPixelForDecimal((index - me._startValue) / me._valueRange);
},
getPixelForTick: function(index) {
- return this.getPixelForValue(this.ticks[index], index + this.minIndex, null);
+ var ticks = this.ticks;
+ return index < 0 || index > ticks.length - 1
+ ? null
+ : this.getPixelForValue(ticks[index], index + this.minIndex);
},
getValueForPixel: function(pixel) {
var me = this;
- var offset = me.options.offset;
- var value;
- var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);
- var horz = me.isHorizontal();
- var valueDimension = (horz ? me.width : me.height) / offsetAmt;
-
- pixel -= horz ? me.left : me.top;
-
- if (offset) {
- pixel -= (valueDimension / 2);
- }
-
- if (pixel <= 0) {
- value = 0;
- } else {
- value = Math.round(pixel / valueDimension);
- }
-
- return value + me.minIndex;
+ var value = Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);
+ return Math.min(Math.max(value, 0), me.ticks.length - 1);
},
getBasePixel: function() {
@@ -11257,7 +12671,7 @@ var _defaults = defaultConfig;
scale_category._defaults = _defaults;
var noop = helpers$1.noop;
-var isNullOrUndef = helpers$1.isNullOrUndef;
+var isNullOrUndef$2 = helpers$1.isNullOrUndef;
/**
* Generate a set of linear ticks
@@ -11285,7 +12699,7 @@ function generateTicks(generationOptions, dataRange) {
// Beyond MIN_SPACING floating point numbers being to lose precision
// such that we can't do the math necessary to generate ticks
- if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) {
+ if (spacing < MIN_SPACING && isNullOrUndef$2(min) && isNullOrUndef$2(max)) {
return [rmin, rmax];
}
@@ -11295,7 +12709,7 @@ function generateTicks(generationOptions, dataRange) {
spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;
}
- if (stepSize || isNullOrUndef(precision)) {
+ if (stepSize || isNullOrUndef$2(precision)) {
// If a precision is not specified, calculate factor based on spacing
factor = Math.pow(10, helpers$1._decimalPlaces(spacing));
} else {
@@ -11310,10 +12724,10 @@ function generateTicks(generationOptions, dataRange) {
// If min, max and stepSize is set and they make an evenly spaced scale use it.
if (stepSize) {
// If very close to our whole number, use it.
- if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {
+ if (!isNullOrUndef$2(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {
niceMin = min;
}
- if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {
+ if (!isNullOrUndef$2(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {
niceMax = max;
}
}
@@ -11328,11 +12742,11 @@ function generateTicks(generationOptions, dataRange) {
niceMin = Math.round(niceMin * factor) / factor;
niceMax = Math.round(niceMax * factor) / factor;
- ticks.push(isNullOrUndef(min) ? niceMin : min);
+ ticks.push(isNullOrUndef$2(min) ? niceMin : min);
for (var j = 1; j < numSpaces; ++j) {
ticks.push(Math.round((niceMin + j * spacing) * factor) / factor);
}
- ticks.push(isNullOrUndef(max) ? niceMax : max);
+ ticks.push(isNullOrUndef$2(max) ? niceMax : max);
return ticks;
}
@@ -11484,6 +12898,25 @@ var scale_linearbase = core_scale.extend({
me.zeroLineIndex = me.ticks.indexOf(0);
core_scale.prototype.convertTicksToLabels.call(me);
+ },
+
+ _configure: function() {
+ var me = this;
+ var ticks = me.getTicks();
+ var start = me.min;
+ var end = me.max;
+ var offset;
+
+ core_scale.prototype._configure.call(me);
+
+ if (me.options.offset && ticks.length) {
+ offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;
+ start -= offset;
+ end += offset;
+ }
+ me._startValue = start;
+ me._endValue = end;
+ me._valueRange = end - start;
}
});
@@ -11494,123 +12927,113 @@ var defaultConfig$1 = {
}
};
-var scale_linear = scale_linearbase.extend({
- determineDataLimits: function() {
- var me = this;
- var opts = me.options;
- var chart = me.chart;
- var data = chart.data;
- var datasets = data.datasets;
- var isHorizontal = me.isHorizontal();
- var DEFAULT_MIN = 0;
- var DEFAULT_MAX = 1;
-
- function IDMatches(meta) {
- return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
- }
-
- // First Calculate the range
- me.min = null;
- me.max = null;
+var DEFAULT_MIN = 0;
+var DEFAULT_MAX = 1;
+
+function getOrCreateStack(stacks, stacked, meta) {
+ var key = [
+ meta.type,
+ // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
+ stacked === undefined && meta.stack === undefined ? meta.index : '',
+ meta.stack
+ ].join('.');
+
+ if (stacks[key] === undefined) {
+ stacks[key] = {
+ pos: [],
+ neg: []
+ };
+ }
- var hasStacks = opts.stacked;
- if (hasStacks === undefined) {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- if (hasStacks) {
- return;
- }
+ return stacks[key];
+}
- var meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&
- meta.stack !== undefined) {
- hasStacks = true;
- }
- });
+function stackData(scale, stacks, meta, data) {
+ var opts = scale.options;
+ var stacked = opts.stacked;
+ var stack = getOrCreateStack(stacks, stacked, meta);
+ var pos = stack.pos;
+ var neg = stack.neg;
+ var ilen = data.length;
+ var i, value;
+
+ for (i = 0; i < ilen; ++i) {
+ value = scale._parseValue(data[i]);
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
+ continue;
}
- if (opts.stacked || hasStacks) {
- var valuesPerStack = {};
-
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
- var key = [
- meta.type,
- // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
- ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),
- meta.stack
- ].join('.');
-
- if (valuesPerStack[key] === undefined) {
- valuesPerStack[key] = {
- positiveValues: [],
- negativeValues: []
- };
- }
+ pos[i] = pos[i] || 0;
+ neg[i] = neg[i] || 0;
- // Store these per type
- var positiveValues = valuesPerStack[key].positiveValues;
- var negativeValues = valuesPerStack[key].negativeValues;
+ if (opts.relativePoints) {
+ pos[i] = 100;
+ } else if (value.min < 0 || value.max < 0) {
+ neg[i] += value.min;
+ } else {
+ pos[i] += value.max;
+ }
+ }
+}
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
+function updateMinMax(scale, meta, data) {
+ var ilen = data.length;
+ var i, value;
- positiveValues[index] = positiveValues[index] || 0;
- negativeValues[index] = negativeValues[index] || 0;
+ for (i = 0; i < ilen; ++i) {
+ value = scale._parseValue(data[i]);
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
+ continue;
+ }
- if (opts.relativePoints) {
- positiveValues[index] = 100;
- } else if (value < 0) {
- negativeValues[index] += value;
- } else {
- positiveValues[index] += value;
- }
- });
- }
- });
+ scale.min = Math.min(scale.min, value.min);
+ scale.max = Math.max(scale.max, value.max);
+ }
+}
- helpers$1.each(valuesPerStack, function(valuesForType) {
- var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);
- var minVal = helpers$1.min(values);
- var maxVal = helpers$1.max(values);
- me.min = me.min === null ? minVal : Math.min(me.min, minVal);
- me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);
- });
+var scale_linear = scale_linearbase.extend({
+ determineDataLimits: function() {
+ var me = this;
+ var opts = me.options;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var metasets = me._getMatchingVisibleMetas();
+ var hasStacks = opts.stacked;
+ var stacks = {};
+ var ilen = metasets.length;
+ var i, meta, data, values;
- } else {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
+ me.min = Number.POSITIVE_INFINITY;
+ me.max = Number.NEGATIVE_INFINITY;
- if (me.min === null) {
- me.min = value;
- } else if (value < me.min) {
- me.min = value;
- }
+ if (hasStacks === undefined) {
+ for (i = 0; !hasStacks && i < ilen; ++i) {
+ meta = metasets[i];
+ hasStacks = meta.stack !== undefined;
+ }
+ }
- if (me.max === null) {
- me.max = value;
- } else if (value > me.max) {
- me.max = value;
- }
- });
- }
- });
+ for (i = 0; i < ilen; ++i) {
+ meta = metasets[i];
+ data = datasets[meta.index].data;
+ if (hasStacks) {
+ stackData(me, stacks, meta, data);
+ } else {
+ updateMinMax(me, meta, data);
+ }
}
- me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;
- me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;
+ helpers$1.each(stacks, function(stackValues) {
+ values = stackValues.pos.concat(stackValues.neg);
+ me.min = Math.min(me.min, helpers$1.min(values));
+ me.max = Math.max(me.max, helpers$1.max(values));
+ });
+
+ me.min = helpers$1.isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;
+ me.max = helpers$1.isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;
// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero
- this.handleTickRangeOptions();
+ me.handleTickRangeOptions();
},
// Returns the maximum number of ticks based on the scale dimension
@@ -11634,38 +13057,25 @@ var scale_linear = scale_linearbase.extend({
},
getLabelForIndex: function(index, datasetIndex) {
- return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
+ return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
},
// Utils
getPixelForValue: function(value) {
- // This must be called after fit has been run so that
- // this.left, this.top, this.right, and this.bottom have been defined
var me = this;
- var start = me.start;
-
- var rightValue = +me.getRightValue(value);
- var pixel;
- var range = me.end - start;
-
- if (me.isHorizontal()) {
- pixel = me.left + (me.width / range * (rightValue - start));
- } else {
- pixel = me.bottom - (me.height / range * (rightValue - start));
- }
- return pixel;
+ return me.getPixelForDecimal((+me.getRightValue(value) - me._startValue) / me._valueRange);
},
getValueForPixel: function(pixel) {
- var me = this;
- var isHorizontal = me.isHorizontal();
- var innerDimension = isHorizontal ? me.width : me.height;
- var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;
- return me.start + ((me.end - me.start) * offset);
+ return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;
},
getPixelForTick: function(index) {
- return this.getPixelForValue(this.ticksAsNumbers[index]);
+ var ticks = this.ticksAsNumbers;
+ if (index < 0 || index > ticks.length - 1) {
+ return null;
+ }
+ return this.getPixelForValue(ticks[index]);
}
});
@@ -11673,7 +13083,8 @@ var scale_linear = scale_linearbase.extend({
var _defaults$1 = defaultConfig$1;
scale_linear._defaults = _defaults$1;
-var valueOrDefault$a = helpers$1.valueOrDefault;
+var valueOrDefault$b = helpers$1.valueOrDefault;
+var log10 = helpers$1.math.log10;
/**
* Generate a set of logarithmic ticks
@@ -11684,20 +13095,20 @@ var valueOrDefault$a = helpers$1.valueOrDefault;
function generateTicks$1(generationOptions, dataRange) {
var ticks = [];
- var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min))));
+ var tickVal = valueOrDefault$b(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));
- var endExp = Math.floor(helpers$1.log10(dataRange.max));
+ var endExp = Math.floor(log10(dataRange.max));
var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));
var exp, significand;
if (tickVal === 0) {
- exp = Math.floor(helpers$1.log10(dataRange.minNotZero));
+ exp = Math.floor(log10(dataRange.minNotZero));
significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));
ticks.push(tickVal);
tickVal = significand * Math.pow(10, exp);
} else {
- exp = Math.floor(helpers$1.log10(tickVal));
+ exp = Math.floor(log10(tickVal));
significand = Math.floor(tickVal / Math.pow(10, exp));
}
var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;
@@ -11715,7 +13126,7 @@ function generateTicks$1(generationOptions, dataRange) {
tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;
} while (exp < endExp || (exp === endExp && significand < endSignificand));
- var lastTick = valueOrDefault$a(generationOptions.max, tickVal);
+ var lastTick = valueOrDefault$b(generationOptions.max, tickVal);
ticks.push(lastTick);
return ticks;
@@ -11740,38 +13151,35 @@ var scale_logarithmic = core_scale.extend({
var me = this;
var opts = me.options;
var chart = me.chart;
- var data = chart.data;
- var datasets = data.datasets;
+ var datasets = chart.data.datasets;
var isHorizontal = me.isHorizontal();
function IDMatches(meta) {
return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
}
+ var datasetIndex, meta, value, data, i, ilen;
// Calculate Range
- me.min = null;
- me.max = null;
- me.minNotZero = null;
+ me.min = Number.POSITIVE_INFINITY;
+ me.max = Number.NEGATIVE_INFINITY;
+ me.minNotZero = Number.POSITIVE_INFINITY;
var hasStacks = opts.stacked;
if (hasStacks === undefined) {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- if (hasStacks) {
- return;
- }
-
- var meta = chart.getDatasetMeta(datasetIndex);
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&
meta.stack !== undefined) {
hasStacks = true;
+ break;
}
- });
+ }
}
if (opts.stacked || hasStacks) {
var valuesPerStack = {};
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
var key = [
meta.type,
// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
@@ -11784,59 +13192,56 @@ var scale_logarithmic = core_scale.extend({
valuesPerStack[key] = [];
}
- helpers$1.each(dataset.data, function(rawValue, index) {
+ data = datasets[datasetIndex].data;
+ for (i = 0, ilen = data.length; i < ilen; i++) {
var values = valuesPerStack[key];
- var value = +me.getRightValue(rawValue);
+ value = me._parseValue(data[i]);
// invalid, hidden and negative values are ignored
- if (isNaN(value) || meta.data[index].hidden || value < 0) {
- return;
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
+ continue;
}
- values[index] = values[index] || 0;
- values[index] += value;
- });
+ values[i] = values[i] || 0;
+ values[i] += value.max;
+ }
}
- });
+ }
helpers$1.each(valuesPerStack, function(valuesForType) {
if (valuesForType.length > 0) {
var minVal = helpers$1.min(valuesForType);
var maxVal = helpers$1.max(valuesForType);
- me.min = me.min === null ? minVal : Math.min(me.min, minVal);
- me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);
+ me.min = Math.min(me.min, minVal);
+ me.max = Math.max(me.max, maxVal);
}
});
} else {
- helpers$1.each(datasets, function(dataset, datasetIndex) {
- var meta = chart.getDatasetMeta(datasetIndex);
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
+ data = datasets[datasetIndex].data;
+ for (i = 0, ilen = data.length; i < ilen; i++) {
+ value = me._parseValue(data[i]);
// invalid, hidden and negative values are ignored
- if (isNaN(value) || meta.data[index].hidden || value < 0) {
- return;
- }
-
- if (me.min === null) {
- me.min = value;
- } else if (value < me.min) {
- me.min = value;
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
+ continue;
}
- if (me.max === null) {
- me.max = value;
- } else if (value > me.max) {
- me.max = value;
- }
+ me.min = Math.min(value.min, me.min);
+ me.max = Math.max(value.max, me.max);
- if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {
- me.minNotZero = value;
+ if (value.min !== 0) {
+ me.minNotZero = Math.min(value.min, me.minNotZero);
}
- });
+ }
}
- });
+ }
}
+ me.min = helpers$1.isFinite(me.min) ? me.min : null;
+ me.max = helpers$1.isFinite(me.max) ? me.max : null;
+ me.minNotZero = helpers$1.isFinite(me.minNotZero) ? me.minNotZero : null;
+
// Common base implementation to handle ticks.min, ticks.max
this.handleTickRangeOptions();
},
@@ -11852,26 +13257,26 @@ var scale_logarithmic = core_scale.extend({
if (me.min === me.max) {
if (me.min !== 0 && me.min !== null) {
- me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1);
- me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1);
+ me.min = Math.pow(10, Math.floor(log10(me.min)) - 1);
+ me.max = Math.pow(10, Math.floor(log10(me.max)) + 1);
} else {
me.min = DEFAULT_MIN;
me.max = DEFAULT_MAX;
}
}
if (me.min === null) {
- me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1);
+ me.min = Math.pow(10, Math.floor(log10(me.max)) - 1);
}
if (me.max === null) {
me.max = me.min !== 0
- ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1)
+ ? Math.pow(10, Math.floor(log10(me.min)) + 1)
: DEFAULT_MAX;
}
if (me.minNotZero === null) {
if (me.min > 0) {
me.minNotZero = me.min;
} else if (me.max < 1) {
- me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max)));
+ me.minNotZero = Math.pow(10, Math.floor(log10(me.max)));
} else {
me.minNotZero = DEFAULT_MIN;
}
@@ -11915,11 +13320,15 @@ var scale_logarithmic = core_scale.extend({
// Get the correct tooltip label
getLabelForIndex: function(index, datasetIndex) {
- return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
+ return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
},
getPixelForTick: function(index) {
- return this.getPixelForValue(this.tickValues[index]);
+ var ticks = this.tickValues;
+ if (index < 0 || index > ticks.length - 1) {
+ return null;
+ }
+ return this.getPixelForValue(ticks[index]);
},
/**
@@ -11929,87 +13338,47 @@ var scale_logarithmic = core_scale.extend({
* @private
*/
_getFirstTickValue: function(value) {
- var exp = Math.floor(helpers$1.log10(value));
+ var exp = Math.floor(log10(value));
var significand = Math.floor(value / Math.pow(10, exp));
return significand * Math.pow(10, exp);
},
- getPixelForValue: function(value) {
+ _configure: function() {
var me = this;
- var tickOpts = me.options.ticks;
- var reverse = tickOpts.reverse;
- var log10 = helpers$1.log10;
- var firstTickValue = me._getFirstTickValue(me.minNotZero);
+ var start = me.min;
var offset = 0;
- var innerDimension, pixel, start, end, sign;
- value = +me.getRightValue(value);
- if (reverse) {
- start = me.end;
- end = me.start;
- sign = -1;
- } else {
- start = me.start;
- end = me.end;
- sign = 1;
- }
- if (me.isHorizontal()) {
- innerDimension = me.width;
- pixel = reverse ? me.right : me.left;
- } else {
- innerDimension = me.height;
- sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)
- pixel = reverse ? me.top : me.bottom;
- }
- if (value !== start) {
- if (start === 0) { // include zero tick
- offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);
- innerDimension -= offset;
- start = firstTickValue;
- }
- if (value !== 0) {
- offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));
- }
- pixel += sign * offset;
+ core_scale.prototype._configure.call(me);
+
+ if (start === 0) {
+ start = me._getFirstTickValue(me.minNotZero);
+ offset = valueOrDefault$b(me.options.ticks.fontSize, core_defaults.global.defaultFontSize) / me._length;
}
- return pixel;
+
+ me._startValue = log10(start);
+ me._valueOffset = offset;
+ me._valueRange = (log10(me.max) - log10(start)) / (1 - offset);
},
- getValueForPixel: function(pixel) {
+ getPixelForValue: function(value) {
var me = this;
- var tickOpts = me.options.ticks;
- var reverse = tickOpts.reverse;
- var log10 = helpers$1.log10;
- var firstTickValue = me._getFirstTickValue(me.minNotZero);
- var innerDimension, start, end, value;
+ var decimal = 0;
- if (reverse) {
- start = me.end;
- end = me.start;
- } else {
- start = me.start;
- end = me.end;
- }
- if (me.isHorizontal()) {
- innerDimension = me.width;
- value = reverse ? me.right - pixel : pixel - me.left;
- } else {
- innerDimension = me.height;
- value = reverse ? pixel - me.top : me.bottom - pixel;
- }
- if (value !== start) {
- if (start === 0) { // include zero tick
- var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize);
- value -= offset;
- innerDimension -= offset;
- start = firstTickValue;
- }
- value *= log10(end) - log10(start);
- value /= innerDimension;
- value = Math.pow(10, log10(start) + value);
+ value = +me.getRightValue(value);
+
+ if (value > me.min && value > 0) {
+ decimal = (log10(value) - me._startValue) / me._valueRange + me._valueOffset;
}
- return value;
+ return me.getPixelForDecimal(decimal);
+ },
+
+ getValueForPixel: function(pixel) {
+ var me = this;
+ var decimal = me.getDecimalForPixel(pixel);
+ return decimal === 0 && me.min === 0
+ ? 0
+ : Math.pow(10, me._startValue + (decimal - me._valueOffset) * me._valueRange);
}
});
@@ -12017,9 +13386,9 @@ var scale_logarithmic = core_scale.extend({
var _defaults$2 = defaultConfig$2;
scale_logarithmic._defaults = _defaults$2;
-var valueOrDefault$b = helpers$1.valueOrDefault;
+var valueOrDefault$c = helpers$1.valueOrDefault;
var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;
-var resolve$7 = helpers$1.options.resolve;
+var resolve$4 = helpers$1.options.resolve;
var defaultConfig$3 = {
display: true,
@@ -12030,7 +13399,7 @@ var defaultConfig$3 = {
angleLines: {
display: true,
- color: 'rgba(0, 0, 0, 0.1)',
+ color: 'rgba(0,0,0,0.1)',
lineWidth: 1,
borderDash: [],
borderDashOffset: 0.0
@@ -12071,16 +13440,11 @@ var defaultConfig$3 = {
}
};
-function getValueCount(scale) {
- var opts = scale.options;
- return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;
-}
-
function getTickBackdropHeight(opts) {
var tickOpts = opts.ticks;
if (tickOpts.display && opts.display) {
- return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;
+ return valueOrDefault$c(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;
}
return 0;
}
@@ -12165,10 +13529,10 @@ function fitWithPointLabels(scale) {
scale.ctx.font = plFont.string;
scale._pointLabelSizes = [];
- var valueCount = getValueCount(scale);
+ var valueCount = scale.chart.data.labels.length;
for (i = 0; i < valueCount; i++) {
pointPosition = scale.getPointPosition(i, scale.drawingArea + 5);
- textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || '');
+ textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i]);
scale._pointLabelSizes[i] = textSize;
// Add quarter circle to make degree 0 mean top of circle
@@ -12236,53 +13600,30 @@ function adjustPointPositionForLabelHeight(angle, textSize, position) {
function drawPointLabels(scale) {
var ctx = scale.ctx;
var opts = scale.options;
- var angleLineOpts = opts.angleLines;
- var gridLineOpts = opts.gridLines;
var pointLabelOpts = opts.pointLabels;
- var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth);
- var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color);
var tickBackdropHeight = getTickBackdropHeight(opts);
-
- ctx.save();
- ctx.lineWidth = lineWidth;
- ctx.strokeStyle = lineColor;
- if (ctx.setLineDash) {
- ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));
- ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);
- }
-
var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);
-
- // Point Label Font
var plFont = helpers$1.options._parseFont(pointLabelOpts);
+ ctx.save();
+
ctx.font = plFont.string;
ctx.textBaseline = 'middle';
- for (var i = getValueCount(scale) - 1; i >= 0; i--) {
- if (angleLineOpts.display && lineWidth && lineColor) {
- var outerPosition = scale.getPointPosition(i, outerDistance);
- ctx.beginPath();
- ctx.moveTo(scale.xCenter, scale.yCenter);
- ctx.lineTo(outerPosition.x, outerPosition.y);
- ctx.stroke();
- }
-
- if (pointLabelOpts.display) {
- // Extra pixels out for some label spacing
- var extra = (i === 0 ? tickBackdropHeight / 2 : 0);
- var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);
+ for (var i = scale.chart.data.labels.length - 1; i >= 0; i--) {
+ // Extra pixels out for some label spacing
+ var extra = (i === 0 ? tickBackdropHeight / 2 : 0);
+ var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);
- // Keep this in loop since we may support array properties here
- var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);
- ctx.fillStyle = pointLabelFontColor;
+ // Keep this in loop since we may support array properties here
+ var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);
+ ctx.fillStyle = pointLabelFontColor;
- var angleRadians = scale.getIndexAngle(i);
- var angle = helpers$1.toDegrees(angleRadians);
- ctx.textAlign = getTextAlignForAngle(angle);
- adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);
- fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight);
- }
+ var angleRadians = scale.getIndexAngle(i);
+ var angle = helpers$1.toDegrees(angleRadians);
+ ctx.textAlign = getTextAlignForAngle(angle);
+ adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);
+ fillText(ctx, scale.pointLabels[i], pointLabelPosition, plFont.lineHeight);
}
ctx.restore();
}
@@ -12290,7 +13631,7 @@ function drawPointLabels(scale) {
function drawRadiusLine(scale, gridLineOpts, radius, index) {
var ctx = scale.ctx;
var circular = gridLineOpts.circular;
- var valueCount = getValueCount(scale);
+ var valueCount = scale.chart.data.labels.length;
var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);
var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);
var pointPosition;
@@ -12383,7 +13724,10 @@ var scale_radialLinear = scale_linearbase.extend({
scale_linearbase.prototype.convertTicksToLabels.call(me);
// Point labels
- me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);
+ me.pointLabels = me.chart.data.labels.map(function() {
+ var label = helpers$1.callback(me.options.pointLabels.callback, arguments, me);
+ return label || label === 0 ? label : '';
+ });
},
getLabelForIndex: function(index, datasetIndex) {
@@ -12435,22 +13779,22 @@ var scale_radialLinear = scale_linearbase.extend({
},
getIndexAngle: function(index) {
- var angleMultiplier = (Math.PI * 2) / getValueCount(this);
- var startAngle = this.chart.options && this.chart.options.startAngle ?
- this.chart.options.startAngle :
- 0;
-
- var startAngleRadians = startAngle * Math.PI * 2 / 360;
+ var chart = this.chart;
+ var angleMultiplier = 360 / chart.data.labels.length;
+ var options = chart.options || {};
+ var startAngle = options.startAngle || 0;
// Start from the top instead of right, so remove a quarter of the circle
- return index * angleMultiplier + startAngleRadians;
+ var angle = (index * angleMultiplier + startAngle) % 360;
+
+ return (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360;
},
getDistanceFromCenterForValue: function(value) {
var me = this;
- if (value === null) {
- return 0; // null always in center
+ if (helpers$1.isNullOrUndef(value)) {
+ return NaN;
}
// Take into account half font size + the yPadding of the top value
@@ -12474,79 +13818,130 @@ var scale_radialLinear = scale_linearbase.extend({
return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));
},
- getBasePosition: function() {
+ getBasePosition: function(index) {
var me = this;
var min = me.min;
var max = me.max;
- return me.getPointPositionForValue(0,
+ return me.getPointPositionForValue(index || 0,
me.beginAtZero ? 0 :
min < 0 && max < 0 ? max :
min > 0 && max > 0 ? min :
0);
},
- draw: function() {
+ /**
+ * @private
+ */
+ _drawGrid: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var opts = me.options;
+ var gridLineOpts = opts.gridLines;
+ var angleLineOpts = opts.angleLines;
+ var lineWidth = valueOrDefault$c(angleLineOpts.lineWidth, gridLineOpts.lineWidth);
+ var lineColor = valueOrDefault$c(angleLineOpts.color, gridLineOpts.color);
+ var i, offset, position;
+
+ if (opts.pointLabels.display) {
+ drawPointLabels(me);
+ }
+
+ if (gridLineOpts.display) {
+ helpers$1.each(me.ticks, function(label, index) {
+ if (index !== 0) {
+ offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
+ drawRadiusLine(me, gridLineOpts, offset, index);
+ }
+ });
+ }
+
+ if (angleLineOpts.display && lineWidth && lineColor) {
+ ctx.save();
+ ctx.lineWidth = lineWidth;
+ ctx.strokeStyle = lineColor;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(resolve$4([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));
+ ctx.lineDashOffset = resolve$4([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);
+ }
+
+ for (i = me.chart.data.labels.length - 1; i >= 0; i--) {
+ offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);
+ position = me.getPointPosition(i, offset);
+ ctx.beginPath();
+ ctx.moveTo(me.xCenter, me.yCenter);
+ ctx.lineTo(position.x, position.y);
+ ctx.stroke();
+ }
+
+ ctx.restore();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawLabels: function() {
var me = this;
+ var ctx = me.ctx;
var opts = me.options;
- var gridLineOpts = opts.gridLines;
var tickOpts = opts.ticks;
- if (opts.display) {
- var ctx = me.ctx;
- var startAngle = this.getIndexAngle(0);
- var tickFont = helpers$1.options._parseFont(tickOpts);
+ if (!tickOpts.display) {
+ return;
+ }
+
+ var startAngle = me.getIndexAngle(0);
+ var tickFont = helpers$1.options._parseFont(tickOpts);
+ var tickFontColor = valueOrDefault$c(tickOpts.fontColor, core_defaults.global.defaultFontColor);
+ var offset, width;
- if (opts.angleLines.display || opts.pointLabels.display) {
- drawPointLabels(me);
+ ctx.save();
+ ctx.font = tickFont.string;
+ ctx.translate(me.xCenter, me.yCenter);
+ ctx.rotate(startAngle);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+
+ helpers$1.each(me.ticks, function(label, index) {
+ if (index === 0 && !tickOpts.reverse) {
+ return;
}
- helpers$1.each(me.ticks, function(label, index) {
- // Don't draw a centre value (if it is minimum)
- if (index > 0 || tickOpts.reverse) {
- var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
+ offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
- // Draw circular lines around the scale
- if (gridLineOpts.display && index !== 0) {
- drawRadiusLine(me, gridLineOpts, yCenterOffset, index);
- }
+ if (tickOpts.showLabelBackdrop) {
+ width = ctx.measureText(label).width;
+ ctx.fillStyle = tickOpts.backdropColor;
- if (tickOpts.display) {
- var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor);
- ctx.font = tickFont.string;
-
- ctx.save();
- ctx.translate(me.xCenter, me.yCenter);
- ctx.rotate(startAngle);
-
- if (tickOpts.showLabelBackdrop) {
- var labelWidth = ctx.measureText(label).width;
- ctx.fillStyle = tickOpts.backdropColor;
- ctx.fillRect(
- -labelWidth / 2 - tickOpts.backdropPaddingX,
- -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY,
- labelWidth + tickOpts.backdropPaddingX * 2,
- tickFont.size + tickOpts.backdropPaddingY * 2
- );
- }
+ ctx.fillRect(
+ -width / 2 - tickOpts.backdropPaddingX,
+ -offset - tickFont.size / 2 - tickOpts.backdropPaddingY,
+ width + tickOpts.backdropPaddingX * 2,
+ tickFont.size + tickOpts.backdropPaddingY * 2
+ );
+ }
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
- ctx.fillStyle = tickFontColor;
- ctx.fillText(label, 0, -yCenterOffset);
- ctx.restore();
- }
- }
- });
- }
- }
+ ctx.fillStyle = tickFontColor;
+ ctx.fillText(label, 0, -offset);
+ });
+
+ ctx.restore();
+ },
+
+ /**
+ * @private
+ */
+ _drawTitle: helpers$1.noop
});
// INTERNAL: static default options, registered in src/index.js
var _defaults$3 = defaultConfig$3;
scale_radialLinear._defaults = _defaults$3;
-var valueOrDefault$c = helpers$1.valueOrDefault;
+var deprecated$1 = helpers$1._deprecated;
+var resolve$5 = helpers$1.options.resolve;
+var valueOrDefault$d = helpers$1.valueOrDefault;
// Integer constants are from the ES6 spec.
var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
@@ -12556,42 +13951,42 @@ var INTERVALS = {
millisecond: {
common: true,
size: 1,
- steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]
+ steps: 1000
},
second: {
common: true,
size: 1000,
- steps: [1, 2, 5, 10, 15, 30]
+ steps: 60
},
minute: {
common: true,
size: 60000,
- steps: [1, 2, 5, 10, 15, 30]
+ steps: 60
},
hour: {
common: true,
size: 3600000,
- steps: [1, 2, 3, 6, 12]
+ steps: 24
},
day: {
common: true,
size: 86400000,
- steps: [1, 2, 5]
+ steps: 30
},
week: {
common: false,
size: 604800000,
- steps: [1, 2, 3, 4]
+ steps: 4
},
month: {
common: true,
size: 2.628e9,
- steps: [1, 2, 3]
+ steps: 12
},
quarter: {
common: false,
size: 7.884e9,
- steps: [1, 2, 3, 4]
+ steps: 4
},
year: {
common: true,
@@ -12621,6 +14016,14 @@ function arrayUnique(items) {
return out;
}
+function getMin(options) {
+ return helpers$1.valueOrDefault(options.time.min, options.ticks.min);
+}
+
+function getMax(options) {
+ return helpers$1.valueOrDefault(options.time.max, options.ticks.max);
+}
+
/**
* Returns an array of {time, pos} objects used to interpolate a specific `time` or position
* (`pos`) on the scale, by searching entries before and after the requested value. `pos` is
@@ -12772,31 +14175,6 @@ function parse(scale, input) {
return value;
}
-/**
- * Returns the number of unit to skip to be able to display up to `capacity` number of ticks
- * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.
- */
-function determineStepSize(min, max, unit, capacity) {
- var range = max - min;
- var interval = INTERVALS[unit];
- var milliseconds = interval.size;
- var steps = interval.steps;
- var i, ilen, factor;
-
- if (!steps) {
- return Math.ceil(range / (capacity * milliseconds));
- }
-
- for (i = 0, ilen = steps.length; i < ilen; ++i) {
- factor = steps[i];
- if (Math.ceil(range / (milliseconds * factor)) <= capacity) {
- break;
- }
- }
-
- return factor;
-}
-
/**
* Figures out what unit results in an appropriate number of auto-generated ticks
*/
@@ -12806,7 +14184,7 @@ function determineUnitForAutoTicks(minUnit, min, max, capacity) {
for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {
interval = INTERVALS[UNITS[i]];
- factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;
+ factor = interval.steps ? interval.steps : MAX_INTEGER;
if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {
return UNITS[i];
@@ -12819,13 +14197,12 @@ function determineUnitForAutoTicks(minUnit, min, max, capacity) {
/**
* Figures out what unit to format a set of ticks with
*/
-function determineUnitForFormatting(scale, ticks, minUnit, min, max) {
- var ilen = UNITS.length;
+function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {
var i, unit;
- for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {
+ for (i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {
unit = UNITS[i];
- if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) {
+ if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {
return unit;
}
}
@@ -12843,7 +14220,7 @@ function determineMajorUnit(unit) {
/**
* Generates a maximum of `capacity` timestamps between min and max, rounded to the
- * `minor` unit, aligned on the `major` unit and using the given scale time `options`.
+ * `minor` unit using the given scale time `options`.
* Important: this method can return ticks outside the min and max range, it's the
* responsibility of the calling code to clamp values if needed.
*/
@@ -12852,51 +14229,33 @@ function generate(scale, min, max, capacity) {
var options = scale.options;
var timeOpts = options.time;
var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);
- var major = determineMajorUnit(minor);
- var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize);
+ var stepSize = resolve$5([timeOpts.stepSize, timeOpts.unitStepSize, 1]);
var weekday = minor === 'week' ? timeOpts.isoWeekday : false;
- var majorTicksEnabled = options.ticks.major.enabled;
- var interval = INTERVALS[minor];
var first = min;
- var last = max;
var ticks = [];
var time;
- if (!stepSize) {
- stepSize = determineStepSize(min, max, minor, capacity);
- }
-
// For 'week' unit, handle the first day of week option
if (weekday) {
first = +adapter.startOf(first, 'isoWeek', weekday);
- last = +adapter.startOf(last, 'isoWeek', weekday);
}
- // Align first/last ticks on unit
+ // Align first ticks on unit
first = +adapter.startOf(first, weekday ? 'day' : minor);
- last = +adapter.startOf(last, weekday ? 'day' : minor);
- // Make sure that the last tick include max
- if (last < max) {
- last = +adapter.add(last, 1, minor);
+ // Prevent browser from freezing in case user options request millions of milliseconds
+ if (adapter.diff(max, min, minor) > 100000 * stepSize) {
+ throw min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor;
}
- time = first;
-
- if (majorTicksEnabled && major && !weekday && !timeOpts.round) {
- // Align the first tick on the previous `minor` unit aligned on the `major` unit:
- // we first aligned time on the previous `major` unit then add the number of full
- // stepSize there is between first and the previous major time.
- time = +adapter.startOf(time, major);
- time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor);
+ for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) {
+ ticks.push(time);
}
- for (; time < last; time = +adapter.add(time, stepSize, minor)) {
- ticks.push(+time);
+ if (time === max || options.bounds === 'ticks') {
+ ticks.push(time);
}
- ticks.push(+time);
-
return ticks;
}
@@ -12912,42 +14271,57 @@ function computeOffsets(table, ticks, min, max, options) {
var first, last;
if (options.offset && ticks.length) {
- if (!options.time.min) {
- first = interpolate$1(table, 'time', ticks[0], 'pos');
- if (ticks.length === 1) {
- start = 1 - first;
- } else {
- start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;
- }
+ first = interpolate$1(table, 'time', ticks[0], 'pos');
+ if (ticks.length === 1) {
+ start = 1 - first;
+ } else {
+ start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;
}
- if (!options.time.max) {
- last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');
- if (ticks.length === 1) {
- end = last;
- } else {
- end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;
- }
+ last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');
+ if (ticks.length === 1) {
+ end = last;
+ } else {
+ end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;
}
}
- return {start: start, end: end};
+ return {start: start, end: end, factor: 1 / (start + 1 + end)};
+}
+
+function setMajorTicks(scale, ticks, map, majorUnit) {
+ var adapter = scale._adapter;
+ var first = +adapter.startOf(ticks[0].value, majorUnit);
+ var last = ticks[ticks.length - 1].value;
+ var major, index;
+
+ for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {
+ index = map[major];
+ if (index >= 0) {
+ ticks[index].major = true;
+ }
+ }
+ return ticks;
}
function ticksFromTimestamps(scale, values, majorUnit) {
var ticks = [];
- var i, ilen, value, major;
+ var map = {};
+ var ilen = values.length;
+ var i, value;
- for (i = 0, ilen = values.length; i < ilen; ++i) {
+ for (i = 0; i < ilen; ++i) {
value = values[i];
- major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false;
+ map[value] = i;
ticks.push({
value: value,
- major: major
+ major: false
});
}
- return ticks;
+ // We set the major ticks separately from the above loop because calling startOf for every tick
+ // is expensive when there is a large number of ticks
+ return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);
}
var defaultConfig$4 = {
@@ -12974,7 +14348,6 @@ var defaultConfig$4 = {
adapters: {},
time: {
parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment
- format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/
unit: false, // false == automatic or override with week, month, year, etc.
round: false, // none, or override with week, month, year, etc.
displayFormat: false, // DEPRECATED
@@ -13014,9 +14387,9 @@ var scale_time = core_scale.extend({
var adapter = me._adapter = new core_adapters._date(options.adapters.date);
// DEPRECATIONS: output a message only one time per update
- if (time.format) {
- console.warn('options.time.format is deprecated and replaced by options.time.parser.');
- }
+ deprecated$1('time scale', time.format, 'time.format', 'time.parser');
+ deprecated$1('time scale', time.min, 'time.min', 'ticks.min');
+ deprecated$1('time scale', time.max, 'time.max', 'ticks.max');
// Backward compatibility: before introducing adapter, `displayFormats` was
// supposed to contain *all* unit/string pairs but this can't be resolved
@@ -13041,22 +14414,20 @@ var scale_time = core_scale.extend({
var me = this;
var chart = me.chart;
var adapter = me._adapter;
- var timeOpts = me.options.time;
- var unit = timeOpts.unit || 'day';
+ var options = me.options;
+ var unit = options.time.unit || 'day';
var min = MAX_INTEGER;
var max = MIN_INTEGER;
var timestamps = [];
var datasets = [];
var labels = [];
- var i, j, ilen, jlen, data, timestamp;
- var dataLabels = chart.data.labels || [];
+ var i, j, ilen, jlen, data, timestamp, labelsAdded;
+ var dataLabels = me._getLabels();
- // Convert labels to timestamps
for (i = 0, ilen = dataLabels.length; i < ilen; ++i) {
labels.push(parse(me, dataLabels[i]));
}
- // Convert data to timestamps
for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
if (chart.isDatasetVisible(i)) {
data = chart.data.datasets[i].data;
@@ -13071,10 +14442,11 @@ var scale_time = core_scale.extend({
datasets[i][j] = timestamp;
}
} else {
- for (j = 0, jlen = labels.length; j < jlen; ++j) {
- timestamps.push(labels[j]);
- }
datasets[i] = labels.slice(0);
+ if (!labelsAdded) {
+ timestamps = timestamps.concat(labels);
+ labelsAdded = true;
+ }
}
} else {
datasets[i] = [];
@@ -13082,20 +14454,18 @@ var scale_time = core_scale.extend({
}
if (labels.length) {
- // Sort labels **after** data have been converted
- labels = arrayUnique(labels).sort(sorter);
min = Math.min(min, labels[0]);
max = Math.max(max, labels[labels.length - 1]);
}
if (timestamps.length) {
- timestamps = arrayUnique(timestamps).sort(sorter);
+ timestamps = ilen > 1 ? arrayUnique(timestamps).sort(sorter) : timestamps.sort(sorter);
min = Math.min(min, timestamps[0]);
max = Math.max(max, timestamps[timestamps.length - 1]);
}
- min = parse(me, timeOpts.min) || min;
- max = parse(me, timeOpts.max) || max;
+ min = parse(me, getMin(options)) || min;
+ max = parse(me, getMax(options)) || max;
// In case there is no valid min/max, set limits based on unit time option
min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;
@@ -13106,7 +14476,6 @@ var scale_time = core_scale.extend({
me.max = Math.max(min + 1, max);
// PRIVATE
- me._horizontal = me.isHorizontal();
me._table = [];
me._timestamps = {
data: timestamps,
@@ -13120,21 +14489,21 @@ var scale_time = core_scale.extend({
var min = me.min;
var max = me.max;
var options = me.options;
+ var tickOpts = options.ticks;
var timeOpts = options.time;
- var timestamps = [];
+ var timestamps = me._timestamps;
var ticks = [];
+ var capacity = me.getLabelCapacity(min);
+ var source = tickOpts.source;
+ var distribution = options.distribution;
var i, ilen, timestamp;
- switch (options.ticks.source) {
- case 'data':
- timestamps = me._timestamps.data;
- break;
- case 'labels':
- timestamps = me._timestamps.labels;
- break;
- case 'auto':
- default:
- timestamps = generate(me, min, max, me.getLabelCapacity(min), options);
+ if (source === 'data' || (source === 'auto' && distribution === 'series')) {
+ timestamps = timestamps.data;
+ } else if (source === 'labels') {
+ timestamps = timestamps.labels;
+ } else {
+ timestamps = generate(me, min, max, capacity);
}
if (options.bounds === 'ticks' && timestamps.length) {
@@ -13143,8 +14512,8 @@ var scale_time = core_scale.extend({
}
// Enforce limits with user min/max options
- min = parse(me, timeOpts.min) || min;
- max = parse(me, timeOpts.max) || max;
+ min = parse(me, getMin(options)) || min;
+ max = parse(me, getMax(options)) || max;
// Remove ticks outside the min/max range
for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
@@ -13158,12 +14527,17 @@ var scale_time = core_scale.extend({
me.max = max;
// PRIVATE
- me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max);
- me._majorUnit = determineMajorUnit(me._unit);
- me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);
+ // determineUnitForFormatting relies on the number of ticks so we don't use it when
+ // autoSkip is enabled because we don't yet know what the final number of ticks will be
+ me._unit = timeOpts.unit || (tickOpts.autoSkip
+ ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, capacity)
+ : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));
+ me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined
+ : determineMajorUnit(me._unit);
+ me._table = buildLookupTable(me._timestamps.data, min, max, distribution);
me._offsets = computeOffsets(me._table, ticks, min, max, options);
- if (options.ticks.reverse) {
+ if (tickOpts.reverse) {
ticks.reverse();
}
@@ -13202,12 +14576,17 @@ var scale_time = core_scale.extend({
var minorFormat = formats[me._unit];
var majorUnit = me._majorUnit;
var majorFormat = formats[majorUnit];
- var majorTime = +adapter.startOf(time, majorUnit);
- var majorTickOpts = options.ticks.major;
- var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;
+ var tick = ticks[index];
+ var tickOpts = options.ticks;
+ var major = majorUnit && majorFormat && tick && tick.major;
var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);
- var tickOpts = major ? majorTickOpts : options.ticks.minor;
- var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback);
+ var nestedTickOpts = major ? tickOpts.major : tickOpts.minor;
+ var formatter = resolve$5([
+ nestedTickOpts.callback,
+ nestedTickOpts.userCallback,
+ tickOpts.callback,
+ tickOpts.userCallback
+ ]);
return formatter ? formatter(label, index, ticks) : label;
},
@@ -13228,13 +14607,9 @@ var scale_time = core_scale.extend({
*/
getPixelForOffset: function(time) {
var me = this;
- var isReverse = me.options.ticks.reverse;
- var size = me._horizontal ? me.width : me.height;
- var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top;
+ var offsets = me._offsets;
var pos = interpolate$1(me._table, 'time', time, 'pos');
- var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end);
-
- return isReverse ? start - offset : start + offset;
+ return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);
},
getPixelForValue: function(value, index, datasetIndex) {
@@ -13263,9 +14638,8 @@ var scale_time = core_scale.extend({
getValueForPixel: function(pixel) {
var me = this;
- var size = me._horizontal ? me.width : me.height;
- var start = me._horizontal ? me.left : me.top;
- var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end;
+ var offsets = me._offsets;
+ var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;
var time = interpolate$1(me._table, 'pos', pos, 'time');
// DEPRECATION, we should return time directly
@@ -13273,19 +14647,29 @@ var scale_time = core_scale.extend({
},
/**
- * Crude approximation of what the label width might be
* @private
*/
- getLabelWidth: function(label) {
+ _getLabelSize: function(label) {
var me = this;
var ticksOpts = me.options.ticks;
var tickLabelWidth = me.ctx.measureText(label).width;
- var angle = helpers$1.toRadians(ticksOpts.maxRotation);
+ var angle = helpers$1.toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);
var cosRotation = Math.cos(angle);
var sinRotation = Math.sin(angle);
- var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize);
+ var tickFontSize = valueOrDefault$d(ticksOpts.fontSize, core_defaults.global.defaultFontSize);
+
+ return {
+ w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),
+ h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)
+ };
+ },
- return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);
+ /**
+ * Crude approximation of what the label width might be
+ * @private
+ */
+ getLabelWidth: function(label) {
+ return this._getLabelSize(label).w;
},
/**
@@ -13293,13 +14677,18 @@ var scale_time = core_scale.extend({
*/
getLabelCapacity: function(exampleTime) {
var me = this;
+ var timeOpts = me.options.time;
+ var displayFormats = timeOpts.displayFormats;
// pick the longest format (milliseconds) for guestimation
- var format = me.options.time.displayFormats.millisecond;
- var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format);
- var tickLabelWidth = me.getLabelWidth(exampleLabel);
- var innerWidth = me.isHorizontal() ? me.width : me.height;
- var capacity = Math.floor(innerWidth / tickLabelWidth);
+ var format = displayFormats[timeOpts.unit] || displayFormats.millisecond;
+ var exampleLabel = me.tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);
+ var size = me._getLabelSize(exampleLabel);
+ var capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h);
+
+ if (me.options.offset) {
+ capacity--;
+ }
return capacity > 0 ? capacity : 1;
}
@@ -13355,7 +14744,7 @@ core_adapters._date.override(typeof moment === 'function' ? {
},
diff: function(max, min, unit) {
- return moment.duration(moment(max).diff(moment(min))).as(unit);
+ return moment(max).diff(moment(min), unit);
},
startOf: function(time, unit, weekday) {
@@ -13410,6 +14799,12 @@ var mappers = {
var x = boundary ? boundary.x : null;
var y = boundary ? boundary.y : null;
+ if (helpers$1.isArray(boundary)) {
+ return function(point, i) {
+ return boundary[i];
+ };
+ }
+
return function(point) {
return {
x: x === null ? point.x : x,
@@ -13469,7 +14864,7 @@ function decodeFill(el, index, count) {
}
}
-function computeBoundary(source) {
+function computeLinearBoundary(source) {
var model = source.el._model || {};
var scale = source.el._scale || {};
var fill = source.fill;
@@ -13490,8 +14885,6 @@ function computeBoundary(source) {
target = model.scaleTop === undefined ? scale.top : model.scaleTop;
} else if (model.scaleZero !== undefined) {
target = model.scaleZero;
- } else if (scale.getBasePosition) {
- target = scale.getBasePosition();
} else if (scale.getBasePixel) {
target = scale.getBasePixel();
}
@@ -13513,6 +14906,44 @@ function computeBoundary(source) {
return null;
}
+function computeCircularBoundary(source) {
+ var scale = source.el._scale;
+ var options = scale.options;
+ var length = scale.chart.data.labels.length;
+ var fill = source.fill;
+ var target = [];
+ var start, end, center, i, point;
+
+ if (!length) {
+ return null;
+ }
+
+ start = options.ticks.reverse ? scale.max : scale.min;
+ end = options.ticks.reverse ? scale.min : scale.max;
+ center = scale.getPointPositionForValue(0, start);
+ for (i = 0; i < length; ++i) {
+ point = fill === 'start' || fill === 'end'
+ ? scale.getPointPositionForValue(i, fill === 'start' ? start : end)
+ : scale.getBasePosition(i);
+ if (options.gridLines.circular) {
+ point.cx = center.x;
+ point.cy = center.y;
+ point.angle = scale.getIndexAngle(i) - Math.PI / 2;
+ }
+ target.push(point);
+ }
+ return target;
+}
+
+function computeBoundary(source) {
+ var scale = source.el._scale || {};
+
+ if (scale.getPointPositionForValue) {
+ return computeCircularBoundary(source);
+ }
+ return computeLinearBoundary(source);
+}
+
function resolveTarget(sources, index, propagate) {
var source = sources[index];
var fill = source.fill;
@@ -13564,7 +14995,7 @@ function isDrawable(point) {
}
function drawArea(ctx, curve0, curve1, len0, len1) {
- var i;
+ var i, cx, cy, r;
if (!len0 || !len1) {
return;
@@ -13576,6 +15007,16 @@ function drawArea(ctx, curve0, curve1, len0, len1) {
helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);
}
+ if (curve1[0].angle !== undefined) {
+ cx = curve1[0].cx;
+ cy = curve1[0].cy;
+ r = Math.sqrt(Math.pow(curve1[0].x - cx, 2) + Math.pow(curve1[0].y - cy, 2));
+ for (i = len1 - 1; i > 0; --i) {
+ ctx.arc(cx, cy, r, curve1[i].angle, curve1[i - 1].angle, true);
+ }
+ return;
+ }
+
// joining the two area curves
ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);
@@ -13592,17 +15033,22 @@ function doFill(ctx, points, mapper, view, color, loop) {
var curve1 = [];
var len0 = 0;
var len1 = 0;
- var i, ilen, index, p0, p1, d0, d1;
+ var i, ilen, index, p0, p1, d0, d1, loopOffset;
ctx.beginPath();
- for (i = 0, ilen = (count + !!loop); i < ilen; ++i) {
+ for (i = 0, ilen = count; i < ilen; ++i) {
index = i % count;
p0 = points[index]._view;
p1 = mapper(p0, index, view);
d0 = isDrawable(p0);
d1 = isDrawable(p1);
+ if (loop && loopOffset === undefined && d0) {
+ loopOffset = i + 1;
+ ilen = count + loopOffset;
+ }
+
if (d0 && d1) {
len0 = curve0.push(p0);
len1 = curve1.push(p1);
@@ -13669,34 +15115,42 @@ var plugin_filler = {
}
},
- beforeDatasetDraw: function(chart, args) {
- var meta = args.meta.$filler;
- if (!meta) {
- return;
- }
-
+ beforeDatasetsDraw: function(chart) {
+ var metasets = chart._getSortedVisibleDatasetMetas();
var ctx = chart.ctx;
- var el = meta.el;
- var view = el._view;
- var points = el._children || [];
- var mapper = meta.mapper;
- var color = view.backgroundColor || core_defaults.global.defaultColor;
+ var meta, i, el, view, points, mapper, color;
+
+ for (i = metasets.length - 1; i >= 0; --i) {
+ meta = metasets[i].$filler;
+
+ if (!meta || !meta.visible) {
+ continue;
+ }
+
+ el = meta.el;
+ view = el._view;
+ points = el._children || [];
+ mapper = meta.mapper;
+ color = view.backgroundColor || core_defaults.global.defaultColor;
- if (mapper && color && points.length) {
- helpers$1.canvas.clipArea(ctx, chart.chartArea);
- doFill(ctx, points, mapper, view, color, el._loop);
- helpers$1.canvas.unclipArea(ctx);
+ if (mapper && color && points.length) {
+ helpers$1.canvas.clipArea(ctx, chart.chartArea);
+ doFill(ctx, points, mapper, view, color, el._loop);
+ helpers$1.canvas.unclipArea(ctx);
+ }
}
}
};
+var getRtlHelper$1 = helpers$1.rtl.getRtlAdapter;
var noop$1 = helpers$1.noop;
-var valueOrDefault$d = helpers$1.valueOrDefault;
+var valueOrDefault$e = helpers$1.valueOrDefault;
core_defaults._set('global', {
legend: {
display: true,
position: 'top',
+ align: 'center',
fullWidth: true,
reverse: false,
weight: 1000,
@@ -13732,40 +15186,51 @@ core_defaults._set('global', {
// lineJoin :
// lineWidth :
generateLabels: function(chart) {
- var data = chart.data;
- return helpers$1.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
+ var datasets = chart.data.datasets;
+ var options = chart.options.legend || {};
+ var usePointStyle = options.labels && options.labels.usePointStyle;
+
+ return chart._getSortedDatasetMetas().map(function(meta) {
+ var style = meta.controller.getStyle(usePointStyle ? 0 : undefined);
+
return {
- text: dataset.label,
- fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),
- hidden: !chart.isDatasetVisible(i),
- lineCap: dataset.borderCapStyle,
- lineDash: dataset.borderDash,
- lineDashOffset: dataset.borderDashOffset,
- lineJoin: dataset.borderJoinStyle,
- lineWidth: dataset.borderWidth,
- strokeStyle: dataset.borderColor,
- pointStyle: dataset.pointStyle,
+ text: datasets[meta.index].label,
+ fillStyle: style.backgroundColor,
+ hidden: !chart.isDatasetVisible(meta.index),
+ lineCap: style.borderCapStyle,
+ lineDash: style.borderDash,
+ lineDashOffset: style.borderDashOffset,
+ lineJoin: style.borderJoinStyle,
+ lineWidth: style.borderWidth,
+ strokeStyle: style.borderColor,
+ pointStyle: style.pointStyle,
+ rotation: style.rotation,
// Below is extra data used for toggling the datasets
- datasetIndex: i
+ datasetIndex: meta.index
};
- }, this) : [];
+ }, this);
}
}
},
legendCallback: function(chart) {
- var text = [];
- text.push('<ul class="' + chart.id + '-legend">');
- for (var i = 0; i < chart.data.datasets.length; i++) {
- text.push('<li><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"></span>');
- if (chart.data.datasets[i].label) {
- text.push(chart.data.datasets[i].label);
+ var list = document.createElement('ul');
+ var datasets = chart.data.datasets;
+ var i, ilen, listItem, listItemSpan;
+
+ list.setAttribute('class', chart.id + '-legend');
+
+ for (i = 0, ilen = datasets.length; i < ilen; i++) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[i].backgroundColor;
+ if (datasets[i].label) {
+ listItem.appendChild(document.createTextNode(datasets[i].label));
}
- text.push('</li>');
}
- text.push('</ul>');
- return text.join('');
+
+ return list.outerHTML;
}
});
@@ -13787,18 +15252,19 @@ function getBoxWidth(labelOpts, fontSize) {
var Legend = core_element.extend({
initialize: function(config) {
- helpers$1.extend(this, config);
+ var me = this;
+ helpers$1.extend(me, config);
// Contains hit boxes for each dataset (in dataset order)
- this.legendHitBoxes = [];
+ me.legendHitBoxes = [];
/**
* @private
*/
- this._hoveredItem = null;
+ me._hoveredItem = null;
// Are we in doughnut mode which has a different data type
- this.doughnutMode = false;
+ me.doughnutMode = false;
},
// These methods are ordered by lifecycle. Utilities then follow.
@@ -13921,79 +15387,82 @@ var Legend = core_element.extend({
}
// Increase sizes here
- if (display) {
- ctx.font = labelFont.string;
+ if (!display) {
+ me.width = minSize.width = me.height = minSize.height = 0;
+ return;
+ }
+ ctx.font = labelFont.string;
- if (isHorizontal) {
- // Labels
+ if (isHorizontal) {
+ // Labels
- // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
- var lineWidths = me.lineWidths = [0];
- var totalHeight = 0;
+ // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
+ var lineWidths = me.lineWidths = [0];
+ var totalHeight = 0;
- ctx.textAlign = 'left';
- ctx.textBaseline = 'top';
+ ctx.textAlign = 'left';
+ ctx.textBaseline = 'middle';
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
- if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) {
- totalHeight += fontSize + labelOpts.padding;
- lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding;
- }
+ if (i === 0 || lineWidths[lineWidths.length - 1] + width + 2 * labelOpts.padding > minSize.width) {
+ totalHeight += fontSize + labelOpts.padding;
+ lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;
+ }
- // Store the hitbox width and height here. Final position will be updated in `draw`
- hitboxes[i] = {
- left: 0,
- top: 0,
- width: width,
- height: fontSize
- };
+ // Store the hitbox width and height here. Final position will be updated in `draw`
+ hitboxes[i] = {
+ left: 0,
+ top: 0,
+ width: width,
+ height: fontSize
+ };
- lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
- });
+ lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
+ });
- minSize.height += totalHeight;
+ minSize.height += totalHeight;
- } else {
- var vPadding = labelOpts.padding;
- var columnWidths = me.columnWidths = [];
- var totalWidth = labelOpts.padding;
- var currentColWidth = 0;
- var currentColHeight = 0;
- var itemHeight = fontSize + vPadding;
-
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
-
- // If too tall, go to new column
- if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) {
- totalWidth += currentColWidth + labelOpts.padding;
- columnWidths.push(currentColWidth); // previous column width
-
- currentColWidth = 0;
- currentColHeight = 0;
- }
+ } else {
+ var vPadding = labelOpts.padding;
+ var columnWidths = me.columnWidths = [];
+ var columnHeights = me.columnHeights = [];
+ var totalWidth = labelOpts.padding;
+ var currentColWidth = 0;
+ var currentColHeight = 0;
- // Get max width
- currentColWidth = Math.max(currentColWidth, itemWidth);
- currentColHeight += itemHeight;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
+
+ // If too tall, go to new column
+ if (i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize.height) {
+ totalWidth += currentColWidth + labelOpts.padding;
+ columnWidths.push(currentColWidth); // previous column width
+ columnHeights.push(currentColHeight);
+ currentColWidth = 0;
+ currentColHeight = 0;
+ }
- // Store the hitbox width and height here. Final position will be updated in `draw`
- hitboxes[i] = {
- left: 0,
- top: 0,
- width: itemWidth,
- height: fontSize
- };
- });
+ // Get max width
+ currentColWidth = Math.max(currentColWidth, itemWidth);
+ currentColHeight += fontSize + vPadding;
- totalWidth += currentColWidth;
- columnWidths.push(currentColWidth);
- minSize.width += totalWidth;
- }
+ // Store the hitbox width and height here. Final position will be updated in `draw`
+ hitboxes[i] = {
+ left: 0,
+ top: 0,
+ width: itemWidth,
+ height: fontSize
+ };
+ });
+
+ totalWidth += currentColWidth;
+ columnWidths.push(currentColWidth);
+ columnHeights.push(currentColHeight);
+ minSize.width += totalWidth;
}
me.width = minSize.width;
@@ -14014,139 +15483,163 @@ var Legend = core_element.extend({
var globalDefaults = core_defaults.global;
var defaultColor = globalDefaults.defaultColor;
var lineDefault = globalDefaults.elements.line;
+ var legendHeight = me.height;
+ var columnHeights = me.columnHeights;
var legendWidth = me.width;
var lineWidths = me.lineWidths;
- if (opts.display) {
- var ctx = me.ctx;
- var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor);
- var labelFont = helpers$1.options._parseFont(labelOpts);
- var fontSize = labelFont.size;
- var cursor;
+ if (!opts.display) {
+ return;
+ }
- // Canvas setup
- ctx.textAlign = 'left';
- ctx.textBaseline = 'middle';
- ctx.lineWidth = 0.5;
- ctx.strokeStyle = fontColor; // for strikethrough effect
- ctx.fillStyle = fontColor; // render in correct colour
- ctx.font = labelFont.string;
+ var rtlHelper = getRtlHelper$1(opts.rtl, me.left, me.minSize.width);
+ var ctx = me.ctx;
+ var fontColor = valueOrDefault$e(labelOpts.fontColor, globalDefaults.defaultFontColor);
+ var labelFont = helpers$1.options._parseFont(labelOpts);
+ var fontSize = labelFont.size;
+ var cursor;
+
+ // Canvas setup
+ ctx.textAlign = rtlHelper.textAlign('left');
+ ctx.textBaseline = 'middle';
+ ctx.lineWidth = 0.5;
+ ctx.strokeStyle = fontColor; // for strikethrough effect
+ ctx.fillStyle = fontColor; // render in correct colour
+ ctx.font = labelFont.string;
+
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var hitboxes = me.legendHitBoxes;
+
+ // current position
+ var drawLegendBox = function(x, y, legendItem) {
+ if (isNaN(boxWidth) || boxWidth <= 0) {
+ return;
+ }
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var hitboxes = me.legendHitBoxes;
+ // Set the ctx for the box
+ ctx.save();
- // current position
- var drawLegendBox = function(x, y, legendItem) {
- if (isNaN(boxWidth) || boxWidth <= 0) {
- return;
- }
+ var lineWidth = valueOrDefault$e(legendItem.lineWidth, lineDefault.borderWidth);
+ ctx.fillStyle = valueOrDefault$e(legendItem.fillStyle, defaultColor);
+ ctx.lineCap = valueOrDefault$e(legendItem.lineCap, lineDefault.borderCapStyle);
+ ctx.lineDashOffset = valueOrDefault$e(legendItem.lineDashOffset, lineDefault.borderDashOffset);
+ ctx.lineJoin = valueOrDefault$e(legendItem.lineJoin, lineDefault.borderJoinStyle);
+ ctx.lineWidth = lineWidth;
+ ctx.strokeStyle = valueOrDefault$e(legendItem.strokeStyle, defaultColor);
- // Set the ctx for the box
- ctx.save();
+ if (ctx.setLineDash) {
+ // IE 9 and 10 do not support line dash
+ ctx.setLineDash(valueOrDefault$e(legendItem.lineDash, lineDefault.borderDash));
+ }
- var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth);
- ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor);
- ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle);
- ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset);
- ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle);
- ctx.lineWidth = lineWidth;
- ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor);
+ if (labelOpts && labelOpts.usePointStyle) {
+ // Recalculate x and y for drawPoint() because its expecting
+ // x and y to be center of figure (instead of top left)
+ var radius = boxWidth * Math.SQRT2 / 2;
+ var centerX = rtlHelper.xPlus(x, boxWidth / 2);
+ var centerY = y + fontSize / 2;
- if (ctx.setLineDash) {
- // IE 9 and 10 do not support line dash
- ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash));
+ // Draw pointStyle as legend symbol
+ helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);
+ } else {
+ // Draw box as legend symbol
+ ctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
+ if (lineWidth !== 0) {
+ ctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
}
+ }
- if (opts.labels && opts.labels.usePointStyle) {
- // Recalculate x and y for drawPoint() because its expecting
- // x and y to be center of figure (instead of top left)
- var radius = boxWidth * Math.SQRT2 / 2;
- var centerX = x + boxWidth / 2;
- var centerY = y + fontSize / 2;
+ ctx.restore();
+ };
- // Draw pointStyle as legend symbol
- helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
- } else {
- // Draw box as legend symbol
- if (lineWidth !== 0) {
- ctx.strokeRect(x, y, boxWidth, fontSize);
- }
- ctx.fillRect(x, y, boxWidth, fontSize);
- }
+ var fillText = function(x, y, legendItem, textWidth) {
+ var halfFontSize = fontSize / 2;
+ var xLeft = rtlHelper.xPlus(x, boxWidth + halfFontSize);
+ var yMiddle = y + halfFontSize;
- ctx.restore();
+ ctx.fillText(legendItem.text, xLeft, yMiddle);
+
+ if (legendItem.hidden) {
+ // Strikethrough the text if hidden
+ ctx.beginPath();
+ ctx.lineWidth = 2;
+ ctx.moveTo(xLeft, yMiddle);
+ ctx.lineTo(rtlHelper.xPlus(xLeft, textWidth), yMiddle);
+ ctx.stroke();
+ }
+ };
+
+ var alignmentOffset = function(dimension, blockSize) {
+ switch (opts.align) {
+ case 'start':
+ return labelOpts.padding;
+ case 'end':
+ return dimension - blockSize;
+ default: // center
+ return (dimension - blockSize + labelOpts.padding) / 2;
+ }
+ };
+
+ // Horizontal
+ var isHorizontal = me.isHorizontal();
+ if (isHorizontal) {
+ cursor = {
+ x: me.left + alignmentOffset(legendWidth, lineWidths[0]),
+ y: me.top + labelOpts.padding,
+ line: 0
};
- var fillText = function(x, y, legendItem, textWidth) {
- var halfFontSize = fontSize / 2;
- var xLeft = boxWidth + halfFontSize + x;
- var yMiddle = y + halfFontSize;
-
- ctx.fillText(legendItem.text, xLeft, yMiddle);
-
- if (legendItem.hidden) {
- // Strikethrough the text if hidden
- ctx.beginPath();
- ctx.lineWidth = 2;
- ctx.moveTo(xLeft, yMiddle);
- ctx.lineTo(xLeft + textWidth, yMiddle);
- ctx.stroke();
- }
+ } else {
+ cursor = {
+ x: me.left + labelOpts.padding,
+ y: me.top + alignmentOffset(legendHeight, columnHeights[0]),
+ line: 0
};
+ }
- // Horizontal
- var isHorizontal = me.isHorizontal();
- if (isHorizontal) {
- cursor = {
- x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding,
- y: me.top + labelOpts.padding,
- line: 0
- };
- } else {
- cursor = {
- x: me.left + labelOpts.padding,
- y: me.top + labelOpts.padding,
- line: 0
- };
- }
+ helpers$1.rtl.overrideTextDirection(me.ctx, opts.textDirection);
- var itemHeight = fontSize + labelOpts.padding;
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var textWidth = ctx.measureText(legendItem.text).width;
- var width = boxWidth + (fontSize / 2) + textWidth;
- var x = cursor.x;
- var y = cursor.y;
-
- // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)
- // instead of me.right and me.bottom because me.width and me.height
- // may have been changed since me.minSize was calculated
- if (isHorizontal) {
- if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {
- y = cursor.y += itemHeight;
- cursor.line++;
- x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding;
- }
- } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {
- x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;
- y = cursor.y = me.top + labelOpts.padding;
+ var itemHeight = fontSize + labelOpts.padding;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var textWidth = ctx.measureText(legendItem.text).width;
+ var width = boxWidth + (fontSize / 2) + textWidth;
+ var x = cursor.x;
+ var y = cursor.y;
+
+ rtlHelper.setWidth(me.minSize.width);
+
+ // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)
+ // instead of me.right and me.bottom because me.width and me.height
+ // may have been changed since me.minSize was calculated
+ if (isHorizontal) {
+ if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {
+ y = cursor.y += itemHeight;
cursor.line++;
+ x = cursor.x = me.left + alignmentOffset(legendWidth, lineWidths[cursor.line]);
}
+ } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {
+ x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;
+ cursor.line++;
+ y = cursor.y = me.top + alignmentOffset(legendHeight, columnHeights[cursor.line]);
+ }
- drawLegendBox(x, y, legendItem);
+ var realX = rtlHelper.x(x);
- hitboxes[i].left = x;
- hitboxes[i].top = y;
+ drawLegendBox(realX, y, legendItem);
- // Fill the actual label
- fillText(x, y, legendItem, textWidth);
+ hitboxes[i].left = rtlHelper.leftForLtr(realX, hitboxes[i].width);
+ hitboxes[i].top = y;
- if (isHorizontal) {
- cursor.x += width + labelOpts.padding;
- } else {
- cursor.y += itemHeight;
- }
+ // Fill the actual label
+ fillText(realX, y, legendItem, textWidth);
- });
- }
+ if (isHorizontal) {
+ cursor.x += width + labelOpts.padding;
+ } else {
+ cursor.y += itemHeight;
+ }
+ });
+
+ helpers$1.rtl.restoreTextDirection(me.ctx, opts.textDirection);
},
/**
@@ -14384,23 +15877,20 @@ var Title = core_element.extend({
fit: function() {
var me = this;
var opts = me.options;
- var display = opts.display;
- var minSize = me.minSize;
- var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;
- var fontOpts = helpers$1.options._parseFont(opts);
- var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0;
+ var minSize = me.minSize = {};
+ var isHorizontal = me.isHorizontal();
+ var lineCount, textSize;
- if (me.isHorizontal()) {
- minSize.width = me.maxWidth; // fill all the width
- minSize.height = textSize;
- } else {
- minSize.width = textSize;
- minSize.height = me.maxHeight; // fill all the height
+ if (!opts.display) {
+ me.width = minSize.width = me.height = minSize.height = 0;
+ return;
}
- me.width = minSize.width;
- me.height = minSize.height;
+ lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;
+ textSize = lineCount * helpers$1.options._parseFont(opts).lineHeight + opts.padding * 2;
+ me.width = minSize.width = isHorizontal ? me.maxWidth : textSize;
+ me.height = minSize.height = isHorizontal ? textSize : me.maxHeight;
},
afterFit: noop$2,
@@ -14416,51 +15906,53 @@ var Title = core_element.extend({
var ctx = me.ctx;
var opts = me.options;
- if (opts.display) {
- var fontOpts = helpers$1.options._parseFont(opts);
- var lineHeight = fontOpts.lineHeight;
- var offset = lineHeight / 2 + opts.padding;
- var rotation = 0;
- var top = me.top;
- var left = me.left;
- var bottom = me.bottom;
- var right = me.right;
- var maxWidth, titleX, titleY;
-
- ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour
- ctx.font = fontOpts.string;
-
- // Horizontal
- if (me.isHorizontal()) {
- titleX = left + ((right - left) / 2); // midpoint of the width
- titleY = top + offset;
- maxWidth = right - left;
- } else {
- titleX = opts.position === 'left' ? left + offset : right - offset;
- titleY = top + ((bottom - top) / 2);
- maxWidth = bottom - top;
- rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);
- }
+ if (!opts.display) {
+ return;
+ }
- ctx.save();
- ctx.translate(titleX, titleY);
- ctx.rotate(rotation);
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
+ var fontOpts = helpers$1.options._parseFont(opts);
+ var lineHeight = fontOpts.lineHeight;
+ var offset = lineHeight / 2 + opts.padding;
+ var rotation = 0;
+ var top = me.top;
+ var left = me.left;
+ var bottom = me.bottom;
+ var right = me.right;
+ var maxWidth, titleX, titleY;
+
+ ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour
+ ctx.font = fontOpts.string;
+
+ // Horizontal
+ if (me.isHorizontal()) {
+ titleX = left + ((right - left) / 2); // midpoint of the width
+ titleY = top + offset;
+ maxWidth = right - left;
+ } else {
+ titleX = opts.position === 'left' ? left + offset : right - offset;
+ titleY = top + ((bottom - top) / 2);
+ maxWidth = bottom - top;
+ rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);
+ }
- var text = opts.text;
- if (helpers$1.isArray(text)) {
- var y = 0;
- for (var i = 0; i < text.length; ++i) {
- ctx.fillText(text[i], 0, y, maxWidth);
- y += lineHeight;
- }
- } else {
- ctx.fillText(text, 0, 0, maxWidth);
+ ctx.save();
+ ctx.translate(titleX, titleY);
+ ctx.rotate(rotation);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+
+ var text = opts.text;
+ if (helpers$1.isArray(text)) {
+ var y = 0;
+ for (var i = 0; i < text.length; ++i) {
+ ctx.fillText(text[i], 0, y, maxWidth);
+ y += lineHeight;
}
-
- ctx.restore();
+ } else {
+ ctx.fillText(text, 0, 0, maxWidth);
}
+
+ ctx.restore();
}
});
@@ -14532,7 +16024,7 @@ plugins.title = title;
core_controller.helpers = helpers$1;
// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!
-core_helpers(core_controller);
+core_helpers();
core_controller._adapters = core_adapters;
core_controller.Animation = core_animation;
diff --git a/borrowed/chartjs/Chart.min.css b/borrowed/chartjs/Chart.min.css
old mode 100644
new mode 100755
diff --git a/borrowed/chartjs/Chart.min.js b/borrowed/chartjs/Chart.min.js
old mode 100644
new mode 100755
index c74a7914a..a87f61443
--- a/borrowed/chartjs/Chart.min.js
+++ b/borrowed/chartjs/Chart.min.js
@@ -1,7 +1,7 @@
/*!
- * Chart.js v2.8.0
+ * Chart.js v2.9.4
* https://www.chartjs.org
- * (c) 2019 Chart.js Contributors
+ * (c) 2020 Chart.js Contributors
* Released under the MIT License
*/
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],function(t){return e(function(){try{return t("moment")}catch(t){}}())}):t.Chart=e(t.moment)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={rgb2hsl:i,rgb2hsv:n,rgb2hwb:a,rgb2cmyk:o,rgb2keyword:s,rgb2xyz:l,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:u,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return a(u(t))},hsl2cmyk:function(t){return o(u(t))},hsl2keyword:function(t){return s(u(t))},hsv2rgb:h,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return e=a*o,[n,100*(e=(e/=(i=(2-a)*o)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return a(h(t))},hsv2cmyk:function(t){return o(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:c,hwb2hsl:function(t){return i(c(t))},hwb2hsv:function(t){return n(c(t))},hwb2cmyk:function(t){return o(c(t))},hwb2keyword:function(t){return s(c(t))},cmyk2rgb:f,cmyk2hsl:function(t){return i(f(t))},cmyk2hsv:function(t){return n(f(t))},cmyk2hwb:function(t){return a(f(t))},cmyk2keyword:function(t){return s(f(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return n(w(t))},keyword2hwb:function(t){return a(w(t))},keyword2cmyk:function(t){return o(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return l(w(t))},xyz2rgb:p,xyz2lab:m,xyz2lch:function(t){return x(m(t))},lab2xyz:v,lab2rgb:y,lab2lch:x,lch2lab:k,lch2xyz:function(t){return v(k(t))},lch2rgb:function(t){return y(k(t))}};function i(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(r+s)/2,[e,100*(s==r?0:i<=.5?l/(s+r):l/(2-s-r)),100*i]}function n(t){var e,i,n=t[0],a=t[1],o=t[2],r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return i=0==s?0:l/s*1e3/10,s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function a(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function o(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function s(t){return _[JSON.stringify(t)]}function l(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=l(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function u(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[o=255*l,o,o];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var d=0;d<3;d++)(n=r+1/3*-(d-1))<0&&n++,n>1&&n--,o=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[d]=255*o;return a}function h(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o));n*=255;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function c(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,d=s+l;switch(d>1&&(s/=d,l/=d),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function f(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function p(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return i=-.9689*a+1.8758*o+.0415*r,n=.0557*a+-.204*o+1.057*r,e=(e=3.2406*a+-1.5372*o+-.4986*r)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function m(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function v(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return o<=8?a=(i=100*o/903.3)/100*7.787+16/116:(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function x(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function y(t){return p(v(t))}function k(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return M[t]}var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},_={};for(var C in M)_[JSON.stringify(M[C])]=C;var S=function(){return new T};for(var P in e){S[P+"Raw"]=function(t){return function(i){return"number"==typeof i&&(i=Array.prototype.slice.call(arguments)),e[t](i)}}(P);var I=/(\w+)2(\w+)/.exec(P),A=I[1],D=I[2];(S[A]=S[A]||{})[D]=S[P]=function(t){return function(i){"number"==typeof i&&(i=Array.prototype.slice.call(arguments));var n=e[t](i);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(P)}var T=function(){this.convs={}};T.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},T.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},T.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,n=this.convs[i];e=S[i][t](n),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){T.prototype[t]=function(e){return this.routeSpace(t,arguments)}});var F=S,L={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},R={getRgba:O,getHsla:z,getRgb:function(t){var e=O(t);return e&&e.slice(0,3)},getHsl:function(t){var e=z(t);return e&&e.slice(0,3)},getHwb:B,getAlpha:function(t){var e=O(t);if(e)return e[3];if(e=z(t))return e[3];if(e=B(t))return e[3]},hexString:function(t,e){var e=void 0!==e&&3===t.length?e:t[3];return"#"+H(t[0])+H(t[1])+H(t[2])+(e>=0&&e<1?H(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return N(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:N,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return W(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"},percentaString:W,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return V(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:V,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return j[t.slice(0,3)]}};function O(t){if(t){var e=[0,0,0],i=1,n=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(n){a=(n=n[1])[3];for(var o=0;o<e.length;o++)e[o]=parseInt(n[o]+n[o],16);a&&(i=Math.round(parseInt(a+a,16)/255*100)/100)}else if(n=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=n[2],n=n[1];for(o=0;o<e.length;o++)e[o]=parseInt(n.slice(2*o,2*o+2),16);a&&(i=Math.round(parseInt(a,16)/255*100)/100)}else if(n=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(o=0;o<e.length;o++)e[o]=parseInt(n[o+1]);i=parseFloat(n[4])}else if(n=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(o=0;o<e.length;o++)e[o]=Math.round(2.55*parseFloat(n[o+1]));i=parseFloat(n[4])}else if(n=t.match(/(\w+)/)){if("transparent"==n[1])return[0,0,0,0];if(!(e=L[n[1]]))return}for(o=0;o<e.length;o++)e[o]=E(e[o],0,255);return i=i||0==i?E(i,0,1):1,e[3]=i,e}}function z(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[E(parseInt(e[1]),0,360),E(parseFloat(e[2]),0,100),E(parseFloat(e[3]),0,100),E(isNaN(i)?1:i,0,1)]}}}function B(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[E(parseInt(e[1]),0,360),E(parseFloat(e[2]),0,100),E(parseFloat(e[3]),0,100),E(isNaN(i)?1:i,0,1)]}}}function N(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function W(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function V(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function E(t,e,i){return Math.min(Math.max(e,t),i)}function H(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var j={};for(var q in L)j[L[q]]=q;var Y=function(t){return t instanceof Y?t:this instanceof Y?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=R.getRgba(t))?this.setValues("rgb",e):(e=R.getHsla(t))?this.setValues("hsl",e):(e=R.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new Y(t);var e};Y.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return R.hexString(this.values.rgb)},rgbString:function(){return R.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return R.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return R.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return R.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return R.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return R.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return R.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var n=t[i]/255;e[i]=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=t,n=void 0===e?.5:e,a=2*n-1,o=this.alpha()-i.alpha(),r=((a*o==-1?a:(a+o)/(1+a*o))+1)/2,s=1-r;return this.rgb(r*this.red()+s*i.red(),r*this.green()+s*i.green(),r*this.blue()+s*i.blue()).alpha(this.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new Y,n=this.values,a=i.values;for(var o in n)n.hasOwnProperty(o)&&(t=n[o],"[object Array]"===(e={}.toString.call(t))?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return i}},Y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Y.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n<t.length;n++)i[t.charAt(n)]=e[t][n];return 1!==e.alpha&&(i.a=e.alpha),i},Y.prototype.setValues=function(t,e){var i,n,a=this.values,o=this.spaces,r=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)a[t][i]=e[t.charAt(i)];s=e.a}else if(void 0!==e[o[t][0]]){var l=o[t];for(i=0;i<t.length;i++)a[t][i]=e[l[i]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(i=0;i<t.length;i++)n=Math.max(0,Math.min(r[t][i],a[t][i])),a[t][i]=Math.round(n);for(var d in o)d!==t&&(a[d]=F[t][d](a[t]));return!0},Y.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},Y.prototype.setChannel=function(t,e,i){var n=this.values[t];return void 0===i?n[e]:i===n[e]?this:(n[e]=i,this.setValues(t,n),this)},"undefined"!=typeof window&&(window.Color=Y);var U,X=Y,K={noop:function(){},uid:(U=0,function(){return U++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,i){return K.valueOrDefault(K.isArray(t)?t[e]:t,i)},callback:function(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)},each:function(t,e,i,n){var a,o,r;if(K.isArray(t))if(o=t.length,n)for(a=o-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<o;a++)e.call(i,t[a],a);else if(K.isObject(t))for(o=(r=Object.keys(t)).length,a=0;a<o;a++)e.call(i,t[r[a]],r[a])},arrayEquals:function(t,e){var i,n,a,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(a=t[i],o=e[i],a instanceof Array&&o instanceof Array){if(!K.arrayEquals(a,o))return!1}else if(a!==o)return!1;return!0},clone:function(t){if(K.isArray(t))return t.map(K.clone);if(K.isObject(t)){for(var e={},i=Object.keys(t),n=i.length,a=0;a<n;++a)e[i[a]]=K.clone(t[i[a]]);return e}return t},_merger:function(t,e,i,n){var a=e[t],o=i[t];K.isObject(a)&&K.isObject(o)?K.merge(a,o,n):e[t]=K.clone(o)},_mergerIf:function(t,e,i){var n=e[t],a=i[t];K.isObject(n)&&K.isObject(a)?K.mergeIf(n,a):e.hasOwnProperty(t)||(e[t]=K.clone(a))},merge:function(t,e,i){var n,a,o,r,s,l=K.isArray(e)?e:[e],d=l.length;if(!K.isObject(t))return t;for(n=(i=i||{}).merger||K._merger,a=0;a<d;++a)if(e=l[a],K.isObject(e))for(s=0,r=(o=Object.keys(e)).length;s<r;++s)n(o[s],t,e,i);return t},mergeIf:function(t,e){return K.merge(t,e,{merger:K._mergerIf})},extend:function(t){for(var e=function(e,i){t[i]=e},i=1,n=arguments.length;i<n;++i)K.each(arguments[i],e);return t},inherits:function(t){var e=this,i=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},n=function(){this.constructor=i};return n.prototype=e.prototype,i.prototype=new n,i.extend=K.inherits,t&&K.extend(i.prototype,t),i.__super__=e.prototype,i}},G=K;K.callCallback=K.callback,K.indexOf=function(t,e,i){return Array.prototype.indexOf.call(t,e,i)},K.getValueOrDefault=K.valueOrDefault,K.getValueAtIndexOrDefault=K.valueAtIndexOrDefault;var Z={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-Z.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*Z.easeInBounce(2*t):.5*Z.easeOutBounce(2*t-1)+.5}},$={effects:Z};G.easingEffects=Z;var J=Math.PI,Q=J/180,tt=2*J,et=J/2,it=J/4,nt=2*J/3,at={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,o){if(o){var r=Math.min(o,a/2,n/2),s=e+r,l=i+r,d=e+n-r,u=i+a-r;t.moveTo(e,l),s<d&&l<u?(t.arc(s,l,r,-J,-et),t.arc(d,l,r,-et,0),t.arc(d,u,r,0,et),t.arc(s,u,r,et,J)):s<d?(t.moveTo(s,i),t.arc(d,l,r,-et,et),t.arc(s,l,r,et,J+et)):l<u?(t.arc(s,l,r,-J,0),t.arc(s,u,r,0,J)):t.arc(s,l,r,-J,J),t.closePath(),t.moveTo(e,i)}else t.rect(e,i,n,a)},drawPoint:function(t,e,i,n,a,o){var r,s,l,d,u,h=(o||0)*Q;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(r=e.toString())&&"[object HTMLCanvasElement]"!==r){if(!(isNaN(i)||i<=0)){switch(t.beginPath(),e){default:t.arc(n,a,i,0,tt),t.closePath();break;case"triangle":t.moveTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=nt,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=nt,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),t.closePath();break;case"rectRounded":d=i-(u=.516*i),s=Math.cos(h+it)*d,l=Math.sin(h+it)*d,t.arc(n-s,a-l,u,h-J,h-et),t.arc(n+l,a-s,u,h-et,h),t.arc(n+s,a+l,u,h,h+et),t.arc(n-l,a+s,u,h+et,h+J),t.closePath();break;case"rect":if(!o){d=Math.SQRT1_2*i,t.rect(n-d,a-d,2*d,2*d);break}h+=it;case"rectRot":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+l,a-s),t.lineTo(n+s,a+l),t.lineTo(n-l,a+s),t.closePath();break;case"crossRot":h+=it;case"cross":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"star":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s),h+=it,s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"line":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l);break;case"dash":t.moveTo(n,a),t.lineTo(n+Math.cos(h)*i,a+Math.sin(h)*i)}t.fill(),t.stroke()}}else t.drawImage(e,n-e.width/2,a-e.height/2,e.width,e.height)},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,i,n){var a=i.steppedLine;if(a){if("middle"===a){var o=(e.x+i.x)/2;t.lineTo(o,n?i.y:e.y),t.lineTo(o,n?e.y:i.y)}else"after"===a&&!n||"after"!==a&&n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}else i.tension?t.bezierCurveTo(n?e.controlPointPreviousX:e.controlPointNextX,n?e.controlPointPreviousY:e.controlPointNextY,n?i.controlPointNextX:i.controlPointPreviousX,n?i.controlPointNextY:i.controlPointPreviousY,i.x,i.y):t.lineTo(i.x,i.y)}},ot=at;G.clear=at.clear,G.drawRoundedRectangle=function(t){t.beginPath(),at.roundedRect.apply(at,arguments)};var rt={_set:function(t,e){return G.merge(this[t]||(this[t]={}),e)}};rt._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var st=rt,lt=G.valueOrDefault;var dt={toLineHeight:function(t,e){var i=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,i,n,a;return G.isObject(t)?(e=+t.top||0,i=+t.right||0,n=+t.bottom||0,a=+t.left||0):e=i=n=a=+t||0,{top:e,right:i,bottom:n,left:a,height:e+n,width:a+i}},_parseFont:function(t){var e=st.global,i=lt(t.fontSize,e.defaultFontSize),n={family:lt(t.fontFamily,e.defaultFontFamily),lineHeight:G.options.toLineHeight(lt(t.lineHeight,e.defaultLineHeight),i),size:i,style:lt(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return n.string=function(t){return!t||G.isNullOrUndef(t.size)||G.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(n),n},resolve:function(t,e,i){var n,a,o;for(n=0,a=t.length;n<a;++n)if(void 0!==(o=t[n])&&(void 0!==e&&"function"==typeof o&&(o=o(e)),void 0!==i&&G.isArray(o)&&(o=o[i]),void 0!==o))return o}},ut=G,ht=$,ct=ot,ft=dt;ut.easing=ht,ut.canvas=ct,ut.options=ft;var gt=function(t){ut.extend(this,t),this.initialize.apply(this,arguments)};ut.extend(gt.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=ut.clone(t._model)),t._start={},t},transition:function(t){var e=this,i=e._model,n=e._start,a=e._view;return i&&1!==t?(a||(a=e._view={}),n||(n=e._start={}),function(t,e,i,n){var a,o,r,s,l,d,u,h,c,f=Object.keys(i);for(a=0,o=f.length;a<o;++a)if(d=i[r=f[a]],e.hasOwnProperty(r)||(e[r]=d),(s=e[r])!==d&&"_"!==r[0]){if(t.hasOwnProperty(r)||(t[r]=s),(u=typeof d)==typeof(l=t[r]))if("string"===u){if((h=X(l)).valid&&(c=X(d)).valid){e[r]=c.mix(h,n).rgbString();continue}}else if(ut.isFinite(l)&&ut.isFinite(d)){e[r]=l+(d-l)*n;continue}e[r]=d}}(n,a,i,t),e):(e._view=i,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return ut.isNumber(this._model.x)&&ut.isNumber(this._model.y)}}),gt.extend=ut.inherits;var pt=gt,mt=pt.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),vt=mt;Object.defineProperty(mt.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(mt.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),st._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:ut.noop,onComplete:ut.noop}});var bt={animations:[],request:null,addAnimation:function(t,e,i,n){var a,o,r=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=i,n||(t.animating=!0),a=0,o=r.length;a<o;++a)if(r[a].chart===t)return void(r[a]=e);r.push(e),1===r.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=ut.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=ut.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,i,n,a=this.animations,o=0;o<a.length;)e=(t=a[o]).chart,i=t.numSteps,n=Math.floor((Date.now()-t.startTime)/t.duration*i)+1,t.currentStep=Math.min(n,i),ut.callback(t.render,[e,t],e),ut.callback(t.onAnimationProgress,[t],e),t.currentStep>=i?(ut.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(o,1)):++o}},xt=ut.options.resolve,yt=["push","pop","shift","splice","unshift"];function kt(t,e){var i=t._chartjs;if(i){var n=i.listeners,a=n.indexOf(e);-1!==a&&n.splice(a,1),n.length>0||(yt.forEach(function(e){delete t[e]}),delete t._chartjs)}}var wt=function(t,e){this.initialize(t,e)};ut.extend(wt.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this.update(!0)},destroy:function(){this._data&&kt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);i.dataset=i.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,i=this,n=i.getDataset(),a=n.data||(n.data=[]);i._data!==a&&(i._data&&kt(i._data,i),a&&Object.isExtensible(a)&&(e=i,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),yt.forEach(function(e){var i="onData"+e.charAt(0).toUpperCase()+e.slice(1),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=n.apply(this,e);return ut.each(t._chartjs.listeners,function(t){"function"==typeof t[i]&&t[i].apply(t,e)}),a}})}))),i._data=a),i.resyncElements()},update:ut.noop,transition:function(t){for(var e=this.getMeta(),i=e.data||[],n=i.length,a=0;a<n;++a)i[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],i=e.length,n=0;for(t.dataset&&t.dataset.draw();n<i;++n)e[n].draw()},removeHoverStyle:function(t){ut.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model,o=ut.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=xt([n.hoverBackgroundColor,e.hoverBackgroundColor,o(a.backgroundColor)],void 0,i),a.borderColor=xt([n.hoverBorderColor,e.hoverBorderColor,o(a.borderColor)],void 0,i),a.borderWidth=xt([n.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,i)},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,i=t.data.length,n=e.length;n<i?t.data.splice(n,i-n):n>i&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;i<e;++i)this.addElementAndReset(t+i)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),wt.extend=ut.inherits;var Mt=wt;st._set("global",{elements:{arc:{backgroundColor:st.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var _t=pt.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var i=this._view;if(i){for(var n=ut.getAngleFromPoint(i,{x:t,y:e}),a=n.angle,o=n.distance,r=i.startAngle,s=i.endAngle;s<r;)s+=2*Math.PI;for(;a>s;)a-=2*Math.PI;for(;a<r;)a+=2*Math.PI;var l=a>=r&&a<=s,d=o>=i.innerRadius&&o<=i.outerRadius;return l&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t,e=this._chart.ctx,i=this._view,n=i.startAngle,a=i.endAngle,o="inner"===i.borderAlign?.33:0;e.save(),e.beginPath(),e.arc(i.x,i.y,Math.max(i.outerRadius-o,0),n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.fillStyle=i.backgroundColor,e.fill(),i.borderWidth&&("inner"===i.borderAlign?(e.beginPath(),t=o/i.outerRadius,e.arc(i.x,i.y,i.outerRadius,n-t,a+t),i.innerRadius>o?(t=o/i.innerRadius,e.arc(i.x,i.y,i.innerRadius-o,a+t,n-t,!0)):e.arc(i.x,i.y,o,a+Math.PI/2,n-Math.PI/2),e.closePath(),e.clip(),e.beginPath(),e.arc(i.x,i.y,i.outerRadius,n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.lineWidth=2*i.borderWidth,e.lineJoin="round"):(e.lineWidth=i.borderWidth,e.lineJoin="bevel"),e.strokeStyle=i.borderColor,e.stroke()),e.restore()}}),Ct=ut.valueOrDefault,St=st.global.defaultColor;st._set("global",{elements:{line:{tension:.4,backgroundColor:St,borderWidth:3,borderColor:St,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Pt=pt.extend({draw:function(){var t,e,i,n,a=this._view,o=this._chart.ctx,r=a.spanGaps,s=this._children.slice(),l=st.global,d=l.elements.line,u=-1;for(this._loop&&s.length&&s.push(s[0]),o.save(),o.lineCap=a.borderCapStyle||d.borderCapStyle,o.setLineDash&&o.setLineDash(a.borderDash||d.borderDash),o.lineDashOffset=Ct(a.borderDashOffset,d.borderDashOffset),o.lineJoin=a.borderJoinStyle||d.borderJoinStyle,o.lineWidth=Ct(a.borderWidth,d.borderWidth),o.strokeStyle=a.borderColor||l.defaultColor,o.beginPath(),u=-1,t=0;t<s.length;++t)e=s[t],i=ut.previousItem(s,t),n=e._view,0===t?n.skip||(o.moveTo(n.x,n.y),u=t):(i=-1===u?i:s[u],n.skip||(u!==t-1&&!r||-1===u?o.moveTo(n.x,n.y):ut.canvas.lineTo(o,i._view,e._view),u=t));o.stroke(),o.restore()}}),It=ut.valueOrDefault,At=st.global.defaultColor;function Dt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}st._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:At,borderColor:At,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var Tt=pt.extend({inRange:function(t,e){var i=this._view;return!!i&&Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2)},inLabelRange:Dt,inXRange:Dt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,i=this._chart.ctx,n=e.pointStyle,a=e.rotation,o=e.radius,r=e.x,s=e.y,l=st.global,d=l.defaultColor;e.skip||(void 0===t||ut.canvas._isPointInArea(e,t))&&(i.strokeStyle=e.borderColor||d,i.lineWidth=It(e.borderWidth,l.elements.point.borderWidth),i.fillStyle=e.backgroundColor||d,ut.canvas.drawPoint(i,n,o,r,s,a))}}),Ft=st.global.defaultColor;function Lt(t){return t&&void 0!==t.width}function Rt(t){var e,i,n,a,o;return Lt(t)?(o=t.width/2,e=t.x-o,i=t.x+o,n=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(o=t.height/2,e=Math.min(t.x,t.base),i=Math.max(t.x,t.base),n=t.y-o,a=t.y+o),{left:e,top:n,right:i,bottom:a}}function Ot(t,e,i){return t===e?i:t===i?e:t}function zt(t,e,i){var n,a,o,r,s=t.borderWidth,l=function(t){var e=t.borderSkipped,i={};return e?(t.horizontal?t.base>t.x&&(e=Ot(e,"left","right")):t.base<t.y&&(e=Ot(e,"bottom","top")),i[e]=!0,i):i}(t);return ut.isObject(s)?(n=+s.top||0,a=+s.right||0,o=+s.bottom||0,r=+s.left||0):n=a=o=r=+s||0,{t:l.top||n<0?0:n>i?i:n,r:l.right||a<0?0:a>e?e:a,b:l.bottom||o<0?0:o>i?i:o,l:l.left||r<0?0:r>e?e:r}}function Bt(t,e,i){var n=null===e,a=null===i,o=!(!t||n&&a)&&Rt(t);return o&&(n||e>=o.left&&e<=o.right)&&(a||i>=o.top&&i<=o.bottom)}st._set("global",{elements:{rectangle:{backgroundColor:Ft,borderColor:Ft,borderSkipped:"bottom",borderWidth:0}}});var Nt=pt.extend({draw:function(){var t=this._chart.ctx,e=this._view,i=function(t){var e=Rt(t),i=e.right-e.left,n=e.bottom-e.top,a=zt(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n},inner:{x:e.left+a.l,y:e.top+a.t,w:i-a.l-a.r,h:n-a.t-a.b}}}(e),n=i.outer,a=i.inner;t.fillStyle=e.backgroundColor,t.fillRect(n.x,n.y,n.w,n.h),n.w===a.w&&n.h===a.h||(t.save(),t.beginPath(),t.rect(n.x,n.y,n.w,n.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return Bt(this._view,t,e)},inLabelRange:function(t,e){var i=this._view;return Lt(i)?Bt(i,t,null):Bt(i,null,e)},inXRange:function(t){return Bt(this._view,t,null)},inYRange:function(t){return Bt(this._view,null,t)},getCenterPoint:function(){var t,e,i=this._view;return Lt(i)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return Lt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),Wt={},Vt=_t,Et=Pt,Ht=Tt,jt=Nt;Wt.Arc=Vt,Wt.Line=Et,Wt.Point=Ht,Wt.Rectangle=jt;var qt=ut.options.resolve;st._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});var Yt=Mt.extend({dataElementType:Wt.Rectangle,initialize:function(){var t;Mt.prototype.initialize.apply(this,arguments),(t=this.getMeta()).stack=this.getDataset().stack,t.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e<i;++e)this.updateElement(n[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.getMeta(),o=n.getDataset(),r=n._resolveElementOptions(t,e);t._xScale=n.getScaleForId(a.xAxisID),t._yScale=n.getScaleForId(a.yAxisID),t._datasetIndex=n.index,t._index=e,t._model={backgroundColor:r.backgroundColor,borderColor:r.borderColor,borderSkipped:r.borderSkipped,borderWidth:r.borderWidth,datasetLabel:o.label,label:n.chart.data.labels[e]},n._updateElementGeometry(t,e,i),t.pivot()},_updateElementGeometry:function(t,e,i){var n=this,a=t._model,o=n._getValueScale(),r=o.getBasePixel(),s=o.isHorizontal(),l=n._ruler||n.getRuler(),d=n.calculateBarValuePixels(n.index,e),u=n.calculateBarIndexPixels(n.index,e,l);a.horizontal=s,a.base=i?r:d.base,a.x=s?i?r:d.head:u.center,a.y=s?u.center:i?r:d.head,a.height=s?u.size:void 0,a.width=s?void 0:u.size},_getStacks:function(t){var e,i,n=this.chart,a=this._getIndexScale().options.stacked,o=void 0===t?n.data.datasets.length:t+1,r=[];for(e=0;e<o;++e)(i=n.getDatasetMeta(e)).bar&&n.isDatasetVisible(e)&&(!1===a||!0===a&&-1===r.indexOf(i.stack)||void 0===a&&(void 0===i.stack||-1===r.indexOf(i.stack)))&&r.push(i.stack);return r},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var i=this._getStacks(t),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n},getRuler:function(){var t,e,i=this._getIndexScale(),n=this.getStackCount(),a=this.index,o=i.isHorizontal(),r=o?i.left:i.top,s=r+(o?i.width:i.height),l=[];for(t=0,e=this.getMeta().data.length;t<e;++t)l.push(i.getPixelForValue(null,t,a));return{min:ut.isNullOrUndef(i.options.barThickness)?function(t,e){var i,n,a,o,r=t.isHorizontal()?t.width:t.height,s=t.getTicks();for(a=1,o=e.length;a<o;++a)r=Math.min(r,Math.abs(e[a]-e[a-1]));for(a=0,o=s.length;a<o;++a)n=t.getPixelForTick(a),r=a>0?Math.min(r,n-i):r,i=n;return r}(i,l):-1,pixels:l,start:r,end:s,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,o,r,s,l=this.chart,d=this.getMeta(),u=this._getValueScale(),h=u.isHorizontal(),c=l.data.datasets,f=+u.getRightValue(c[t].data[e]),g=u.options.minBarLength,p=u.options.stacked,m=d.stack,v=0;if(p||void 0===p&&void 0!==m)for(i=0;i<t;++i)(n=l.getDatasetMeta(i)).bar&&n.stack===m&&n.controller._getValueScaleId()===u.id&&l.isDatasetVisible(i)&&(a=+u.getRightValue(c[i].data[e]),(f<0&&a<0||f>=0&&a>0)&&(v+=a));return o=u.getPixelForValue(v),s=(r=u.getPixelForValue(v+f))-o,void 0!==g&&Math.abs(s)<g&&(s=g,r=f>=0&&!h||f<0&&h?o-g:o+g),{size:s,base:o,head:r,center:r+s/2}},calculateBarIndexPixels:function(t,e,i){var n=i.scale.options,a="flex"===n.barThickness?function(t,e,i){var n,a=e.pixels,o=a[t],r=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=i.categoryPercentage;return null===r&&(r=o-(null===s?e.end-e.start:s-o)),null===s&&(s=o+o-r),n=o-(o-Math.min(r,s))/2*l,{chunk:Math.abs(s-r)/2*l/e.stackCount,ratio:i.barPercentage,start:n}}(e,i,n):function(t,e,i){var n,a,o=i.barThickness,r=e.stackCount,s=e.pixels[t];return ut.isNullOrUndef(o)?(n=e.min*i.categoryPercentage,a=i.barPercentage):(n=o*r,a=1),{chunk:n/r,ratio:a,start:s-n/2}}(e,i,n),o=this.getStackIndex(t,this.getMeta().stack),r=a.start+a.chunk*o+a.chunk/2,s=Math.min(ut.valueOrDefault(n.maxBarThickness,1/0),a.chunk*a.ratio);return{base:r-s/2,head:r+s/2,center:r,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),i=this.getMeta().data,n=this.getDataset(),a=i.length,o=0;for(ut.canvas.clipArea(t.ctx,t.chartArea);o<a;++o)isNaN(e.getRightValue(n.data[o]))||i[o].draw();ut.canvas.unclipArea(t.ctx)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.rectangle,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderSkipped","borderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=qt([s[a],r[a],l[a]],u,e);return d}}),Ut=ut.valueOrDefault,Xt=ut.options.resolve;st._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"",n=e.datasets[t.datasetIndex].data[t.index];return i+": ("+t.xLabel+", "+t.yLabel+", "+n.r+")"}}}});var Kt=Mt.extend({dataElementType:Wt.Point,update:function(t){var e=this,i=e.getMeta().data;ut.each(i,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.getMeta(),o=t.custom||{},r=n.getScaleForId(a.xAxisID),s=n.getScaleForId(a.yAxisID),l=n._resolveElementOptions(t,e),d=n.getDataset().data[e],u=n.index,h=i?r.getPixelForDecimal(.5):r.getPixelForValue("object"==typeof d?d:NaN,e,u),c=i?s.getBasePixel():s.getPixelForValue(d,e,u);t._xScale=r,t._yScale=s,t._options=l,t._datasetIndex=u,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:i?0:l.radius,skip:o.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ut(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Ut(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Ut(i.hoverBorderWidth,i.borderWidth),e.radius=i.radius+i.hoverRadius},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d=r.data[e],u={},h={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},c=["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"];for(i=0,n=c.length;i<n;++i)u[a=c[i]]=Xt([s[a],r[a],l[a]],h,e);return u.radius=Xt([s.radius,d?d.r:void 0,r.radius,l.radius],h,e),u}}),Gt=ut.options.resolve,Zt=ut.valueOrDefault;st._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n],s=r&&r.custom||{},l=t.options.elements.arc;return{text:i,fillStyle:Gt([s.backgroundColor,o.backgroundColor,l.backgroundColor],void 0,n),strokeStyle:Gt([s.borderColor,o.borderColor,l.borderColor],void 0,n),lineWidth:Gt([s.borderWidth,o.borderWidth,l.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i<n;++i)(a=r.getDatasetMeta(i)).data[o]&&(a.data[o].hidden=!a.data[o].hidden);r.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.labels[t.index],n=": "+e.datasets[t.datasetIndex].data[t.index];return ut.isArray(i)?(i=i.slice())[0]+=n:i+=n,i}}}});var $t=Mt.extend({dataElementType:Wt.Arc,linkScales:ut.noop,getRingIndex:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var e,i,n=this,a=n.chart,o=a.chartArea,r=a.options,s=o.right-o.left,l=o.bottom-o.top,d=Math.min(s,l),u={x:0,y:0},h=n.getMeta(),c=h.data,f=r.cutoutPercentage,g=r.circumference,p=n._getRingWeight(n.index);if(g<2*Math.PI){var m=r.rotation%(2*Math.PI),v=(m+=2*Math.PI*(m>=Math.PI?-1:m<-Math.PI?1:0))+g,b={x:Math.cos(m),y:Math.sin(m)},x={x:Math.cos(v),y:Math.sin(v)},y=m<=0&&v>=0||m<=2*Math.PI&&2*Math.PI<=v,k=m<=.5*Math.PI&&.5*Math.PI<=v||m<=2.5*Math.PI&&2.5*Math.PI<=v,w=m<=-Math.PI&&-Math.PI<=v||m<=Math.PI&&Math.PI<=v,M=m<=.5*-Math.PI&&.5*-Math.PI<=v||m<=1.5*Math.PI&&1.5*Math.PI<=v,_=f/100,C={x:w?-1:Math.min(b.x*(b.x<0?1:_),x.x*(x.x<0?1:_)),y:M?-1:Math.min(b.y*(b.y<0?1:_),x.y*(x.y<0?1:_))},S={x:y?1:Math.max(b.x*(b.x>0?1:_),x.x*(x.x>0?1:_)),y:k?1:Math.max(b.y*(b.y>0?1:_),x.y*(x.y>0?1:_))},P={width:.5*(S.x-C.x),height:.5*(S.y-C.y)};d=Math.min(s/P.width,l/P.height),u={x:-.5*(S.x+C.x),y:-.5*(S.y+C.y)}}for(e=0,i=c.length;e<i;++e)c[e]._options=n._resolveElementOptions(c[e],e);for(a.borderWidth=n.getMaxBorderWidth(),a.outerRadius=Math.max((d-a.borderWidth)/2,0),a.innerRadius=Math.max(f?a.outerRadius/100*f:0,0),a.radiusLength=(a.outerRadius-a.innerRadius)/(n._getVisibleDatasetWeightTotal()||1),a.offsetX=u.x*a.outerRadius,a.offsetY=u.y*a.outerRadius,h.total=n.calculateTotal(),n.outerRadius=a.outerRadius-a.radiusLength*n._getRingWeightOffset(n.index),n.innerRadius=Math.max(n.outerRadius-a.radiusLength*p,0),e=0,i=c.length;e<i;++e)n.updateElement(c[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.chart,o=a.chartArea,r=a.options,s=r.animation,l=(o.left+o.right)/2,d=(o.top+o.bottom)/2,u=r.rotation,h=r.rotation,c=n.getDataset(),f=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(c.data[e])*(r.circumference/(2*Math.PI)),g=i&&s.animateScale?0:n.innerRadius,p=i&&s.animateScale?0:n.outerRadius,m=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_model:{backgroundColor:m.backgroundColor,borderColor:m.borderColor,borderWidth:m.borderWidth,borderAlign:m.borderAlign,x:l+a.offsetX,y:d+a.offsetY,startAngle:u,endAngle:h,circumference:f,outerRadius:p,innerRadius:g,label:ut.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;i&&s.animateRotate||(v.startAngle=0===e?r.rotation:n.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),i=this.getMeta(),n=0;return ut.each(i.data,function(i,a){t=e.data[a],isNaN(t)||i.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,i,n,a,o,r,s,l,d=0,u=this.chart;if(!t)for(e=0,i=u.data.datasets.length;e<i;++e)if(u.isDatasetVisible(e)){t=(n=u.getDatasetMeta(e)).data,e!==this.index&&(o=n.controller);break}if(!t)return 0;for(e=0,i=t.length;e<i;++e)a=t[e],"inner"!==(r=o?o._resolveElementOptions(a,e):a._options).borderAlign&&(s=r.borderWidth,d=(l=r.hoverBorderWidth)>(d=s>d?s:d)?l:d);return d},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Zt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Zt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Zt(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=Gt([s[a],r[a],l[a]],u,e);return d},_getRingWeightOffset:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e},_getRingWeight:function(t){return Math.max(Zt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});st._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}});var Jt=Yt.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Qt=ut.valueOrDefault,te=ut.options.resolve,ee=ut.canvas._isPointInArea;function ie(t,e){return Qt(t.showLine,e.showLines)}st._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var ne=Mt.extend({datasetElementType:Wt.Line,dataElementType:Wt.Point,update:function(t){var e,i,n=this,a=n.getMeta(),o=a.dataset,r=a.data||[],s=n.getScaleForId(a.yAxisID),l=n.getDataset(),d=ie(l,n.chart.options);for(d&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o._scale=s,o._datasetIndex=n.index,o._children=r,o._model=n._resolveLineOptions(o),o.pivot()),e=0,i=r.length;e<i;++e)n.updateElement(r[e],e,t);for(d&&0!==o._model.tension&&n.updateBezierControlPoints(),e=0,i=r.length;e<i;++e)r[e].pivot()},updateElement:function(t,e,i){var n,a,o=this,r=o.getMeta(),s=t.custom||{},l=o.getDataset(),d=o.index,u=l.data[e],h=o.getScaleForId(r.yAxisID),c=o.getScaleForId(r.xAxisID),f=r.dataset._model,g=o._resolvePointOptions(t,e);n=c.getPixelForValue("object"==typeof u?u:NaN,e,d),a=i?h.getBasePixel():o.calculatePointY(u,e,d),t._xScale=c,t._yScale=h,t._options=g,t._datasetIndex=d,t._index=e,t._model={x:n,y:a,skip:s.skip||isNaN(n)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Qt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)d[a=c[i]]=te([s[a],r[h[a]],r[a],l[a]],u,e);return d},_resolveLineOptions:function(t){var e,i,n,a=this.chart,o=a.data.datasets[this.index],r=t.custom||{},s=a.options,l=s.elements.line,d={},u=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","cubicInterpolationMode"];for(e=0,i=u.length;e<i;++e)d[n=u[e]]=te([r[n],o[n],l[n]]);return d.spanGaps=Qt(o.spanGaps,s.spanGaps),d.tension=Qt(o.lineTension,l.tension),d.steppedLine=te([r.steppedLine,o.steppedLine,l.stepped]),d},calculatePointY:function(t,e,i){var n,a,o,r=this.chart,s=this.getMeta(),l=this.getScaleForId(s.yAxisID),d=0,u=0;if(l.options.stacked){for(n=0;n<i;n++)if(a=r.data.datasets[n],"line"===(o=r.getDatasetMeta(n)).type&&o.yAxisID===l.id&&r.isDatasetVisible(n)){var h=Number(l.getRightValue(a.data[e]));h<0?u+=h||0:d+=h||0}var c=Number(l.getRightValue(t));return c<0?l.getPixelForValue(u+c):l.getPixelForValue(d+c)}return l.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,a=this.chart,o=this.getMeta(),r=o.dataset._model,s=a.chartArea,l=o.data||[];function d(t,e,i){return Math.max(Math.min(t,i),e)}if(r.spanGaps&&(l=l.filter(function(t){return!t._model.skip})),"monotone"===r.cubicInterpolationMode)ut.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)i=l[t]._model,n=ut.splineCurve(ut.previousItem(l,t)._model,i,ut.nextItem(l,t)._model,r.tension),i.controlPointPreviousX=n.previous.x,i.controlPointPreviousY=n.previous.y,i.controlPointNextX=n.next.x,i.controlPointNextY=n.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)i=l[t]._model,ee(i,s)&&(t>0&&ee(l[t-1]._model,s)&&(i.controlPointPreviousX=d(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=d(i.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&ee(l[t+1]._model,s)&&(i.controlPointNextX=d(i.controlPointNextX,s.left,s.right),i.controlPointNextY=d(i.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,i=this.getMeta(),n=i.data||[],a=e.chartArea,o=n.length,r=0;for(ie(this.getDataset(),e.options)&&(t=(i.dataset._model.borderWidth||0)/2,ut.canvas.clipArea(e.ctx,{left:a.left,right:a.right,top:a.top-t,bottom:a.bottom+t}),i.dataset.draw(),ut.canvas.unclipArea(e.ctx));r<o;++r)n[r].draw(a)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Qt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Qt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Qt(i.hoverBorderWidth,i.borderWidth),e.radius=Qt(i.hoverRadius,i.radius)}}),ae=ut.options.resolve;st._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n].custom||{},s=t.options.elements.arc;return{text:i,fillStyle:ae([r.backgroundColor,o.backgroundColor,s.backgroundColor],void 0,n),strokeStyle:ae([r.borderColor,o.borderColor,s.borderColor],void 0,n),lineWidth:ae([r.borderWidth,o.borderWidth,s.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i<n;++i)(a=r.getDatasetMeta(i)).data[o].hidden=!a.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var oe=Mt.extend({dataElementType:Wt.Arc,linkScales:ut.noop,update:function(t){var e,i,n,a=this,o=a.getDataset(),r=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],d=a._angles=[],u=r.data;for(a._updateRadius(),r.count=a.countVisibleElements(),e=0,i=o.data.length;e<i;e++)l[e]=s,n=a._computeAngle(e),d[e]=n,s+=n;for(e=0,i=u.length;e<i;++e)u[e]._options=a._resolveElementOptions(u[e],e),a.updateElement(u[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,i=e.chartArea,n=e.options,a=Math.min(i.right-i.left,i.bottom-i.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(n.cutoutPercentage?e.outerRadius/100*n.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,i){var n=this,a=n.chart,o=n.getDataset(),r=a.options,s=r.animation,l=a.scale,d=a.data.labels,u=l.xCenter,h=l.yCenter,c=r.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(o.data[e]),g=n._starts[e],p=g+(t.hidden?0:n._angles[e]),m=s.animateScale?0:l.getDistanceFromCenterForValue(o.data[e]),v=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:u,y:h,innerRadius:0,outerRadius:i?m:f,startAngle:i&&s.animateRotate?c:g,endAngle:i&&s.animateRotate?c:p,label:ut.valueAtIndexOrDefault(d,e,d[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),i=0;return ut.each(e.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor,a=ut.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=a(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=a(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=ae([s[a],r[a],l[a]],u,e);return d},_computeAngle:function(t){var e=this,i=this.getMeta().count,n=e.getDataset(),a=e.getMeta();if(isNaN(n.data[t])||a.data[t].hidden)return 0;var o={chart:e.chart,dataIndex:t,dataset:n,datasetIndex:e.index};return ae([e.chart.options.elements.arc.angle,2*Math.PI/i],o,t)}});st._set("pie",ut.clone(st.doughnut)),st._set("pie",{cutoutPercentage:0});var re=$t,se=ut.valueOrDefault,le=ut.options.resolve;st._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}});var de=Mt.extend({datasetElementType:Wt.Line,dataElementType:Wt.Point,linkScales:ut.noop,update:function(t){var e,i,n=this,a=n.getMeta(),o=a.dataset,r=a.data||[],s=n.chart.scale,l=n.getDataset();for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o._scale=s,o._datasetIndex=n.index,o._children=r,o._loop=!0,o._model=n._resolveLineOptions(o),o.pivot(),e=0,i=r.length;e<i;++e)n.updateElement(r[e],e,t);for(n.updateBezierControlPoints(),e=0,i=r.length;e<i;++e)r[e].pivot()},updateElement:function(t,e,i){var n=this,a=t.custom||{},o=n.getDataset(),r=n.chart.scale,s=r.getPointPositionForValue(e,o.data[e]),l=n._resolvePointOptions(t,e),d=n.getMeta().dataset._model,u=i?r.xCenter:s.x,h=i?r.yCenter:s.y;t._scale=r,t._options=l,t._datasetIndex=n.index,t._index=e,t._model={x:u,y:h,skip:a.skip||isNaN(u)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:se(a.tension,d?d.tension:0),hitRadius:l.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)d[a=c[i]]=le([s[a],r[h[a]],r[a],l[a]],u,e);return d},_resolveLineOptions:function(t){var e,i,n,a=this.chart,o=a.data.datasets[this.index],r=t.custom||{},s=a.options.elements.line,l={},d=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"];for(e=0,i=d.length;e<i;++e)l[n=d[e]]=le([r[n],o[n],s[n]]);return l.tension=se(o.lineTension,s.tension),l},updateBezierControlPoints:function(){var t,e,i,n,a=this.getMeta(),o=this.chart.chartArea,r=a.data||[];function s(t,e,i){return Math.max(Math.min(t,i),e)}for(t=0,e=r.length;t<e;++t)i=r[t]._model,n=ut.splineCurve(ut.previousItem(r,t,!0)._model,i,ut.nextItem(r,t,!0)._model,i.tension),i.controlPointPreviousX=s(n.previous.x,o.left,o.right),i.controlPointPreviousY=s(n.previous.y,o.top,o.bottom),i.controlPointNextX=s(n.next.x,o.left,o.right),i.controlPointNextY=s(n.next.y,o.top,o.bottom)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=se(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=se(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=se(i.hoverBorderWidth,i.borderWidth),e.radius=se(i.hoverRadius,i.radius)}});st._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}});var ue={bar:Yt,bubble:Kt,doughnut:$t,horizontalBar:Jt,line:ne,polarArea:oe,pie:re,radar:de,scatter:ne};function he(t,e){return t.native?{x:t.x,y:t.y}:ut.getRelativePosition(t,e)}function ce(t,e){var i,n,a,o,r;for(n=0,o=t.data.datasets.length;n<o;++n)if(t.isDatasetVisible(n))for(a=0,r=(i=t.getDatasetMeta(n)).data.length;a<r;++a){var s=i.data[a];s._view.skip||e(s)}}function fe(t,e){var i=[];return ce(t,function(t){t.inRange(e.x,e.y)&&i.push(t)}),i}function ge(t,e,i,n){var a=Number.POSITIVE_INFINITY,o=[];return ce(t,function(t){if(!i||t.inRange(e.x,e.y)){var r=t.getCenterPoint(),s=n(e,r);s<a?(o=[t],a=s):s===a&&o.push(t)}}),o}function pe(t){var e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){var a=e?Math.abs(t.x-n.x):0,o=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(o,2))}}function me(t,e,i){var n=he(e,t);i.axis=i.axis||"x";var a=pe(i.axis),o=i.intersect?fe(t,n):ge(t,n,!1,a),r=[];return o.length?(t.data.datasets.forEach(function(e,i){if(t.isDatasetVisible(i)){var n=t.getDatasetMeta(i).data[o[0]._index];n&&!n._view.skip&&r.push(n)}}),r):[]}var ve={modes:{single:function(t,e){var i=he(e,t),n=[];return ce(t,function(t){if(t.inRange(i.x,i.y))return n.push(t),n}),n.slice(0,1)},label:me,index:me,dataset:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis),o=i.intersect?fe(t,n):ge(t,n,!1,a);return o.length>0&&(o=t.getDatasetMeta(o[0]._datasetIndex).data),o},"x-axis":function(t,e){return me(t,e,{intersect:!1})},point:function(t,e){return fe(t,he(e,t))},nearest:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis);return ge(t,n,i.intersect,a)},x:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inXRange(n.x)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a},y:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inYRange(n.y)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a}}};function be(t,e){return ut.where(t,function(t){return t.position===e})}function xe(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}function ye(t,e){ut.each(t,function(t){e[t.position]+=t.isHorizontal()?t.height:t.width})}st._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var ke={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],o=a.length,r=0;r<o;++r)n=a[r],i.hasOwnProperty(n)&&(e[n]=i[n])},update:function(t,e,i){if(t){var n=t.options.layout||{},a=ut.options.toPadding(n.padding),o=a.left,r=a.right,s=a.top,l=a.bottom,d=be(t.boxes,"left"),u=be(t.boxes,"right"),h=be(t.boxes,"top"),c=be(t.boxes,"bottom"),f=be(t.boxes,"chartArea");xe(d,!0),xe(u,!1),xe(h,!0),xe(c,!1);var g,p=d.concat(u),m=h.concat(c),v=p.concat(m),b=e-o-r,x=i-s-l,y=(e-b/2)/p.length,k=b,w=x,M={top:s,left:o,bottom:l,right:r},_=[];ut.each(v,function(t){var e,i=t.isHorizontal();i?(e=t.update(t.fullWidth?b:k,x/2),w-=e.height):(e=t.update(y,w),k-=e.width),_.push({horizontal:i,width:e.width,box:t})}),g=function(t){var e=0,i=0,n=0,a=0;return ut.each(t,function(t){if(t.getPadding){var o=t.getPadding();e=Math.max(e,o.top),i=Math.max(i,o.left),n=Math.max(n,o.bottom),a=Math.max(a,o.right)}}),{top:e,left:i,bottom:n,right:a}}(v),ut.each(p,T),ye(p,M),ut.each(m,T),ye(m,M),ut.each(p,function(t){var e=ut.findNextWhere(_,function(e){return e.box===t}),i={left:0,right:0,top:M.top,bottom:M.bottom};e&&t.update(e.width,w,i)}),ye(v,M={top:s,left:o,bottom:l,right:r});var C=Math.max(g.left-M.left,0);M.left+=C,M.right+=Math.max(g.right-M.right,0);var S=Math.max(g.top-M.top,0);M.top+=S,M.bottom+=Math.max(g.bottom-M.bottom,0);var P=i-M.top-M.bottom,I=e-M.left-M.right;I===k&&P===w||(ut.each(p,function(t){t.height=P}),ut.each(m,function(t){t.fullWidth||(t.width=I)}),w=P,k=I);var A=o+C,D=s+S;ut.each(d.concat(h),F),A+=k,D+=w,ut.each(u,F),ut.each(c,F),t.chartArea={left:M.left,top:M.top,right:M.left+k,bottom:M.top+w},ut.each(f,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,w)})}function T(t){var e=ut.findNextWhere(_,function(e){return e.box===t});if(e)if(e.horizontal){var i={left:Math.max(M.left,g.left),right:Math.max(M.right,g.right),top:0,bottom:0};t.update(t.fullWidth?b:k,x/2,i)}else t.update(e.width,w)}function F(t){t.isHorizontal()?(t.left=t.fullWidth?o:M.left,t.right=t.fullWidth?e-r:M.left+k,t.top=D,t.bottom=D+t.height,D=t.bottom):(t.left=A,t.right=A+t.width,t.top=M.top,t.bottom=M.top+w,A=t.right)}}};var we,Me=(we=Object.freeze({default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&we.default||we,_e="$chartjs",Ce="chartjs-size-monitor",Se="chartjs-render-monitor",Pe="chartjs-render-animation",Ie=["animationstart","webkitAnimationStart"],Ae={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function De(t,e){var i=ut.getStyle(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?Number(n[1]):void 0}var Te=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Fe(t,e,i){t.addEventListener(e,i,Te)}function Le(t,e,i){t.removeEventListener(e,i,Te)}function Re(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Oe(t){var e=document.createElement("div");return e.className=t||"",e}function ze(t,e,i){var n,a,o,r,s=t[_e]||(t[_e]={}),l=s.resizer=function(t){var e=Oe(Ce),i=Oe(Ce+"-expand"),n=Oe(Ce+"-shrink");i.appendChild(Oe()),n.appendChild(Oe()),e.appendChild(i),e.appendChild(n),e._reset=function(){i.scrollLeft=1e6,i.scrollTop=1e6,n.scrollLeft=1e6,n.scrollTop=1e6};var a=function(){e._reset(),t()};return Fe(i,"scroll",a.bind(i,"expand")),Fe(n,"scroll",a.bind(n,"shrink")),e}((n=function(){if(s.resizer){var n=i.options.maintainAspectRatio&&t.parentNode,a=n?n.clientWidth:0;e(Re("resize",i)),n&&n.clientWidth<a&&i.canvas&&e(Re("resize",i))}},o=!1,r=[],function(){r=Array.prototype.slice.call(arguments),a=a||this,o||(o=!0,ut.requestAnimFrame.call(window,function(){o=!1,n.apply(a,r)}))}));!function(t,e){var i=t[_e]||(t[_e]={}),n=i.renderProxy=function(t){t.animationName===Pe&&e()};ut.each(Ie,function(e){Fe(t,e,n)}),i.reflow=!!t.offsetParent,t.classList.add(Se)}(t,function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}})}function Be(t){var e=t[_e]||{},i=e.resizer;delete e.resizer,function(t){var e=t[_e]||{},i=e.renderProxy;i&&(ut.each(Ie,function(e){Le(t,e,i)}),delete e.renderProxy),t.classList.remove(Se)}(t),i&&i.parentNode&&i.parentNode.removeChild(i)}var Ne={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(){var t,e,i;this._loaded||(this._loaded=!0,this.disableCSSInjection||(e=Me,i=(t=this)._style||document.createElement("style"),t._style||(t._style=i,e="/* Chart.js */\n"+e,i.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(i)),i.appendChild(document.createTextNode(e))))},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return this._ensureLoaded(),i&&i.canvas===t?(function(t,e){var i=t.style,n=t.getAttribute("height"),a=t.getAttribute("width");if(t[_e]={initial:{height:n,width:a,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===a||""===a){var o=De(t,"width");void 0!==o&&(t.width=o)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var r=De(t,"height");void 0!==o&&(t.height=r)}}(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e[_e]){var i=e[_e].initial;["height","width"].forEach(function(t){var n=i[t];ut.isNullOrUndef(n)?e.removeAttribute(t):e.setAttribute(t,n)}),ut.each(i.style||{},function(t,i){e.style[i]=t}),e.width=e.width,delete e[_e]}},addEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=i[_e]||(i[_e]={});Fe(n,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){i(function(t,e){var i=Ae[t.type]||t.type,n=ut.getRelativePosition(t,e);return Re(i,e,n.x,n.y,t)}(e,t))})}else ze(n,i,t)},removeEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=((i[_e]||{}).proxies||{})[t.id+"_"+e];a&&Le(n,e,a)}else Be(n)}};ut.addEvent=Fe,ut.removeEvent=Le;var We=Ne._enabled?Ne:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Ve=ut.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},We);st._set("global",{plugins:{}});var Ee={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var i=e.indexOf(t);-1!==i&&e.splice(i,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,i){var n,a,o,r,s,l=this.descriptors(t),d=l.length;for(n=0;n<d;++n)if("function"==typeof(s=(o=(a=l[n]).plugin)[e])&&((r=[t].concat(i||[])).push(a.options),!1===s.apply(o,r)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var i=[],n=[],a=t&&t.config||{},o=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach(function(t){if(-1===i.indexOf(t)){var e=t.id,a=o[e];!1!==a&&(!0===a&&(a=ut.clone(st.global.plugins[e])),i.push(t),n.push({plugin:t,options:a||{}}))}}),e.descriptors=n,e.id=this._cacheId,n},_invalidate:function(t){delete t.$plugins}},He={constructors:{},defaults:{},registerScaleType:function(t,e,i){this.constructors[t]=e,this.defaults[t]=ut.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?ut.merge({},[st.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=ut.extend(this.defaults[t],e))},addScalesToLayout:function(t){ut.each(t.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,ke.addBox(t,e)})}},je=ut.valueOrDefault;st._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:ut.noop,title:function(t,e){var i="",n=e.labels,a=n?n.length:0;if(t.length>0){var o=t[0];o.label?i=o.label:o.xLabel?i=o.xLabel:a>0&&o.index<a&&(i=n[o.index])}return i},afterTitle:ut.noop,beforeBody:ut.noop,beforeLabel:ut.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i&&(i+=": "),ut.isNullOrUndef(t.value)?i+=t.yLabel:i+=t.value,i},labelColor:function(t,e){var i=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:i.borderColor,backgroundColor:i.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:ut.noop,afterBody:ut.noop,beforeFooter:ut.noop,footer:ut.noop,afterFooter:ut.noop}}});var qe={average:function(t){if(!t.length)return!1;var e,i,n=0,a=0,o=0;for(e=0,i=t.length;e<i;++e){var r=t[e];if(r&&r.hasValue()){var s=r.tooltipPosition();n+=s.x,a+=s.y,++o}}return{x:n/o,y:a/o}},nearest:function(t,e){var i,n,a,o=e.x,r=e.y,s=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){var l=t[i];if(l&&l.hasValue()){var d=l.getCenterPoint(),u=ut.distanceBetweenPoints(e,d);u<s&&(s=u,a=l)}}if(a){var h=a.tooltipPosition();o=h.x,r=h.y}return{x:o,y:r}}};function Ye(t,e){return e&&(ut.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ue(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Xe(t){var e=st.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:je(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:je(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:je(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:je(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:je(t.titleFontStyle,e.defaultFontStyle),titleFontSize:je(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:je(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:je(t.footerFontStyle,e.defaultFontStyle),footerFontSize:je(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ke(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function Ge(t){return Ye([],Ue(t))}var Ze=pt.extend({initialize:function(){this._model=Xe(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),i=t.title.apply(this,arguments),n=t.afterTitle.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},getBeforeBody:function(){return Ge(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var i=this,n=i._options.callbacks,a=[];return ut.each(t,function(t){var o={before:[],lines:[],after:[]};Ye(o.before,Ue(n.beforeLabel.call(i,t,e))),Ye(o.lines,n.label.call(i,t,e)),Ye(o.after,Ue(n.afterLabel.call(i,t,e))),a.push(o)}),a},getAfterBody:function(){return Ge(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),i=t.footer.apply(this,arguments),n=t.afterFooter.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},update:function(t){var e,i,n,a,o,r,s,l,d,u,h=this,c=h._options,f=h._model,g=h._model=Xe(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var k=[],w=[];y=qe[c.position].call(h,p,h._eventPosition);var M=[];for(e=0,i=p.length;e<i;++e)M.push((n=p[e],a=void 0,o=void 0,r=void 0,s=void 0,l=void 0,d=void 0,u=void 0,a=n._xScale,o=n._yScale||n._scale,r=n._index,s=n._datasetIndex,l=n._chart.getDatasetMeta(s).controller,d=l._getIndexScale(),u=l._getValueScale(),{xLabel:a?a.getLabelForIndex(r,s):"",yLabel:o?o.getLabelForIndex(r,s):"",label:d?""+d.getLabelForIndex(r,s):"",value:u?""+u.getLabelForIndex(r,s):"",index:r,datasetIndex:s,x:n._model.x,y:n._model.y}));c.filter&&(M=M.filter(function(t){return c.filter(t,m)})),c.itemSort&&(M=M.sort(function(t,e){return c.itemSort(t,e,m)})),ut.each(M,function(t){k.push(c.callbacks.labelColor.call(h,t,h._chart)),w.push(c.callbacks.labelTextColor.call(h,t,h._chart))}),g.title=h.getTitle(M,m),g.beforeBody=h.getBeforeBody(M,m),g.body=h.getBody(M,m),g.afterBody=h.getAfterBody(M,m),g.footer=h.getFooter(M,m),g.x=y.x,g.y=y.y,g.caretPadding=c.caretPadding,g.labelColors=k,g.labelTextColors=w,g.dataPoints=M,x=function(t,e){var i=t._chart.ctx,n=2*e.yPadding,a=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,d=e.titleFontSize,u=e.bodyFontSize,h=e.footerFontSize;n+=s*d,n+=s?(s-1)*e.titleSpacing:0,n+=s?e.titleMarginBottom:0,n+=r*u,n+=r?(r-1)*e.bodySpacing:0,n+=l?e.footerMarginTop:0,n+=l*h,n+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,i.measureText(t).width+c)};return i.font=ut.fontString(d,e._titleFontStyle,e._titleFontFamily),ut.each(e.title,f),i.font=ut.fontString(u,e._bodyFontStyle,e._bodyFontFamily),ut.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?u+2:0,ut.each(o,function(t){ut.each(t.before,f),ut.each(t.lines,f),ut.each(t.after,f)}),c=0,i.font=ut.fontString(h,e._footerFontStyle,e._footerFontFamily),ut.each(e.footer,f),{width:a+=2*e.xPadding,height:n}}(this,g),b=function(t,e,i,n){var a=t.x,o=t.y,r=t.caretSize,s=t.caretPadding,l=t.cornerRadius,d=i.xAlign,u=i.yAlign,h=r+s,c=l+s;return"right"===d?a-=e.width:"center"===d&&((a-=e.width/2)+e.width>n.width&&(a=n.width-e.width),a<0&&(a=0)),"top"===u?o+=h:o-="bottom"===u?e.height+h:e.height/2,"center"===u?"left"===d?a+=h:"right"===d&&(a-=h):"left"===d?a-=c:"right"===d&&(a+=c),{x:a,y:o}}(g,x,v=function(t,e){var i,n,a,o,r,s=t._model,l=t._chart,d=t._chart.chartArea,u="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(d.left+d.right)/2,f=(d.top+d.bottom)/2;"center"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},o=function(t){return t-e.width-s.caretSize-s.caretPadding<0},r=function(t){return t<=f?"top":"bottom"},i(s.x)?(u="left",a(s.x)&&(u="center",h=r(s.y))):n(s.x)&&(u="right",o(s.x)&&(u="center",h=r(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:u,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,o,r,s,l,d=i.caretSize,u=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(n=f)-d,o=n,r=s+d,l=s-d):(a=(n=f+p)+d,o=n,r=s-d,l=s+d);else if("left"===h?(n=(a=f+u+d)-d,o=a+d):"right"===h?(n=(a=f+p-u-d)-d,o=a+d):(n=(a=i.caretX)-d,o=a+d),"top"===c)s=(r=g)-d,l=r;else{s=(r=g+m)+d,l=r;var v=o;o=n,n=v}return{x1:n,x2:a,x3:o,y1:r,y2:s,y3:l}},drawTitle:function(t,e,i){var n=e.title;if(n.length){t.x=Ke(e,e._titleAlign),i.textAlign=e._titleAlign,i.textBaseline="top";var a,o,r=e.titleFontSize,s=e.titleSpacing;for(i.fillStyle=e.titleFontColor,i.font=ut.fontString(r,e._titleFontStyle,e._titleFontFamily),a=0,o=n.length;a<o;++a)i.fillText(n[a],t.x,t.y),t.y+=r+s,a+1===n.length&&(t.y+=e.titleMarginBottom-s)}},drawBody:function(t,e,i){var n,a=e.bodyFontSize,o=e.bodySpacing,r=e._bodyAlign,s=e.body,l=e.displayColors,d=e.labelColors,u=0,h=l?Ke(e,"left"):0;i.textAlign=r,i.textBaseline="top",i.font=ut.fontString(a,e._bodyFontStyle,e._bodyFontFamily),t.x=Ke(e,r);var c=function(e){i.fillText(e,t.x+u,t.y),t.y+=a+o};i.fillStyle=e.bodyFontColor,ut.each(e.beforeBody,c),u=l&&"right"!==r?"center"===r?a/2+1:a+2:0,ut.each(s,function(o,r){n=e.labelTextColors[r],i.fillStyle=n,ut.each(o.before,c),ut.each(o.lines,function(o){l&&(i.fillStyle=e.legendColorBackground,i.fillRect(h,t.y,a,a),i.lineWidth=1,i.strokeStyle=d[r].borderColor,i.strokeRect(h,t.y,a,a),i.fillStyle=d[r].backgroundColor,i.fillRect(h+1,t.y+1,a-2,a-2),i.fillStyle=n),c(o)}),ut.each(o.after,c)}),u=0,ut.each(e.afterBody,c),t.y-=o},drawFooter:function(t,e,i){var n=e.footer;n.length&&(t.x=Ke(e,e._footerAlign),t.y+=e.footerMarginTop,i.textAlign=e._footerAlign,i.textBaseline="top",i.fillStyle=e.footerFontColor,i.font=ut.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),ut.each(n,function(n){i.fillText(n,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing}))},drawBackground:function(t,e,i,n){i.fillStyle=e.backgroundColor,i.strokeStyle=e.borderColor,i.lineWidth=e.borderWidth;var a=e.xAlign,o=e.yAlign,r=t.x,s=t.y,l=n.width,d=n.height,u=e.cornerRadius;i.beginPath(),i.moveTo(r+u,s),"top"===o&&this.drawCaret(t,n),i.lineTo(r+l-u,s),i.quadraticCurveTo(r+l,s,r+l,s+u),"center"===o&&"right"===a&&this.drawCaret(t,n),i.lineTo(r+l,s+d-u),i.quadraticCurveTo(r+l,s+d,r+l-u,s+d),"bottom"===o&&this.drawCaret(t,n),i.lineTo(r+u,s+d),i.quadraticCurveTo(r,s+d,r,s+d-u),"center"===o&&"left"===a&&this.drawCaret(t,n),i.lineTo(r,s+u),i.quadraticCurveTo(r,s,r+u,s),i.closePath(),i.fill(),e.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(t.save(),t.globalAlpha=a,this.drawBackground(n,e,t,i),n.y+=e.yPadding,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),t.restore())}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!ut.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),$e=qe,Je=Ze;Je.positioners=$e;var Qe=ut.valueOrDefault;function ti(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){if("xAxes"===t||"yAxes"===t){var a,o,r,s=i[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)r=i[t][a],o=Qe(r.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||r.type&&r.type!==e[t][a].type?ut.merge(e[t][a],[He.getScaleDefaults(o),r]):ut.merge(e[t][a],r)}else ut._merger(t,e,i,n)}})}function ei(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){var a=e[t]||{},o=i[t];"scales"===t?e[t]=ti(a,o):"scale"===t?e[t]=ut.merge(a,[He.getScaleDefaults(o.type),o]):ut._merger(t,e,i,n)}})}function ii(t){return"top"===t||"bottom"===t}st._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var ni=function(t,e){return this.construct(t,e),this};ut.extend(ni.prototype,{construct:function(t,e){var i=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=ei(st.global,st[t.type],t.options||{}),t}(e);var n=Ve.acquireContext(t,e),a=n&&n.canvas,o=a&&a.height,r=a&&a.width;i.id=ut.uid(),i.ctx=n,i.canvas=a,i.config=e,i.width=r,i.height=o,i.aspectRatio=o?r/o:null,i.options=e.options,i._bufferedRender=!1,i.chart=i,i.controller=i,ni.instances[i.id]=i,Object.defineProperty(i,"data",{get:function(){return i.config.data},set:function(t){i.config.data=t}}),n&&a?(i.initialize(),i.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Ee.notify(t,"beforeInit"),ut.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),Ee.notify(t,"afterInit"),t},clear:function(){return ut.canvas.clear(this),this},stop:function(){return bt.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,a=i.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(ut.getMaximumWidth(n))),r=Math.max(0,Math.floor(a?o/a:ut.getMaximumHeight(n)));if((e.width!==o||e.height!==r)&&(n.width=e.width=o,n.height=e.height=r,n.style.width=o+"px",n.style.height=r+"px",ut.retinaScale(e,i.devicePixelRatio),!t)){var s={width:o,height:r};Ee.notify(e,"resize",[s]),i.onResize&&i.onResize(e,s),e.stop(),e.update({duration:i.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;ut.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),ut.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,i=t.scales||{},n=[],a=Object.keys(i).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(n=n.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&n.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),ut.each(n,function(e){var n=e.options,o=n.id,r=Qe(n.type,e.dtype);ii(n.position)!==ii(e.dposition)&&(n.position=e.dposition),a[o]=!0;var s=null;if(o in i&&i[o].type===r)(s=i[o]).options=n,s.ctx=t.ctx,s.chart=t;else{var l=He.getScaleConstructor(r);if(!l)return;s=new l({id:o,type:r,options:n,ctx:t.ctx,chart:t}),i[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),ut.each(a,function(t,e){t||delete i[e]}),t.scales=i,He.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t=this,e=[];return ut.each(t.data.datasets,function(i,n){var a=t.getDatasetMeta(n),o=i.type||t.config.type;if(a.type&&a.type!==o&&(t.destroyDatasetMeta(n),a=t.getDatasetMeta(n)),a.type=o,a.controller)a.controller.updateIndex(n),a.controller.linkScales();else{var r=ue[a.type];if(void 0===r)throw new Error('"'+a.type+'" is not a chart type.');a.controller=new r(t,n),e.push(a.controller)}},t),e},resetElements:function(){var t=this;ut.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,i,n=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),i=(e=n).options,ut.each(e.scales,function(t){ke.removeBox(e,t)}),i=ei(st.global,st[e.config.type],i),e.options=e.config.options=i,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=i.tooltips,e.tooltip.initialize(),Ee._invalidate(n),!1!==Ee.notify(n,"beforeUpdate")){n.tooltip._data=n.data;var a=n.buildOrUpdateControllers();ut.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),n.updateLayout(),n.options.animation&&n.options.animation.duration&&ut.each(a,function(t){t.reset()}),n.updateDatasets(),n.tooltip.initialize(),n.lastActive=[],Ee.notify(n,"afterUpdate"),n._bufferedRender?n._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:n.render(t)}},updateLayout:function(){!1!==Ee.notify(this,"beforeLayout")&&(ke.update(this,this.width,this.height),Ee.notify(this,"afterScaleUpdate"),Ee.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==Ee.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Ee.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),i={meta:e,index:t};!1!==Ee.notify(this,"beforeDatasetUpdate",[i])&&(e.controller.update(),Ee.notify(this,"afterDatasetUpdate",[i]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var i=e.options.animation,n=Qe(t.duration,i&&i.duration),a=t.lazy;if(!1!==Ee.notify(e,"beforeRender")){var o=function(t){Ee.notify(e,"afterRender"),ut.callback(i&&i.onComplete,[t],e)};if(i&&n){var r=new vt({numSteps:n/16.66,easing:t.easing||i.easing,render:function(t,e){var i=ut.easing.effects[e.easing],n=e.currentStep,a=n/e.numSteps;t.draw(i(a),a,n)},onAnimationProgress:i.onProgress,onAnimationComplete:o});bt.addAnimation(e,r,n,a)}else e.draw(),o(new vt({numSteps:0,chart:e}));return e}},draw:function(t){var e=this;e.clear(),ut.isNullOrUndef(t)&&(t=1),e.transition(t),e.width<=0||e.height<=0||!1!==Ee.notify(e,"beforeDraw",[t])&&(ut.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.drawDatasets(t),e._drawTooltip(t),Ee.notify(e,"afterDraw",[t]))},transition:function(t){for(var e=0,i=(this.data.datasets||[]).length;e<i;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==Ee.notify(e,"beforeDatasetsDraw",[t])){for(var i=(e.data.datasets||[]).length-1;i>=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);Ee.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==Ee.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),Ee.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==Ee.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),Ee.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return ve.modes.single(this,t)},getElementsAtEvent:function(t){return ve.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ve.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=ve.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return ve.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e<i;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,i=this.data.datasets[t],n=i._meta&&i._meta[e];n&&(n.controller.destroy(),delete i._meta[e])},destroy:function(){var t,e,i=this,n=i.canvas;for(i.stop(),t=0,e=i.data.datasets.length;t<e;++t)i.destroyDatasetMeta(t);n&&(i.unbindEvents(),ut.canvas.clear(i),Ve.releaseContext(i.ctx),i.canvas=null,i.ctx=null),Ee.notify(i,"destroy"),delete ni.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Je({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},i=function(){t.eventHandler.apply(t,arguments)};ut.each(t.options.events,function(n){Ve.addEventListener(t,n,i),e[n]=i}),t.options.responsive&&(i=function(){t.resize()},Ve.addEventListener(t,"resize",i),e.resize=i)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,ut.each(e,function(e,i){Ve.removeEventListener(t,i,e)}))},updateHoverStyle:function(t,e,i){var n,a,o,r=i?"setHoverStyle":"removeHoverStyle";for(a=0,o=t.length;a<o;++a)(n=t[a])&&this.getDatasetMeta(n._datasetIndex).controller[r](n)},eventHandler:function(t){var e=this,i=e.tooltip;if(!1!==Ee.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var n=e.handleEvent(t);i&&(n=i._start?i.handleEvent(t):n|i.handleEvent(t)),Ee.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):n&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,i=this,n=i.options||{},a=n.hover;return i.lastActive=i.lastActive||[],"mouseout"===t.type?i.active=[]:i.active=i.getElementsAtEventForMode(t,a.mode,a),ut.callback(n.onHover||n.hover.onHover,[t.native,i.active],i),"mouseup"!==t.type&&"click"!==t.type||n.onClick&&n.onClick.call(i,t.native,i.active),i.lastActive.length&&i.updateHoverStyle(i.lastActive,a.mode,!1),i.active.length&&a.mode&&i.updateHoverStyle(i.active,a.mode,!0),e=!ut.arrayEquals(i.active,i.lastActive),i.lastActive=i.active,e}}),ni.instances={};var ai=ni;ni.Controller=ni,ni.types={},ut.configMerge=ei,ut.scaleMerge=ti;function oi(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function ri(t){this.options=t||{}}ut.extend(ri.prototype,{formats:oi,parse:oi,format:oi,add:oi,diff:oi,startOf:oi,endOf:oi,_create:function(t){return t}}),ri.override=function(t){ut.extend(ri.prototype,t)};var si={_date:ri},li={formatters:{values:function(t){return ut.isArray(t)?t:""+t},linear:function(t,e,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var a=ut.log10(Math.abs(n)),o="";if(0!==t)if(Math.max(Math.abs(i[0]),Math.abs(i[i.length-1]))<1e-4){var r=ut.log10(Math.abs(t));o=t.toExponential(Math.floor(r)-Math.floor(a))}else{var s=-1*Math.floor(a);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,e,i){var n=t/Math.pow(10,Math.floor(ut.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===e||e===i.length-1?t.toExponential():""}}},di=ut.valueOrDefault,ui=ut.valueAtIndexOrDefault;function hi(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(t[e].label);return n}function ci(t,e,i){return ut.isArray(e)?ut.longestText(t,i,e):t.measureText(e).width}st._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:li.formatters.values,minor:{},major:{}}});var fi=pt.extend({getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;for(var e in!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1}),t)"major"!==e&&"minor"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){ut.callback(this.options.beforeUpdate,[this])},update:function(t,e,i){var n,a,o,r,s,l,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=ut.extend({left:0,right:0,top:0,bottom:0},i),d._maxLabelLines=0,d.longestLabelWidth=0,d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),s=d.buildTicks()||[],s=d.afterBuildTicks(s)||s,d.beforeTickToLabelConversion(),o=d.convertTicksToLabels(s)||d.ticks,d.afterTickToLabelConversion(),d.ticks=o,n=0,a=o.length;n<a;++n)r=o[n],(l=s[n])?l.label=r:s.push(l={label:r,major:!1});return d._ticks=s,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){ut.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){ut.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){ut.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){ut.callback(this.options.beforeDataLimits,[this])},determineDataLimits:ut.noop,afterDataLimits:function(){ut.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){ut.callback(this.options.beforeBuildTicks,[this])},buildTicks:ut.noop,afterBuildTicks:function(t){var e=this;return ut.isArray(t)&&t.length?ut.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=ut.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){ut.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){ut.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){ut.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,i=t.options.ticks,n=hi(t._ticks),a=ut.options._parseFont(i);e.font=a.string;var o=i.minRotation||0;if(n.length&&t.options.display&&t.isHorizontal())for(var r,s=ut.longestText(e,a.string,n,t.longestTextCache),l=s,d=t.getPixelForTick(1)-t.getPixelForTick(0)-6;l>d&&o<i.maxRotation;){var u=ut.toRadians(o);if(r=Math.cos(u),Math.sin(u)*s>t.maxHeight){o--;break}o++,l=r*s}t.labelRotation=o},afterCalculateTickRotation:function(){ut.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){ut.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},i=hi(t._ticks),n=t.options,a=n.ticks,o=n.scaleLabel,r=n.gridLines,s=t._isVisible(),l=n.position,d=t.isHorizontal(),u=ut.options._parseFont,h=u(a),c=n.gridLines.tickMarkLength;if(e.width=d?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&r.drawTicks?c:0,e.height=d?s&&r.drawTicks?c:0:t.maxHeight,o.display&&s){var f=u(o),g=ut.options.toPadding(o.padding),p=f.lineHeight+g.height;d?e.height+=p:e.width+=p}if(a.display&&s){var m=ut.longestText(t.ctx,h.string,i,t.longestTextCache),v=ut.numberOfLabelLines(i),b=.5*h.size,x=t.options.ticks.padding;if(t._maxLabelLines=v,t.longestLabelWidth=m,d){var y=ut.toRadians(t.labelRotation),k=Math.cos(y),w=Math.sin(y)*m+h.lineHeight*v+b;e.height=Math.min(t.maxHeight,e.height+w+x),t.ctx.font=h.string;var M,_,C=ci(t.ctx,i[0],h.string),S=ci(t.ctx,i[i.length-1],h.string),P=t.getPixelForTick(0)-t.left,I=t.right-t.getPixelForTick(i.length-1);0!==t.labelRotation?(M="bottom"===l?k*C:k*b,_="bottom"===l?k*b:k*S):(M=C/2,_=S/2),t.paddingLeft=Math.max(M-P,0)+3,t.paddingRight=Math.max(_-I,0)+3}else a.mirror?m=0:m+=x+b,e.width=Math.min(t.maxWidth,e.width+m),t.paddingTop=h.size/2,t.paddingBottom=h.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){ut.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ut.isNullOrUndef(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:ut.noop,getPixelForValue:ut.noop,getValueForPixel:ut.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var o=e.left+a;return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+i;return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n=this,a=n.isHorizontal(),o=n.options.ticks.minor,r=t.length,s=!1,l=o.maxTicksLimit,d=n._tickSize()*(r-1),u=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.PaddingBottom),h=[];for(d>u&&(s=1+Math.floor(d/u)),r>l&&(s=Math.max(s,1+Math.floor(r/l))),e=0;e<r;e++)i=t[e],s>1&&e%s>0&&delete i.label,h.push(i);return h},_tickSize:function(){var t=this,e=t.isHorizontal(),i=t.options.ticks.minor,n=ut.toRadians(t.labelRotation),a=Math.abs(Math.cos(n)),o=Math.abs(Math.sin(n)),r=i.autoSkipPadding||0,s=t.longestLabelWidth+r||0,l=ut.options._parseFont(i),d=t._maxLabelLines*l.lineHeight+r||0;return e?d*a>s*o?s/a:d/o:d*o<s*a?d/a:s/o},_isVisible:function(){var t,e,i,n=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=n.data.datasets.length;t<e;++t)if(n.isDatasetVisible(t)&&((i=n.getDatasetMeta(t)).xAxisID===this.id||i.yAxisID===this.id))return!0;return!1},draw:function(t){var e=this,i=e.options;if(e._isVisible()){var n,a,o,r=e.chart,s=e.ctx,l=st.global.defaultFontColor,d=i.ticks.minor,u=i.ticks.major||d,h=i.gridLines,c=i.scaleLabel,f=i.position,g=0!==e.labelRotation,p=d.mirror,m=e.isHorizontal(),v=ut.options._parseFont,b=d.display&&d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),x=di(d.fontColor,l),y=v(d),k=y.lineHeight,w=di(u.fontColor,l),M=v(u),_=d.padding,C=d.labelOffset,S=h.drawTicks?h.tickMarkLength:0,P=di(c.fontColor,l),I=v(c),A=ut.options.toPadding(c.padding),D=ut.toRadians(e.labelRotation),T=[],F=h.drawBorder?ui(h.lineWidth,0,0):0,L=ut._alignPixel;"top"===f?(n=L(r,e.bottom,F),a=e.bottom-S,o=n-F/2):"bottom"===f?(n=L(r,e.top,F),a=n+F/2,o=e.top+S):"left"===f?(n=L(r,e.right,F),a=e.right-S,o=n-F/2):(n=L(r,e.left,F),a=n+F/2,o=e.left+S);if(ut.each(b,function(n,s){if(!ut.isNullOrUndef(n.label)){var l,d,u,c,v,b,x,y,w,M,P,I,A,R,O,z,B=n.label;s===e.zeroLineIndex&&i.offset===h.offsetGridLines?(l=h.zeroLineWidth,d=h.zeroLineColor,u=h.zeroLineBorderDash||[],c=h.zeroLineBorderDashOffset||0):(l=ui(h.lineWidth,s),d=ui(h.color,s),u=h.borderDash||[],c=h.borderDashOffset||0);var N=ut.isArray(B)?B.length:1,W=function(t,e,i){var n=t.getPixelForTick(e);return i&&(1===t.getTicks().length?n-=t.isHorizontal()?Math.max(n-t.left,t.right-n):Math.max(n-t.top,t.bottom-n):n-=0===e?(t.getPixelForTick(1)-n)/2:(n-t.getPixelForTick(e-1))/2),n}(e,s,h.offsetGridLines);if(m){var V=S+_;W<e.left-1e-7&&(d="rgba(0,0,0,0)"),v=x=w=P=L(r,W,l),b=a,y=o,A=e.getPixelForTick(s)+C,"top"===f?(M=L(r,t.top,F)+F/2,I=t.bottom,O=((g?1:.5)-N)*k,z=g?"left":"center",R=e.bottom-V):(M=t.top,I=L(r,t.bottom,F)-F/2,O=(g?0:.5)*k,z=g?"right":"center",R=e.top+V)}else{var E=(p?0:S)+_;W<e.top-1e-7&&(d="rgba(0,0,0,0)"),v=a,x=o,b=y=M=I=L(r,W,l),R=e.getPixelForTick(s)+C,O=(1-N)*k/2,"left"===f?(w=L(r,t.left,F)+F/2,P=t.right,z=p?"left":"right",A=e.right-E):(w=t.left,P=L(r,t.right,F)-F/2,z=p?"right":"left",A=e.left+E)}T.push({tx1:v,ty1:b,tx2:x,ty2:y,x1:w,y1:M,x2:P,y2:I,labelX:A,labelY:R,glWidth:l,glColor:d,glBorderDash:u,glBorderDashOffset:c,rotation:-1*D,label:B,major:n.major,textOffset:O,textAlign:z})}}),ut.each(T,function(t){var e=t.glWidth,i=t.glColor;if(h.display&&e&&i&&(s.save(),s.lineWidth=e,s.strokeStyle=i,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),h.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=t.major?M.string:y.string,s.fillStyle=t.major?w:x,s.textBaseline="middle",s.textAlign=t.textAlign;var n=t.label,a=t.textOffset;if(ut.isArray(n))for(var o=0;o<n.length;++o)s.fillText(""+n[o],0,a),a+=k;else s.fillText(n,0,a);s.restore()}}),c.display){var R,O,z=0,B=I.lineHeight/2;if(m)R=e.left+(e.right-e.left)/2,O="bottom"===f?e.bottom-B-A.bottom:e.top+B+A.top;else{var N="left"===f;R=N?e.left+B+A.top:e.right-B-A.top,O=e.top+(e.bottom-e.top)/2,z=N?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(R,O),s.rotate(z),s.textAlign="center",s.textBaseline="middle",s.fillStyle=P,s.font=I.string,s.fillText(c.labelString,0,0),s.restore()}if(F){var W,V,E,H,j=F,q=ui(h.lineWidth,b.length-1,0);m?(W=L(r,e.left,j)-j/2,V=L(r,e.right,q)+q/2,E=H=n):(E=L(r,e.top,j)-j/2,H=L(r,e.bottom,q)+q/2,W=V=n),s.lineWidth=F,s.strokeStyle=ui(h.color,0),s.beginPath(),s.moveTo(W,E),s.lineTo(V,H),s.stroke()}}}}),gi=fi.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t,e=this,i=e.getLabels();e.minIndex=0,e.maxIndex=i.length-1,void 0!==e.options.ticks.min&&(t=i.indexOf(e.options.ticks.min),e.minIndex=-1!==t?t:e.minIndex),void 0!==e.options.ticks.max&&(t=i.indexOf(e.options.ticks.max),e.maxIndex=-1!==t?t:e.maxIndex),e.min=i[e.minIndex],e.max=i[e.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var i=this,n=i.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===i.id?i.getRightValue(n.data.datasets[e].data[t]):i.ticks[t-i.minIndex]},getPixelForValue:function(t,e){var i,n=this,a=n.options.offset,o=Math.max(n.maxIndex+1-n.minIndex-(a?0:1),1);if(null!=t&&(i=n.isHorizontal()?t.x:t.y),void 0!==i||void 0!==t&&isNaN(e)){t=i||t;var r=n.getLabels().indexOf(t);e=-1!==r?r:e}if(n.isHorizontal()){var s=n.width/o,l=s*(e-n.minIndex);return a&&(l+=s/2),n.left+l}var d=n.height/o,u=d*(e-n.minIndex);return a&&(u+=d/2),n.top+u},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,i=e.options.offset,n=Math.max(e._ticks.length-(i?0:1),1),a=e.isHorizontal(),o=(a?e.width:e.height)/n;return t-=a?e.left:e.top,i&&(t-=o/2),(t<=0?0:Math.round(t/o))+e.minIndex},getBasePixel:function(){return this.bottom}}),pi={position:"bottom"};gi._defaults=pi;var mi=ut.noop,vi=ut.isNullOrUndef;var bi=fi.extend({getRightValue:function(t){return"string"==typeof t?+t:fi.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var i=ut.sign(t.min),n=ut.sign(t.max);i<0&&n<0?t.max=0:i>0&&n>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==o&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,i=e.stepSize,n=e.maxTicksLimit;return i?t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1:(t=this._computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:mi,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),n={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,precision:e.precision,stepSize:ut.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var i,n,a,o,r=[],s=t.stepSize,l=s||1,d=t.maxTicks-1,u=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=ut.niceNum((g-f)/d/l)*l;if(p<1e-14&&vi(u)&&vi(h))return[f,g];(o=Math.ceil(g/p)-Math.floor(f/p))>d&&(p=ut.niceNum(o*p/d/l)*l),s||vi(c)?i=Math.pow(10,ut._decimalPlaces(p)):(i=Math.pow(10,c),p=Math.ceil(p*i)/i),n=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!vi(u)&&ut.almostWhole(u/p,p/1e3)&&(n=u),!vi(h)&&ut.almostWhole(h/p,p/1e3)&&(a=h)),o=(a-n)/p,o=ut.almostEquals(o,Math.round(o),p/1e3)?Math.round(o):Math.ceil(o),n=Math.round(n*i)/i,a=Math.round(a*i)/i,r.push(vi(u)?n:u);for(var m=1;m<o;++m)r.push(Math.round((n+m*p)*i)/i);return r.push(vi(h)?a:h),r}(n,t);t.handleDirectionalChanges(),t.max=ut.max(a),t.min=ut.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),fi.prototype.convertTicksToLabels.call(t)}}),xi={position:"left",ticks:{callback:li.formatters.linear}},yi=bi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");void 0===s[l]&&(s[l]={positiveValues:[],negativeValues:[]});var d=s[l].positiveValues,u=s[l].negativeValues;i.isDatasetVisible(a)&&o(r)&&ut.each(n.data,function(i,n){var a=+t.getRightValue(i);isNaN(a)||r.data[n].hidden||(d[n]=d[n]||0,u[n]=u[n]||0,e.relativePoints?d[n]=100:a<0?u[n]+=a:d[n]+=a)})}),ut.each(s,function(e){var i=e.positiveValues.concat(e.negativeValues),n=ut.min(i),a=ut.max(i);t.min=null===t.min?n:Math.min(t.min,n),t.max=null===t.max?a:Math.max(t.max,a)})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=ut.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}}),ki=xi;yi._defaults=ki;var wi=ut.valueOrDefault;var Mi={position:"left",ticks:{callback:li.formatters.logarithmic}};function _i(t,e){return ut.isFinite(t)&&t>=0?t:e}var Ci=fi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");i.isDatasetVisible(a)&&o(r)&&(void 0===s[l]&&(s[l]=[]),ut.each(n.data,function(e,i){var n=s[l],a=+t.getRightValue(e);isNaN(a)||r.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),ut.each(s,function(e){if(e.length>0){var i=ut.min(e),n=ut.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?n:Math.max(t.max,n)}})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||n<0||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n),0!==n&&(null===t.minNotZero||n<t.minNotZero)&&(t.minNotZero=n))})});this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=_i(e.min,t.min),t.max=_i(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(ut.log10(t.min))-1),t.max=Math.pow(10,Math.floor(ut.log10(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(ut.log10(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(ut.log10(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(ut.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),n={min:_i(e.min),max:_i(e.max)},a=t.ticks=function(t,e){var i,n,a=[],o=wi(t.min,Math.pow(10,Math.floor(ut.log10(e.min)))),r=Math.floor(ut.log10(e.max)),s=Math.ceil(e.max/Math.pow(10,r));0===o?(i=Math.floor(ut.log10(e.minNotZero)),n=Math.floor(e.minNotZero/Math.pow(10,i)),a.push(o),o=n*Math.pow(10,i)):(i=Math.floor(ut.log10(o)),n=Math.floor(o/Math.pow(10,i)));var l=i<0?Math.pow(10,Math.abs(i)):1;do{a.push(o),10==++n&&(n=1,l=++i>=0?1:l),o=Math.round(n*Math.pow(10,i)*l)/l}while(i<r||i===r&&n<s);var d=wi(t.max,o);return a.push(d),a}(n,t);t.max=ut.max(a),t.min=ut.min(a),e.reverse?(i=!i,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),i&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),fi.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},_getFirstTickValue:function(t){var e=Math.floor(ut.log10(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},getPixelForValue:function(t){var e,i,n,a,o,r=this,s=r.options.ticks,l=s.reverse,d=ut.log10,u=r._getFirstTickValue(r.minNotZero),h=0;return t=+r.getRightValue(t),l?(n=r.end,a=r.start,o=-1):(n=r.start,a=r.end,o=1),r.isHorizontal()?(e=r.width,i=l?r.right:r.left):(e=r.height,o*=-1,i=l?r.top:r.bottom),t!==n&&(0===n&&(e-=h=wi(s.fontSize,st.global.defaultFontSize),n=u),0!==t&&(h+=e/(d(a)-d(n))*(d(t)-d(n))),i+=o*h),i},getValueForPixel:function(t){var e,i,n,a,o=this,r=o.options.ticks,s=r.reverse,l=ut.log10,d=o._getFirstTickValue(o.minNotZero);if(s?(i=o.end,n=o.start):(i=o.start,n=o.end),o.isHorizontal()?(e=o.width,a=s?o.right-t:t-o.left):(e=o.height,a=s?t-o.top:o.bottom-t),a!==i){if(0===i){var u=wi(r.fontSize,st.global.defaultFontSize);a-=u,e-=u,i=d}a*=l(n)-l(i),a/=e,a=Math.pow(10,l(i)+a)}return a}}),Si=Mi;Ci._defaults=Si;var Pi=ut.valueOrDefault,Ii=ut.valueAtIndexOrDefault,Ai=ut.options.resolve,Di={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:li.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Ti(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function Fi(t){var e=t.ticks;return e.display&&t.display?Pi(e.fontSize,st.global.defaultFontSize)+2*e.backdropPaddingY:0}function Li(t,e,i,n,a){return t===n||t===a?{start:e-i/2,end:e+i/2}:t<n||t>a?{start:e-i,end:e}:{start:e,end:e+i}}function Ri(t){return 0===t||180===t?"center":t<180?"left":"right"}function Oi(t,e,i,n){var a,o,r=i.y+n/2;if(ut.isArray(e))for(a=0,o=e.length;a<o;++a)t.fillText(e[a],i.x,r),r+=n;else t.fillText(e,i.x,r)}function zi(t,e,i){90===t||270===t?i.y-=e.h/2:(t>270||t<90)&&(i.y-=e.h)}function Bi(t){return ut.isNumber(t)?t:0}var Ni=bi.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Fi(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;ut.each(e.data.datasets,function(a,o){if(e.isDatasetVisible(o)){var r=e.getDatasetMeta(o);ut.each(a.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||r.data[a].hidden||(i=Math.min(o,i),n=Math.max(o,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Fi(this.options))},convertTicksToLabels:function(){var t=this;bi.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(t.options.pointLabels.callback,t)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,i,n,a=ut.options._parseFont(t.options.pointLabels),o={l:0,r:t.width,t:0,b:t.height-t.paddingTop},r={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,d,u=Ti(t);for(e=0;e<u;e++){n=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,d=t.pointLabels[e]||"",i=ut.isArray(d)?{w:ut.longestText(s,s.font,d),h:d.length*l}:{w:s.measureText(d).width,h:l},t._pointLabelSizes[e]=i;var h=t.getIndexAngle(e),c=ut.toDegrees(h)%360,f=Li(c,n.x,i.w,0,180),g=Li(c,n.y,i.h,90,270);f.start<o.l&&(o.l=f.start,r.l=h),f.end>o.r&&(o.r=f.end,r.r=h),g.start<o.t&&(o.t=g.start,r.t=h),g.end>o.b&&(o.b=g.end,r.b=h)}t.setReductions(t.drawingArea,o,r)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,i){var n=this,a=e.l/Math.sin(i.l),o=Math.max(e.r-n.width,0)/Math.sin(i.r),r=-e.t/Math.cos(i.t),s=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);a=Bi(a),o=Bi(o),r=Bi(r),s=Bi(s),n.drawingArea=Math.min(Math.floor(t-(a+o)/2),Math.floor(t-(r+s)/2)),n.setCenterPoint(a,o,r,s)},setCenterPoint:function(t,e,i,n){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,s=i+a.drawingArea,l=a.height-a.paddingTop-n-a.drawingArea;a.xCenter=Math.floor((r+o)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){return t*(2*Math.PI/Ti(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+this.xCenter,y:Math.sin(i)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,e=t.options,i=e.gridLines,n=e.ticks;if(e.display){var a=t.ctx,o=this.getIndexAngle(0),r=ut.options._parseFont(n);(e.angleLines.display||e.pointLabels.display)&&function(t){var e=t.ctx,i=t.options,n=i.angleLines,a=i.gridLines,o=i.pointLabels,r=Pi(n.lineWidth,a.lineWidth),s=Pi(n.color,a.color),l=Fi(i);e.save(),e.lineWidth=r,e.strokeStyle=s,e.setLineDash&&(e.setLineDash(Ai([n.borderDash,a.borderDash,[]])),e.lineDashOffset=Ai([n.borderDashOffset,a.borderDashOffset,0]));var d=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),u=ut.options._parseFont(o);e.font=u.string,e.textBaseline="middle";for(var h=Ti(t)-1;h>=0;h--){if(n.display&&r&&s){var c=t.getPointPosition(h,d);e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(c.x,c.y),e.stroke()}if(o.display){var f=0===h?l/2:0,g=t.getPointPosition(h,d+f+5),p=Ii(o.fontColor,h,st.global.defaultFontColor);e.fillStyle=p;var m=t.getIndexAngle(h),v=ut.toDegrees(m);e.textAlign=Ri(v),zi(v,t._pointLabelSizes[h],g),Oi(e,t.pointLabels[h]||"",g,u.lineHeight)}}e.restore()}(t),ut.each(t.ticks,function(e,s){if(s>0||n.reverse){var l=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(i.display&&0!==s&&function(t,e,i,n){var a,o=t.ctx,r=e.circular,s=Ti(t),l=Ii(e.color,n-1),d=Ii(e.lineWidth,n-1);if((r||s)&&l&&d){if(o.save(),o.strokeStyle=l,o.lineWidth=d,o.setLineDash&&(o.setLineDash(e.borderDash||[]),o.lineDashOffset=e.borderDashOffset||0),o.beginPath(),r)o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI);else{a=t.getPointPosition(0,i),o.moveTo(a.x,a.y);for(var u=1;u<s;u++)a=t.getPointPosition(u,i),o.lineTo(a.x,a.y)}o.closePath(),o.stroke(),o.restore()}}(t,i,l,s),n.display){var d=Pi(n.fontColor,st.global.defaultFontColor);if(a.font=r.string,a.save(),a.translate(t.xCenter,t.yCenter),a.rotate(o),n.showLabelBackdrop){var u=a.measureText(e).width;a.fillStyle=n.backdropColor,a.fillRect(-u/2-n.backdropPaddingX,-l-r.size/2-n.backdropPaddingY,u+2*n.backdropPaddingX,r.size+2*n.backdropPaddingY)}a.textAlign="center",a.textBaseline="middle",a.fillStyle=d,a.fillText(e,0,-l),a.restore()}}})}}}),Wi=Di;Ni._defaults=Wi;var Vi=ut.valueOrDefault,Ei=Number.MIN_SAFE_INTEGER||-9007199254740991,Hi=Number.MAX_SAFE_INTEGER||9007199254740991,ji={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,15,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,15,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},qi=Object.keys(ji);function Yi(t,e){return t-e}function Ui(t){var e,i,n,a={},o=[];for(e=0,i=t.length;e<i;++e)a[n=t[e]]||(a[n]=!0,o.push(n));return o}function Xi(t,e,i,n){var a=function(t,e,i){for(var n,a,o,r=0,s=t.length-1;r>=0&&r<=s;){if(a=t[(n=r+s>>1)-1]||null,o=t[n],!a)return{lo:null,hi:o};if(o[e]<i)r=n+1;else{if(!(a[e]>i))return{lo:a,hi:o};s=n-1}}return{lo:o,hi:null}}(t,e,i),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],r=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=r[e]-o[e],l=s?(i-o[e])/s:0,d=(r[n]-o[n])*l;return o[n]+d}function Ki(t,e){var i=t._adapter,n=t.options.time,a=n.parser,o=a||n.format,r=e;return"function"==typeof a&&(r=a(r)),ut.isFinite(r)||(r="string"==typeof o?i.parse(r,o):i.parse(r)),null!==r?+r:(a||"function"!=typeof o||(r=o(e),ut.isFinite(r)||(r=i.parse(r))),r)}function Gi(t,e){if(ut.isNullOrUndef(e))return null;var i=t.options.time,n=Ki(t,t.getRightValue(e));return null===n?n:(i.round&&(n=+t._adapter.startOf(n,i.round)),n)}function Zi(t){for(var e=qi.indexOf(t)+1,i=qi.length;e<i;++e)if(ji[qi[e]].common)return qi[e]}function $i(t,e,i,n){var a,o=t._adapter,r=t.options,s=r.time,l=s.unit||function(t,e,i,n){var a,o,r,s=qi.length;for(a=qi.indexOf(t);a<s-1;++a)if(r=(o=ji[qi[a]]).steps?o.steps[o.steps.length-1]:Hi,o.common&&Math.ceil((i-e)/(r*o.size))<=n)return qi[a];return qi[s-1]}(s.minUnit,e,i,n),d=Zi(l),u=Vi(s.stepSize,s.unitStepSize),h="week"===l&&s.isoWeekday,c=r.ticks.major.enabled,f=ji[l],g=e,p=i,m=[];for(u||(u=function(t,e,i,n){var a,o,r,s=e-t,l=ji[i],d=l.size,u=l.steps;if(!u)return Math.ceil(s/(n*d));for(a=0,o=u.length;a<o&&(r=u[a],!(Math.ceil(s/(d*r))<=n));++a);return r}(e,i,l,n)),h&&(g=+o.startOf(g,"isoWeek",h),p=+o.startOf(p,"isoWeek",h)),g=+o.startOf(g,h?"day":l),(p=+o.startOf(p,h?"day":l))<i&&(p=+o.add(p,1,l)),a=g,c&&d&&!h&&!s.round&&(a=+o.startOf(a,d),a=+o.add(a,~~((g-a)/(f.size*u))*u,l));a<p;a=+o.add(a,u,l))m.push(+a);return m.push(+a),m}var Ji=fi.extend({initialize:function(){this.mergeTicksOptions(),fi.prototype.initialize.call(this)},update:function(){var t=this.options,e=t.time||(t.time={}),i=this._adapter=new si._date(t.adapters.date);return e.format&&console.warn("options.time.format is deprecated and replaced by options.time.parser."),ut.mergeIf(e.displayFormats,i.formats()),fi.prototype.update.apply(this,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),fi.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,i,n,a,o,r=this,s=r.chart,l=r._adapter,d=r.options.time,u=d.unit||"day",h=Hi,c=Ei,f=[],g=[],p=[],m=s.data.labels||[];for(t=0,i=m.length;t<i;++t)p.push(Gi(r,m[t]));for(t=0,i=(s.data.datasets||[]).length;t<i;++t)if(s.isDatasetVisible(t))if(a=s.data.datasets[t].data,ut.isObject(a[0]))for(g[t]=[],e=0,n=a.length;e<n;++e)o=Gi(r,a[e]),f.push(o),g[t][e]=o;else{for(e=0,n=p.length;e<n;++e)f.push(p[e]);g[t]=p.slice(0)}else g[t]=[];p.length&&(p=Ui(p).sort(Yi),h=Math.min(h,p[0]),c=Math.max(c,p[p.length-1])),f.length&&(f=Ui(f).sort(Yi),h=Math.min(h,f[0]),c=Math.max(c,f[f.length-1])),h=Gi(r,d.min)||h,c=Gi(r,d.max)||c,h=h===Hi?+l.startOf(Date.now(),u):h,c=c===Ei?+l.endOf(Date.now(),u)+1:c,r.min=Math.min(h,c),r.max=Math.max(h+1,c),r._horizontal=r.isHorizontal(),r._table=[],r._timestamps={data:f,datasets:g,labels:p}},buildTicks:function(){var t,e,i,n=this,a=n.min,o=n.max,r=n.options,s=r.time,l=[],d=[];switch(r.ticks.source){case"data":l=n._timestamps.data;break;case"labels":l=n._timestamps.labels;break;case"auto":default:l=$i(n,a,o,n.getLabelCapacity(a))}for("ticks"===r.bounds&&l.length&&(a=l[0],o=l[l.length-1]),a=Gi(n,s.min)||a,o=Gi(n,s.max)||o,t=0,e=l.length;t<e;++t)(i=l[t])>=a&&i<=o&&d.push(i);return n.min=a,n.max=o,n._unit=s.unit||function(t,e,i,n,a){var o,r;for(o=qi.length-1;o>=qi.indexOf(i);o--)if(r=qi[o],ji[r].common&&t._adapter.diff(a,n,r)>=e.length)return r;return qi[i?qi.indexOf(i):0]}(n,d,s.minUnit,n.min,n.max),n._majorUnit=Zi(n._unit),n._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,o,r,s,l,d=[],u=[e];for(a=0,o=t.length;a<o;++a)(s=t[a])>e&&s<i&&u.push(s);for(u.push(i),a=0,o=u.length;a<o;++a)l=u[a+1],r=u[a-1],s=u[a],void 0!==r&&void 0!==l&&Math.round((l+r)/2)===s||d.push({time:s,pos:a/(o-1)});return d}(n._timestamps.data,a,o,r.distribution),n._offsets=function(t,e,i,n,a){var o,r,s=0,l=0;return a.offset&&e.length&&(a.time.min||(o=Xi(t,"time",e[0],"pos"),s=1===e.length?1-o:(Xi(t,"time",e[1],"pos")-o)/2),a.time.max||(r=Xi(t,"time",e[e.length-1],"pos"),l=1===e.length?r:(r-Xi(t,"time",e[e.length-2],"pos"))/2)),{start:s,end:l}}(n._table,d,0,0,r),r.ticks.reverse&&d.reverse(),function(t,e,i){var n,a,o,r,s=[];for(n=0,a=e.length;n<a;++n)o=e[n],r=!!i&&o===+t._adapter.startOf(o,i),s.push({value:o,major:r});return s}(n,d,n._majorUnit)},getLabelForIndex:function(t,e){var i=this,n=i._adapter,a=i.chart.data,o=i.options.time,r=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return ut.isObject(s)&&(r=i.getRightValue(s)),o.tooltipFormat?n.format(Ki(i,r),o.tooltipFormat):"string"==typeof r?r:n.format(Ki(i,r),o.displayFormats.datetime)},tickFormatFunction:function(t,e,i,n){var a=this._adapter,o=this.options,r=o.time.displayFormats,s=r[this._unit],l=this._majorUnit,d=r[l],u=+a.startOf(t,l),h=o.ticks.major,c=h.enabled&&l&&d&&t===u,f=a.format(t,n||(c?d:s)),g=c?h:o.ticks.minor,p=Vi(g.callback,g.userCallback);return p?p(f,e,i):f},convertTicksToLabels:function(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(this.tickFormatFunction(t[e].value,e,t));return n},getPixelForOffset:function(t){var e=this,i=e.options.ticks.reverse,n=e._horizontal?e.width:e.height,a=e._horizontal?i?e.right:e.left:i?e.bottom:e.top,o=Xi(e._table,"time",t,"pos"),r=n*(e._offsets.start+o)/(e._offsets.start+1+e._offsets.end);return i?a-r:a+r},getPixelForValue:function(t,e,i){var n=null;if(void 0!==e&&void 0!==i&&(n=this._timestamps.datasets[i][e]),null===n&&(n=Gi(this,t)),null!==n)return this.getPixelForOffset(n)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,i=e._horizontal?e.width:e.height,n=e._horizontal?e.left:e.top,a=(i?(t-n)/i:0)*(e._offsets.start+1+e._offsets.start)-e._offsets.end,o=Xi(e._table,"pos",a,"time");return e._adapter._create(o)},getLabelWidth:function(t){var e=this.options.ticks,i=this.ctx.measureText(t).width,n=ut.toRadians(e.maxRotation),a=Math.cos(n),o=Math.sin(n);return i*a+Vi(e.fontSize,st.global.defaultFontSize)*o},getLabelCapacity:function(t){var e=this,i=e.options.time.displayFormats.millisecond,n=e.tickFormatFunction(t,0,[],i),a=e.getLabelWidth(n),o=e.isHorizontal()?e.width:e.height,r=Math.floor(o/a);return r>0?r:1}}),Qi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};Ji._defaults=Qi;var tn={category:gi,linear:yi,logarithmic:Ci,radialLinear:Ni,time:Ji},en={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};si._date.override("function"==typeof t?{_id:"moment",formats:function(){return en},parse:function(e,i){return"string"==typeof e&&"string"==typeof i?e=t(e,i):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,i){return t(e).format(i)},add:function(e,i,n){return t(e).add(i,n).valueOf()},diff:function(e,i,n){return t.duration(t(e).diff(t(i))).as(n)},startOf:function(e,i,n){return e=t(e),"isoWeek"===i?e.isoWeekday(n).valueOf():e.startOf(i).valueOf()},endOf:function(e,i){return t(e).endOf(i).valueOf()},_create:function(e){return t(e)}}:{}),st._set("global",{plugins:{filler:{propagate:!0}}});var nn={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],o=a.length||0;return o?function(t,e){return e<o&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,i=e?e.x:null,n=e?e.y:null;return function(t){return{x:null===i?t.x:i,y:null===n?t.y:n}}}};function an(t,e,i){var n,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(n=parseFloat(o,10),isFinite(n)&&Math.floor(n)===n)return"-"!==o[0]&&"+"!==o[0]||(n=e+n),!(n===e||n<0||n>=i)&&n;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function on(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?o=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?o=i.scaleZero:n.getBasePosition?o=n.getBasePosition():n.getBasePixel&&(o=n.getBasePixel()),null!=o){if(void 0!==o.x&&void 0!==o.y)return o;if(ut.isFinite(o))return{x:(e=n.isHorizontal())?o:null,y:e?null:o}}return null}function rn(t,e,i){var n,a=t[e].fill,o=[e];if(!i)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;o.push(a),a=n.fill}return!1}function sn(t){var e=t.fill,i="dataset";return!1===e?null:(isFinite(e)||(i="boundary"),nn[i](t))}function ln(t){return t&&!t.skip}function dn(t,e,i,n,a){var o;if(n&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<n;++o)ut.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(i[a-1].x,i[a-1].y),o=a-1;o>0;--o)ut.canvas.lineTo(t,i[o],i[o-1],!0)}}var un={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,a,o,r=(t.data.datasets||[]).length,s=e.propagate,l=[];for(n=0;n<r;++n)o=null,(a=(i=t.getDatasetMeta(n)).dataset)&&a._model&&a instanceof Wt.Line&&(o={visible:t.isDatasetVisible(n),fill:an(a,n,r),chart:t,el:a}),i.$filler=o,l.push(o);for(n=0;n<r;++n)(o=l[n])&&(o.fill=rn(l,n,s),o.boundary=on(o),o.mapper=sn(o))},beforeDatasetDraw:function(t,e){var i=e.meta.$filler;if(i){var n=t.ctx,a=i.el,o=a._view,r=a._children||[],s=i.mapper,l=o.backgroundColor||st.global.defaultColor;s&&l&&r.length&&(ut.canvas.clipArea(n,t.chartArea),function(t,e,i,n,a,o){var r,s,l,d,u,h,c,f=e.length,g=n.spanGaps,p=[],m=[],v=0,b=0;for(t.beginPath(),r=0,s=f+!!o;r<s;++r)u=i(d=e[l=r%f]._view,l,n),h=ln(d),c=ln(u),h&&c?(v=p.push(d),b=m.push(u)):v&&b&&(g?(h&&p.push(d),c&&m.push(u)):(dn(t,p,m,v,b),v=b=0,p=[],m=[]));dn(t,p,m,v,b),t.closePath(),t.fillStyle=a,t.fill()}(n,r,s,o,l,a._loop),ut.canvas.unclipArea(n))}}},hn=ut.noop,cn=ut.valueOrDefault;function fn(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}st._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return ut.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:ut.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style="background-color:'+t.data.datasets[i].backgroundColor+'"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("</li>");return e.push("</ul>"),e.join("")}});var gn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:hn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:hn,beforeSetDimensions:hn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:hn,beforeBuildLabels:hn,buildLabels:function(){var t=this,e=t.options.labels||{},i=ut.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:hn,beforeFit:hn,fit:function(){var t=this,e=t.options,i=e.labels,n=e.display,a=t.ctx,o=ut.options._parseFont(i),r=o.size,s=t.legendHitBoxes=[],l=t.minSize,d=t.isHorizontal();if(d?(l.width=t.maxWidth,l.height=n?10:0):(l.width=n?10:0,l.height=t.maxHeight),n)if(a.font=o.string,d){var u=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="top",ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;(0===e||u[u.length-1]+n+i.padding>l.width)&&(h+=r+i.padding,u[u.length-(e>0?0:1)]=i.padding),s[e]={left:0,top:0,width:n,height:r},u[u.length-1]+=n+i.padding}),l.height+=h}else{var c=i.padding,f=t.columnWidths=[],g=i.padding,p=0,m=0,v=r+c;ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;e>0&&m+v>l.height-c&&(g+=p+i.padding,f.push(p),p=0,m=0),p=Math.max(p,n),m+=v,s[e]={left:0,top:0,width:n,height:r}}),g+=p,f.push(p),l.width+=g}t.width=l.width,t.height=l.height},afterFit:hn,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,n=st.global,a=n.defaultColor,o=n.elements.line,r=t.width,s=t.lineWidths;if(e.display){var l,d=t.ctx,u=cn(i.fontColor,n.defaultFontColor),h=ut.options._parseFont(i),c=h.size;d.textAlign="left",d.textBaseline="middle",d.lineWidth=.5,d.strokeStyle=u,d.fillStyle=u,d.font=h.string;var f=fn(i,c),g=t.legendHitBoxes,p=t.isHorizontal();l=p?{x:t.left+(r-s[0])/2+i.padding,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var m=c+i.padding;ut.each(t.legendItems,function(n,u){var h=d.measureText(n.text).width,v=f+c/2+h,b=l.x,x=l.y;p?u>0&&b+v+i.padding>t.left+t.minSize.width&&(x=l.y+=m,l.line++,b=l.x=t.left+(r-s[l.line])/2+i.padding):u>0&&x+m>t.top+t.minSize.height&&(b=l.x=b+t.columnWidths[l.line]+i.padding,x=l.y=t.top+i.padding,l.line++),function(t,i,n){if(!(isNaN(f)||f<=0)){d.save();var r=cn(n.lineWidth,o.borderWidth);if(d.fillStyle=cn(n.fillStyle,a),d.lineCap=cn(n.lineCap,o.borderCapStyle),d.lineDashOffset=cn(n.lineDashOffset,o.borderDashOffset),d.lineJoin=cn(n.lineJoin,o.borderJoinStyle),d.lineWidth=r,d.strokeStyle=cn(n.strokeStyle,a),d.setLineDash&&d.setLineDash(cn(n.lineDash,o.borderDash)),e.labels&&e.labels.usePointStyle){var s=f*Math.SQRT2/2,l=t+f/2,u=i+c/2;ut.canvas.drawPoint(d,n.pointStyle,s,l,u)}else 0!==r&&d.strokeRect(t,i,f,c),d.fillRect(t,i,f,c);d.restore()}}(b,x,n),g[u].left=b,g[u].top=x,function(t,e,i,n){var a=c/2,o=f+a+t,r=e+a;d.fillText(i.text,o,r),i.hidden&&(d.beginPath(),d.lineWidth=2,d.moveTo(o,r),d.lineTo(o+n,r),d.stroke())}(b,x,n,h),p?l.x+=v+i.padding:l.y+=m})}},_getLegendItemAt:function(t,e){var i,n,a,o=this;if(t>=o.left&&t<=o.right&&e>=o.top&&e<=o.bottom)for(a=o.legendHitBoxes,i=0;i<a.length;++i)if(t>=(n=a[i]).left&&t<=n.left+n.width&&e>=n.top&&e<=n.top+n.height)return o.legendItems[i];return null},handleEvent:function(t){var e,i=this,n=i.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!n.onHover&&!n.onLeave)return}else{if("click"!==a)return;if(!n.onClick)return}e=i._getLegendItemAt(t.x,t.y),"click"===a?e&&n.onClick&&n.onClick.call(i,t.native,e):(n.onLeave&&e!==i._hoveredItem&&(i._hoveredItem&&n.onLeave.call(i,t.native,i._hoveredItem),i._hoveredItem=e),n.onHover&&e&&n.onHover.call(i,t.native,e))}});function pn(t,e){var i=new gn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.legend=i}var mn={id:"legend",_element:gn,beforeInit:function(t){var e=t.options.legend;e&&pn(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(ut.mergeIf(e,st.global.legend),i?(ke.configure(t,i,e),i.options=e):pn(t,e)):i&&(ke.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}},vn=ut.noop;st._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var bn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:vn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:vn,beforeSetDimensions:vn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:vn,beforeBuildLabels:vn,buildLabels:vn,afterBuildLabels:vn,beforeFit:vn,fit:function(){var t=this,e=t.options,i=e.display,n=t.minSize,a=ut.isArray(e.text)?e.text.length:1,o=ut.options._parseFont(e),r=i?a*o.lineHeight+2*e.padding:0;t.isHorizontal()?(n.width=t.maxWidth,n.height=r):(n.width=r,n.height=t.maxHeight),t.width=n.width,t.height=n.height},afterFit:vn,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=t.options;if(i.display){var n,a,o,r=ut.options._parseFont(i),s=r.lineHeight,l=s/2+i.padding,d=0,u=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=ut.valueOrDefault(i.fontColor,st.global.defaultFontColor),e.font=r.string,t.isHorizontal()?(a=h+(f-h)/2,o=u+l,n=f-h):(a="left"===i.position?h+l:f-l,o=u+(c-u)/2,n=c-u,d=Math.PI*("left"===i.position?-.5:.5)),e.save(),e.translate(a,o),e.rotate(d),e.textAlign="center",e.textBaseline="middle";var g=i.text;if(ut.isArray(g))for(var p=0,m=0;m<g.length;++m)e.fillText(g[m],0,p,n),p+=s;else e.fillText(g,0,0,n);e.restore()}}});function xn(t,e){var i=new bn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.titleBlock=i}var yn={},kn=un,wn=mn,Mn={id:"title",_element:bn,beforeInit:function(t){var e=t.options.title;e&&xn(t,e)},beforeUpdate:function(t){var e=t.options.title,i=t.titleBlock;e?(ut.mergeIf(e,st.global.title),i?(ke.configure(t,i,e),i.options=e):xn(t,e)):i&&(ke.removeBox(t,i),delete t.titleBlock)}};for(var _n in yn.filler=kn,yn.legend=wn,yn.title=Mn,ai.helpers=ut,function(){function t(t,e,i){var n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}function e(t){return null!=t&&"none"!==t}function i(i,n,a){var o=document.defaultView,r=ut._getParentNode(i),s=o.getComputedStyle(i)[n],l=o.getComputedStyle(r)[n],d=e(s),u=e(l),h=Number.POSITIVE_INFINITY;return d||u?Math.min(d?t(s,i,a):h,u?t(l,r,a):h):"none"}ut.where=function(t,e){if(ut.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return ut.each(t,function(t){e(t)&&i.push(t)}),i},ut.findIndex=Array.prototype.findIndex?function(t,e,i){return t.findIndex(e,i)}:function(t,e,i){i=void 0===i?t:i;for(var n=0,a=t.length;n<a;++n)if(e.call(i,t[n],n,t))return n;return-1},ut.findNextWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=-1);for(var n=i+1;n<t.length;n++){var a=t[n];if(e(a))return a}},ut.findPreviousWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=t.length);for(var n=i-1;n>=0;n--){var a=t[n];if(e(a))return a}},ut.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},ut.almostEquals=function(t,e,i){return Math.abs(t-e)<i},ut.almostWhole=function(t,e){var i=Math.round(t);return i-e<t&&i+e>t},ut.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},ut.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},ut.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},ut.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},ut.toRadians=function(t){return t*(Math.PI/180)},ut.toDegrees=function(t){return t*(180/Math.PI)},ut._decimalPlaces=function(t){if(ut.isFinite(t)){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}},ut.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},ut.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},ut.aliasPixel=function(t){return t%2==0?0:.5},ut._alignPixel=function(t,e,i){var n=t.currentDevicePixelRatio,a=i/2;return Math.round((e-a)*n)/n+a},ut.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=s/(s+l),u=l/(s+l),h=n*(d=isNaN(d)?0:d),c=n*(u=isNaN(u)?0:u);return{previous:{x:o.x-h*(r.x-a.x),y:o.y-h*(r.y-a.y)},next:{x:o.x+c*(r.x-a.x),y:o.y+c*(r.y-a.y)}}},ut.EPSILON=Number.EPSILON||1e-14,ut.splineCurveMonotone=function(t){var e,i,n,a,o,r,s,l,d,u=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=u.length;for(e=0;e<h;++e)if(!(n=u[e]).model.skip){if(i=e>0?u[e-1]:null,(a=e<h-1?u[e+1]:null)&&!a.model.skip){var c=a.model.x-n.model.x;n.deltaK=0!==c?(a.model.y-n.model.y)/c:0}!i||i.model.skip?n.mK=n.deltaK:!a||a.model.skip?n.mK=i.deltaK:this.sign(i.deltaK)!==this.sign(n.deltaK)?n.mK=0:n.mK=(i.deltaK+n.deltaK)/2}for(e=0;e<h-1;++e)n=u[e],a=u[e+1],n.model.skip||a.model.skip||(ut.almostEquals(n.deltaK,0,this.EPSILON)?n.mK=a.mK=0:(o=n.mK/n.deltaK,r=a.mK/n.deltaK,(l=Math.pow(o,2)+Math.pow(r,2))<=9||(s=3/Math.sqrt(l),n.mK=o*s*n.deltaK,a.mK=r*s*n.deltaK)));for(e=0;e<h;++e)(n=u[e]).model.skip||(i=e>0?u[e-1]:null,a=e<h-1?u[e+1]:null,i&&!i.model.skip&&(d=(n.model.x-i.model.x)/3,n.model.controlPointPreviousX=n.model.x-d,n.model.controlPointPreviousY=n.model.y-d*n.mK),a&&!a.model.skip&&(d=(a.model.x-n.model.x)/3,n.model.controlPointNextX=n.model.x+d,n.model.controlPointNextY=n.model.y+d*n.mK))},ut.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},ut.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},ut.niceNum=function(t,e){var i=Math.floor(ut.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},ut.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},ut.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,o=t.target||t.srcElement,r=o.getBoundingClientRect(),s=a.touches;s&&s.length>0?(i=s[0].clientX,n=s[0].clientY):(i=a.clientX,n=a.clientY);var l=parseFloat(ut.getStyle(o,"padding-left")),d=parseFloat(ut.getStyle(o,"padding-top")),u=parseFloat(ut.getStyle(o,"padding-right")),h=parseFloat(ut.getStyle(o,"padding-bottom")),c=r.right-r.left-l-u,f=r.bottom-r.top-d-h;return{x:i=Math.round((i-r.left-l)/c*o.width/e.currentDevicePixelRatio),y:n=Math.round((n-r.top-d)/f*o.height/e.currentDevicePixelRatio)}},ut.getConstraintWidth=function(t){return i(t,"max-width","clientWidth")},ut.getConstraintHeight=function(t){return i(t,"max-height","clientHeight")},ut._calculatePadding=function(t,e,i){return(e=ut.getStyle(t,e)).indexOf("%")>-1?i*parseInt(e,10)/100:parseInt(e,10)},ut._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},ut.getMaximumWidth=function(t){var e=ut._getParentNode(t);if(!e)return t.clientWidth;var i=e.clientWidth,n=i-ut._calculatePadding(e,"padding-left",i)-ut._calculatePadding(e,"padding-right",i),a=ut.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},ut.getMaximumHeight=function(t){var e=ut._getParentNode(t);if(!e)return t.clientHeight;var i=e.clientHeight,n=i-ut._calculatePadding(e,"padding-top",i)-ut._calculatePadding(e,"padding-bottom",i),a=ut.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},ut.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},ut.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,o=t.width;n.height=a*i,n.width=o*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=o+"px")}},ut.fontString=function(t,e,i){return e+" "+t+"px "+i},ut.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},o=n.garbageCollect=[],n.font=e),t.font=e;var r=0;ut.each(i,function(e){null!=e&&!0!==ut.isArray(e)?r=ut.measureText(t,a,o,r,e):ut.isArray(e)&&ut.each(e,function(e){null==e||ut.isArray(e)||(r=ut.measureText(t,a,o,r,e))})});var s=o.length/2;if(s>i.length){for(var l=0;l<s;l++)delete a[o[l]];o.splice(0,s)}return r},ut.measureText=function(t,e,i,n,a){var o=e[a];return o||(o=e[a]=t.measureText(a).width,i.push(a)),o>n&&(n=o),n},ut.numberOfLabelLines=function(t){var e=1;return ut.each(t,function(t){ut.isArray(t)&&t.length>e&&(e=t.length)}),e},ut.color=X?function(t){return t instanceof CanvasGradient&&(t=st.global.defaultColor),X(t)}:function(t){return console.error("Color.js not found!"),t},ut.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:ut.color(t).saturate(.5).darken(.1).rgbString()}}(),ai._adapters=si,ai.Animation=vt,ai.animationService=bt,ai.controllers=ue,ai.DatasetController=Mt,ai.defaults=st,ai.Element=pt,ai.elements=Wt,ai.Interaction=ve,ai.layouts=ke,ai.platform=Ve,ai.plugins=Ee,ai.Scale=fi,ai.scaleService=He,ai.Ticks=li,ai.Tooltip=Je,ai.helpers.each(tn,function(t,e){ai.scaleService.registerScaleType(e,t,t._defaults)}),yn)yn.hasOwnProperty(_n)&&ai.plugins.register(yn[_n]);ai.platform.initialize();var Cn=ai;return"undefined"!=typeof window&&(window.Chart=ai),ai.Chart=ai,ai.Legend=yn.legend._element,ai.Title=yn.title._element,ai.pluginService=ai.plugins,ai.PluginBase=ai.Element.extend({}),ai.canvasHelpers=ai.helpers.canvas,ai.layoutService=ai.layouts,ai.LinearScaleBase=bi,ai.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){ai[t]=function(e,i){return new ai(e,ai.helpers.merge(i||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),Cn});
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],(function(t){return e(function(){try{return t("moment")}catch(t){}}())})):(t=t||self).Chart=e(t.moment)}(this,(function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},n=function(t,e){return t(e={exports:{}},e.exports),e.exports}((function(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[e[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=n[t];if(i)return i;var a,r,o,s=1/0;for(var l in e)if(e.hasOwnProperty(l)){var u=e[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d<s&&(s=d,a=l)}return a},a.keyword.rgb=function(t){return e[t]},a.rgb.xyz=function(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));n.rgb,n.hsl,n.hsv,n.hwb,n.cmyk,n.xyz,n.lab,n.lch,n.hex,n.keyword,n.ansi16,n.ansi256,n.hcg,n.apple,n.gray;function i(t){var e=function(){for(var t={},e=Object.keys(n),i=e.length,a=0;a<i;a++)t[e[a]]={distance:-1,parent:null};return t}(),i=[t];for(e[t].distance=0;i.length;)for(var a=i.pop(),r=Object.keys(n[a]),o=r.length,s=0;s<o;s++){var l=r[s],u=e[l];-1===u.distance&&(u.distance=e[a].distance+1,u.parent=a,i.unshift(l))}return e}function a(t,e){return function(n){return e(t(n))}}function r(t,e){for(var i=[e[t].parent,t],r=n[e[t].parent][t],o=e[t].parent;e[o].parent;)i.unshift(e[o].parent),r=a(n[e[o].parent][o],r),o=e[o].parent;return r.conversion=i,r}var o={};Object.keys(n).forEach((function(t){o[t]={},Object.defineProperty(o[t],"channels",{value:n[t].channels}),Object.defineProperty(o[t],"labels",{value:n[t].labels});var e=function(t){for(var e=i(t),n={},a=Object.keys(e),o=a.length,s=0;s<o;s++){var l=a[s];null!==e[l].parent&&(n[l]=r(l,e))}return n}(t);Object.keys(e).forEach((function(n){var i=e[n];o[t][n]=function(t){var e=function(e){if(null==e)return e;arguments.length>1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a<i;a++)n[a]=Math.round(n[a]);return n};return"conversion"in t&&(e.conversion=t.conversion),e}(i),o[t][n].raw=function(t){var e=function(e){return null==e?e:(arguments.length>1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var s=o,l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},u={getRgba:d,getHsla:h,getRgb:function(t){var e=d(t);return e&&e.slice(0,3)},getHsl:function(t){var e=h(t);return e&&e.slice(0,3)},getHwb:c,getAlpha:function(t){var e=d(t);if(e)return e[3];if(e=h(t))return e[3];if(e=c(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+v(t[0])+v(t[1])+v(t[2])+(e>=0&&e<1?v(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return f(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:f,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:g,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return b[t.slice(0,3)]}};function d(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;r<e.length;r++)e[r]=parseInt(i[r]+i[r],16);a&&(n=Math.round(parseInt(a+a,16)/255*100)/100)}else if(i=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=i[2],i=i[1];for(r=0;r<e.length;r++)e[r]=parseInt(i.slice(2*r,2*r+2),16);a&&(n=Math.round(parseInt(a,16)/255*100)/100)}else if(i=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(i[r+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(i[r+1]));n=parseFloat(i[4])}else if(i=t.match(/(\w+)/)){if("transparent"==i[1])return[0,0,0,0];if(!(e=l[i[1]]))return}for(r=0;r<e.length;r++)e[r]=m(e[r],0,255);return n=n||0==n?m(n,0,1):1,e[3]=n,e}}function h(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[m(parseInt(e[1]),0,360),m(parseFloat(e[2]),0,100),m(parseFloat(e[3]),0,100),m(isNaN(n)?1:n,0,1)]}}}function c(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[m(parseInt(e[1]),0,360),m(parseFloat(e[2]),0,100),m(parseFloat(e[3]),0,100),m(isNaN(n)?1:n,0,1)]}}}function f(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function g(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e,n){return Math.min(Math.max(e,t),n)}function v(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var b={};for(var x in l)b[l[x]]=x;var y=function(t){return t instanceof y?t:this instanceof y?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=u.getRgba(t))?this.setValues("rgb",e):(e=u.getHsla(t))?this.setValues("hsl",e):(e=u.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new y(t);var e};y.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return u.hexString(this.values.rgb)},rgbString:function(){return u.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return u.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return u.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return u.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return u.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return u.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return u.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new y,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},y.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},y.prototype.setValues=function(t,e){var n,i,a=this.values,r=this.spaces,o=this.maxes,l=1;if(this.valid=!0,"alpha"===t)l=e;else if(e.length)a[t]=e.slice(0,t.length),l=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];l=e.a}else if(void 0!==e[r[t][0]]){var u=r[t];for(n=0;n<t.length;n++)a[t][n]=e[u[n]];l=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===l?a.alpha:l)),"alpha"===t)return!1;for(n=0;n<t.length;n++)i=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(i);for(var d in r)d!==t&&(a[d]=s[t][d](a[t]));return!0},y.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},y.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=y);var _=y;function k(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}var w,M={noop:function(){},uid:(w=0,function(){return w++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return M.valueOrDefault(M.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,i){var a,r,o;if(M.isArray(t))if(r=t.length,i)for(a=r-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;a<r;a++)e.call(n,t[a],a);else if(M.isObject(t))for(r=(o=Object.keys(t)).length,a=0;a<r;a++)e.call(n,t[o[a]],o[a])},arrayEquals:function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n<i;++n)if(a=t[n],r=e[n],a instanceof Array&&r instanceof Array){if(!M.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},clone:function(t){if(M.isArray(t))return t.map(M.clone);if(M.isObject(t)){for(var e=Object.create(t),n=Object.keys(t),i=n.length,a=0;a<i;++a)e[n[a]]=M.clone(t[n[a]]);return e}return t},_merger:function(t,e,n,i){if(k(t)){var a=e[t],r=n[t];M.isObject(a)&&M.isObject(r)?M.merge(a,r,i):e[t]=M.clone(r)}},_mergerIf:function(t,e,n){if(k(t)){var i=e[t],a=n[t];M.isObject(i)&&M.isObject(a)?M.mergeIf(i,a):e.hasOwnProperty(t)||(e[t]=M.clone(a))}},merge:function(t,e,n){var i,a,r,o,s,l=M.isArray(e)?e:[e],u=l.length;if(!M.isObject(t))return t;for(i=(n=n||{}).merger||M._merger,a=0;a<u;++a)if(e=l[a],M.isObject(e))for(s=0,o=(r=Object.keys(e)).length;s<o;++s)i(r[s],t,e,n);return t},mergeIf:function(t,e){return M.merge(t,e,{merger:M._mergerIf})},extend:Object.assign||function(t){return M.merge(t,[].slice.call(arguments,1),{merger:function(t,e,n){e[t]=n[t]}})},inherits:function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=M.inherits,t&&M.extend(n.prototype,t),n.__super__=e.prototype,n},_deprecated:function(t,e,n,i){void 0!==e&&console.warn(t+': "'+n+'" is deprecated. Please use "'+i+'" instead')}},S=M;M.callCallback=M.callback,M.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},M.getValueOrDefault=M.valueOrDefault,M.getValueAtIndexOrDefault=M.valueAtIndexOrDefault;var C={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-C.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*C.easeInBounce(2*t):.5*C.easeOutBounce(2*t-1)+.5}},P={effects:C};S.easingEffects=C;var A=Math.PI,D=A/180,T=2*A,I=A/2,F=A/4,O=2*A/3,L={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),s<u&&l<d?(t.arc(s,l,o,-A,-I),t.arc(u,l,o,-I,0),t.arc(u,d,o,0,I),t.arc(s,d,o,I,A)):s<u?(t.moveTo(s,n),t.arc(u,l,o,-I,I),t.arc(s,l,o,I,A+I)):l<d?(t.arc(s,l,o,-A,0),t.arc(s,d,o,0,A)):t.arc(s,l,o,-A,A),t.closePath(),t.moveTo(e,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a,r){var o,s,l,u,d,h=(r||0)*D;if(e&&"object"==typeof e&&("[object HTMLImageElement]"===(o=e.toString())||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,a),t.rotate(h),t.drawImage(e,-e.width/2,-e.height/2,e.width,e.height),void t.restore();if(!(isNaN(n)||n<=0)){switch(t.beginPath(),e){default:t.arc(i,a,n,0,T),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=O,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=O,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),t.closePath();break;case"rectRounded":u=n-(d=.516*n),s=Math.cos(h+F)*u,l=Math.sin(h+F)*u,t.arc(i-s,a-l,d,h-A,h-I),t.arc(i+l,a-s,d,h-I,h),t.arc(i+s,a+l,d,h,h+I),t.arc(i-l,a+s,d,h+I,h+A),t.closePath();break;case"rect":if(!r){u=Math.SQRT1_2*n,t.rect(i-u,a-u,2*u,2*u);break}h+=F;case"rectRot":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+l,a-s),t.lineTo(i+s,a+l),t.lineTo(i-l,a+s),t.closePath();break;case"crossRot":h+=F;case"cross":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"star":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s),h+=F,s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"line":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l);break;case"dash":t.moveTo(i,a),t.lineTo(i+Math.cos(h)*n,a+Math.sin(h)*n)}t.fill(),t.stroke()}},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){var a=n.steppedLine;if(a){if("middle"===a){var r=(e.x+n.x)/2;t.lineTo(r,i?n.y:e.y),t.lineTo(r,i?e.y:n.y)}else"after"===a&&!i||"after"!==a&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y);t.lineTo(n.x,n.y)}else n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}},R=L;S.clear=L.clear,S.drawRoundedRectangle=function(t){t.beginPath(),L.roundedRect.apply(L,arguments)};var z={_set:function(t,e){return S.merge(this[t]||(this[t]={}),e)}};z._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var N=z,B=S.valueOrDefault;var E={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,i,a;return S.isObject(t)?(e=+t.top||0,n=+t.right||0,i=+t.bottom||0,a=+t.left||0):e=n=i=a=+t||0,{top:e,right:n,bottom:i,left:a,height:e+i,width:a+n}},_parseFont:function(t){var e=N.global,n=B(t.fontSize,e.defaultFontSize),i={family:B(t.fontFamily,e.defaultFontFamily),lineHeight:S.options.toLineHeight(B(t.lineHeight,e.defaultLineHeight),n),size:n,style:B(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return i.string=function(t){return!t||S.isNullOrUndef(t.size)||S.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(i),i},resolve:function(t,e,n,i){var a,r,o,s=!0;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&"function"==typeof o&&(o=o(e),s=!1),void 0!==n&&S.isArray(o)&&(o=o[n],s=!1),void 0!==o))return i&&!s&&(i.cacheable=!1),o}},W={_factorize:function(t){var e,n=[],i=Math.sqrt(t);for(e=1;e<i;e++)t%e==0&&(n.push(e),n.push(t/e));return i===(0|i)&&n.push(i),n.sort((function(t,e){return t-e})).pop(),n},log10:Math.log10||function(t){var e=Math.log(t)*Math.LOG10E,n=Math.round(e);return t===Math.pow(10,n)?n:e}},V=W;S.log10=W.log10;var H=S,j=P,q=R,U=E,Y=V,G={getRtlAdapter:function(t,e,n){return t?function(t,e){return{x:function(n){return t+t+e-n},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}}(e,n):{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}},overrideTextDirection:function(t,e){var n,i;"ltr"!==e&&"rtl"!==e||(i=[(n=t.canvas.style).getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",e,"important"),t.prevTextDirection=i)},restoreTextDirection:function(t){var e=t.prevTextDirection;void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}};H.easing=j,H.canvas=q,H.options=U,H.math=Y,H.rtl=G;var X=function(t){H.extend(this,t),this.initialize.apply(this,arguments)};H.extend(X.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=H.extend({},t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,i=e._start,a=e._view;return n&&1!==t?(a||(a=e._view={}),i||(i=e._start={}),function(t,e,n,i){var a,r,o,s,l,u,d,h,c,f=Object.keys(n);for(a=0,r=f.length;a<r;++a)if(u=n[o=f[a]],e.hasOwnProperty(o)||(e[o]=u),(s=e[o])!==u&&"_"!==o[0]){if(t.hasOwnProperty(o)||(t[o]=s),(d=typeof u)===typeof(l=t[o]))if("string"===d){if((h=_(l)).valid&&(c=_(u)).valid){e[o]=c.mix(h,i).rgbString();continue}}else if(H.isFinite(l)&&H.isFinite(u)){e[o]=l+(u-l)*i;continue}e[o]=u}}(i,a,n,t),e):(e._view=H.extend({},n),e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return H.isNumber(this._model.x)&&H.isNumber(this._model.y)}}),X.extend=H.inherits;var K=X,Z=K.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),$=Z;Object.defineProperty(Z.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(Z.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),N._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:H.noop,onComplete:H.noop}});var J={animations:[],request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=n,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=H.findIndex(this.animations,(function(e){return e.chart===t}));-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=H.requestAnimFrame.call(window,(function(){t.request=null,t.startDigest()})))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r<a.length;)e=(t=a[r]).chart,n=t.numSteps,i=Math.floor((Date.now()-t.startTime)/t.duration*n)+1,t.currentStep=Math.min(i,n),H.callback(t.render,[e,t],e),H.callback(t.onAnimationProgress,[t],e),t.currentStep>=n?(H.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},Q=H.options.resolve,tt=["push","pop","shift","splice","unshift"];function et(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(tt.forEach((function(e){delete t[e]})),delete t._chartjs)}}var nt=function(t,e){this.initialize(t,e)};H.extend(nt.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&et(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);n.dataset=n.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,n=this,i=n.getDataset(),a=i.data||(i.data=[]);n._data!==a&&(n._data&&et(n._data,n),a&&Object.isExtensible(a)&&(e=n,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),tt.forEach((function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=i.apply(this,e);return H.each(t._chartjs.listeners,(function(t){"function"==typeof t[n]&&t[n].apply(t,e)})),a}})})))),n._data=a),n.resyncElements()},_configure:function(){this._config=H.merge(Object.create(null),[this.chart.options.datasets[this._type],this.getDataset()],{merger:function(t,e,n){"_meta"!==t&&"data"!==t&&H._merger(t,e,n)}})},_update:function(t){this._configure(),this._cachedDataOpts=null,this.update(t)},update:H.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},getStyle:function(t){var e,n=this.getMeta(),i=n.dataset;return this._configure(),i&&void 0===t?e=this._resolveDatasetElementOptions(i||{}):(t=t||0,e=this._resolveDataElementOptions(n.data[t]||{},t)),!1!==e.fill&&null!==e.fill||(e.backgroundColor=e.borderColor),e},_resolveDatasetElementOptions:function(t,e){var n,i,a,r,o=this,s=o.chart,l=o._config,u=t.custom||{},d=s.options.elements[o.datasetElementType.prototype._type]||{},h=o._datasetElementOptions,c={},f={chart:s,dataset:o.getDataset(),datasetIndex:o.index,hover:e};for(n=0,i=h.length;n<i;++n)a=h[n],r=e?"hover"+a.charAt(0).toUpperCase()+a.slice(1):a,c[a]=Q([u[r],l[r],d[r]],f);return c},_resolveDataElementOptions:function(t,e){var n=this,i=t&&t.custom,a=n._cachedDataOpts;if(a&&!i)return a;var r,o,s,l,u=n.chart,d=n._config,h=u.options.elements[n.dataElementType.prototype._type]||{},c=n._dataElementOptions,f={},g={chart:u,dataIndex:e,dataset:n.getDataset(),datasetIndex:n.index},p={cacheable:!i};if(i=i||{},H.isArray(c))for(o=0,s=c.length;o<s;++o)f[l=c[o]]=Q([i[l],d[l],h[l]],g,e,p);else for(o=0,s=(r=Object.keys(c)).length;o<s;++o)f[l=r[o]]=Q([i[l],d[c[l]],d[l],h[l]],g,e,p);return p.cacheable&&(n._cachedDataOpts=Object.freeze(f)),f},removeHoverStyle:function(t){H.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,r=H.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=Q([i.hoverBackgroundColor,e.hoverBackgroundColor,r(a.backgroundColor)],void 0,n),a.borderColor=Q([i.hoverBorderColor,e.hoverBorderColor,r(a.borderColor)],void 0,n),a.borderWidth=Q([i.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,n)},_removeDatasetHoverStyle:function(){var t=this.getMeta().dataset;t&&this.removeHoverStyle(t)},_setDatasetHoverStyle:function(){var t,e,n,i,a,r,o=this.getMeta().dataset,s={};if(o){for(r=o._model,a=this._resolveDatasetElementOptions(o,!0),t=0,e=(i=Object.keys(a)).length;t<e;++t)s[n=i[t]]=r[n],r[n]=a[n];o.$previousStyle=s}},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,n=t.data.length,i=e.length;i<n?t.data.splice(i,n-i):i>n&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),nt.extend=H.inherits;var it=nt,at=2*Math.PI;function rt(t,e){var n=e.startAngle,i=e.endAngle,a=e.pixelMargin,r=a/e.outerRadius,o=e.x,s=e.y;t.beginPath(),t.arc(o,s,e.outerRadius,n-r,i+r),e.innerRadius>a?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function ot(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+at,rt(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=at,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+at,n.startAngle,!0),a=0;a<n.fullCircles;++a)t.stroke();for(t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.startAngle+at),a=0;a<n.fullCircles;++a)t.stroke()}(t,e,n,i),i&&rt(t,n),t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.endAngle),t.arc(n.x,n.y,n.innerRadius,n.endAngle,n.startAngle,!0),t.closePath(),t.stroke()}N._set("global",{elements:{arc:{backgroundColor:N.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var st=K.extend({_type:"arc",inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=H.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,r=i.distance,o=n.startAngle,s=n.endAngle;s<o;)s+=at;for(;a>s;)a-=at;for(;a<o;)a+=at;var l=a>=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/at)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+at,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;t<a.fullCircles;++t)e.fill();a.endAngle=a.startAngle+n.circumference%at}e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),e.fill(),n.borderWidth&&ot(e,n,a),e.restore()}}),lt=H.valueOrDefault,ut=N.global.defaultColor;N._set("global",{elements:{line:{tension:.4,backgroundColor:ut,borderWidth:3,borderColor:ut,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var dt=K.extend({_type:"line",draw:function(){var t,e,n,i=this,a=i._view,r=i._chart.ctx,o=a.spanGaps,s=i._children.slice(),l=N.global,u=l.elements.line,d=-1,h=i._loop;if(s.length){if(i._loop){for(t=0;t<s.length;++t)if(e=H.previousItem(s,t),!s[t]._view.skip&&e._view.skip){s=s.slice(t).concat(s.slice(0,t)),h=o;break}h&&s.push(s[0])}for(r.save(),r.lineCap=a.borderCapStyle||u.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||u.borderDash),r.lineDashOffset=lt(a.borderDashOffset,u.borderDashOffset),r.lineJoin=a.borderJoinStyle||u.borderJoinStyle,r.lineWidth=lt(a.borderWidth,u.borderWidth),r.strokeStyle=a.borderColor||l.defaultColor,r.beginPath(),(n=s[0]._view).skip||(r.moveTo(n.x,n.y),d=0),t=1;t<s.length;++t)n=s[t]._view,e=-1===d?H.previousItem(s,t):s[d],n.skip||(d!==t-1&&!o||-1===d?r.moveTo(n.x,n.y):H.canvas.lineTo(r,e._view,n),d=t);h&&r.closePath(),r.stroke(),r.restore()}}}),ht=H.valueOrDefault,ct=N.global.defaultColor;function ft(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}N._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:ct,borderColor:ct,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var gt=K.extend({_type:"point",inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:ft,inXRange:ft,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._chart.ctx,i=e.pointStyle,a=e.rotation,r=e.radius,o=e.x,s=e.y,l=N.global,u=l.defaultColor;e.skip||(void 0===t||H.canvas._isPointInArea(e,t))&&(n.strokeStyle=e.borderColor||u,n.lineWidth=ht(e.borderWidth,l.elements.point.borderWidth),n.fillStyle=e.backgroundColor||u,H.canvas.drawPoint(n,i,r,o,s,a))}}),pt=N.global.defaultColor;function mt(t){return t&&void 0!==t.width}function vt(t){var e,n,i,a,r;return mt(t)?(r=t.width/2,e=t.x-r,n=t.x+r,i=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(r=t.height/2,e=Math.min(t.x,t.base),n=Math.max(t.x,t.base),i=t.y-r,a=t.y+r),{left:e,top:i,right:n,bottom:a}}function bt(t,e,n){return t===e?n:t===n?e:t}function xt(t,e,n){var i,a,r,o,s=t.borderWidth,l=function(t){var e=t.borderSkipped,n={};return e?(t.horizontal?t.base>t.x&&(e=bt(e,"left","right")):t.base<t.y&&(e=bt(e,"bottom","top")),n[e]=!0,n):n}(t);return H.isObject(s)?(i=+s.top||0,a=+s.right||0,r=+s.bottom||0,o=+s.left||0):i=a=r=o=+s||0,{t:l.top||i<0?0:i>n?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function yt(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&vt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}N._set("global",{elements:{rectangle:{backgroundColor:pt,borderColor:pt,borderSkipped:"bottom",borderWidth:0}}});var _t=K.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=vt(t),n=e.right-e.left,i=e.bottom-e.top,a=xt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return yt(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return mt(n)?yt(n,t,null):yt(n,null,e)},inXRange:function(t){return yt(this._view,t,null)},inYRange:function(t){return yt(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return mt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return mt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),kt={},wt=st,Mt=dt,St=gt,Ct=_t;kt.Arc=wt,kt.Line=Mt,kt.Point=St,kt.Rectangle=Ct;var Pt=H._deprecated,At=H.valueOrDefault;function Dt(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=H.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a<r;++a)o=Math.min(o,Math.abs(e[a]-e[a-1]));for(a=0,r=t.getTicks().length;a<r;++a)i=t.getPixelForTick(a),o=a>0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return H.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}N._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),N._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var Tt=it.extend({dataElementType:kt.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;it.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Pt("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Pt("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Pt("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Pt("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Pt("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e<n;++e)this.updateElement(i[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=i.getDataset(),o=i._resolveDataElementOptions(t,e);t._xScale=i.getScaleForId(a.xAxisID),t._yScale=i.getScaleForId(a.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderSkipped:o.borderSkipped,borderWidth:o.borderWidth,datasetLabel:r.label,label:i.chart.data.labels[e]},H.isArray(r.data[e])&&(t._model.borderSkipped=null),i._updateElementGeometry(t,e,n,o),t.pivot()},_updateElementGeometry:function(t,e,n,i){var a=this,r=t._model,o=a._getValueScale(),s=o.getBasePixel(),l=o.isHorizontal(),u=a._ruler||a.getRuler(),d=a.calculateBarValuePixels(a.index,e,i),h=a.calculateBarIndexPixels(a.index,e,u,i);r.horizontal=l,r.base=n?s:d.base,r.x=l?n?s:d.head:h.center,r.y=l?h.center:n?s:d.head,r.height=l?h.size:void 0,r.width=l?void 0:h.size},_getStacks:function(t){var e,n,i=this._getIndexScale(),a=i._getMatchingVisibleMetas(this._type),r=i.options.stacked,o=a.length,s=[];for(e=0;e<o&&(n=a[e],(!1===r||-1===s.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&s.push(n.stack),n.index!==t);++e);return s},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var n=this._getStacks(t),i=void 0!==e?n.indexOf(e):-1;return-1===i?n.length-1:i},getRuler:function(){var t,e,n=this._getIndexScale(),i=[];for(t=0,e=this.getMeta().data.length;t<e;++t)i.push(n.getPixelForValue(null,t,this.index));return{pixels:i,start:n._startPixel,end:n._endPixel,stackCount:this.getStackCount(),scale:n}},calculateBarValuePixels:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._getValueScale(),c=h.isHorizontal(),f=d.data.datasets,g=h._getMatchingVisibleMetas(this._type),p=h._parseValue(f[t].data[e]),m=n.minBarLength,v=h.options.stacked,b=this.getMeta().stack,x=void 0===p.start?0:p.max>=0&&p.min>=0?p.min:p.max,y=void 0===p.start?p.end:p.max>=0&&p.min>=0?p.max-p.min:p.min-p.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(p.min<0&&r<0||p.max>=0&&r>0)&&(x+=r));return o=h.getPixelForValue(x),l=(s=h.getPixelForValue(x+y))-o,void 0!==m&&Math.abs(l)<m&&(l=m,s=y>=0&&!c||y<0&&c?o-m:o+m),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=n.categoryPercentage;return null===o&&(o=r-(null===s?e.end-e.start:s-r)),null===s&&(s=r+r-o),i=r-(r-Math.min(o,s))/2*l,{chunk:Math.abs(s-o)/2*l/e.stackCount,ratio:n.barPercentage,start:i}}(e,n,i):Dt(e,n,i),r=this.getStackIndex(t,this.getMeta().stack),o=a.start+a.chunk*r+a.chunk/2,s=Math.min(At(i.maxBarThickness,1/0),a.chunk*a.ratio);return{base:o-s/2,head:o+s/2,center:o,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),n=this.getMeta().data,i=this.getDataset(),a=n.length,r=0;for(H.canvas.clipArea(t.ctx,t.chartArea);r<a;++r){var o=e._parseValue(i.data[r]);isNaN(o.min)||isNaN(o.max)||n[r].draw()}H.canvas.unclipArea(t.ctx)},_resolveDataElementOptions:function(){var t=this,e=H.extend({},it.prototype._resolveDataElementOptions.apply(t,arguments)),n=t._getIndexScale().options,i=t._getValueScale().options;return e.barPercentage=At(n.barPercentage,e.barPercentage),e.barThickness=At(n.barThickness,e.barThickness),e.categoryPercentage=At(n.categoryPercentage,e.categoryPercentage),e.maxBarThickness=At(n.maxBarThickness,e.maxBarThickness),e.minBarLength=At(i.minBarLength,e.minBarLength),e}}),It=H.valueOrDefault,Ft=H.options.resolve;N._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}});var Ot=it.extend({dataElementType:kt.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(t){var e=this,n=e.getMeta().data;H.each(n,(function(n,i){e.updateElement(n,i,t)}))},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveDataElementOptions(t,e),u=i.getDataset().data[e],d=i.index,h=n?o.getPixelForDecimal(.5):o.getPixelForValue("object"==typeof u?u:NaN,e,d),c=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:n?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options,i=H.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=It(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=It(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=It(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},_resolveDataElementOptions:function(t,e){var n=this,i=n.chart,a=n.getDataset(),r=t.custom||{},o=a.data[e]||{},s=it.prototype._resolveDataElementOptions.apply(n,arguments),l={chart:i,dataIndex:e,dataset:a,datasetIndex:n.index};return n._cachedDataOpts===s&&(s=H.extend({},s)),s.radius=Ft([r.radius,o.r,n._config.radius,i.options.elements.point.radius],l,e),s}}),Lt=H.valueOrDefault,Rt=Math.PI,zt=2*Rt,Nt=Rt/2;N._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-Nt,circumference:zt,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.labels[t.index],i=": "+e.datasets[t.datasetIndex].data[t.index];return H.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}});var Bt=it.extend({dataElementType:kt.Arc,linkScales:H.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e,n,i,a,r=this,o=r.chart,s=o.chartArea,l=o.options,u=1,d=1,h=0,c=0,f=r.getMeta(),g=f.data,p=l.cutoutPercentage/100||0,m=l.circumference,v=r._getRingWeight(r.index);if(m<zt){var b=l.rotation%zt,x=(b+=b>=Rt?-zt:b<-Rt?zt:0)+m,y=Math.cos(b),_=Math.sin(b),k=Math.cos(x),w=Math.sin(x),M=b<=0&&x>=0||x>=zt,S=b<=Nt&&x>=Nt||x>=zt+Nt,C=b<=-Nt&&x>=-Nt||x>=Rt+Nt,P=b===-Rt||x>=Rt?-1:Math.min(y,y*p,k,k*p),A=C?-1:Math.min(_,_*p,w,w*p),D=M?1:Math.max(y,y*p,k,k*p),T=S?1:Math.max(_,_*p,w,w*p);u=(D-P)/2,d=(T-A)/2,h=-(D+P)/2,c=-(T+A)/2}for(i=0,a=g.length;i<a;++i)g[i]._options=r._resolveDataElementOptions(g[i],i);for(o.borderWidth=r.getMaxBorderWidth(),e=(s.right-s.left-o.borderWidth)/u,n=(s.bottom-s.top-o.borderWidth)/d,o.outerRadius=Math.max(Math.min(e,n)/2,0),o.innerRadius=Math.max(o.outerRadius*p,0),o.radiusLength=(o.outerRadius-o.innerRadius)/(r._getVisibleDatasetWeightTotal()||1),o.offsetX=h*o.outerRadius,o.offsetY=c*o.outerRadius,f.total=r.calculateTotal(),r.outerRadius=o.outerRadius-o.radiusLength*r._getRingWeightOffset(r.index),r.innerRadius=Math.max(r.outerRadius-o.radiusLength*v,0),i=0,a=g.length;i<a;++i)r.updateElement(g[i],i,t)},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,o=a.options,s=o.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,d=o.rotation,h=o.rotation,c=i.getDataset(),f=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(c.data[e])*(o.circumference/zt),g=n&&s.animateScale?0:i.innerRadius,p=n&&s.animateScale?0:i.outerRadius,m=t._options||{};H.extend(t,{_datasetIndex:i.index,_index:e,_model:{backgroundColor:m.backgroundColor,borderColor:m.borderColor,borderWidth:m.borderWidth,borderAlign:m.borderAlign,x:l+a.offsetX,y:u+a.offsetY,startAngle:d,endAngle:h,circumference:f,outerRadius:p,innerRadius:g,label:H.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;n&&s.animateRotate||(v.startAngle=0===e?o.rotation:i.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return H.each(n.data,(function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))})),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?zt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e<n;++e)if(d.isDatasetVisible(e)){t=(i=d.getDatasetMeta(e)).data,e!==this.index&&(r=i.controller);break}if(!t)return 0;for(e=0,n=t.length;e<n;++e)a=t[e],r?(r._configure(),o=r._resolveDataElementOptions(a,e)):o=a._options,"inner"!==o.borderAlign&&(s=o.borderWidth,u=(l=o.hoverBorderWidth)>(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=H.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Lt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Lt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Lt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&(e+=this._getRingWeight(n));return e},_getRingWeight:function(t){return Math.max(Lt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});N._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),N._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Et=Tt.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Wt=H.valueOrDefault,Vt=H.options.resolve,Ht=H.canvas._isPointInArea;function jt(t,e){var n=t&&t.options.ticks||{},i=n.reverse,a=void 0===n.min?e:0,r=void 0===n.max?e:0;return{start:i?r:a,end:i?a:r}}function qt(t,e,n){var i=n/2,a=jt(t,i),r=jt(e,i);return{top:r.end,right:a.end,bottom:r.start,left:a.start}}function Ut(t){var e,n,i,a;return H.isObject(t)?(e=t.top,n=t.right,i=t.bottom,a=t.left):e=n=i=a=t,{top:e,right:n,bottom:i,left:a}}N._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var Yt=it.extend({datasetElementType:kt.Line,dataElementType:kt.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.options,l=i._config,u=i._showLine=Wt(l.showLine,s.showLines);for(i._xScale=i.getScaleForId(a.xAxisID),i._yScale=i.getScaleForId(a.yAxisID),u&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=i._yScale,r._datasetIndex=i.index,r._children=o,r._model=i._resolveDatasetElementOptions(r),r.pivot()),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(u&&0!==r._model.tension&&i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i,a,r=this,o=r.getMeta(),s=t.custom||{},l=r.getDataset(),u=r.index,d=l.data[e],h=r._xScale,c=r._yScale,f=o.dataset._model,g=r._resolveDataElementOptions(t,e);i=h.getPixelForValue("object"==typeof d?d:NaN,e,u),a=n?c.getBasePixel():r.calculatePointY(d,e,u),t._xScale=h,t._yScale=c,t._options=g,t._datasetIndex=u,t._index=e,t._model={x:i,y:a,skip:s.skip||isNaN(i)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Wt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolveDatasetElementOptions:function(t){var e=this,n=e._config,i=t.custom||{},a=e.chart.options,r=a.elements.line,o=it.prototype._resolveDatasetElementOptions.apply(e,arguments);return o.spanGaps=Wt(n.spanGaps,a.spanGaps),o.tension=Wt(n.lineTension,r.tension),o.steppedLine=Vt([i.steppedLine,n.steppedLine,r.stepped]),o.clip=Ut(Wt(n.clip,qt(e._xScale,e._yScale,o.borderWidth))),o},calculatePointY:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._yScale,c=0,f=0;if(h.options.stacked){for(s=+h.getRightValue(t),u=(l=d._getSortedVisibleDatasetMetas()).length,i=0;i<u&&(r=l[i]).index!==n;++i)a=d.data.datasets[r.index],"line"===r.type&&r.yAxisID===h.id&&((o=+h.getRightValue(a.data[e]))<0?f+=o||0:c+=o||0);return s<0?h.getPixelForValue(f+s):h.getPixelForValue(c+s)}return h.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,n,i,a=this.chart,r=this.getMeta(),o=r.dataset._model,s=a.chartArea,l=r.data||[];function u(t,e,n){return Math.max(Math.min(t,n),e)}if(o.spanGaps&&(l=l.filter((function(t){return!t._model.skip}))),"monotone"===o.cubicInterpolationMode)H.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)n=l[t]._model,i=H.splineCurve(H.previousItem(l,t)._model,n,H.nextItem(l,t)._model,o.tension),n.controlPointPreviousX=i.previous.x,n.controlPointPreviousY=i.previous.y,n.controlPointNextX=i.next.x,n.controlPointNextY=i.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)n=l[t]._model,Ht(n,s)&&(t>0&&Ht(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&Ht(l[t+1]._model,s)&&(n.controlPointNextX=u(n.controlPointNextX,s.left,s.right),n.controlPointNextY=u(n.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,n=this.getMeta(),i=n.data||[],a=e.chartArea,r=e.canvas,o=0,s=i.length;for(this._showLine&&(t=n.dataset._model.clip,H.canvas.clipArea(e.ctx,{left:!1===t.left?0:a.left-t.left,right:!1===t.right?r.width:a.right+t.right,top:!1===t.top?0:a.top-t.top,bottom:!1===t.bottom?r.height:a.bottom+t.bottom}),n.dataset.draw(),H.canvas.unclipArea(e.ctx));o<s;++o)i[o].draw(a)},setHoverStyle:function(t){var e=t._model,n=t._options,i=H.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Wt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Wt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Wt(n.hoverBorderWidth,n.borderWidth),e.radius=Wt(n.hoverRadius,n.radius)}}),Gt=H.options.resolve;N._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var Xt=it.extend({dataElementType:kt.Arc,linkScales:H.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i,a=this,r=a.getDataset(),o=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],u=a._angles=[],d=o.data;for(a._updateRadius(),o.count=a.countVisibleElements(),e=0,n=r.data.length;e<n;e++)l[e]=s,i=a._computeAngle(e),u[e]=i,s+=i;for(e=0,n=d.length;e<n;++e)d[e]._options=a._resolveDataElementOptions(d[e],e),a.updateElement(d[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,n=e.chartArea,i=e.options,a=Math.min(n.right-n.left,n.bottom-n.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(i.cutoutPercentage?e.outerRadius/100*i.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,n){var i=this,a=i.chart,r=i.getDataset(),o=a.options,s=o.animation,l=a.scale,u=a.data.labels,d=l.xCenter,h=l.yCenter,c=o.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(r.data[e]),g=i._starts[e],p=g+(t.hidden?0:i._angles[e]),m=s.animateScale?0:l.getDistanceFromCenterForValue(r.data[e]),v=t._options||{};H.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:d,y:h,innerRadius:0,outerRadius:n?m:f,startAngle:n&&s.animateRotate?c:g,endAngle:n&&s.animateRotate?c:p,label:H.valueAtIndexOrDefault(u,e,u[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return H.each(e.data,(function(e,i){isNaN(t.data[i])||e.hidden||n++})),n},setHoverStyle:function(t){var e=t._model,n=t._options,i=H.getHoverColor,a=H.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=a(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=a(n.hoverBorderWidth,n.borderWidth)},_computeAngle:function(t){var e=this,n=this.getMeta().count,i=e.getDataset(),a=e.getMeta();if(isNaN(i.data[t])||a.data[t].hidden)return 0;var r={chart:e.chart,dataIndex:t,dataset:i,datasetIndex:e.index};return Gt([e.chart.options.elements.arc.angle,2*Math.PI/n],r,t)}});N._set("pie",H.clone(N.doughnut)),N._set("pie",{cutoutPercentage:0});var Kt=Bt,Zt=H.valueOrDefault;N._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var $t=it.extend({datasetElementType:kt.Line,dataElementType:kt.Point,linkScales:H.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.scale,l=i._config;for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=i.index,r._children=o,r._loop=!0,r._model=i._resolveDatasetElementOptions(r),r.pivot(),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),o=i.chart.scale,s=o.getPointPositionForValue(e,r.data[e]),l=i._resolveDataElementOptions(t,e),u=i.getMeta().dataset._model,d=n?o.xCenter:s.x,h=n?o.yCenter:s.y;t._scale=o,t._options=l,t._datasetIndex=i.index,t._index=e,t._model={x:d,y:h,skip:a.skip||isNaN(d)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:Zt(a.tension,u?u.tension:0),hitRadius:l.hitRadius}},_resolveDatasetElementOptions:function(){var t=this,e=t._config,n=t.chart.options,i=it.prototype._resolveDatasetElementOptions.apply(t,arguments);return i.spanGaps=Zt(e.spanGaps,n.spanGaps),i.tension=Zt(e.lineTension,n.elements.line.tension),i},updateBezierControlPoints:function(){var t,e,n,i,a=this.getMeta(),r=this.chart.chartArea,o=a.data||[];function s(t,e,n){return Math.max(Math.min(t,n),e)}for(a.dataset._model.spanGaps&&(o=o.filter((function(t){return!t._model.skip}))),t=0,e=o.length;t<e;++t)n=o[t]._model,i=H.splineCurve(H.previousItem(o,t,!0)._model,n,H.nextItem(o,t,!0)._model,n.tension),n.controlPointPreviousX=s(i.previous.x,r.left,r.right),n.controlPointPreviousY=s(i.previous.y,r.top,r.bottom),n.controlPointNextX=s(i.next.x,r.left,r.right),n.controlPointNextY=s(i.next.y,r.top,r.bottom)},setHoverStyle:function(t){var e=t._model,n=t._options,i=H.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Zt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Zt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Zt(n.hoverBorderWidth,n.borderWidth),e.radius=Zt(n.hoverRadius,n.radius)}});N._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),N._set("global",{datasets:{scatter:{showLine:!1}}});var Jt={bar:Tt,bubble:Ot,doughnut:Bt,horizontalBar:Et,line:Yt,polarArea:Xt,pie:Kt,radar:$t,scatter:Yt};function Qt(t,e){return t.native?{x:t.x,y:t.y}:H.getRelativePosition(t,e)}function te(t,e){var n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas();for(i=0,r=l.length;i<r;++i)for(a=0,o=(n=l[i].data).length;a<o;++a)(s=n[a])._view.skip||e(s)}function ee(t,e){var n=[];return te(t,(function(t){t.inRange(e.x,e.y)&&n.push(t)})),n}function ne(t,e,n,i){var a=Number.POSITIVE_INFINITY,r=[];return te(t,(function(t){if(!n||t.inRange(e.x,e.y)){var o=t.getCenterPoint(),s=i(e,o);s<a?(r=[t],a=s):s===a&&r.push(t)}})),r}function ie(t){var e=-1!==t.indexOf("x"),n=-1!==t.indexOf("y");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function ae(t,e,n){var i=Qt(e,t);n.axis=n.axis||"x";var a=ie(n.axis),r=n.intersect?ee(t,i):ne(t,i,!1,a),o=[];return r.length?(t._getSortedVisibleDatasetMetas().forEach((function(t){var e=t.data[r[0]._index];e&&!e._view.skip&&o.push(e)})),o):[]}var re={modes:{single:function(t,e){var n=Qt(e,t),i=[];return te(t,(function(t){if(t.inRange(n.x,n.y))return i.push(t),i})),i.slice(0,1)},label:ae,index:ae,dataset:function(t,e,n){var i=Qt(e,t);n.axis=n.axis||"xy";var a=ie(n.axis),r=n.intersect?ee(t,i):ne(t,i,!1,a);return r.length>0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return ae(t,e,{intersect:!1})},point:function(t,e){return ee(t,Qt(e,t))},nearest:function(t,e,n){var i=Qt(e,t);n.axis=n.axis||"xy";var a=ie(n.axis);return ne(t,i,n.intersect,a)},x:function(t,e,n){var i=Qt(e,t),a=[],r=!1;return te(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=Qt(e,t),a=[],r=!1;return te(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},oe=H.extend;function se(t,e){return H.where(t,(function(t){return t.pos===e}))}function le(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function ue(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function de(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-ue(o,t,"left","right"),a=e.outerHeight-ue(o,t,"top","bottom"),i!==t.w||a!==t.h){t.w=i,t.h=a;var l=n.horizontal?[i,t.w]:[a,t.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function he(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function ce(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;i<a;++i)(o=(r=t[i]).box).update(r.width||e.w,r.height||e.h,he(r.horizontal,e)),de(e,n,r)&&(l=!0,u.length&&(s=!0)),o.fullWidth||u.push(r);return s&&ce(u,e,n)||l}function fe(t,e,n){var i,a,r,o,s=n.padding,l=e.x,u=e.y;for(i=0,a=t.length;i<a;++i)o=(r=t[i]).box,r.horizontal?(o.left=o.fullWidth?s.left:e.left,o.right=o.fullWidth?n.outerWidth-s.right:e.left+e.w,o.top=u,o.bottom=u+o.height,o.width=o.right-o.left,u=o.bottom):(o.left=l,o.right=l+o.width,o.top=e.top,o.bottom=e.top+e.h,o.height=o.bottom-o.top,l=o.right);e.x=l,e.y=u}N._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var ge,pe={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw:function(){e.draw.apply(e,arguments)}}]},t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,e,n){if(t){var i=t.options.layout||{},a=H.options.toPadding(i.padding),r=e-a.width,o=n-a.height,s=function(t){var e=function(t){var e,n,i,a=[];for(e=0,n=(t||[]).length;e<n;++e)i=t[e],a.push({index:e,box:i,pos:i.position,horizontal:i.isHorizontal(),weight:i.weight});return a}(t),n=le(se(e,"left"),!0),i=le(se(e,"right")),a=le(se(e,"top"),!0),r=le(se(e,"bottom"));return{leftAndTop:n.concat(a),rightAndBottom:i.concat(r),chartArea:se(e,"chartArea"),vertical:n.concat(i),horizontal:a.concat(r)}}(t.boxes),l=s.vertical,u=s.horizontal,d=Object.freeze({outerWidth:e,outerHeight:n,padding:a,availableWidth:r,vBoxMaxWidth:r/2/l.length,hBoxMaxHeight:o/2}),h=oe({maxPadding:oe({},a),w:r,h:o,x:a.left,y:a.top},a);!function(t,e){var n,i,a;for(n=0,i=t.length;n<i;++n)(a=t[n]).width=a.horizontal?a.box.fullWidth&&e.availableWidth:e.vBoxMaxWidth,a.height=a.horizontal&&e.hBoxMaxHeight}(l.concat(u),d),ce(l,h,d),ce(u,h,d)&&ce(l,h,d),function(t){var e=t.maxPadding;function n(n){var i=Math.max(e[n]-t[n],0);return t[n]+=i,i}t.y+=n("top"),t.x+=n("left"),n("right"),n("bottom")}(h),fe(s.leftAndTop,h,d),h.x+=h.w,h.y+=h.h,fe(s.rightAndBottom,h,d),t.chartArea={left:h.left,top:h.top,right:h.left+h.w,bottom:h.top+h.h},H.each(s.chartArea,(function(e){var n=e.box;oe(n,t.chartArea),n.update(h.w,h.h)}))}}},me=(ge=Object.freeze({__proto__:null,default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&ge.default||ge,ve="$chartjs",be="chartjs-size-monitor",xe="chartjs-render-monitor",ye="chartjs-render-animation",_e=["animationstart","webkitAnimationStart"],ke={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function we(t,e){var n=H.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var Me=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Se(t,e,n){t.addEventListener(e,n,Me)}function Ce(t,e,n){t.removeEventListener(e,n,Me)}function Pe(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Ae(t){var e=document.createElement("div");return e.className=t||"",e}function De(t,e,n){var i,a,r,o,s=t[ve]||(t[ve]={}),l=s.resizer=function(t){var e=Ae(be),n=Ae(be+"-expand"),i=Ae(be+"-shrink");n.appendChild(Ae()),i.appendChild(Ae()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return Se(n,"scroll",a.bind(n,"expand")),Se(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Pe("resize",n)),i&&i.clientWidth<a&&n.canvas&&e(Pe("resize",n))}},r=!1,o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,H.requestAnimFrame.call(window,(function(){r=!1,i.apply(a,o)})))}));!function(t,e){var n=t[ve]||(t[ve]={}),i=n.renderProxy=function(t){t.animationName===ye&&e()};H.each(_e,(function(e){Se(t,e,i)})),n.reflow=!!t.offsetParent,t.classList.add(xe)}(t,(function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}}))}function Te(t){var e=t[ve]||{},n=e.resizer;delete e.resizer,function(t){var e=t[ve]||{},n=e.renderProxy;n&&(H.each(_e,(function(e){Ce(t,e,n)})),delete e.renderProxy),t.classList.remove(xe)}(t),n&&n.parentNode&&n.parentNode.removeChild(n)}var Ie={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(t){if(!this.disableCSSInjection){var e=t.getRootNode?t.getRootNode():document;!function(t,e){var n=t[ve]||(t[ve]={});if(!n.containsStyles){n.containsStyles=!0,e="/* Chart.js */\n"+e;var i=document.createElement("style");i.setAttribute("type","text/css"),i.appendChild(document.createTextNode(e)),t.appendChild(i)}}(e.host?e:document.head,me)}},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(this._ensureLoaded(t),function(t,e){var n=t.style,i=t.getAttribute("height"),a=t.getAttribute("width");if(t[ve]={initial:{height:i,width:a,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===a||""===a){var r=we(t,"width");void 0!==r&&(t.width=r)}if(null===i||""===i)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=we(t,"height");void 0!==r&&(t.height=o)}}(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[ve]){var n=e[ve].initial;["height","width"].forEach((function(t){var i=n[t];H.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)})),H.each(n.style||{},(function(t,n){e.style[n]=t})),e.width=e.width,delete e[ve]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[ve]||(n[ve]={});Se(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(function(t,e){var n=ke[t.type]||t.type,i=H.getRelativePosition(t,e);return Pe(n,e,i.x,i.y,t)}(e,t))})}else De(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[ve]||{}).proxies||{})[t.id+"_"+e];a&&Ce(i,e,a)}else Te(i)}};H.addEvent=Se,H.removeEvent=Ce;var Fe=Ie._enabled?Ie:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Oe=H.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Fe);N._set("global",{plugins:{}});var Le={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach((function(t){-1===e.indexOf(t)&&e.push(t)})),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach((function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)})),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if("function"==typeof(s=(r=(a=l[i]).plugin)[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],i=[],a=t&&t.config||{},r=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach((function(t){if(-1===n.indexOf(t)){var e=t.id,a=r[e];!1!==a&&(!0===a&&(a=H.clone(N.global.plugins[e])),n.push(t),i.push({plugin:t,options:a||{}}))}})),e.descriptors=i,e.id=this._cacheId,i},_invalidate:function(t){delete t.$plugins}},Re={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=H.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?H.merge(Object.create(null),[N.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=H.extend(this.defaults[t],e))},addScalesToLayout:function(t){H.each(t.scales,(function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,pe.addBox(t,e)}))}},ze=H.valueOrDefault,Ne=H.rtl.getRtlAdapter;N._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:H.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:H.noop,beforeBody:H.noop,beforeLabel:H.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),H.isNullOrUndef(t.value)?n+=t.yLabel:n+=t.value,n},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:H.noop,afterBody:H.noop,beforeFooter:H.noop,footer:H.noop,afterFooter:H.noop}}});var Be={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:i/r,y:a/r}},nearest:function(t,e){var n,i,a,r=e.x,o=e.y,s=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var l=t[n];if(l&&l.hasValue()){var u=l.getCenterPoint(),d=H.distanceBetweenPoints(e,u);d<s&&(s=d,a=l)}}if(a){var h=a.tooltipPosition();r=h.x,o=h.y}return{x:r,y:o}}};function Ee(t,e){return e&&(H.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function We(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Ve(t){var e=N.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:ze(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:ze(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:ze(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:ze(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:ze(t.titleFontStyle,e.defaultFontStyle),titleFontSize:ze(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:ze(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:ze(t.footerFontStyle,e.defaultFontStyle),footerFontSize:ze(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function He(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function je(t){return Ee([],We(t))}var qe=K.extend({initialize:function(){this._model=Ve(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Ee(o,We(i)),o=Ee(o,We(a)),o=Ee(o,We(r))},getBeforeBody:function(){return je(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return H.each(t,(function(t){var r={before:[],lines:[],after:[]};Ee(r.before,We(i.beforeLabel.call(n,t,e))),Ee(r.lines,i.label.call(n,t,e)),Ee(r.after,We(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return je(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Ee(r,We(n)),r=Ee(r,We(i)),r=Ee(r,We(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=Ve(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var _=[],k=[];y=Be[c.position].call(h,p,h._eventPosition);var w=[];for(e=0,n=p.length;e<n;++e)w.push((i=p[e],a=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,d=void 0,a=i._xScale,r=i._yScale||i._scale,o=i._index,s=i._datasetIndex,l=i._chart.getDatasetMeta(s).controller,u=l._getIndexScale(),d=l._getValueScale(),{xLabel:a?a.getLabelForIndex(o,s):"",yLabel:r?r.getLabelForIndex(o,s):"",label:u?""+u.getLabelForIndex(o,s):"",value:d?""+d.getLabelForIndex(o,s):"",index:o,datasetIndex:s,x:i._model.x,y:i._model.y}));c.filter&&(w=w.filter((function(t){return c.filter(t,m)}))),c.itemSort&&(w=w.sort((function(t,e){return c.itemSort(t,e,m)}))),H.each(w,(function(t){_.push(c.callbacks.labelColor.call(h,t,h._chart)),k.push(c.callbacks.labelTextColor.call(h,t,h._chart))})),g.title=h.getTitle(w,m),g.beforeBody=h.getBeforeBody(w,m),g.body=h.getBody(w,m),g.afterBody=h.getAfterBody(w,m),g.footer=h.getFooter(w,m),g.x=y.x,g.y=y.y,g.caretPadding=c.caretPadding,g.labelColors=_,g.labelTextColors=k,g.dataPoints=w,x=function(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce((function(t,e){return t+e.before.length+e.lines.length+e.after.length}),0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;i+=s*u,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*d,i+=o?(o-1)*e.bodySpacing:0,i+=l?e.footerMarginTop:0,i+=l*h,i+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,n.measureText(t).width+c)};return n.font=H.fontString(u,e._titleFontStyle,e._titleFontFamily),H.each(e.title,f),n.font=H.fontString(d,e._bodyFontStyle,e._bodyFontFamily),H.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,H.each(r,(function(t){H.each(t.before,f),H.each(t.lines,f),H.each(t.after,f)})),c=0,n.font=H.fontString(h,e._footerFontStyle,e._footerFontFamily),H.each(e.footer,f),{width:a+=2*e.xPadding,height:i}}(this,g),b=function(t,e,n,i){var a=t.x,r=t.y,o=t.caretSize,s=t.caretPadding,l=t.cornerRadius,u=n.xAlign,d=n.yAlign,h=o+s,c=l+s;return"right"===u?a-=e.width:"center"===u&&((a-=e.width/2)+e.width>i.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,x,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+p)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+p-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+m)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=Ne(e.rtl,e.x,e.width);for(t.x=He(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=H.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r<s;++r)n.fillText(o[r],l.x(t.x),t.y+i/2),t.y+=i+a,r+1===s&&(t.y+=e.titleMarginBottom-a)}},drawBody:function(t,e,n){var i,a,r,o,s,l,u,d,h=e.bodyFontSize,c=e.bodySpacing,f=e._bodyAlign,g=e.body,p=e.displayColors,m=0,v=p?He(e,"left"):0,b=Ne(e.rtl,e.x,e.width),x=function(e){n.fillText(e,b.x(t.x+m),t.y+h/2),t.y+=h+c},y=b.textAlign(f);for(n.textAlign=f,n.textBaseline="middle",n.font=H.fontString(h,e._bodyFontStyle,e._bodyFontFamily),t.x=He(e,y),n.fillStyle=e.bodyFontColor,H.each(e.beforeBody,x),m=p&&"right"!==y?"center"===f?h/2+1:h+2:0,s=0,u=g.length;s<u;++s){for(i=g[s],a=e.labelTextColors[s],r=e.labelColors[s],n.fillStyle=a,H.each(i.before,x),l=0,d=(o=i.lines).length;l<d;++l){if(p){var _=b.x(v);n.fillStyle=e.legendColorBackground,n.fillRect(b.leftForLtr(_,h),t.y,h,h),n.lineWidth=1,n.strokeStyle=r.borderColor,n.strokeRect(b.leftForLtr(_,h),t.y,h,h),n.fillStyle=r.backgroundColor,n.fillRect(b.leftForLtr(b.xPlus(_,1),h-2),t.y+1,h-2,h-2),n.fillStyle=a}x(o[l])}H.each(i.after,x)}m=0,H.each(e.afterBody,x),t.y-=c},drawFooter:function(t,e,n){var i,a,r=e.footer,o=r.length;if(o){var s=Ne(e.rtl,e.x,e.width);for(t.x=He(e,e._footerAlign),t.y+=e.footerMarginTop,n.textAlign=s.textAlign(e._footerAlign),n.textBaseline="middle",i=e.footerFontSize,n.fillStyle=e.footerFontColor,n.font=H.fontString(i,e._footerFontStyle,e._footerFontFamily),a=0;a<o;++a)n.fillText(r[a],s.x(t.x),t.y+i/2),t.y+=i+e.footerSpacing}},drawBackground:function(t,e,n,i){n.fillStyle=e.backgroundColor,n.strokeStyle=e.borderColor,n.lineWidth=e.borderWidth;var a=e.xAlign,r=e.yAlign,o=t.x,s=t.y,l=i.width,u=i.height,d=e.cornerRadius;n.beginPath(),n.moveTo(o+d,s),"top"===r&&this.drawCaret(t,i),n.lineTo(o+l-d,s),n.quadraticCurveTo(o+l,s,o+l,s+d),"center"===r&&"right"===a&&this.drawCaret(t,i),n.lineTo(o+l,s+u-d),n.quadraticCurveTo(o+l,s+u,o+l-d,s+u),"bottom"===r&&this.drawCaret(t,i),n.lineTo(o+d,s+u),n.quadraticCurveTo(o,s+u,o,s+u-d),"center"===r&&"left"===a&&this.drawCaret(t,i),n.lineTo(o,s+d),n.quadraticCurveTo(o,s,o+d,s),n.closePath(),n.fill(),e.borderWidth>0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,H.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),H.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!H.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),Ue=Be,Ye=qe;Ye.positioners=Ue;var Ge=H.valueOrDefault;function Xe(){return H.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)o=n[t][a],r=Ge(o.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?H.merge(e[t][a],[Re.getScaleDefaults(r),o]):H.merge(e[t][a],o)}else H._merger(t,e,n,i)}})}function Ke(){return H.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||Object.create(null),r=n[t];"scales"===t?e[t]=Xe(a,r):"scale"===t?e[t]=H.merge(a,[Re.getScaleDefaults(r.type),r]):H._merger(t,e,n,i)}})}function Ze(t){var e=t.options;H.each(t.scales,(function(e){pe.removeBox(t,e)})),e=Ke(N.global,N[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function $e(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(H.findIndex(t,a)>=0);return i}function Je(t){return"top"===t||"bottom"===t}function Qe(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}N._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var tn=function(t,e){return this.construct(t,e),this};H.extend(tn.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||Object.create(null)).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Ke(N.global,N[t.type],t.options||{}),t}(e);var i=Oe.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=H.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,tn.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Le.notify(t,"beforeInit"),H.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Le.notify(t,"afterInit"),t},clear:function(){return H.canvas.clear(this),this},stop:function(){return J.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(H.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:H.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",H.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Le.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;H.each(e.xAxes,(function(t,n){t.id||(t.id=$e(e.xAxes,"x-axis-",n))})),H.each(e.yAxes,(function(t,n){t.id||(t.id=$e(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),H.each(i,(function(e){var i=e.options,r=i.id,o=Ge(i.type,e.dtype);Je(i.position)!==Je(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Re.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),H.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Re.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t<e;t++){var r=a[t],o=n.getDatasetMeta(t),s=r.type||n.config.type;if(o.type&&o.type!==s&&(n.destroyDatasetMeta(t),o=n.getDatasetMeta(t)),o.type=s,o.order=r.order||0,o.index=t,o.controller)o.controller.updateIndex(t),o.controller.linkScales();else{var l=Jt[o.type];if(void 0===l)throw new Error('"'+o.type+'" is not a chart type.');o.controller=new l(n,t),i.push(o.controller)}}return i},resetElements:function(){var t=this;H.each(t.data.datasets,(function(e,n){t.getDatasetMeta(n).controller.reset()}),t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,n,i=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),Ze(i),Le._invalidate(i),!1!==Le.notify(i,"beforeUpdate")){i.tooltip._data=i.data;var a=i.buildOrUpdateControllers();for(e=0,n=i.data.datasets.length;e<n;e++)i.getDatasetMeta(e).controller.buildOrUpdateElements();i.updateLayout(),i.options.animation&&i.options.animation.duration&&H.each(a,(function(t){t.reset()})),i.updateDatasets(),i.tooltip.initialize(),i.lastActive=[],Le.notify(i,"afterUpdate"),i._layers.sort(Qe("z","_idx")),i._bufferedRender?i._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:i.render(t)}},updateLayout:function(){var t=this;!1!==Le.notify(t,"beforeLayout")&&(pe.update(this,this.width,this.height),t._layers=[],H.each(t.boxes,(function(e){e._configure&&e._configure(),t._layers.push.apply(t._layers,e._layers())}),t),t._layers.forEach((function(t,e){t._idx=e})),Le.notify(t,"afterScaleUpdate"),Le.notify(t,"afterLayout"))},updateDatasets:function(){if(!1!==Le.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Le.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),n={meta:e,index:t};!1!==Le.notify(this,"beforeDatasetUpdate",[n])&&(e.controller._update(),Le.notify(this,"afterDatasetUpdate",[n]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var n=e.options.animation,i=Ge(t.duration,n&&n.duration),a=t.lazy;if(!1!==Le.notify(e,"beforeRender")){var r=function(t){Le.notify(e,"afterRender"),H.callback(n&&n.onComplete,[t],e)};if(n&&i){var o=new $({numSteps:i/16.66,easing:t.easing||n.easing,render:function(t,e){var n=H.easing.effects[e.easing],i=e.currentStep,a=i/e.numSteps;t.draw(n(a),a,i)},onAnimationProgress:n.onProgress,onAnimationComplete:r});J.addAnimation(e,o,i,a)}else e.draw(),r(new $({numSteps:0,chart:e}));return e}},draw:function(t){var e,n,i=this;if(i.clear(),H.isNullOrUndef(t)&&(t=1),i.transition(t),!(i.width<=0||i.height<=0)&&!1!==Le.notify(i,"beforeDraw",[t])){for(n=i._layers,e=0;e<n.length&&n[e].z<=0;++e)n[e].draw(i.chartArea);for(i.drawDatasets(t);e<n.length;++e)n[e].draw(i.chartArea);i._drawTooltip(t),Le.notify(i,"afterDraw",[t])}},transition:function(t){for(var e=0,n=(this.data.datasets||[]).length;e<n;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},_getSortedDatasetMetas:function(t){var e,n,i=[];for(e=0,n=(this.data.datasets||[]).length;e<n;++e)t&&!this.isDatasetVisible(e)||i.push(this.getDatasetMeta(e));return i.sort(Qe("order","index")),i},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(t){var e,n;if(!1!==Le.notify(this,"beforeDatasetsDraw",[t])){for(n=(e=this._getSortedVisibleDatasetMetas()).length-1;n>=0;--n)this.drawDataset(e[n],t);Le.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Le.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Le.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Le.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Le.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return re.modes.single(this,t)},getElementsAtEvent:function(t){return re.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return re.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=re.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return re.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var t,e,n=this,i=n.canvas;for(n.stop(),t=0,e=n.data.datasets.length;t<e;++t)n.destroyDatasetMeta(t);i&&(n.unbindEvents(),H.canvas.clear(n),Oe.releaseContext(n.ctx),n.canvas=null,n.ctx=null),Le.notify(n,"destroy"),delete tn.instances[n.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Ye({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};H.each(t.options.events,(function(i){Oe.addEventListener(t,i,n),e[i]=n})),t.options.responsive&&(n=function(){t.resize()},Oe.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,H.each(e,(function(e,n){Oe.removeEventListener(t,n,e)})))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?"set":"remove";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o+"HoverStyle"](i);"dataset"===e&&this.getDatasetMeta(t[0]._datasetIndex).controller["_"+o+"DatasetHoverStyle"]()},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==Le.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);n&&(i=n._start?n.handleEvent(t):i|n.handleEvent(t)),Le.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,n=this,i=n.options||{},a=i.hover;return n.lastActive=n.lastActive||[],"mouseout"===t.type?n.active=[]:n.active=n.getElementsAtEventForMode(t,a.mode,a),H.callback(i.onHover||i.hover.onHover,[t.native,n.active],n),"mouseup"!==t.type&&"click"!==t.type||i.onClick&&i.onClick.call(n,t.native,n.active),n.lastActive.length&&n.updateHoverStyle(n.lastActive,a.mode,!1),n.active.length&&a.mode&&n.updateHoverStyle(n.active,a.mode,!0),e=!H.arrayEquals(n.active,n.lastActive),n.lastActive=n.active,e}}),tn.instances={};var en=tn;tn.Controller=tn,tn.types={},H.configMerge=Ke,H.scaleMerge=Xe;function nn(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function an(t){this.options=t||{}}H.extend(an.prototype,{formats:nn,parse:nn,format:nn,add:nn,diff:nn,startOf:nn,endOf:nn,_create:function(t){return t}}),an.override=function(t){H.extend(an.prototype,t)};var rn={_date:an},on={formatters:{values:function(t){return H.isArray(t)?t:""+t},linear:function(t,e,n){var i=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=H.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=H.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(H.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},sn=H.isArray,ln=H.isNullOrUndef,un=H.valueOrDefault,dn=H.valueAtIndexOrDefault;function hn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=r<e?i:-i)<s-1e-6||o>l+1e-6)))return o}function cn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,p,m,v=n.length,b=[],x=[],y=[],_=0,k=0;for(a=0;a<v;++a){if(s=n[a].label,l=n[a].major?e.major:e.minor,t.font=u=l.string,d=i[u]=i[u]||{data:{},gc:[]},h=l.lineHeight,c=f=0,ln(s)||sn(s)){if(sn(s))for(r=0,o=s.length;r<o;++r)g=s[r],ln(g)||sn(g)||(c=H.measureText(t,d.data,d.gc,c,g),f+=h)}else c=H.measureText(t,d.data,d.gc,c,s),f=h;b.push(c),x.push(f),y.push(h/2),_=Math.max(c,_),k=Math.max(f,k)}function w(t){return{width:b[t]||0,height:x[t]||0,offset:y[t]||0}}return function(t,e){H.each(t,(function(t){var n,i=t.gc,a=i.length/2;if(a>e){for(n=0;n<a;++n)delete t.data[i[n]];i.splice(0,a)}}))}(i,v),p=b.indexOf(_),m=x.indexOf(k),{first:w(0),last:w(v-1),widest:w(p),highest:w(m)}}function fn(t){return t.drawTicks?t.tickMarkLength:0}function gn(t){var e,n;return t.display?(e=H.options._parseFont(t),n=H.options.toPadding(t.padding),e.lineHeight+n.height):0}function pn(t,e){return H.extend(H.options._parseFont({fontFamily:un(e.fontFamily,t.fontFamily),fontSize:un(e.fontSize,t.fontSize),fontStyle:un(e.fontStyle,t.fontStyle),lineHeight:un(e.lineHeight,t.lineHeight)}),{color:H.options.resolve([e.fontColor,t.fontColor,N.global.defaultFontColor])})}function mn(t){var e=pn(t,t.minor);return{minor:e,major:t.major.enabled?pn(t,t.major):e}}function vn(t){var e,n,i,a=[];for(n=0,i=t.length;n<i;++n)void 0!==(e=t[n])._index&&a.push(e);return a}function bn(t,e,n,i){var a,r,o,s,l=un(n,0),u=Math.min(un(i,t.length),t.length),d=0;for(e=Math.ceil(e),i&&(e=(a=i-n)/Math.floor(a/e)),s=l;s<0;)d++,s=Math.round(l+d*e);for(r=Math.max(l,0);r<u;r++)o=t[r],r===s?(o._index=r,d++,s=Math.round(l+d*e)):delete o.label}N._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:on.formatters.values,minor:{},major:{}}});var xn=K.extend({zeroLineIndex:0,getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){H.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,s,l=this,u=l.options.ticks,d=u.sampleSize;if(l.beforeUpdate(),l.maxWidth=t,l.maxHeight=e,l.margins=H.extend({left:0,right:0,top:0,bottom:0},n),l._ticks=null,l.ticks=null,l._labelSizes=null,l._maxLabelLines=0,l.longestLabelWidth=0,l.longestTextCache=l.longestTextCache||{},l._gridLineItems=null,l._labelItems=null,l.beforeSetDimensions(),l.setDimensions(),l.afterSetDimensions(),l.beforeDataLimits(),l.determineDataLimits(),l.afterDataLimits(),l.beforeBuildTicks(),o=l.buildTicks()||[],(!(o=l.afterBuildTicks(o)||o)||!o.length)&&l.ticks)for(o=[],i=0,a=l.ticks.length;i<a;++i)o.push({value:l.ticks[i],major:!1});return l._ticks=o,s=d<o.length,r=l._convertTicksToLabels(s?function(t,e){for(var n=[],i=t.length/e,a=0,r=t.length;a<r;a+=i)n.push(t[Math.floor(a)]);return n}(o,d):o),l._configure(),l.beforeCalculateTickRotation(),l.calculateTickRotation(),l.afterCalculateTickRotation(),l.beforeFit(),l.fit(),l.afterFit(),l._ticksToDraw=u.display&&(u.autoSkip||"auto"===u.source)?l._autoSkip(o):o,s&&(r=l._convertTicksToLabels(l._ticksToDraw)),l.ticks=r,l.afterUpdate(),l.minSize},_configure:function(){var t,e,n=this,i=n.options.ticks.reverse;n.isHorizontal()?(t=n.left,e=n.right):(t=n.top,e=n.bottom,i=!i),n._startPixel=t,n._endPixel=e,n._reversePixels=i,n._length=e-t},afterUpdate:function(){H.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){H.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){H.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){H.callback(this.options.beforeDataLimits,[this])},determineDataLimits:H.noop,afterDataLimits:function(){H.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){H.callback(this.options.beforeBuildTicks,[this])},buildTicks:H.noop,afterBuildTicks:function(t){var e=this;return sn(t)&&t.length?H.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=H.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){H.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){H.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){H.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t,e,n,i,a,r,o,s=this,l=s.options,u=l.ticks,d=s.getTicks().length,h=u.minRotation||0,c=u.maxRotation,f=h;!s._isVisible()||!u.display||h>=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-fn(l.gridLines)-u.padding-gn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=H.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){H.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){H.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=fn(o)+gn(r)),u?s&&(e.height=fn(o)+gn(r)):e.height=t.maxHeight,a.display&&s){var d=mn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,p=h.highest,m=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,x=H.toRadians(t.labelRotation),y=Math.cos(x),_=Math.sin(x),k=_*g.width+y*(p.height-(b?p.offset:0))+(b?0:m);e.height=Math.min(t.maxHeight,e.height+k+v);var w,M,S=t.getPixelForTick(0)-t.left,C=t.right-t.getPixelForTick(t.getTicks().length-1);b?(w=l?y*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):y*f.width+_*f.offset):(w=c.width/2,M=f.width/2),t.paddingLeft=Math.max((w-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-C)*t.width/(t.width-C),0)+3}else{var P=a.mirror?0:g.width+v+m;e.width=Math.min(t.maxWidth,e.width+P),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){H.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ln(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;n<i;++n)t[n].label=e[n];return e},_getLabelSizes:function(){var t=this,e=t._labelSizes;return e||(t._labelSizes=e=cn(t.ctx,mn(t.options.ticks),t.getTicks(),t.longestTextCache),t.longestLabelWidth=e.widest.width),e},_parseValue:function(t){var e,n,i,a;return sn(t)?(e=+this.getRightValue(t[0]),n=+this.getRightValue(t[1]),i=Math.min(e,n),a=Math.max(e,n)):(e=void 0,n=t=+this.getRightValue(t),i=t,a=t),{min:i,max:a,start:e,end:n}},_getScaleLabel:function(t){var e=this._parseValue(t);return void 0!==e.start?"["+e.start+", "+e.end+"]":+this.getRightValue(t)},getLabelForIndex:H.noop,getPixelForValue:H.noop,getValueForPixel:H.noop,getPixelForTick:function(t){var e=this.options.offset,n=this._ticks.length,i=1/Math.max(n-(e?0:1),1);return t<0||t>n-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;e<n;e++)t[e].major&&i.push(e);return i}(t):[],u=l.length,d=l[0],h=l[u-1];if(u>s)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;i<t.length;i++)a=t[i],i===o?(a._index=i,o=e[++r*n]):delete a.label}(t,l,u/s),vn(t);if(i=function(t,e,n,i){var a,r,o,s,l=function(t){var e,n,i=t.length;if(i<2)return!1;for(n=t[0],e=1;e<i;++e)if(t[e]-t[e-1]!==n)return!1;return n}(t),u=(e.length-1)/i;if(!l)return Math.max(u,1);for(o=0,s=(a=H.math._factorize(l)).length-1;o<s;o++)if((r=a[o])>u)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e<n;e++)bn(t,i,l[e],l[e+1]);return a=u>1?(h-d)/(u-1):null,bn(t,i,H.isNullOrUndef(a)?0:d-a,d),bn(t,i,h,H.isNullOrUndef(a)?t.length:h+a),vn(t)}return bn(t,i),vn(t)},_tickSize:function(){var t=this.options.ticks,e=H.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i<o*n?s/n:o/i},_isVisible:function(){var t,e,n,i=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=i.data.datasets.length;t<e;++t)if(i.isDatasetVisible(t)&&((n=i.getDatasetMeta(t)).xAxisID===this.id||n.yAxisID===this.id))return!0;return!1},_computeGridLineItems:function(t){var e,n,i,a,r,o,s,l,u,d,h,c,f,g,p,m,v,b=this,x=b.chart,y=b.options,_=y.gridLines,k=y.position,w=_.offsetGridLines,M=b.isHorizontal(),S=b._ticksToDraw,C=S.length+(w?1:0),P=fn(_),A=[],D=_.drawBorder?dn(_.lineWidth,0,0):0,T=D/2,I=H._alignPixel,F=function(t){return I(x,t,D)};for("top"===k?(e=F(b.bottom),s=b.bottom-P,u=e-T,h=F(t.top)+T,f=t.bottom):"bottom"===k?(e=F(b.top),h=t.top,f=F(t.bottom)-T,s=e+T,u=b.top+P):"left"===k?(e=F(b.right),o=b.right-P,l=e-T,d=F(t.left)+T,c=t.right):(e=F(b.left),d=t.left,c=F(t.right)-T,o=e+T,l=b.left+P),n=0;n<C;++n)i=S[n]||{},ln(i.label)&&n<S.length||(n===b.zeroLineIndex&&y.offset===w?(g=_.zeroLineWidth,p=_.zeroLineColor,m=_.zeroLineBorderDash||[],v=_.zeroLineBorderDashOffset||0):(g=dn(_.lineWidth,n,1),p=dn(_.color,n,"rgba(0,0,0,0.1)"),m=_.borderDash||[],v=_.borderDashOffset||0),void 0!==(a=hn(b,i._index||n,w))&&(r=I(x,a,g),M?o=l=d=c=r:s=u=h=f=r,A.push({tx1:o,ty1:s,tx2:l,ty2:u,x1:d,y1:h,x2:c,y2:f,width:g,color:p,borderDash:m,borderDashOffset:v})));return A.ticksLength=C,A.borderValue=e,A},_computeLabelItems:function(){var t,e,n,i,a,r,o,s,l,u,d,h,c=this,f=c.options,g=f.ticks,p=f.position,m=g.mirror,v=c.isHorizontal(),b=c._ticksToDraw,x=mn(g),y=g.padding,_=fn(f.gridLines),k=-H.toRadians(c.labelRotation),w=[];for("top"===p?(r=c.bottom-_-y,o=k?"left":"center"):"bottom"===p?(r=c.top+_+y,o=k?"right":"center"):"left"===p?(a=c.right-(m?0:_)-y,o=m?"left":"right"):(a=c.left+(m?0:_)+y,o=m?"right":"left"),t=0,e=b.length;t<e;++t)i=(n=b[t]).label,ln(i)||(s=c.getPixelForTick(n._index||t)+g.labelOffset,u=(l=n.major?x.major:x.minor).lineHeight,d=sn(i)?i.length:1,v?(a=s,h="top"===p?((k?1:.5)-d)*u:(k?0:.5)*u):(r=s,h=(1-d)*u/2),w.push({x:a,y:r,rotation:k,label:i,font:l,textOffset:h,textAlign:o}));return w},_drawGrid:function(t){var e=this,n=e.options.gridLines;if(n.display){var i,a,r,o,s,l=e.ctx,u=e.chart,d=H._alignPixel,h=n.drawBorder?dn(n.lineWidth,0,0):0,c=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));for(r=0,o=c.length;r<o;++r)i=(s=c[r]).width,a=s.color,i&&a&&(l.save(),l.lineWidth=i,l.strokeStyle=a,l.setLineDash&&(l.setLineDash(s.borderDash),l.lineDashOffset=s.borderDashOffset),l.beginPath(),n.drawTicks&&(l.moveTo(s.tx1,s.ty1),l.lineTo(s.tx2,s.ty2)),n.drawOnChartArea&&(l.moveTo(s.x1,s.y1),l.lineTo(s.x2,s.y2)),l.stroke(),l.restore());if(h){var f,g,p,m,v=h,b=dn(n.lineWidth,c.ticksLength-1,1),x=c.borderValue;e.isHorizontal()?(f=d(u,e.left,v)-v/2,g=d(u,e.right,b)+b/2,p=m=x):(p=d(u,e.top,v)-v/2,m=d(u,e.bottom,b)+b/2,f=g=x),l.lineWidth=h,l.strokeStyle=dn(n.color,0),l.beginPath(),l.moveTo(f,p),l.lineTo(g,m),l.stroke()}}},_drawLabels:function(){var t=this;if(t.options.ticks.display){var e,n,i,a,r,o,s,l,u=t.ctx,d=t._labelItems||(t._labelItems=t._computeLabelItems());for(e=0,i=d.length;e<i;++e){if(o=(r=d[e]).font,u.save(),u.translate(r.x,r.y),u.rotate(r.rotation),u.font=o.string,u.fillStyle=o.color,u.textBaseline="middle",u.textAlign=r.textAlign,s=r.label,l=r.textOffset,sn(s))for(n=0,a=s.length;n<a;++n)u.fillText(""+s[n],0,l),l+=o.lineHeight;else u.fillText(s,0,l);u.restore()}}},_drawTitle:function(){var t=this,e=t.ctx,n=t.options,i=n.scaleLabel;if(i.display){var a,r,o=un(i.fontColor,N.global.defaultFontColor),s=H.options._parseFont(i),l=H.options.toPadding(i.padding),u=s.lineHeight/2,d=n.position,h=0;if(t.isHorizontal())a=t.left+t.width/2,r="bottom"===d?t.bottom-u-l.bottom:t.top+u+l.top;else{var c="left"===d;a=c?t.left+u+l.top:t.right-u-l.top,r=t.top+t.height/2,h=c?-.5*Math.PI:.5*Math.PI}e.save(),e.translate(a,r),e.rotate(h),e.textAlign="center",e.textBaseline="middle",e.fillStyle=o,e.font=s.string,e.fillText(i.labelString,0,0),e.restore()}},draw:function(t){this._isVisible()&&(this._drawGrid(t),this._drawTitle(),this._drawLabels())},_layers:function(){var t=this,e=t.options,n=e.ticks&&e.ticks.z||0,i=e.gridLines&&e.gridLines.z||0;return t._isVisible()&&n!==i&&t.draw===t._draw?[{z:i,draw:function(){t._drawGrid.apply(t,arguments),t._drawTitle.apply(t,arguments)}},{z:n,draw:function(){t._drawLabels.apply(t,arguments)}}]:[{z:n,draw:function(){t.draw.apply(t,arguments)}}]},_getMatchingVisibleMetas:function(t){var e=this,n=e.isHorizontal();return e.chart._getSortedVisibleDatasetMetas().filter((function(i){return(!t||i.type===t)&&(n?i.xAxisID===e.id:i.yAxisID===e.id)}))}});xn.prototype._draw=xn.prototype.draw;var yn=xn,_n=H.isNullOrUndef,kn=yn.extend({determineDataLimits:function(){var t,e=this,n=e._getLabels(),i=e.options.ticks,a=i.min,r=i.max,o=0,s=n.length-1;void 0!==a&&(t=n.indexOf(a))>=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;yn.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return _n(e)||_n(n)||(t=o.chart.data.datasets[n].data[e]),_n(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=H.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),wn={position:"bottom"};kn._defaults=wn;var Mn=H.noop,Sn=H.isNullOrUndef;var Cn=yn.extend({getRightValue:function(t){return"string"==typeof t?+t:yn.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=H.sign(t.min),i=H.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:Mn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:H.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=H.niceNum((g-f)/u/l)*l;if(p<1e-14&&Sn(d)&&Sn(h))return[f,g];(r=Math.ceil(g/p)-Math.floor(f/p))>u&&(p=H.niceNum(r*p/u/l)*l),s||Sn(c)?n=Math.pow(10,H._decimalPlaces(p)):(n=Math.pow(10,c),p=Math.ceil(p*n)/n),i=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!Sn(d)&&H.almostWhole(d/p,p/1e3)&&(i=d),!Sn(h)&&H.almostWhole(h/p,p/1e3)&&(a=h)),r=(a-i)/p,r=H.almostEquals(r,Math.round(r),p/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Sn(d)?i:d);for(var m=1;m<r;++m)o.push(Math.round((i+m*p)*n)/n);return o.push(Sn(h)?a:h),o}(i,t);t.handleDirectionalChanges(),t.max=H.max(a),t.min=H.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),yn.prototype.convertTicksToLabels.call(t)},_configure:function(){var t,e=this,n=e.getTicks(),i=e.min,a=e.max;yn.prototype._configure.call(e),e.options.offset&&n.length&&(i-=t=(a-i)/Math.max(n.length-1,1)/2,a+=t),e._startValue=i,e._endValue=a,e._valueRange=a-i}}),Pn={position:"left",ticks:{callback:on.formatters.linear}};function An(t,e,n,i){var a,r,o=t.options,s=function(t,e,n){var i=[n.type,void 0===e&&void 0===n.stack?n.index:"",n.stack].join(".");return void 0===t[i]&&(t[i]={pos:[],neg:[]}),t[i]}(e,o.stacked,n),l=s.pos,u=s.neg,d=i.length;for(a=0;a<d;++a)r=t._parseValue(i[a]),isNaN(r.min)||isNaN(r.max)||n.data[a].hidden||(l[a]=l[a]||0,u[a]=u[a]||0,o.relativePoints?l[a]=100:r.min<0||r.max<0?u[a]+=r.min:l[a]+=r.max)}function Dn(t,e,n){var i,a,r=n.length;for(i=0;i<r;++i)a=t._parseValue(n[i]),isNaN(a.min)||isNaN(a.max)||e.data[i].hidden||(t.min=Math.min(t.min,a.min),t.max=Math.max(t.max,a.max))}var Tn=Cn.extend({determineDataLimits:function(){var t,e,n,i,a=this,r=a.options,o=a.chart.data.datasets,s=a._getMatchingVisibleMetas(),l=r.stacked,u={},d=s.length;if(a.min=Number.POSITIVE_INFINITY,a.max=Number.NEGATIVE_INFINITY,void 0===l)for(t=0;!l&&t<d;++t)l=void 0!==(e=s[t]).stack;for(t=0;t<d;++t)n=o[(e=s[t]).index].data,l?An(a,u,e,n):Dn(a,e,n);H.each(u,(function(t){i=t.pos.concat(t.neg),a.min=Math.min(a.min,H.min(i)),a.max=Math.max(a.max,H.max(i))})),a.min=H.isFinite(a.min)&&!isNaN(a.min)?a.min:0,a.max=H.isFinite(a.max)&&!isNaN(a.max)?a.max:1,a.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=H.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){return this.getPixelForDecimal((+this.getRightValue(t)-this._startValue)/this._valueRange)},getValueForPixel:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange},getPixelForTick:function(t){var e=this.ticksAsNumbers;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])}}),In=Pn;Tn._defaults=In;var Fn=H.valueOrDefault,On=H.math.log10;var Ln={position:"left",ticks:{callback:on.formatters.logarithmic}};function Rn(t,e){return H.isFinite(t)&&t>=0?t:e}var zn=yn.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e)&&void 0!==e.stack){c=!0;break}if(s.stacked||c){var f={};for(t=0;t<u.length;t++){var g=[(e=l.getDatasetMeta(t)).type,void 0===s.stacked&&void 0===e.stack?t:"",e.stack].join(".");if(l.isDatasetVisible(t)&&h(e))for(void 0===f[g]&&(f[g]=[]),a=0,r=(i=u[t].data).length;a<r;a++){var p=f[g];n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(p[a]=p[a]||0,p[a]+=n.max)}}H.each(f,(function(t){if(t.length>0){var e=H.min(t),n=H.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e))for(a=0,r=(i=u[t].data).length;a<r;a++)n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(o.min=Math.min(n.min,o.min),o.max=Math.max(n.max,o.max),0!==n.min&&(o.minNotZero=Math.min(n.min,o.minNotZero)));o.min=H.isFinite(o.min)?o.min:null,o.max=H.isFinite(o.max)?o.max:null,o.minNotZero=H.isFinite(o.minNotZero)?o.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=Rn(e.min,t.min),t.max=Rn(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(On(t.min))-1),t.max=Math.pow(10,Math.floor(On(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(On(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(On(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(On(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:Rn(e.min),max:Rn(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=Fn(t.min,Math.pow(10,Math.floor(On(e.min)))),o=Math.floor(On(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(On(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(On(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(n<o||n===o&&i<s);var u=Fn(t.max,r);return a.push(u),a}(i,t);t.max=H.max(a),t.min=H.min(a),e.reverse?(n=!n,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),n&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),yn.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){var e=this.tickValues;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(On(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;yn.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=Fn(t.options.ticks.fontSize,N.global.defaultFontSize)/t._length),t._startValue=On(e),t._valueOffset=n,t._valueRange=(On(t.max)-On(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(On(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),Nn=Ln;zn._defaults=Nn;var Bn=H.valueOrDefault,En=H.valueAtIndexOrDefault,Wn=H.options.resolve,Vn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:on.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Hn(t){var e=t.ticks;return e.display&&t.display?Bn(e.fontSize,N.global.defaultFontSize)+2*e.backdropPaddingY:0}function jn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n,end:e}:{start:e,end:e+n}}function qn(t){return 0===t||180===t?"center":t<180?"left":"right"}function Un(t,e,n,i){var a,r,o=n.y+i/2;if(H.isArray(e))for(a=0,r=e.length;a<r;++a)t.fillText(e[a],n.x,o),o+=i;else t.fillText(e,n.x,o)}function Yn(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function Gn(t){return H.isNumber(t)?t:0}var Xn=Cn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Hn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;H.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);H.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Hn(this.options))},convertTicksToLabels:function(){var t=this;Cn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=H.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=H.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;e<d;e++){i=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,u=t.pointLabels[e],n=H.isArray(u)?{w:H.longestText(s,s.font,u),h:u.length*l}:{w:s.measureText(u).width,h:l},t._pointLabelSizes[e]=n;var h=t.getIndexAngle(e),c=H.toDegrees(h)%360,f=jn(c,i.x,n.w,0,180),g=jn(c,i.y,n.h,90,270);f.start<r.l&&(r.l=f.start,o.l=h),f.end>r.r&&(r.r=f.end,o.r=h),g.start<r.t&&(r.t=g.start,o.t=h),g.end>r.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Gn(a),r=Gn(r),o=Gn(o),s=Gn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(H.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=Bn(s.lineWidth,o.lineWidth),u=Bn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Hn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=H.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=En(i.fontColor,s,N.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=H.toDegrees(h);e.textAlign=qn(c),Yn(c,t._pointLabelSizes[s],u),Un(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&H.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=En(e.color,i-1),u=En(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d<s;d++)a=t.getPointPosition(d,n),r.lineTo(a.x,a.y)}r.closePath(),r.stroke(),r.restore()}}(i,o,e,n))})),s.display&&l&&u){for(a.save(),a.lineWidth=l,a.strokeStyle=u,a.setLineDash&&(a.setLineDash(Wn([s.borderDash,o.borderDash,[]])),a.lineDashOffset=Wn([s.borderDashOffset,o.borderDashOffset,0])),t=i.chart.data.labels.length-1;t>=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=H.options._parseFont(n),s=Bn(n.fontColor,N.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",H.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:H.noop}),Kn=Vn;Xn._defaults=Kn;var Zn=H._deprecated,$n=H.options.resolve,Jn=H.valueOrDefault,Qn=Number.MIN_SAFE_INTEGER||-9007199254740991,ti=Number.MAX_SAFE_INTEGER||9007199254740991,ei={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ni=Object.keys(ei);function ii(t,e){return t-e}function ai(t){return H.valueOrDefault(t.time.min,t.ticks.min)}function ri(t){return H.valueOrDefault(t.time.max,t.ticks.max)}function oi(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function si(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),H.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),H.isFinite(o)||(o=n.parse(o))),o)}function li(t,e){if(H.isNullOrUndef(e))return null;var n=t.options.time,i=si(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function ui(t,e,n,i){var a,r,o,s=ni.length;for(a=ni.indexOf(t);a<s-1;++a)if(o=(r=ei[ni[a]]).steps?r.steps:ti,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return ni[a];return ni[s-1]}function di(t,e,n){var i,a,r=[],o={},s=e.length;for(i=0;i<s;++i)o[a=e[i]]=i,r.push({value:a,major:!1});return 0!==s&&n?function(t,e,n,i){var a,r,o=t._adapter,s=+o.startOf(e[0].value,i),l=e[e.length-1].value;for(a=s;a<=l;a=+o.add(a,1,i))(r=n[a])>=0&&(e[r].major=!0);return e}(t,r,o,n):r}var hi=yn.extend({initialize:function(){this.mergeTicksOptions(),yn.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new rn._date(e.adapters.date);return Zn("time scale",n.format,"time.format","time.parser"),Zn("time scale",n.min,"time.min","ticks.min"),Zn("time scale",n.max,"time.max","ticks.max"),H.mergeIf(n.displayFormats,i.formats()),yn.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),yn.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=ti,f=Qn,g=[],p=[],m=[],v=s._getLabels();for(t=0,n=v.length;t<n;++t)m.push(li(s,v[t]));for(t=0,n=(l.data.datasets||[]).length;t<n;++t)if(l.isDatasetVisible(t))if(a=l.data.datasets[t].data,H.isObject(a[0]))for(p[t]=[],e=0,i=a.length;e<i;++e)r=li(s,a[e]),g.push(r),p[t][e]=r;else p[t]=m.slice(0),o||(g=g.concat(m),o=!0);else p[t]=[];m.length&&(c=Math.min(c,m[0]),f=Math.max(f,m[m.length-1])),g.length&&(g=n>1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}(g).sort(ii):g.sort(ii),c=Math.min(c,g[0]),f=Math.max(f,g[g.length-1])),c=li(s,ai(d))||c,f=li(s,ri(d))||f,c=c===ti?+u.startOf(Date.now(),h):c,f=f===Qn?+u.endOf(Date.now(),h)+1:f,s.min=Math.min(c,f),s.max=Math.max(c+1,f),s._table=[],s._timestamps={data:g,datasets:p,labels:m}},buildTicks:function(){var t,e,n,i=this,a=i.min,r=i.max,o=i.options,s=o.ticks,l=o.time,u=i._timestamps,d=[],h=i.getLabelCapacity(a),c=s.source,f=o.distribution;for(u="data"===c||"auto"===c&&"series"===f?u.data:"labels"===c?u.labels:function(t,e,n,i){var a,r=t._adapter,o=t.options,s=o.time,l=s.unit||ui(s.minUnit,e,n,i),u=$n([s.stepSize,s.unitStepSize,1]),d="week"===l&&s.isoWeekday,h=e,c=[];if(d&&(h=+r.startOf(h,"isoWeek",d)),h=+r.startOf(h,d?"day":l),r.diff(n,e,l)>1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a<n;a=+r.add(a,u,l))c.push(a);return a!==n&&"ticks"!==o.bounds||c.push(a),c}(i,a,r,h),"ticks"===o.bounds&&u.length&&(a=u[0],r=u[u.length-1]),a=li(i,ai(o))||a,r=li(i,ri(o))||r,t=0,e=u.length;t<e;++t)(n=u[t])>=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?ui(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ni.length-1;r>=ni.indexOf(n);r--)if(o=ni[r],ei[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ni[n?ni.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ni.indexOf(t)+1,n=ni.length;e<n;++e)if(ei[ni[e]].common)return ni[e]}(i._unit):void 0,i._table=function(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(i._timestamps.data,a,r,f),i._offsets=function(t,e,n,i,a){var r,o,s=0,l=0;return a.offset&&e.length&&(r=oi(t,"time",e[0],"pos"),s=1===e.length?1-r:(oi(t,"time",e[1],"pos")-r)/2,o=oi(t,"time",e[e.length-1],"pos"),l=1===e.length?o:(o-oi(t,"time",e[e.length-2],"pos"))/2),{start:s,end:l,factor:1/(s+1+l)}}(i._table,d,0,0,o),s.reverse&&d.reverse(),di(i,d,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n._adapter,a=n.chart.data,r=n.options.time,o=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return H.isObject(s)&&(o=n.getRightValue(s)),r.tooltipFormat?i.format(si(n,o),r.tooltipFormat):"string"==typeof o?o:i.format(si(n,o),r.displayFormats.datetime)},tickFormatFunction:function(t,e,n,i){var a=this._adapter,r=this.options,o=r.time.displayFormats,s=o[this._unit],l=this._majorUnit,u=o[l],d=n[e],h=r.ticks,c=l&&u&&d&&d.major,f=a.format(t,i||(c?u:s)),g=c?h.major:h.minor,p=$n([g.callback,g.userCallback,h.callback,h.userCallback]);return p?p(f,e,n):f},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(t[e].value,e,t));return i},getPixelForOffset:function(t){var e=this._offsets,n=oi(this._table,"time",t,"pos");return this.getPixelForDecimal((e.start+n)*e.factor)},getPixelForValue:function(t,e,n){var i=null;if(void 0!==e&&void 0!==n&&(i=this._timestamps.datasets[n][e]),null===i&&(i=li(this,t)),null!==i)return this.getPixelForOffset(i)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this._offsets,n=this.getDecimalForPixel(t)/e.factor-e.end,i=oi(this._table,"pos",n,"time");return this._adapter._create(i)},_getLabelSize:function(t){var e=this.options.ticks,n=this.ctx.measureText(t).width,i=H.toRadians(this.isHorizontal()?e.maxRotation:e.minRotation),a=Math.cos(i),r=Math.sin(i),o=Jn(e.fontSize,N.global.defaultFontSize);return{w:n*a+o*r,h:n*r+o*a}},getLabelWidth:function(t){return this._getLabelSize(t).w},getLabelCapacity:function(t){var e=this,n=e.options.time,i=n.displayFormats,a=i[n.unit]||i.millisecond,r=e.tickFormatFunction(t,0,di(e,[t],e._majorUnit),a),o=e._getLabelSize(r),s=Math.floor(e.isHorizontal()?e.width/o.w:e.height/o.h);return e.options.offset&&s--,s>0?s:1}}),ci={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};hi._defaults=ci;var fi={category:kn,linear:Tn,logarithmic:zn,radialLinear:Xn,time:hi},gi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};rn._date.override("function"==typeof t?{_id:"moment",formats:function(){return gi},parse:function(e,n){return"string"==typeof e&&"string"==typeof n?e=t(e,n):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,n){return t(e).format(n)},add:function(e,n,i){return t(e).add(n,i).valueOf()},diff:function(e,n,i){return t(e).diff(t(n),i)},startOf:function(e,n,i){return e=t(e),"isoWeek"===n?e.isoWeekday(i).valueOf():e.startOf(n).valueOf()},endOf:function(e,n){return t(e).endOf(n).valueOf()},_create:function(e){return t(e)}}:{}),N._set("global",{plugins:{filler:{propagate:!0}}});var pi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return H.isArray(e)?function(t,n){return e[n]}:function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};function mi(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return"-"!==r[0]&&"+"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function vi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a<l;++a)r="start"===u||"end"===u?o.getPointPositionForValue(a,"start"===u?e:n):o.getBasePosition(a),s.gridLines.circular&&(r.cx=i.x,r.cy=i.y,r.angle=o.getIndexAngle(a)-Math.PI/2),d.push(r);return d}(t):function(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePixel&&(r=i.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(H.isFinite(r))return{x:(e=i.isHorizontal())?r:null,y:e?null:r}}return null}(t)}function bi(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function xi(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),pi[n](t))}function yi(t){return t&&!t.skip}function _i(t,e,n,i,a){var r,o,s,l;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<i;++r)H.canvas.lineTo(t,e[r-1],e[r]);if(void 0===n[0].angle)for(t.lineTo(n[a-1].x,n[a-1].y),r=a-1;r>0;--r)H.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function ki(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,p=i.spanGaps,m=[],v=[],b=0,x=0;for(t.beginPath(),o=0,s=g;o<s;++o)d=n(u=e[l=o%g]._view,l,i),h=yi(u),c=yi(d),r&&void 0===f&&h&&(s=g+(f=o+1)),h&&c?(b=m.push(u),x=v.push(d)):b&&x&&(p?(h&&m.push(u),c&&v.push(d)):(_i(t,m,v,b,x),b=x=0,m=[],v=[]));_i(t,m,v,b,x),t.closePath(),t.fillStyle=a,t.fill()}var wi={id:"filler",afterDatasetsUpdate:function(t,e){var n,i,a,r,o=(t.data.datasets||[]).length,s=e.propagate,l=[];for(i=0;i<o;++i)r=null,(a=(n=t.getDatasetMeta(i)).dataset)&&a._model&&a instanceof kt.Line&&(r={visible:t.isDatasetVisible(i),fill:mi(a,i,o),chart:t,el:a}),n.$filler=r,l.push(r);for(i=0;i<o;++i)(r=l[i])&&(r.fill=bi(l,i,s),r.boundary=vi(r),r.mapper=xi(r))},beforeDatasetsDraw:function(t){var e,n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas(),u=t.ctx;for(n=l.length-1;n>=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||N.global.defaultColor,o&&s&&r.length&&(H.canvas.clipArea(u,t.chartArea),ki(u,r,o,a,s,i._loop),H.canvas.unclipArea(u)))}},Mi=H.rtl.getRtlAdapter,Si=H.noop,Ci=H.valueOrDefault;function Pi(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}N._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;e<n;e++)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=r[e].backgroundColor,r[e].label&&i.appendChild(document.createTextNode(r[e].label));return a.outerHTML}});var Ai=K.extend({initialize:function(t){H.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:Si,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Si,beforeSetDimensions:Si,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Si,beforeBuildLabels:Si,buildLabels:function(){var t=this,e=t.options.labels||{},n=H.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter((function(n){return e.filter(n,t.chart.data)}))),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:Si,beforeFit:Si,fit:function(){var t=this,e=t.options,n=e.labels,i=e.display,a=t.ctx,r=H.options._parseFont(n),o=r.size,s=t.legendHitBoxes=[],l=t.minSize,u=t.isHorizontal();if(u?(l.width=t.maxWidth,l.height=i?10:0):(l.width=i?10:0,l.height=t.maxHeight),i){if(a.font=r.string,u){var d=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="middle",H.each(t.legendItems,(function(t,e){var i=Pi(n,o)+o/2+a.measureText(t.text).width;(0===e||d[d.length-1]+i+2*n.padding>l.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],p=n.padding,m=0,v=0;H.each(t.legendItems,(function(t,e){var i=Pi(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(p+=m+n.padding,f.push(m),g.push(v),m=0,v=0),m=Math.max(m,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),p+=m,f.push(m),g.push(v),l.width+=p}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Si,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=N.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=Mi(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Ci(n.fontColor,i.defaultFontColor),g=H.options._parseFont(n),p=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var m=Pi(n,p),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},x=t.isHorizontal();d=x?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},H.rtl.overrideTextDirection(t.ctx,e.textDirection);var y=p+n.padding;H.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=m+p/2+f,_=d.x,k=d.y;h.setWidth(t.minSize.width),x?i>0&&_+g+n.padding>t.left+t.minSize.width&&(k=d.y+=y,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&k+y>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,k=d.y=t.top+b(o,s[d.line]));var w=h.x(_);!function(t,e,i){if(!(isNaN(m)||m<=0)){c.save();var o=Ci(i.lineWidth,r.borderWidth);if(c.fillStyle=Ci(i.fillStyle,a),c.lineCap=Ci(i.lineCap,r.borderCapStyle),c.lineDashOffset=Ci(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Ci(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Ci(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Ci(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=m*Math.SQRT2/2,l=h.xPlus(t,m/2),u=e+p/2;H.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,m),e,m,p),0!==o&&c.strokeRect(h.leftForLtr(t,m),e,m,p);c.restore()}}(w,k,e),v[i].left=h.leftForLtr(w,v[i].width),v[i].top=k,function(t,e,n,i){var a=p/2,r=h.xPlus(t,m+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(w,k,e,f),x?d.x+=g+n.padding:d.y+=y})),H.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n<a.length;++n)if(t>=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Di(t,e){var n=new Ai({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.legend=n}var Ti={id:"legend",_element:Ai,beforeInit:function(t){var e=t.options.legend;e&&Di(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(H.mergeIf(e,N.global.legend),n?(pe.configure(t,n,e),n.options=e):Di(t,e)):n&&(pe.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ii=H.noop;N._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Fi=K.extend({initialize:function(t){H.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ii,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ii,beforeSetDimensions:Ii,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ii,beforeBuildLabels:Ii,buildLabels:Ii,afterBuildLabels:Ii,beforeFit:Ii,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(H.isArray(n.text)?n.text.length:1)*H.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ii,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=H.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=H.valueOrDefault(n.fontColor,N.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(H.isArray(g))for(var p=0,m=0;m<g.length;++m)e.fillText(g[m],0,p,i),p+=s;else e.fillText(g,0,0,i);e.restore()}}});function Oi(t,e){var n=new Fi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.titleBlock=n}var Li={},Ri=wi,zi=Ti,Ni={id:"title",_element:Fi,beforeInit:function(t){var e=t.options.title;e&&Oi(t,e)},beforeUpdate:function(t){var e=t.options.title,n=t.titleBlock;e?(H.mergeIf(e,N.global.title),n?(pe.configure(t,n,e),n.options=e):Oi(t,e)):n&&(pe.removeBox(t,n),delete t.titleBlock)}};for(var Bi in Li.filler=Ri,Li.legend=zi,Li.title=Ni,en.helpers=H,function(){function t(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!==t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function e(t){return null!=t&&"none"!==t}function n(n,i,a){var r=document.defaultView,o=H._getParentNode(n),s=r.getComputedStyle(n)[i],l=r.getComputedStyle(o)[i],u=e(s),d=e(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?t(s,n,a):h,d?t(l,o,a):h):"none"}H.where=function(t,e){if(H.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return H.each(t,(function(t){e(t)&&n.push(t)})),n},H.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},H.findNextWhere=function(t,e,n){H.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},H.findPreviousWhere=function(t,e,n){H.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},H.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},H.almostEquals=function(t,e,n){return Math.abs(t-e)<n},H.almostWhole=function(t,e){var n=Math.round(t);return n-e<=t&&n+e>=t},H.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},H.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},H.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},H.toRadians=function(t){return t*(Math.PI/180)},H.toDegrees=function(t){return t*(180/Math.PI)},H._decimalPlaces=function(t){if(H.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},H.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},H.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},H.aliasPixel=function(t){return t%2==0?0:.5},H._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},H.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},H.EPSILON=Number.EPSILON||1e-14,H.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e<h;++e)if(!(i=d[e]).model.skip){if(n=e>0?d[e-1]:null,(a=e<h-1?d[e+1]:null)&&!a.model.skip){var c=a.model.x-i.model.x;i.deltaK=0!==c?(a.model.y-i.model.y)/c:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}for(e=0;e<h-1;++e)i=d[e],a=d[e+1],i.model.skip||a.model.skip||(H.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(r=i.mK/i.deltaK,o=a.mK/i.deltaK,(l=Math.pow(r,2)+Math.pow(o,2))<=9||(s=3/Math.sqrt(l),i.mK=r*s*i.deltaK,a.mK=o*s*i.deltaK)));for(e=0;e<h;++e)(i=d[e]).model.skip||(n=e>0?d[e-1]:null,a=e<h-1?d[e+1]:null,n&&!n.model.skip&&(u=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-u,i.model.controlPointPreviousY=i.model.y-u*i.mK),a&&!a.model.skip&&(u=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+u,i.model.controlPointNextY=i.model.y+u*i.mK))},H.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},H.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},H.niceNum=function(t,e){var n=Math.floor(H.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},H.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},H.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(H.getStyle(r,"padding-left")),u=parseFloat(H.getStyle(r,"padding-top")),d=parseFloat(H.getStyle(r,"padding-right")),h=parseFloat(H.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},H.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},H.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},H._calculatePadding=function(t,e,n){return(e=H.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},H._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},H.getMaximumWidth=function(t){var e=H._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-H._calculatePadding(e,"padding-left",n)-H._calculatePadding(e,"padding-right",n),a=H.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},H.getMaximumHeight=function(t){var e=H._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-H._calculatePadding(e,"padding-top",n)-H._calculatePadding(e,"padding-bottom",n),a=H.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},H.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},H.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},H.fontString=function(t,e,n){return e+" "+t+"px "+n},H.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;o<c;o++)if(null!=(u=n[o])&&!0!==H.isArray(u))h=H.measureText(t,a,r,h,u);else if(H.isArray(u))for(s=0,l=u.length;s<l;s++)null==(d=u[s])||H.isArray(d)||(h=H.measureText(t,a,r,h,d));var f=r.length/2;if(f>n.length){for(o=0;o<f;o++)delete a[r[o]];r.splice(0,f)}return h},H.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},H.numberOfLabelLines=function(t){var e=1;return H.each(t,(function(t){H.isArray(t)&&t.length>e&&(e=t.length)})),e},H.color=_?function(t){return t instanceof CanvasGradient&&(t=N.global.defaultColor),_(t)}:function(t){return console.error("Color.js not found!"),t},H.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:H.color(t).saturate(.5).darken(.1).rgbString()}}(),en._adapters=rn,en.Animation=$,en.animationService=J,en.controllers=Jt,en.DatasetController=it,en.defaults=N,en.Element=K,en.elements=kt,en.Interaction=re,en.layouts=pe,en.platform=Oe,en.plugins=Le,en.Scale=yn,en.scaleService=Re,en.Ticks=on,en.Tooltip=Ye,en.helpers.each(fi,(function(t,e){en.scaleService.registerScaleType(e,t,t._defaults)})),Li)Li.hasOwnProperty(Bi)&&en.plugins.register(Li[Bi]);en.platform.initialize();var Ei=en;return"undefined"!=typeof window&&(window.Chart=en),en.Chart=en,en.Legend=Li.legend._element,en.Title=Li.title._element,en.pluginService=en.plugins,en.PluginBase=en.Element.extend({}),en.canvasHelpers=en.helpers.canvas,en.layoutService=en.layouts,en.LinearScaleBase=Cn,en.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){en[t]=function(e,n){return new en(e,en.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Ei}));
diff --git a/borrowed/chartjs/LICENSE.md b/borrowed/chartjs/LICENSE.md
old mode 100644
new mode 100755
diff --git a/borrowed/chartjs/README.md b/borrowed/chartjs/README.md
new file mode 100755
index 000000000..5a522a5e9
--- /dev/null
+++ b/borrowed/chartjs/README.md
@@ -0,0 +1,32 @@
+<p align="center">
+ <img src="https://www.chartjs.org/media/logo-title.svg"><br/>
+ Simple yet flexible JavaScript charting for designers & developers
+</p>
+
+<p align="center">
+ <a href="https://www.chartjs.org/docs/latest/getting-started/installation.html"><img src="https://img.shields.io/github/release/chartjs/Chart.js.svg?style=flat-square&maxAge=600" alt="Downloads"></a>
+ <a href="https://travis-ci.org/chartjs/Chart.js"><img src="https://img.shields.io/travis/chartjs/Chart.js.svg?style=flat-square&maxAge=600" alt="Builds"></a>
+ <a href="https://coveralls.io/github/chartjs/Chart.js?branch=master"><img src="https://img.shields.io/coveralls/chartjs/Chart.js.svg?style=flat-square&maxAge=600" alt="Coverage"></a>
+ <a href="https://github.com/chartjs/awesome"><img src="https://awesome.re/badge-flat2.svg" alt="Awesome"></a>
+ <a href="https://chartjs-slack.herokuapp.com/"><img src="https://img.shields.io/badge/slack-chartjs-blue.svg?style=flat-square&maxAge=3600" alt="Slack"></a>
+</p>
+
+## Documentation
+
+- [Introduction](https://www.chartjs.org/docs/latest/)
+- [Getting Started](https://www.chartjs.org/docs/latest/getting-started/)
+- [General](https://www.chartjs.org/docs/latest/general/)
+- [Configuration](https://www.chartjs.org/docs/latest/configuration/)
+- [Charts](https://www.chartjs.org/docs/latest/charts/)
+- [Axes](https://www.chartjs.org/docs/latest/axes/)
+- [Developers](https://www.chartjs.org/docs/latest/developers/)
+- [Popular Extensions](https://github.com/chartjs/awesome)
+- [Samples](https://www.chartjs.org/samples/)
+
+## Contributing
+
+Instructions on building and testing Chart.js can be found in [the documentation](https://github.com/chartjs/Chart.js/blob/master/docs/developers/contributing.md#building-and-testing). Before submitting an issue or a pull request, please take a moment to look over the [contributing guidelines](https://github.com/chartjs/Chart.js/blob/master/docs/developers/contributing.md) first. For support, please post questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/chartjs) with the `chartjs` tag.
+
+## License
+
+Chart.js is available under the [MIT license](https://opensource.org/licenses/MIT).
diff --git a/borrowed/chartjs/samples/scales/time/financial.html b/borrowed/chartjs/samples/scales/time/financial.html
index 1a9f9c612..1f99d163c 100644
--- a/borrowed/chartjs/samples/scales/time/financial.html
+++ b/borrowed/chartjs/samples/scales/time/financial.html
@@ -17,6 +17,7 @@
<body>
<div style="width:1000px">
+ <p>This example demonstrates a time series scale by drawing a financial line chart using just the core library. For more specific functionality for financial charts, please see <a href="https://github.com/chartjs/chartjs-chart-financial">chartjs-chart-financial</a></p>
<canvas id="chart1"></canvas>
</div>
<br>
@@ -26,29 +27,68 @@
<option value="line">Line</option>
<option value="bar">Bar</option>
</select>
+ <select id="unit">
+ <option value="second">Second</option>
+ <option value="minute">Minute</option>
+ <option value="hour">Hour</option>
+ <option value="day" selected>Day</option>
+ <option value="month">Month</option>
+ <option value="year">Year</option>
+ </select>
<button id="update">update</button>
<script>
- function randomNumber(min, max) {
- return Math.random() * (max - min) + min;
- }
+ function generateData() {
+ var unit = document.getElementById('unit').value;
- function randomBar(date, lastClose) {
- var open = randomNumber(lastClose * 0.95, lastClose * 1.05).toFixed(2);
- var close = randomNumber(open * 0.95, open * 1.05).toFixed(2);
- return {
- t: date.valueOf(),
- y: close
- };
- }
+ function unitLessThanDay() {
+ return unit === 'second' || unit === 'minute' || unit === 'hour';
+ }
+
+ function beforeNineThirty(date) {
+ return date.hour() < 9 || (date.hour() === 9 && date.minute() < 30);
+ }
+
+ // Returns true if outside 9:30am-4pm on a weekday
+ function outsideMarketHours(date) {
+ if (date.isoWeekday() > 5) {
+ return true;
+ }
+ if (unitLessThanDay() && (beforeNineThirty(date) || date.hour() > 16)) {
+ return true;
+ }
+ return false;
+ }
+
+ function randomNumber(min, max) {
+ return Math.random() * (max - min) + min;
+ }
- var dateFormat = 'MMMM DD YYYY';
- var date = moment('April 01 2017', dateFormat);
- var data = [randomBar(date, 30)];
- while (data.length < 60) {
- date = date.clone().add(1, 'd');
- if (date.isoWeekday() <= 5) {
- data.push(randomBar(date, data[data.length - 1].y));
+ function randomBar(date, lastClose) {
+ var open = randomNumber(lastClose * 0.95, lastClose * 1.05).toFixed(2);
+ var close = randomNumber(open * 0.95, open * 1.05).toFixed(2);
+ return {
+ t: date.valueOf(),
+ y: close
+ };
}
+
+ var date = moment('Jan 01 1990', 'MMM DD YYYY');
+ var now = moment();
+ var data = [];
+ var lessThanDay = unitLessThanDay();
+ for (; data.length < 600 && date.isBefore(now); date = date.clone().add(1, unit).startOf(unit)) {
+ if (outsideMarketHours(date)) {
+ if (!lessThanDay || !beforeNineThirty(date)) {
+ date = date.clone().add(date.isoWeekday() >= 5 ? 8 - date.isoWeekday() : 1, 'day');
+ }
+ if (lessThanDay) {
+ date = date.hour(9).minute(30).second(0);
+ }
+ }
+ data.push(randomBar(date, data.length > 0 ? data[data.length - 1].y : 30));
+ }
+
+ return data;
}
var ctx = document.getElementById('chart1').getContext('2d');
@@ -57,13 +97,12 @@
var color = Chart.helpers.color;
var cfg = {
- type: 'bar',
data: {
datasets: [{
label: 'CHRT - Chart.js Corporation',
backgroundColor: color(window.chartColors.red).alpha(0.5).rgbString(),
borderColor: window.chartColors.red,
- data: data,
+ data: generateData(),
type: 'line',
pointRadius: 0,
fill: false,
@@ -72,16 +111,56 @@
}]
},
options: {
+ animation: {
+ duration: 0
+ },
scales: {
xAxes: [{
type: 'time',
distribution: 'series',
+ offset: true,
ticks: {
+ major: {
+ enabled: true,
+ fontStyle: 'bold'
+ },
source: 'data',
- autoSkip: true
+ autoSkip: true,
+ autoSkipPadding: 75,
+ maxRotation: 0,
+ sampleSize: 100
+ },
+ afterBuildTicks: function(scale, ticks) {
+ var majorUnit = scale._majorUnit;
+ var firstTick = ticks[0];
+ var i, ilen, val, tick, currMajor, lastMajor;
+
+ val = moment(ticks[0].value);
+ if ((majorUnit === 'minute' && val.second() === 0)
+ || (majorUnit === 'hour' && val.minute() === 0)
+ || (majorUnit === 'day' && val.hour() === 9)
+ || (majorUnit === 'month' && val.date() <= 3 && val.isoWeekday() === 1)
+ || (majorUnit === 'year' && val.month() === 0)) {
+ firstTick.major = true;
+ } else {
+ firstTick.major = false;
+ }
+ lastMajor = val.get(majorUnit);
+
+ for (i = 1, ilen = ticks.length; i < ilen; i++) {
+ tick = ticks[i];
+ val = moment(tick.value);
+ currMajor = val.get(majorUnit);
+ tick.major = currMajor !== lastMajor;
+ lastMajor = currMajor;
+ }
+ return ticks;
}
}],
yAxes: [{
+ gridLines: {
+ drawBorder: false
+ },
scaleLabel: {
display: true,
labelString: 'Closing price ($)'
@@ -109,7 +188,9 @@
document.getElementById('update').addEventListener('click', function() {
var type = document.getElementById('type').value;
- chart.config.data.datasets[0].type = type;
+ var dataset = chart.config.data.datasets[0];
+ dataset.type = type;
+ dataset.data = generateData();
chart.update();
});
diff --git a/borrowed/chartjs/samples/scriptable/line.html b/borrowed/chartjs/samples/scriptable/line.html
index 6e19dc2c5..71cef7ae2 100644
--- a/borrowed/chartjs/samples/scriptable/line.html
+++ b/borrowed/chartjs/samples/scriptable/line.html
@@ -26,14 +26,17 @@
utils.srand(110);
+ function getLineColor(ctx) {
+ return utils.color(ctx.datasetIndex);
+ }
+
function alternatePointStyles(ctx) {
var index = ctx.dataIndex;
return index % 2 === 0 ? 'circle' : 'rect';
}
function makeHalfAsOpaque(ctx) {
- var c = ctx.dataset.backgroundColor;
- return utils.transparentize(c);
+ return utils.transparentize(getLineColor(ctx));
}
function adjustRadiusBasedOnData(ctx) {
@@ -56,9 +59,7 @@
var data = {
labels: utils.months({count: DATA_COUNT}),
datasets: [{
- data: generateData(),
- backgroundColor: '#4dc9f6',
- borderColor: '#4dc9f6',
+ data: generateData()
}]
};
@@ -68,8 +69,11 @@
elements: {
line: {
fill: false,
+ backgroundColor: getLineColor,
+ borderColor: getLineColor,
},
point: {
+ backgroundColor: getLineColor,
hoverBackgroundColor: makeHalfAsOpaque,
radius: adjustRadiusBasedOnData,
pointStyle: alternatePointStyles,
@@ -87,12 +91,8 @@
// eslint-disable-next-line no-unused-vars
function addDataset() {
- var newColor = utils.color(chart.data.datasets.length);
-
chart.data.datasets.push({
- data: generateData(),
- backgroundColor: newColor,
- borderColor: newColor
+ data: generateData()
});
chart.update();
}
diff --git a/borrowed/chartjs/samples/scriptable/radar.html b/borrowed/chartjs/samples/scriptable/radar.html
index 8f57accd5..fc07833a8 100644
--- a/borrowed/chartjs/samples/scriptable/radar.html
+++ b/borrowed/chartjs/samples/scriptable/radar.html
@@ -26,14 +26,21 @@
utils.srand(110);
+ function getLineColor(ctx) {
+ return utils.color(ctx.datasetIndex);
+ }
+
function alternatePointStyles(ctx) {
var index = ctx.dataIndex;
return index % 2 === 0 ? 'circle' : 'rect';
}
function makeHalfAsOpaque(ctx) {
- var c = ctx.dataset.backgroundColor;
- return utils.transparentize(c);
+ return utils.transparentize(getLineColor(ctx));
+ }
+
+ function make20PercentOpaque(ctx) {
+ return utils.transparentize(getLineColor(ctx), 0.8);
}
function adjustRadiusBasedOnData(ctx) {
@@ -56,9 +63,7 @@
var data = {
labels: [['Eating', 'Dinner'], ['Drinking', 'Water'], 'Sleeping', ['Designing', 'Graphics'], 'Coding', 'Cycling', 'Running'],
datasets: [{
- data: generateData(),
- backgroundColor: Chart.helpers.color('#4dc9f6').alpha(0.2).rgbString(),
- borderColor: '#4dc9f6',
+ data: generateData()
}]
};
@@ -66,7 +71,12 @@
legend: false,
tooltips: true,
elements: {
+ line: {
+ backgroundColor: make20PercentOpaque,
+ borderColor: getLineColor,
+ },
point: {
+ backgroundColor: getLineColor,
hoverBackgroundColor: makeHalfAsOpaque,
radius: adjustRadiusBasedOnData,
pointStyle: alternatePointStyles,
@@ -84,12 +94,8 @@
// eslint-disable-next-line no-unused-vars
function addDataset() {
- var newColor = utils.color(chart.data.datasets.length);
-
chart.data.datasets.push({
- data: generateData(),
- backgroundColor: Chart.helpers.color(newColor).alpha(0.2).rgbString(),
- borderColor: newColor
+ data: generateData()
});
chart.update();
}
commit e57194379e641d2a7fffef14bdf594ec8bcfa464
Author: Eugenia Russell <eugenia.russell2019 at gmail.com>
Date: Fri May 7 18:32:54 2021 +0200
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/glossary/el.po: 99.5% (207 of 208 strings; 1 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/el/
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/el.po: 53.5% (2932 of 5479 strings; 1501 fuzzy)
611 failing checks (11.1%)
Translation: GnuCash/Program (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/el/
Co-authored-by: Eugenia Russell <eugenia.russell2019 at gmail.com>
diff --git a/po/el.po b/po/el.po
index ec4b7f57b..ced16715f 100644
--- a/po/el.po
+++ b/po/el.po
@@ -40,7 +40,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-05-01 13:32+0000\n"
+"PO-Revision-Date: 2021-05-07 16:32+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/gnucash/gnucash/el/"
">\n"
@@ -684,6 +684,10 @@ msgid ""
"after midnight, to get the new date as default for new transactions. It is "
"not necessary to restart GnuCash."
msgstr ""
+"Îάν εÏγάζεÏÏε καÏά Ïη διάÏκεια ÏÎ·Ï Î½ÏÏÏαÏ, θα ÏÏÎÏει να κλείÏεÏε και να "
+"ανοίξεÏε ξανά Ïα μηÏÏÏα εÏγαÏÎ¯Î±Ï ÏÎ±Ï Î¼ÎµÏά Ïα μεÏάνÏ
ÏÏα, για να λάβεÏε Ïη νÎα "
+"ημεÏομηνία ÏÏ ÏÏοεÏιλογή για ÏÎ¹Ï Î½ÎÎµÏ ÏÏ
ναλλαγÎÏ. Îεν είναι αÏαÏαίÏηÏο να "
+"εÏανεκκινήÏεÏε Ïο GnuCash."
#: doc/tip_of_the_day.list.c:115
msgid ""
diff --git a/po/glossary/el.po b/po/glossary/el.po
index f56a42958..5c695b606 100644
--- a/po/glossary/el.po
+++ b/po/glossary/el.po
@@ -11,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-05-03 11:32+0000\n"
+"PO-Revision-Date: 2021-05-07 16:32+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/gnucash/glossary/"
"el/>\n"
@@ -292,7 +292,6 @@ msgid "check and repair, to"
msgstr "ÎλεγÏÎ¿Ï ÎºÎ±Î¹ εÏιÏκεÏ
ή, για να"
#. "To end an application's relationship with an open file so that the application will no longer be able to access the file without opening it again. "
-#, fuzzy
msgid "close, to"
msgstr "ÎλείÏιμο καÏαγÏαÏÏν"
@@ -683,9 +682,8 @@ msgstr "μηÏÏÏο"
#
#. "A transaction that is divided into two or more parts"
-#, fuzzy
msgid "register entry: split transaction"
-msgstr "ÎκκίνηÏη νÎÎ±Ï Î´Î¹ÎµÎ½ÎÏγειαÏ"
+msgstr "καÏαÏÏÏηÏη μηÏÏÏοÏ
: διαÏÏÏιÏμÏÏ ÏÏ
ναλλαγήÏ"
#. "-"
msgid "register entry: stock split"
@@ -705,9 +703,8 @@ msgstr "μηÏÏÏο: Î³ÎµÎ½Î¹ÎºÏ ÎºÎ±Î¸Î¿Î»Î¹ÎºÏ"
#
#. "another form of register"
-#, fuzzy
msgid "register: transaction journal"
-msgstr "ÎκκίνηÏη νÎÎ±Ï Î´Î¹ÎµÎ½ÎÏγειαÏ"
+msgstr "μηÏÏÏο: ημεÏολÏγιο ÏÏ
ναλλαγÏν"
#
#. "reload the current document"
@@ -745,12 +742,11 @@ msgstr "Î ÏογÏαμμαÏιÏμÎνη ΣÏ
ναλλαγή"
#. "DEPRECATED. To repair unbalanced transactions and orphan splits in an account tree. Any transactions that have debits != credits will get a balancing split added (pointing to a special new account called 'Imbalance'). Any splits that do not have accounts are put into another special account called 'Orphan'. Deprecated - use the term 'to check and repair' now."
msgid "scrub, to"
-msgstr ""
+msgstr "να ÎºÎ¬Î½Ï ÎºÎ±Î¸Î±ÏιÏμÏ"
#. "A document or certificate showing who owns shares"
-#, fuzzy
msgid "security"
-msgstr "ÎÏÏάλεια"
+msgstr "αÏÏάλεια"
#. "-"
msgid "Share Balance (register)"
commit f6d0c3d90c437b6f28e3a8940e9676ee7f79026a
Author: udo pton <udopton at gmail.com>
Date: Thu May 6 15:32:19 2021 +0200
Translation update by udo pton <udopton at gmail.com> using Weblate
po/tr.po: 77.8% (4263 of 5479 strings; 735 fuzzy)
230 failing checks (4.1%)
Translation: GnuCash/Program (Turkish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/tr/
Translation update by udo pton <udopton at gmail.com> using Weblate
po/glossary/tr.po: 23.5% (49 of 208 strings; 2 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Turkish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/tr/
Co-authored-by: udo pton <udopton at gmail.com>
diff --git a/po/glossary/tr.po b/po/glossary/tr.po
index 3b1ef3448..81bb2231f 100644
--- a/po/glossary/tr.po
+++ b/po/glossary/tr.po
@@ -5,14 +5,15 @@
#
# Muha Aliss <muhaaliss at pm.me>, 2021.
# OÄuz Ersen <oguzersen at protonmail.com>, 2021.
+# udo pton <udopton at gmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: GnuCash VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-02-09 01:51+0100\n"
-"PO-Revision-Date: 2021-02-11 21:50+0000\n"
-"Last-Translator: OÄuz Ersen <oguzersen at protonmail.com>\n"
+"PO-Revision-Date: 2021-05-06 13:32+0000\n"
+"Last-Translator: udo pton <udopton at gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/gnucash/glossary/"
"tr/>\n"
"Language: tr\n"
@@ -20,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.5-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
msgid "Term (Dear translator: This file will never be visible to the user!)"
@@ -794,31 +795,31 @@ msgstr ""
#. "A piece of business done; the transfer of money from one account to one or more other accounts. (see also: Scheduled Transaction)"
msgid "transaction"
-msgstr ""
+msgstr "iÅlem"
#. "A transaction whose amount has actually been moved. The word comes from checks: a check is issued, but several steps have to be done until the amount is actually retrieved from the bank account, which is the point in time where that transaction (check) gets cleared."
msgid "transaction state: cleared"
-msgstr ""
+msgstr "iÅlem durumu: temizlendi"
#. "-"
msgid "transaction state: frozen"
-msgstr ""
+msgstr "iÅlem durumu: dondurulmuÅ"
#. "A transaction that was reconciled with the bank's statement."
msgid "transaction state: reconciled"
-msgstr ""
+msgstr "iÅlem durumu: mutabakat saÄlanmıÅtır"
#. "A transaction that is void i.e. not valid (anymore)."
msgid "transaction state: voided"
-msgstr ""
+msgstr "iÅlem durumu: geçersiz"
#. "1. The action of transferring sth. 2. see: credit transfer"
msgid "transfer (noun)"
-msgstr ""
+msgstr "transfer (isim)"
#. "The account where an amount is transferred to"
msgid "transfer account"
-msgstr ""
+msgstr "transfer hesabı"
#. "To move money from one account to another. Will create a transaction."
msgid "transfer, to (register toolbar)"
diff --git a/po/tr.po b/po/tr.po
index 3492da38f..b61851b6c 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -6,14 +6,15 @@
# Emin Tufan Ãetin <etcetin at gmail.com>, 2018.
# OÄuz Ersen <oguzersen at protonmail.com>, 2021.
# Ãmer Faruk Ãakmak <omerfarukckmk at protonmail.com>, 2021.
+# udo pton <udopton at gmail.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: GnuCash 4.4+\n"
-"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug.cgi?"
-"product=GnuCash&component=Translations\n"
+"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
+"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-04 17:26+0000\n"
-"Last-Translator: Ãmer Faruk Ãakmak <omerfarukckmk at protonmail.com>\n"
+"PO-Revision-Date: 2021-05-06 13:32+0000\n"
+"Last-Translator: udo pton <udopton at gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/gnucash/gnucash/"
"tr/>\n"
"Language: tr\n"
@@ -21,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
"X-Bugs: Report translation errors to the Language-Team address.\n"
"X-POOTLE-MTIME: 1497808015.000000\n"
@@ -458,6 +459,9 @@ msgid ""
"community. For announcements of new releases, user groups etc. see the table "
"at https://wiki.gnucash.org/wiki/Mailing_Lists"
msgstr ""
+"Posta listeleri GnuCash topluluÄunda tercih edilen iletiÅim Åeklidir. Yeni "
+"sürümlerin duyuruları, kullanıcı grupları vb için bknz .https://wiki.gnucash."
+"org/wiki/Mailing_Lists."
#: doc/tip_of_the_day.list.c:9
msgid ""
@@ -498,6 +502,9 @@ msgid ""
"Just locate the triangle at the far right of the column headings, and click "
"it to see the different columns available."
msgstr ""
+"Hesap Planında hangi sütunların görüntüleneceÄini deÄiÅtirmek mümkündür. "
+"Sütun baÅlıklarının en saÄındaki üçgeni bulun ve mevcut farklı sütunları "
+"görmek için tıklayın."
#: doc/tip_of_the_day.list.c:27
msgid ""
@@ -532,6 +539,13 @@ msgid ""
"select \"View\" in the menu bar and check \"Double Line\" or\n"
"check \"Double Line Mode\" in Preferences:Register Defaults."
msgstr ""
+"Her iÅlemin için yararlı bilgiler girebileceÄiniz bir \"Notlar\" alanı "
+"vardır.\n"
+"\n"
+"Görünür kılmak için\n"
+"menü çubuÄunda \"Görünüm\" ü seçin ve \"Ãift Hat\" ı iÅaretleyin veya\n"
+"Tercihler: Varsayılanları Kaydet bölümünde \"Ãift Hat Modu\" seçeneÄini "
+"iÅaretleyin."
#: doc/tip_of_the_day.list.c:44
msgid ""
@@ -632,12 +646,17 @@ msgstr ""
"para biriminin miktarı kullanılabilir olacaktır."
#: doc/tip_of_the_day.list.c:85
+#, fuzzy
msgid ""
"You can set the Security Editor screen to display the Quote Source of a "
"security, which makes it easy to see which online sources your securities "
"use. Click the triangle at the far right of the column headings to change "
"the display."
msgstr ""
+"Güvenlik Düzenleyicisi ekranını bir menkul kıymetin Teklif KaynaÄını "
+"görüntüleyecek Åekilde ayarlayabilirsiniz, bu da menkul kıymetlerinizin "
+"hangi çevrimiçi kaynakları kullandıÄını görmenizi kolaylaÅtırır. Görüntüyü "
+"deÄiÅtirmek için sütun baÅlıklarının en saÄındaki üçgeni tıklayın."
#: doc/tip_of_the_day.list.c:90
msgid ""
@@ -876,6 +895,9 @@ msgid ""
"new accounts. Accounts in other currencies must be\n"
"added manually."
msgstr ""
+"Bir Defter para birimi seçtiniz ve bu yeni hesaplar\n"
+"için kullanılacak. DiÄer para birimlerindeki hesaplar,\n"
+"manuel olarak eklendi."
#: gnucash/gnome/assistant-hierarchy.c:1491
msgid "Please choose the currency to use for new accounts."
@@ -1654,7 +1676,7 @@ msgstr "URL gir:"
#: gnucash/gnome/dialog-doclink.c:242
msgid "Enter URL like http://www.gnucash.org:"
-msgstr ""
+msgstr "Http://www.gnucash.org gibi bir URL girin:"
#: gnucash/gnome/dialog-doclink.c:256
msgid "Existing Document Link is"
@@ -1692,7 +1714,7 @@ msgstr "Girdi dosyası açılamıyor."
#: gnucash/gnome/gnc-plugin-page-invoice.c:1361
#: gnucash/gnome/gnc-plugin-page-register.c:631
msgid "Manage Document Link"
-msgstr ""
+msgstr "Belge BaÄlantısını Yönetin"
#: gnucash/gnome/dialog-doclink.c:754
#, fuzzy
@@ -1755,12 +1777,17 @@ msgid "Description"
msgstr "Açıklama"
#: gnucash/gnome/dialog-doclink.c:1088
+#, fuzzy
msgid ""
"Double click on the entry in the Id column to jump to the Business Item.\n"
"Double click on the entry in the Link column to open the Linked Document.\n"
"Double click on the entry in the Available column to modify the document "
"link."
msgstr ""
+"İŠÃÄesine atlamak için Kimlik sütunundaki giriÅi çift tıklayın.\n"
+"BaÄlantılı Belgeyi açmak için BaÄlantı sütunundaki giriÅe çift tıklayın.\n"
+"Belge baÄlantısını deÄiÅtirmek için Kullanılabilir sütunundaki giriÅe çift "
+"tıklayın."
#: gnucash/gnome/dialog-doclink.c:1097
#, fuzzy
@@ -2168,7 +2195,7 @@ msgstr[0] ""
#: gnucash/gnome/dialog-imap-editor.c:367
#, c-format
msgid "To see the invalid mappings, use a filter of '%s'"
-msgstr ""
+msgstr "Geçersiz eÅlemeleri görmek için bir '%s' filtresi kullanın"
#: gnucash/gnome/dialog-imap-editor.c:367
#: gnucash/gnome/dialog-imap-editor.c:604
@@ -2178,12 +2205,12 @@ msgstr "Hesap Kodu"
#: gnucash/gnome/dialog-imap-editor.c:369
msgid "(Note, if there is a large number, it may take a while)"
-msgstr ""
+msgstr "(Not, çok sayıda varsa, biraz zaman alabilir)"
#: gnucash/gnome/dialog-imap-editor.c:703
#: gnucash/gtkbuilder/dialog-imap-editor.glade:123
msgid "Bayesian"
-msgstr ""
+msgstr "Bayes"
#: gnucash/gnome/dialog-imap-editor.c:718
msgid "Description Field"
@@ -2309,12 +2336,12 @@ msgstr "Kredi Notu"
#: gnucash/gnome/dialog-invoice.c:2089
msgid "PAID"
-msgstr ""
+msgstr "Ãdendi"
#: gnucash/gnome/dialog-invoice.c:2091
#: gnucash/report/reports/standard/new-owner-report.scm:583
msgid "UNPAID"
-msgstr ""
+msgstr "Ãdenmedi"
#: gnucash/gnome/dialog-invoice.c:2139 gnucash/gnome/dialog-invoice.c:2158
#: gnucash/gnome/dialog-invoice.c:2177
@@ -2787,6 +2814,8 @@ msgid ""
"No documents were selected to assign this payment to. This may create an "
"unattached payment."
msgstr ""
+"Bu ödemenin atanacaÄı belge seçilmedi. Bu, ekli olmayan bir ödeme "
+"oluÅturabilir."
#: gnucash/gnome/dialog-payment.c:529 gnucash/gnome/dialog-payment.c:1330
#: gnucash/report/reports/standard/new-aging.scm:192
@@ -2863,15 +2892,21 @@ msgstr ""
msgid ""
"The selected transaction doesn't have splits that can be assigned as a "
"payment"
-msgstr ""
+msgstr "Seçili iÅlem, ödeme olarak atanabilecek bölmelere sahip deÄil"
#: gnucash/gnome/dialog-payment.c:1593
+#, fuzzy
msgid ""
"While this transaction has multiple splits that can be considered\n"
"as 'the payment split', gnucash only knows how to handle one.\n"
"Please select one, the others will be ignored.\n"
"\n"
msgstr ""
+"Bu iÅlemin dikkate alınabilecek birden fazla bölünmesi olsa da\n"
+"\"ödeme bölümü\" olarak, gnucash yalnızca birini nasıl idare edeceÄini bilir."
+"\n"
+"Lütfen birini seçin, diÄerleri göz ardı edilecektir.\n"
+"\n"
#: gnucash/gnome/dialog-payment.c:1596
msgid "Warning"
commit 272278dd51cad26d386960bc26ba241485d40597
Author: Arve Eriksson <031299870 at telia.com>
Date: Thu May 6 15:32:19 2021 +0200
Translation update by Arve Eriksson <031299870 at telia.com> using Weblate
po/glossary/sv.po: 100.0% (208 of 208 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Swedish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/sv/
Translation update by Arve Eriksson <031299870 at telia.com> using Weblate
po/glossary/sv.po: 99.5% (207 of 208 strings; 1 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Swedish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/sv/
Co-authored-by: Arve Eriksson <031299870 at telia.com>
diff --git a/po/glossary/sv.po b/po/glossary/sv.po
index 466cda468..91c743c27 100644
--- a/po/glossary/sv.po
+++ b/po/glossary/sv.po
@@ -13,8 +13,8 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-05-02 17:32+0000\n"
-"Last-Translator: Kristoffer Grundström <swedishsailfishosuser at tutanota.com>\n"
+"PO-Revision-Date: 2021-05-06 03:32+0000\n"
+"Last-Translator: Arve Eriksson <031299870 at telia.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/gnucash/glossary/"
"sv/>\n"
"Language: sv\n"
@@ -218,14 +218,12 @@ msgid "balance (noun)"
msgstr "saldo (substantiv)"
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
-#, fuzzy
msgid "balance b/f"
-msgstr "balansera, att"
+msgstr "saldo ing"
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
-#, fuzzy
msgid "balance c/f"
-msgstr "balansera, att"
+msgstr "saldo utg"
#. "A written record of money received and paid out, showing the difference between the two total amounts"
msgid "balance sheet"
@@ -760,9 +758,8 @@ msgid "subtotal"
msgstr "delsumma"
#. "On the government's tax forms, the tax code identifies the given line or place on the form where certain amounts must be specified according to the current country's legislation"
-#, fuzzy
msgid "tax code"
-msgstr "skatteinformation"
+msgstr "skattelagstiftning"
#. "field of an account"
msgid "tax info"
@@ -778,11 +775,11 @@ msgstr "skattetyp: försäljningsskatt"
#. "'Goods and Service Tax' is one form of sales tax."
msgid "tax type: GST"
-msgstr ""
+msgstr "skattetyp: GST"
#. "'Value Added Tax' is the other form of sales tax."
msgid "tax type: VAT"
-msgstr ""
+msgstr "skattetyp: mervärdesskatt (moms)"
#. "If you create a new e.g. style sheet, you can start from a template."
msgid "template"
commit 00afdf569d3804dc715c12f11b9cff468b42ba59
Author: TianXing_Yi <duguqiubailee at gmail.com>
Date: Thu May 6 15:32:18 2021 +0200
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 62.9% (3450 of 5479 strings; 1352 fuzzy)
494 failing checks (9.0%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 62.9% (3448 of 5479 strings; 1354 fuzzy)
494 failing checks (9.0%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: TianXing_Yi <duguqiubailee at gmail.com>
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 0378e9aa7..8de84dcdd 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -20,8 +20,8 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-05-04 17:22+0000\n"
-"Last-Translator: chokore <byt2ooo at 163.com>\n"
+"PO-Revision-Date: 2021-05-05 17:32+0000\n"
+"Last-Translator: TianXing_Yi <duguqiubailee at gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -3609,7 +3609,7 @@ msgstr "éæ©ä¸ä¸ªé¢ç®"
#: gnucash/gnome/gnc-plugin-business.c:155
#: gnucash/gnome/gnc-plugin-business.c:305 gnucash/report/report-core.scm:163
msgid "_Business"
-msgstr "ä¸å¡(_B)"
+msgstr "åä¸(_B)"
#: gnucash/gnome/gnc-plugin-business.c:158
msgid "_Customer"
@@ -5012,7 +5012,6 @@ msgid "Vendor Report"
msgstr "ä¾åºåæ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:222
-#, fuzzy
msgid "Show vendor report"
msgstr "æ¾ç¤ºä¾åºåæ¥è¡¨"
@@ -5023,7 +5022,6 @@ msgid "Customer Report"
msgstr "å®¢æ·æ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:227
-#, fuzzy
msgid "Show customer report"
msgstr "æ¾ç¤ºå®¢æ·æ¥è¡¨"
@@ -5034,7 +5032,6 @@ msgid "Employee Report"
msgstr "åå·¥æ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:232
-#, fuzzy
msgid "Show employee report"
msgstr "æ¾ç¤ºåå·¥æ¥è¡¨"
@@ -5469,9 +5466,8 @@ msgid ""
msgstr ""
#: gnucash/gnome/gnc-plugin-page-register2.c:755
-#, fuzzy
msgid "General Journal2"
-msgstr "æ®éæ¥è®°è´¦"
+msgstr "æ¥å¸¸æµæ°´ 2"
#. Translators: %s is the name
#. of the tab page
@@ -5523,7 +5519,7 @@ msgstr "æªç¥"
#: gnucash/gnome/gnc-plugin-page-register.c:3559
#: gnucash/report/reports/standard/general-journal.scm:36
msgid "General Journal"
-msgstr "æ®éæ¥è®°è´¦"
+msgstr "æ¥å¸¸æµæ°´"
#: gnucash/gnome/gnc-plugin-page-register2.c:1683
#: gnucash/gnome/gnc-plugin-page-register2.c:2422
@@ -5540,9 +5536,8 @@ msgid "Search Results"
msgstr "æç´¢ç»æ"
#: gnucash/gnome/gnc-plugin-page-register2.c:2418
-#, fuzzy
msgid "General Journal Report"
-msgstr "æ®éæ¥è®°è´¦æ¥è¡¨"
+msgstr "æ¥å¸¸æµæ°´æ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-register2.c:2424
#: gnucash/gnome/gnc-plugin-page-register.c:3567
@@ -5754,7 +5749,7 @@ msgstr "æ¾ç¤ºï¼"
#: gnucash/gnome/gnc-plugin-page-register.c:3579
#: gnucash/report/reports/standard/transaction.scm:33
msgid "Transaction Report"
-msgstr "交æäºé¡¹æ¥è¡¨"
+msgstr "äº¤ææ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-register.c:3997
#: gnucash/gnome/gnc-split-reg.c:1160
@@ -5997,7 +5992,7 @@ msgstr "GnuCash é项"
#: gnucash/gtkbuilder/business-prefs.glade:26
#: gnucash/report/reports/standard/invoice.scm:903
msgid "Printable Invoice"
-msgstr "ç´æ¥"
+msgstr "坿å°å票"
#: gnucash/gnome/gnc-plugin-page-report.c:1852
#: gnucash/gtkbuilder/business-prefs.glade:29
@@ -6006,19 +6001,19 @@ msgstr "ç´æ¥"
#: gnucash/report/reports/standard/taxinvoice.scm:309
#: gnucash/report/reports/support/taxinvoice.eguile.scm:423
msgid "Tax Invoice"
-msgstr "ç¨å¡"
+msgstr "ç¨å¡å票"
#: gnucash/gnome/gnc-plugin-page-report.c:1853
#: gnucash/gtkbuilder/business-prefs.glade:32
#: gnucash/report/reports/standard/invoice.scm:912
msgid "Easy Invoice"
-msgstr "ç®æ´"
+msgstr "ç®æå票"
#: gnucash/gnome/gnc-plugin-page-report.c:1854
#: gnucash/gtkbuilder/business-prefs.glade:35
#: gnucash/report/reports/standard/invoice.scm:921
msgid "Fancy Invoice"
-msgstr "ç²¾ç¾"
+msgstr "ç²¾ç¾å票"
#: gnucash/gnome/gnc-plugin-page-sx-list.c:136
msgid "_Scheduled"
@@ -6081,14 +6076,12 @@ msgstr "æ¨ç¡®ä¿¡æ¨è¦å é¤è¿ç¬è®¡å交æäºé¡¹ï¼"
#: gnucash/gnome/gnc-plugin-register2.c:57
#: gnucash/gnome/gnc-plugin-register.c:58
-#, fuzzy
msgid "_General Journal"
-msgstr "æ®éæ¥è®°è´¦(_G)"
+msgstr "æ¥å¸¸æµæ°´(_G)"
#: gnucash/gnome/gnc-plugin-register2.c:58
-#, fuzzy
msgid "Open a general journal window"
-msgstr "å¼å¯ä¸ä¸ªæ®éæ¥è®°è´¦çªå£"
+msgstr "å¼å¯æ¥å¸¸æµæ°´çªå£"
#: gnucash/gnome/gnc-plugin-register2.c:66
#: gnucash/gnome/gnc-plugin-register2.c:67
@@ -6097,17 +6090,15 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-register.c:54
msgid "Old St_yle General Journal"
-msgstr "æ§å¼æ¥è®°è´¦(_Y)"
+msgstr "æ§å¼æ¥å¸¸æµæ°´(_Y)"
#: gnucash/gnome/gnc-plugin-register.c:55
-#, fuzzy
msgid "Open an old style general journal window"
-msgstr "å¼å¯ä¸ä¸ªåç±»æ»è´¦çªå£"
+msgstr "å¼å¯æ§å¼æ¥å¸¸æµæ°´çªå£"
#: gnucash/gnome/gnc-plugin-register.c:59
-#, fuzzy
msgid "Open general journal window"
-msgstr "å¼å¯ä¸ä¸ªåç±»æ»è´¦çªå£"
+msgstr "å¼å¯æ¥å¸¸æµæ°´çªå£"
#: gnucash/gnome/gnc-plugin-report-system.c:57
msgid "St_yle Sheets"
@@ -6520,22 +6511,20 @@ msgstr "æ¾ç¤º ~a æ¥è¡¨"
#: gnucash/gnome/report-menus.scm:90
#: gnucash/gtkbuilder/dialog-custom-report.glade:8
msgid "Saved Report Configurations"
-msgstr "å·²ä¿åæ¥è¡¨æ¨¡æ¿"
+msgstr "ä¿åçæ¥è¡¨é
ç½®"
#: gnucash/gnome/report-menus.scm:92
-#, fuzzy
msgid "Manage and run saved report configurations"
-msgstr "管çåæ§è¡èªå®ä¹æ¥è¡¨"
+msgstr "管çåè¿è¡ä¿åé
ç½®çæ¥è¡¨"
#: gnucash/gnome/report-menus.scm:116
#: gnucash/report/reports/standard/dashboard.scm:52
-#, fuzzy
msgid "Dashboard"
-msgstr "å线"
+msgstr "æ¥è¡¨ç"
#: gnucash/gnome/report-menus.scm:118
msgid "A basic dashboard for your accounting data"
-msgstr ""
+msgstr "è´¢å¡æ°æ®çåºæ¬ä¿¡æ¯ä¸å¿"
#: gnucash/gnome/search-owner.c:136
msgid "You have not selected an owner"
@@ -9097,7 +9086,7 @@ msgstr "è´¹ç¨"
#: gnucash/report/reports/support/receipt.eguile.scm:278
#: gnucash/report/reports/support/receipt.eguile.scm:285
msgid "Receipt"
-msgstr "éç¥"
+msgstr "æ¶æ®"
#: gnucash/gnome-utils/gnc-tree-model-split-reg.c:2857
#: gnucash/gnome-utils/gnc-tree-model-split-reg.c:2871
@@ -12435,9 +12424,8 @@ msgid "Press 'Close' to Exit."
msgstr ""
#: gnucash/gtkbuilder/assistant-acct-period.glade:266
-#, fuzzy
msgid "Summary Page"
-msgstr "æ¦è¦æ (_M)"
+msgstr "æ±æ»é¡µé¢(_M)"
#: gnucash/gtkbuilder/assistant-csv-account-import.glade:13
#, fuzzy
@@ -12529,9 +12517,8 @@ msgstr "ç«å³å¯¼å
¥ç§ç®"
#: gnucash/gtkbuilder/assistant-csv-account-import.glade:346
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:1069
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:1156
-#, fuzzy
msgid "Import Summary"
-msgstr "ç§ç®æè¦"
+msgstr "导å
¥æ±æ»"
#: gnucash/gtkbuilder/assistant-csv-export.glade:8
#, fuzzy
@@ -12699,14 +12686,12 @@ msgid "Export Now..."
msgstr "ç«å³å¯¼åº..."
#: gnucash/gtkbuilder/assistant-csv-export.glade:742
-#, fuzzy
msgid "Summary"
-msgstr "æ¦è¦æ (_M)"
+msgstr "æ±æ»"
#: gnucash/gtkbuilder/assistant-csv-export.glade:747
-#, fuzzy
msgid "Export Summary"
-msgstr "ç§ç®æè¦"
+msgstr "å¯¼åºæ±æ»"
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:38
msgid "CSV Price Import"
@@ -13504,9 +13489,8 @@ msgid "Schedule added successfully."
msgstr "ç»è´¦æåã"
#: gnucash/gtkbuilder/assistant-loan.glade:1257
-#, fuzzy
msgid "Loan Summary"
-msgstr "ç§ç®æè¦"
+msgstr "è´·æ¬¾æ±æ»"
#: gnucash/gtkbuilder/assistant-qif-import.glade:12
#: gnucash/gtkbuilder/assistant-qif-import.glade:23
@@ -13910,14 +13894,12 @@ msgid "Update your GnuCash accounts"
msgstr "æ´æ°æ¨ç GnuCash ç§ç®"
#: gnucash/gtkbuilder/assistant-qif-import.glade:1387
-#, fuzzy
msgid "Summary Text"
-msgstr "æ¦è¦æ (_M)"
+msgstr "æ±æ»æå"
#: gnucash/gtkbuilder/assistant-qif-import.glade:1392
-#, fuzzy
msgid "Qif Import Summary"
-msgstr "ç§ç®æè¦"
+msgstr "Qif 导å
¥æ±æ»"
#: gnucash/gtkbuilder/assistant-stock-split.glade:9
#: gnucash/gtkbuilder/assistant-stock-split.glade:37
@@ -18970,9 +18952,8 @@ msgid "Con_firm Password"
msgstr "确认å¯ç ï¼"
#: gnucash/import-export/aqb/dialog-ab.glade:842
-#, fuzzy
msgid "_Remember the PIN in memory"
-msgstr "å¨å
åä¸è®°ä½å¯ç "
+msgstr "å¨å
åä¸è®°ä½å¯ç (_R)"
#: gnucash/import-export/aqb/dialog-ab.glade:848
#, fuzzy
@@ -19133,9 +19114,8 @@ msgstr ""
"ææå¼ç¶æã"
#: gnucash/import-export/aqb/dialog-ab-pref.glade:51
-#, fuzzy
msgid "Remember the _PIN in memory"
-msgstr "å¨å
åä¸è®°ä½å¯ç "
+msgstr "å¨å
åä¸è®°ä½å¯ç (_P)"
#: gnucash/import-export/aqb/dialog-ab-pref.glade:57
#: gnucash/import-export/aqb/gschemas/org.gnucash.dialogs.import.hbci.gschema.xml.in:21
@@ -21305,7 +21285,7 @@ msgstr "è¡ä»½æ°é"
#: gnucash/import-export/qif-imp/qif-file.scm:705
msgid "Investment action"
-msgstr "æèµæä½"
+msgstr "æèµåè½"
#: gnucash/import-export/qif-imp/qif-file.scm:706
msgid "Reconciliation status"
@@ -22254,9 +22234,8 @@ msgid "No accounts selected"
msgstr "没æéå®ç§ç®"
#: gnucash/report/html-utilities.scm:398
-#, fuzzy
msgid "This report requires accounts to be selected in the report options."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "éè¦å¨æ¥è¡¨é项ä¸éæ©ç§ç®ã"
#: gnucash/report/html-utilities.scm:405
#: gnucash/report/reports/standard/price-scatter.scm:267
@@ -22634,14 +22613,12 @@ msgid "E_xamples"
msgstr "示ä¾(_X)"
#: gnucash/report/report-core.scm:155
-#, fuzzy
msgid "_Experimental"
-msgstr "导åº(_E)"
+msgstr "å®éªé¶æ®µ(_E)"
#: gnucash/report/report-core.scm:156
-#, fuzzy
msgid "_Multicolumn"
-msgstr "å¤åè§å¾"
+msgstr "å¤åæ¥è¡¨(_M)"
#: gnucash/report/report-core.scm:157
msgid "_Custom"
@@ -23798,7 +23775,7 @@ msgstr "è¿ä¸ªé¡µé¢æ¾ç¤ºæ¨é¡»çº³ç¨çæ¶å
¥ä¸å¯åå
çæ¯åºã"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:119
msgid "Tax Schedule Report/TXF Export"
-msgstr "ç¨å¡è®¡åæ¥è¡¨åå¯¼åº TXF"
+msgstr "ç¨å¡è®¡åæ¥è¡¨å TXF 导åº"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:219
msgid "$0.00 valued Tax codes won't be printed."
@@ -23895,7 +23872,7 @@ msgstr "ä½¿ç¨ææ¥è¿æ¥è¡¨çæ¥æ"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:3334
msgid "Tax Schedule Report & TXF Export"
-msgstr "ç¨å¡è®¡åæ¥è¡¨ä¸TXFè¾åº"
+msgstr "ç¨å¡è®¡åæ¥è¡¨å TXF 导åº"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:3336
msgid ""
@@ -23920,15 +23897,15 @@ msgstr "è¿ä¸ªé¡µé¢æ¾ç¤ºæå¾ç¨ç¸å
³ç§ç®ç交æäºé¡¹æç»ã"
#: gnucash/report/reports/standard/account-piecharts.scm:36
msgid "Income Piechart"
-msgstr "æ¶å
¥é¥¼å¾"
+msgstr "æ¶å
¥æå½¢å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:37
msgid "Expense Piechart"
-msgstr "æ¯åºé¥¼å¾"
+msgstr "æ¯åºæå½¢å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:38
msgid "Asset Piechart"
-msgstr "èµäº§æå½¢å¾"
+msgstr "èµäº§é¥¼å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:39
#, fuzzy
@@ -23949,11 +23926,11 @@ msgstr "æ¾ç¤ºæ¯ä¸ªæ¶é´é´éçæ¯åºå饼å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:49
msgid "Shows a piechart with the Assets balance at a given time"
-msgstr "æ¾ç¤ºç¹å®æ¶é´çèµäº§æå½¢å¾"
+msgstr "æ¾ç¤ºç¹å®æ¶é´çèµäº§é¥¼å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:51
msgid "Shows a piechart with distribution of assets over securities"
-msgstr "æ¾ç¤ºç¹å®æ¶é´çè´åºæå½¢å¾"
+msgstr "æ¾ç¤ºç¹å®æ¶é´çè´åºé¥¼å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:53
msgid "Shows a piechart with the Liabilities balance at a given time"
@@ -24096,11 +24073,11 @@ msgstr "%s çä½é¢"
#: gnucash/report/reports/standard/account-summary.scm:69
msgid "Account Summary"
-msgstr "ç§ç®æè¦"
+msgstr "ç§ç®æ±æ»"
#: gnucash/report/reports/standard/account-summary.scm:70
msgid "Future Scheduled Transactions Summary"
-msgstr ""
+msgstr "计åäº¤ææ±æ»"
#: gnucash/report/reports/standard/account-summary.scm:72
#: gnucash/report/reports/standard/balance-sheet.scm:75
@@ -25023,7 +25000,7 @@ msgstr "å¤ç«ç"
#: gnucash/report/reports/standard/balsheet-eg.scm:557
msgid "Balance Sheet using eguile-gnc"
-msgstr "ä½¿ç¨ eguile-gnc çèµäº§è´åºè¡¨"
+msgstr "èµäº§è´åºè¡¨ï¼eguile-gncï¼"
#: gnucash/report/reports/standard/balsheet-eg.scm:558
msgid "Display a balance sheet (using eguile template)"
@@ -25236,14 +25213,12 @@ msgid "Net Income"
msgstr "åæ¶ç"
#: gnucash/report/reports/standard/balsheet-pnl.scm:1326
-#, fuzzy
msgid "Balance Sheet (Multicolumn)"
-msgstr "èµäº§è´åºè¡¨ (eguile)"
+msgstr "èµäº§è´åºè¡¨ï¼å¤åï¼"
#: gnucash/report/reports/standard/balsheet-pnl.scm:1327
-#, fuzzy
msgid "Income Statement (Multicolumn)"
-msgstr "æç表"
+msgstr "æ¶æ¯è¡¨ï¼å¤åï¼"
#: gnucash/report/reports/standard/budget-balance-sheet.scm:38
msgid "Budget Balance Sheet"
@@ -25849,31 +25824,28 @@ msgstr "æ¯åºå¾"
#: gnucash/report/reports/standard/category-barchart.scm:43
#: gnucash/report/reports/standard/net-charts.scm:363
msgid "Asset Chart"
-msgstr "èµäº§æ±ç¶å¾"
+msgstr "èµäº§å 积æ±å½¢å¾"
#: gnucash/report/reports/standard/category-barchart.scm:44
#: gnucash/report/reports/standard/net-charts.scm:384
msgid "Liability Chart"
-msgstr "è´åºå¾"
+msgstr "è´åºå 积æ±å½¢å¾"
#: gnucash/report/reports/standard/category-barchart.scm:49
-#, fuzzy
msgid "Shows a chart with the Income per interval developing over time"
-msgstr "æ¾ç¤ºæ¯æ®µæé´æ¶å
¥éæ¶é´ååæ¡ç¶å¾"
+msgstr "æ¾ç¤ºæ¶å
¥éæ¶é´ååçæ±ç¶å¾"
#: gnucash/report/reports/standard/category-barchart.scm:52
-#, fuzzy
msgid "Shows a chart with the Expenses per interval developing over time"
-msgstr "æ¾ç¤ºæ¯æ®µæé´æ¯åºéæ¶é´ååæ¡ç¶å¾"
+msgstr "æ¾ç¤ºæ¯åºéæ¶é´ååçæ±ç¶å¾"
#: gnucash/report/reports/standard/category-barchart.scm:55
msgid "Shows a chart with the Assets developing over time"
-msgstr "æ¾ç¤ºèµäº§éæ¶é´ååçæ±ç¶å¾"
+msgstr "æ¾ç¤ºèµäº§éæ¶é´ååçå 积æ±å½¢å¾"
#: gnucash/report/reports/standard/category-barchart.scm:57
-#, fuzzy
msgid "Shows a chart with the Liabilities developing over time"
-msgstr "æ¾ç¤ºè´åºéæ¶é´ååæ¡ç¶å¾"
+msgstr "æ¾ç¤ºè´åºéæ¶é´ååæ±ç¶å¾"
#: gnucash/report/reports/standard/category-barchart.scm:63
msgid "Income Over Time"
@@ -26099,9 +26071,8 @@ msgid "No Customer"
msgstr "æ°å»ºå®¢æ·"
#: gnucash/report/reports/standard/customer-summary.scm:508
-#, fuzzy
msgid "Customer Summary"
-msgstr "客æ·ç¼å·ï¼"
+msgstr "å®¢æ·æ¦åµ"
#: gnucash/report/reports/standard/equity-statement.scm:55
msgid "Equity Statement"
@@ -26965,9 +26936,8 @@ msgid "Total Due"
msgstr "å°æå计"
#: gnucash/report/reports/standard/job-report.scm:352
-#, fuzzy
msgid "The job for this report."
-msgstr "æ¤æ¥è¡¨çå·¥ä½"
+msgstr "æ¤æ¥è¡¨ç项ç®ã"
#: gnucash/report/reports/standard/job-report.scm:360
#: gnucash/report/reports/standard/owner-report.scm:543
@@ -27011,7 +26981,7 @@ msgstr "æ¯å¦æ¾ç¤ºäº¤ææ¥æï¼"
#: gnucash/report/reports/standard/job-report.scm:508
#: gnucash/report/reports/standard/new-owner-report.scm:1234
msgid "Job Report"
-msgstr "工使¥å"
+msgstr "é¡¹ç®æ¥è¡¨"
#: gnucash/report/reports/standard/job-report.scm:580
#: gnucash/report/reports/standard/new-owner-report.scm:90
@@ -27058,9 +27028,8 @@ msgid "Show Asset & Liability"
msgstr "æ¾ç¤ºèµäº§è´åº"
#: gnucash/report/reports/standard/net-charts.scm:51
-#, fuzzy
msgid "Show Net Worth"
-msgstr "æ¾ç¤ºèµäº§å弿¡"
+msgstr "æ¾ç¤ºåå¼"
#: gnucash/report/reports/standard/net-charts.scm:56
#, fuzzy
@@ -27090,7 +27059,7 @@ msgstr "æ¾ç¤ºæ¶çåé¢ï¼"
#: gnucash/report/reports/standard/net-charts.scm:127
msgid "Show a Net Worth bar?"
-msgstr "æ¾ç¤ºä¸æ ¹èµäº§å弿¡ï¼"
+msgstr "æ¾ç¤ºå弿 ï¼"
#: gnucash/report/reports/standard/net-charts.scm:153
msgid "Add grid lines."
@@ -27108,7 +27077,7 @@ msgstr "èµäº§åå¼"
#: gnucash/report/reports/standard/net-charts.scm:484
msgid "Net Worth Barchart"
-msgstr "èµäº§å弿±ç¶å¾"
+msgstr "èµäº§åå¼ç°ç¶æ±å½¢å¾"
#: gnucash/report/reports/standard/net-charts.scm:495
msgid "Income/Expense Chart"
@@ -27120,9 +27089,8 @@ msgid "Income & Expense Barchart"
msgstr "æ¶å
¥åæ¯åºå¾"
#: gnucash/report/reports/standard/net-charts.scm:507
-#, fuzzy
msgid "Net Worth Linechart"
-msgstr "èµäº§å弿±ç¶å¾"
+msgstr "èµäº§åå¼å 积æçº¿å¾"
#: gnucash/report/reports/standard/net-charts.scm:520
#: gnucash/report/reports/standard/net-charts.scm:522
@@ -27196,11 +27164,11 @@ msgstr ""
#: gnucash/report/reports/standard/new-aging.scm:435
msgid "Payable Aging"
-msgstr "åºä»è´¦æ¬¾è´¦é¾"
+msgstr "åºä»è´¦é¾"
#: gnucash/report/reports/standard/new-aging.scm:444
msgid "Receivable Aging"
-msgstr "åºæ¶è´¦æ¬¾è´¦é¾"
+msgstr "åºæ¶è´¦é¾"
#: gnucash/report/reports/standard/new-owner-report.scm:54
#: gnucash/report/reports/standard/owner-report.scm:55
@@ -27230,25 +27198,21 @@ msgstr "交æäºé¡¹"
#: gnucash/report/reports/standard/new-owner-report.scm:91
#: gnucash/report/reports/standard/owner-report.scm:87
-#, fuzzy
msgid "This report requires a customer to be selected."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "请为该æ¥è¡¨éæ©ä¸ä½å®¢æ·ã"
#: gnucash/report/reports/standard/new-owner-report.scm:96
#: gnucash/report/reports/standard/owner-report.scm:88
-#, fuzzy
msgid "This report requires a employee to be selected."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "请为该æ¥è¡¨éæ©ä¸ä½åå·¥ã"
#: gnucash/report/reports/standard/new-owner-report.scm:101
-#, fuzzy
msgid "This report requires a job to be selected."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "请为该æ¥è¡¨éè¦éæ©ä¸ä¸ªé¡¹ç®ã"
#: gnucash/report/reports/standard/new-owner-report.scm:106
-#, fuzzy
msgid "This report requires a vendor to be selected."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "请为该æ¥è¡¨éæ©ä¸ä½ä¾åºåã"
#: gnucash/report/reports/standard/new-owner-report.scm:246
#, fuzzy
@@ -27351,9 +27315,8 @@ msgid "No valid account found"
msgstr "æ¾ä¸å°å¹é
ç"
#: gnucash/report/reports/standard/new-owner-report.scm:1088
-#, fuzzy
msgid "This report requires a valid AP/AR account to be available."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "æ¤æ¥è¡¨è¦æ±æä¾ææç AP/AR ç§ç®ã"
#: gnucash/report/reports/standard/new-owner-report.scm:1111
#, fuzzy
@@ -27371,9 +27334,8 @@ msgid "No valid company selected."
msgstr "éæ©äºæ æçç¼ç "
#: gnucash/report/reports/standard/owner-report.scm:91
-#, fuzzy
msgid "This report requires a company to be selected."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "请为该æ¥è¡¨éæ©ä¸ä¸ªå
¬å¸ã"
#: gnucash/report/reports/standard/owner-report.scm:107
#, fuzzy
@@ -27381,9 +27343,8 @@ msgid "No valid account selected"
msgstr "没æéå®ç§ç®"
#: gnucash/report/reports/standard/owner-report.scm:108
-#, fuzzy
msgid "This report requires a valid account to be selected."
-msgstr "è¿ä¸ªæ¥è¡¨éè¦æéå®çç§ç®ã"
+msgstr "请为该æ¥è¡¨éæ©ä¸ä¸ªææçç§ç®ã"
#: gnucash/report/reports/standard/owner-report.scm:768
msgid "Report:"
@@ -27708,9 +27669,8 @@ msgid "Notes added at end of invoice -- may contain HTML markup"
msgstr "å¨å票ç»å°¾æ·»å ç说æ -- å¯ä»¥å
å« HTML æ è®°"
#: gnucash/report/reports/standard/receipt.scm:211
-#, fuzzy
msgid "Display a customer invoice as receipt, cash voucher"
-msgstr "æ¾ç¤ºä¸ä¸ªå¸¦ç¨æ ç客æ·å票 (ä½¿ç¨ eguile 模æ¿)"
+msgstr "å°å®¢æ·çå票æ¾ç¤ºä¸ºæ¶æ®ãç°éåè¯"
#: gnucash/report/reports/standard/receivables.scm:36
msgid "Receivables Account"
@@ -27729,9 +27689,8 @@ msgid ""
msgstr ""
#: gnucash/report/reports/standard/reconcile-report.scm:103
-#, fuzzy
msgid "Reconciliation Report"
-msgstr "å¯¹è´¦ç¶æ"
+msgstr "对账æ¥è¡¨"
#: gnucash/report/reports/standard/register.scm:148
#: gnucash/report/reports/standard/register.scm:388
@@ -28091,16 +28050,14 @@ msgstr ""
#: gnucash/report/reports/standard/taxinvoice.scm:322
#: gnucash/report/reports/standard/taxinvoice.scm:324
-#, fuzzy
msgid "Australian Tax Invoice"
-msgstr "ç¨å¡å票"
+msgstr "澳大å©äºç¨å¡å票"
#: gnucash/report/reports/standard/taxinvoice.scm:325
-#, fuzzy
msgid ""
"Display an Australian customer invoice with tax columns (using eguile "
"template)"
-msgstr "æ¾ç¤ºä¸ä¸ªå¸¦ç¨æ ç客æ·å票 (ä½¿ç¨ eguile 模æ¿)"
+msgstr "æ¾ç¤ºä¸å¼ 带æç¨æ çæ¾³å¤§å©äºå®¢æ·å票ï¼eguile 模æ¿ï¼"
#: gnucash/report/reports/standard/trial-balance.scm:61
#: gnucash/report/reports/standard/trial-balance.scm:570
@@ -28186,9 +28143,8 @@ msgid "Current Trial Balance"
msgstr "å½åè¯ç®è¡¨"
#: gnucash/report/reports/standard/trial-balance.scm:205
-#, fuzzy
msgid "Uses the exact balances in the general journal"
-msgstr "卿»å类账ä¸ä½¿ç¨åç¡®ä½é¢"
+msgstr "卿¥å¸¸æµæ°´ä¸ä½¿ç¨åç¡®ä½é¢"
#: gnucash/report/reports/standard/trial-balance.scm:207
msgid "Pre-adjustment Trial Balance"
@@ -28246,7 +28202,7 @@ msgstr "å¤åè§å¾"
#: gnucash/report/reports/standard/view-column.scm:217
msgid "Custom Multicolumn Report"
-msgstr "å®å¶å¤åæ¥è¡¨"
+msgstr "èªå®ä¹"
#: gnucash/report/reports/support/balsheet-eg.eguile.scm:167
msgid "Assets Accounts"
commit a6064185a53774f48476dcb0f22cb010fb9c031b
Author: chokore <byt2ooo at 163.com>
Date: Thu May 6 15:32:18 2021 +0200
Translation update by chokore <byt2ooo at 163.com> using Weblate
po/zh_CN.po: 62.1% (3404 of 5479 strings; 1396 fuzzy)
496 failing checks (9.0%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: chokore <byt2ooo at 163.com>
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 15622f2b3..0378e9aa7 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -20,7 +20,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-05-04 15:49+0000\n"
+"PO-Revision-Date: 2021-05-04 17:22+0000\n"
"Last-Translator: chokore <byt2ooo at 163.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
@@ -3242,8 +3242,7 @@ msgstr "åºç¨(_A)"
msgid ""
"CAUTION: If you set TXF categories, and later change 'Type', you will need "
"to manually reset those categories one at a time"
-msgstr ""
-"è¦åï¼å¦ææ¨è®¾ç½®äº TXF ç±»å«ï¼å¹¶ä¸ä¹åæ¹åâç±»åâï¼æ¨éè¦é个æå¨éç½®è¿äºç±»å«ã"
+msgstr "è¦åï¼å¦ææ¨è®¾ç½®äº TXF ç±»å«ï¼å¹¶ä¸ä¹åæ¹åâç±»åâï¼æ¨éè¦é个æå¨éç½®è¿äºç±»å«"
#: gnucash/gnome/dialog-tax-info.c:1394
msgid "Form"
@@ -3454,7 +3453,7 @@ msgstr "ç¨å¡æ¥è¡¨é项(_X)"
#: gnucash/gnome/gnc-plugin-page-register2.c:268
#: gnucash/gnome/gnc-plugin-page-register.c:377
msgid "Setup relevant accounts for tax reports, e.g. US income tax"
-msgstr "为ç¨å¡æ¥è¡¨è®¾ç½®ç¸å
³ç§ç®ï¼å¦ä¸ªäººæå¾ç¨ãå¢å¼ç¨çã"
+msgstr "为ç¨å¡æ¥è¡¨è®¾ç½®ç¸å
³ç§ç®ï¼å¦ä¸ªäººæå¾ç¨ãå¢å¼ç¨ç"
#: gnucash/gnome/gnc-plugin-basic-commands.c:164
msgid "_Scheduled Transactions"
@@ -3487,7 +3486,7 @@ msgstr "为å¿è¿è´·æ¬¾è®¾å®è®¡å交æ"
#: gnucash/gnome/gnc-plugin-basic-commands.c:180
#: gnucash/report/report-core.scm:152
msgid "B_udget"
-msgstr "é¢ç®(_B)"
+msgstr "é¢ç®(_U)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:183
msgid "Close _Books"
@@ -3499,7 +3498,7 @@ msgstr "使ç¨ä¼è®¡æ¶é´åæ¡£èæ°æ®"
#: gnucash/gnome/gnc-plugin-basic-commands.c:191
msgid "_Price Database"
-msgstr "ä»·æ ¼æ°æ®åº(_B)"
+msgstr "ä»·æ ¼æ°æ®åº(_P)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:192
msgid "View and edit the prices for stocks and mutual funds"
@@ -3574,9 +3573,8 @@ msgid "_New Budget"
msgstr "æ°é¢ç®(_N)"
#: gnucash/gnome/gnc-plugin-budget.c:64
-#, fuzzy
msgid "Create a new Budget."
-msgstr "å建ä¸ä¸ªæ°é¢ç®"
+msgstr "å建ä¸ä¸ªæ°é¢ç®ã"
#: gnucash/gnome/gnc-plugin-budget.c:69
msgid "_Open Budget"
@@ -3593,18 +3591,16 @@ msgid "_Copy Budget"
msgstr "å¤å¶é¢ç®(_C)"
#: gnucash/gnome/gnc-plugin-budget.c:76
-#, fuzzy
msgid "Copy an existing Budget."
-msgstr "å¤å¶ä¸ä¸ªå·²æçé¢ç®"
+msgstr "å¤å¶ä¸ä¸ªå·²æçé¢ç®ã"
#: gnucash/gnome/gnc-plugin-budget.c:80
msgid "_Delete Budget"
msgstr "å é¤é¢ç®(_D)"
#: gnucash/gnome/gnc-plugin-budget.c:81
-#, fuzzy
msgid "Delete an existing Budget."
-msgstr "æå¼ä¸ä¸ªå·²æçé¢ç®"
+msgstr "å é¤ä¸ä¸ªå·²æçé¢ç®ã"
#: gnucash/gnome/gnc-plugin-budget.c:288
msgid "Select a Budget"
@@ -3842,9 +3838,8 @@ msgid "Initialize Test Data"
msgstr "åå§åæµè¯æ°æ®"
#: gnucash/gnome/gnc-plugin-business.c:326
-#, fuzzy
msgid "Assign as payment..."
-msgstr "æå®æä»æ¬¾(_P)..."
+msgstr "æå®æä»æ¬¾..."
#: gnucash/gnome/gnc-plugin-business.c:327
#, fuzzy
@@ -3892,7 +3887,7 @@ msgstr "æå¼éä¸çç§ç®"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:214
msgid "Open _Old Style Register Account"
-msgstr ""
+msgstr "æå¼æ§å¼è´¦ç°¿ç§ç®(_O)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:215
msgid "Open the old style register selected account"
@@ -3912,7 +3907,7 @@ msgstr "æå¼éä¸çç§ç®ä»¥åå
¶åç§ç®"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:233
msgid "Open Old St_yle Subaccounts"
-msgstr ""
+msgstr "æå¼æ§å¼åç§ç®(_Y)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:234
msgid "Open the old style register selected account and all its subaccounts"
@@ -4086,7 +4081,7 @@ msgstr "æ£æ¥å¹¶ä¿®å¤å¨æ¤ç§ç®åå
¶åç§ç®ä¸æªç»ç®ç交æäºé¡¹ä¸
#: gnucash/gnome/gnc-plugin-page-account-tree.c:337
msgid "Check & Repair A_ll"
-msgstr "ææç§ç®(_L)"
+msgstr "æ£æ¥åä¿®å¤å
¨é¨(_L)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:338
msgid ""
@@ -4097,7 +4092,7 @@ msgstr "æ£æ¥å¹¶ä¿®å¤ææç§ç®ä¸æªç»ç®ç交æäºé¡¹ä¸å¤ç«çåå½
#: gnucash/gnome/gnc-plugin-page-account-tree.c:342
#: gnucash/gnome/gnc-plugin-register2.c:64
msgid "_Register2"
-msgstr ""
+msgstr "账簿2(_R)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:405
msgid "Open2"
@@ -4180,13 +4175,12 @@ msgstr ""
"ç¡®å®è¦è¿æ ·ååï¼"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1437
-#, fuzzy
msgid "_Pick another account"
-msgstr "éæ©è½¬è´¦ç§ç®(_S)"
+msgstr "éæ©å
¶ä»ç§ç®(_P)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1438
msgid "_Do it anyway"
-msgstr ""
+msgstr "ä»è¦æ§è¡(_D)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1521
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1657
@@ -4248,58 +4242,49 @@ msgid "Are you sure you want to do this?"
msgstr "æ¨ç¡®å®è¦æ§è¡æ¤æä½åï¼"
#: gnucash/gnome/gnc-plugin-page-budget.c:147
-#, fuzzy
msgid "Open the selected account."
-msgstr "æå¼éä¸çç§ç®"
+msgstr "æå¼éä¸çç§ç®ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:152
msgid "Open _Subaccounts"
msgstr "æå¼åç§ç®(_S)"
#: gnucash/gnome/gnc-plugin-page-budget.c:153
-#, fuzzy
msgid "Open the selected account and all its subaccounts."
-msgstr "æå¼éä¸çç§ç®ä»¥åå
¶åç§ç®"
+msgstr "æå¼éä¸çç§ç®ä»¥åå
¶åç§ç®ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:159
-#, fuzzy
msgid "_Delete Budget..."
-msgstr "å é¤é¢ç®(_D)"
+msgstr "å é¤é¢ç®(_D)â¦"
#: gnucash/gnome/gnc-plugin-page-budget.c:160
msgid "Select this or another budget and delete it."
msgstr "éæ©è¿ä¸ªæå¦ä¸ä¸ªé¢ç®å¹¶å é¤å®ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:164
-#, fuzzy
msgid "Budget _Options..."
-msgstr "é¢ç®é项"
+msgstr "é¢ç®é项(_O)â¦"
#: gnucash/gnome/gnc-plugin-page-budget.c:165
-#, fuzzy
msgid "Edit this budget's options."
-msgstr "ç¼è¾è¯¥é¢ç®é项"
+msgstr "ç¼è¾è¯¥é¢ç®é项ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:169
-#, fuzzy
msgid "Esti_mate Budget..."
-msgstr "è¯ä¼°é¢ç®"
+msgstr "è¯ä¼°é¢ç®(_M)â¦"
#: gnucash/gnome/gnc-plugin-page-budget.c:171
-#, fuzzy
msgid ""
"Estimate a budget value for the selected accounts from past transactions."
-msgstr "ä»è¿å»ç交æäºé¡¹ä¸ä¸ºéä¸çç§ç®è¯ä¼°é¢ç®"
+msgstr "ä»è¿å»ç交æäºé¡¹ä¸ä¸ºéä¸çç§ç®è¯ä¼°é¢ç®ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:175
-#, fuzzy
msgid "_All Periods..."
-msgstr "ä¼è®¡æé´"
+msgstr "ææä¼è®¡æé´(_A)â¦"
#: gnucash/gnome/gnc-plugin-page-budget.c:177
-#, fuzzy
msgid "Edit budget for all periods for the selected accounts."
-msgstr "ç¼è¾éä¸çç§ç®"
+msgstr "ç¼è¾éå®ç§ç®ææä¼è®¡æé´çé¢ç®ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:181
#, fuzzy
@@ -4307,9 +4292,8 @@ msgid "Edit Note"
msgstr "ä¿¡ç¨åè¯"
#: gnucash/gnome/gnc-plugin-page-budget.c:183
-#, fuzzy
msgid "Edit note for the selected account and period."
-msgstr "ç¼è¾éä¸çç§ç®"
+msgstr "ç¼è¾æéç§ç®åæé´ç注éã"
#: gnucash/gnome/gnc-plugin-page-budget.c:187
#: gnucash/report/reports/standard/budget.scm:39
@@ -4317,15 +4301,12 @@ msgid "Budget Report"
msgstr "年度"
#: gnucash/gnome/gnc-plugin-page-budget.c:189
-#, fuzzy
-#| msgid "Print the current report"
msgid "Run the budget report."
-msgstr "æå°å½åæ¥è¡¨"
+msgstr "è¿è¡é¢ç®æ¥è¡¨ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:199
-#, fuzzy
msgid "Refresh this window."
-msgstr "å·æ°æ¬çªå£"
+msgstr "å·æ°æ¬çªå£ã"
#: gnucash/gnome/gnc-plugin-page-budget.c:222
#: gnucash/gnome/gnc-plugin-page-report.c:1137
@@ -4454,9 +4435,8 @@ msgid "Move the current entry one row upwards"
msgstr "å°è¯¥æ¡ç®åä¸ç§»ä¸è¡"
#: gnucash/gnome/gnc-plugin-page-invoice.c:209
-#, fuzzy
msgid "Move Entry Do_wn"
-msgstr "åä¸ç§»å¨æ¡ç®(_N)"
+msgstr "åä¸ç§»å¨æ¡ç®(_W)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:210
#, fuzzy
@@ -4530,9 +4510,8 @@ msgid "Sort by description"
msgstr "ææè¿°æåº"
#: gnucash/gnome/gnc-plugin-page-invoice.c:296
-#, fuzzy
msgid "_Print Invoice"
-msgstr "æå°å票"
+msgstr "æå°å票(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:297
msgid "_Edit Invoice"
@@ -4567,7 +4546,7 @@ msgstr "æ¯ä»å票(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:366
#: gnucash/gnome/gnc-plugin-page-register.c:300
msgid "_Manage Document Link..."
-msgstr "_管çåè¯é¾æ¥â¦"
+msgstr "管çåè¯é¾æ¥(_M)â¦"
#. Translators: This is a menu item that opens an external file or URI that may
#. be linked to the current bill, invoice, transaction, or voucher using
@@ -4578,122 +4557,112 @@ msgstr "_管çåè¯é¾æ¥â¦"
#: gnucash/gnome/gnc-plugin-page-invoice.c:367
#: gnucash/gnome/gnc-plugin-page-register.c:304
msgid "_Open Linked Document"
-msgstr "_æå¼å
³èçåè¯"
+msgstr "æå¼å
³èçåè¯(_O)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:310
msgid "_Use as Default Layout for Customer Documents"
-msgstr ""
+msgstr "ç¨ä½å®¢æ·åè¯çé»è®¤å¸å±(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:311
msgid "_Reset Default Layout for Customer Documents"
-msgstr ""
+msgstr "é置客æ·åè¯çé»è®¤å¸å±(_R)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:317
-#, fuzzy
msgid "_Print Bill"
-msgstr "æå°"
+msgstr "æå°è´¦å(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:318
-#, fuzzy
msgid "_Edit Bill"
-msgstr "ç¼è¾è´¦å"
+msgstr "ç¼è¾è´¦å(_E)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:319
msgid "_Duplicate Bill"
-msgstr "å¤å¶(_D)"
+msgstr "å¤å¶è´¦å(_D)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:320
-#, fuzzy
msgid "_Post Bill"
-msgstr "ä»è´¦å"
+msgstr "å
¥è´¦ç¥¨æ®(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:321
-#, fuzzy
msgid "_Unpost Bill"
-msgstr "åæ¶å票å
¥è´¦(_U)"
+msgstr "ä¸å
¥è´¦ç¥¨æ®(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:322
msgid "New _Bill"
msgstr "æ°å¢è´¦å(_B)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:323
-#, fuzzy
msgid "_Pay Bill"
-msgstr "ä»è´¦å"
+msgstr "ä»è´¦å(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:331
msgid "_Use as Default Layout for Vendor Documents"
-msgstr ""
+msgstr "ç¨ä½ä¾åºååæ®çé»è®¤å¸å±(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:332
msgid "_Reset Default Layout for Vendor Documents"
-msgstr ""
+msgstr "éç½®ä¾åºååæ®çé»è®¤å¸å±(_R)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:338
#, fuzzy
msgid "_Print Voucher"
-msgstr "æå°æ¯ç¥¨(_P)"
+msgstr "æå°åè¯(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:339
-#, fuzzy
msgid "_Edit Voucher"
-msgstr "æ¥ç/ç¼è¾æ¯åºåè¯"
+msgstr "ç¼è¾åè¯(_E)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:340
msgid "_Duplicate Voucher"
-msgstr "å¤å¶(_D)"
+msgstr "å¤å¶åè¯(_D)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:341
-#, fuzzy
msgid "_Post Voucher"
-msgstr "æ¯åºåè¯"
+msgstr "å
¥è´¦åè¯(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:342
-#, fuzzy
msgid "_Unpost Voucher"
-msgstr "åæ¶å票å
¥è´¦(_U)"
+msgstr "åæ¶åè¯å
¥è´¦(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:343
-#, fuzzy
msgid "New _Voucher"
-msgstr "æ°å»ºæ¯åºåè¯"
+msgstr "æ°å»ºåè¯(_V)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:344
-#, fuzzy
msgid "_Pay Voucher"
-msgstr "æ¯åºåè¯"
+msgstr "æ¯åºåè¯(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:352
msgid "_Use as Default Layout for Employee Documents"
-msgstr ""
+msgstr "ç¨ä½åå·¥åè¯çé»è®¤å¸å±(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:353
msgid "_Reset Default Layout for Employee Documents"
-msgstr ""
+msgstr "éç½®åå·¥åè¯çé»è®¤å¸å±(_R)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:359
msgid "_Print Credit Note"
-msgstr "æå°(_P)"
+msgstr "æå°è´·è®°å(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:360
msgid "_Edit Credit Note"
-msgstr "ç¼è¾(_E)"
+msgstr "ç¼è¾è´·è®°å(_E)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:361
msgid "_Duplicate Credit Note"
-msgstr "å¤å¶(_D)"
+msgstr "å¤å¶è´·è®°å(_D)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:362
msgid "_Post Credit Note"
-msgstr "å
¥è´¦(_P)"
+msgstr "å
¥è´¦è´·è®°å(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:363
msgid "_Unpost Credit Note"
-msgstr "åæ¶å
¥è´¦(_U)"
+msgstr "åæ¶å
¥è´¦è´·è®°å(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:364
msgid "New _Credit Note"
-msgstr "æ°å»º(_C)"
+msgstr "æ°å»ºè´·è®°å(_C)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:365
msgid "_Pay Credit Note"
@@ -5303,9 +5272,8 @@ msgid "Add _Reversing Transaction"
msgstr "æ·»å åå交æäºé¡¹(_R)"
#: gnucash/gnome/gnc-plugin-page-register2.c:327
-#, fuzzy
msgid "Move Transaction _Up"
-msgstr "å°äº¤æäºé¡¹ä¸ç§»"
+msgstr "å°äº¤æäºé¡¹ä¸ç§»(_U)"
#: gnucash/gnome/gnc-plugin-page-register2.c:328
msgid ""
@@ -5357,17 +5325,14 @@ msgstr "ç¼è¾å½å交æäºé¡¹çæ±ç"
#. with focus on the current transaction's entry in that register.
#: gnucash/gnome/gnc-plugin-page-register2.c:387
#: gnucash/gnome/gnc-plugin-page-register.c:513
-#, fuzzy
msgid "_Jump to the other account"
-msgstr "æ¾ç¤ºå
¶å®ç§ç®ä»£ç "
+msgstr "跳转å°å
¶ä»ç§ç®(_J)"
#: gnucash/gnome/gnc-plugin-page-register2.c:388
#: gnucash/gnome/gnc-plugin-page-register.c:514
-#, fuzzy
-#| msgid "Open a register report for the selected Transaction"
msgid ""
"Open a new register tab for the other account with focus on this transaction."
-msgstr "为éä¸ç交æäºé¡¹æå¼ä¸ä¸ªè´¦ç°¿æ¥è¡¨"
+msgstr "为å¦ä¸ç§ç®æ°å»ºè´¦ç°¿æ ç¾å¹¶æå¼ã"
#: gnucash/gnome/gnc-plugin-page-register2.c:392
#: gnucash/gnome/gnc-plugin-page-register.c:518
@@ -5419,16 +5384,14 @@ msgstr "åè¡(_D)"
#: gnucash/gnome/gnc-plugin-page-register2.c:425
#: gnucash/gnome/gnc-plugin-page-register.c:554
-#, fuzzy
msgid ""
"Show a second line with \"Action\", \"Notes\", and \"Linked Document\" for "
"each transaction."
-msgstr "æ¯ç¬äº¤æäºé¡¹ç¨ä¸¤è¡æ¾ç¤ºä¿¡æ¯"
+msgstr "æ¾ç¤ºç¬¬äºè¡ï¼å
¶ä¸å
嫿¯ç¬äº¤æçâæä½âãâéæ³¨âåâå
³èåè¯âã"
#: gnucash/gnome/gnc-plugin-page-register2.c:430
-#, fuzzy
msgid "Show _Extra Dates"
-msgstr "æ¾ç¤ºé¢å¤æ¥æ"
+msgstr "æ¾ç¤ºé¢å¤æ¥æ(_E)"
#: gnucash/gnome/gnc-plugin-page-register2.c:431
#, fuzzy
@@ -5485,10 +5448,8 @@ msgstr "åå½"
#: gnucash/gnome/gnc-plugin-page-register2.c:503
#: gnucash/gnome/gnc-plugin-page-register.c:626
-#, fuzzy
-#| msgid "_Jump"
msgid "Jump"
-msgstr "跳转(_J)"
+msgstr "跳转"
#: gnucash/gnome/gnc-plugin-page-register2.c:504
#: gnucash/gnome/gnc-plugin-page-register.c:627
@@ -5717,10 +5678,8 @@ msgid "_Sort By..."
msgstr "æåº(_S)..."
#: gnucash/gnome/gnc-plugin-page-register.c:500
-#, fuzzy
-#| msgid "Post Date"
msgid "_Go to Date"
-msgstr "å
¥è´¦æ¥æ"
+msgstr "è½¬å°æ¥æ(_G)"
#: gnucash/gnome/gnc-plugin-page-register.c:501
#, fuzzy
@@ -5751,9 +5710,8 @@ msgstr "æªæ¢æ¥æï¼"
#: gnucash/gnome/gnc-plugin-page-register.c:3442
#: gnucash/report/trep-engine.scm:146 gnucash/report/trep-engine.scm:420
-#, fuzzy
msgid "Unreconciled"
-msgstr "æªå¯¹è´¦(_U)"
+msgstr "æªå¯¹è´¦"
#: gnucash/gnome/gnc-plugin-page-register.c:3444
#: gnucash/gnome-search/search-reconciled.c:224
@@ -5809,12 +5767,11 @@ msgstr "è¿ç¬äº¤æäºé¡¹è¢«æ è®°åªè¯»ï¼åå æ¯ï¼â%sâ"
#: gnucash/gnome/gnc-split-reg.c:1131
#: gnucash/gnome-utils/gnc-tree-control-split-reg.c:1121
msgid "A reversing entry has already been created for this transaction."
-msgstr "å·²ç»ä¸ºè¿ç¬äº¤æäºé¡¹å建äºä¸ä¸ªåæ¹å交æäºé¡¹"
+msgstr "已为æ¤äº¤æè®°å½å建å²éåå½ã"
#: gnucash/gnome/gnc-plugin-page-register.c:4084
-#, fuzzy
msgid "Reverse Transaction"
-msgstr "æ·»å åå交æäºé¡¹(_R)"
+msgstr "æ·»å åå交æäºé¡¹"
#: gnucash/gnome/gnc-plugin-page-register.c:4085
#: gnucash/gtkbuilder/gnc-plugin-page-register2.glade:73
@@ -5882,9 +5839,8 @@ msgstr ""
#. Translators: This string is meant to be a short alternative for "Save Report Configuration As..."
#. to be used as toolbar button label.
#: gnucash/gnome/gnc-plugin-page-report.c:1143
-#, fuzzy
msgid "Save Config As..."
-msgstr "å¦å为(_A)..."
+msgstr "å°é
ç½®å¦å为..."
#: gnucash/gnome/gnc-plugin-page-report.c:1144
msgid "Make Pdf"
@@ -5922,9 +5878,8 @@ msgid "Export the current report as a PDF document"
msgstr "æå°å½åæ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-report.c:1236
-#, fuzzy
msgid "Save _Report Configuration"
-msgstr "设置é
置路å¾"
+msgstr "ä¿åæ¥è¡¨é
ç½®(_R)"
#: gnucash/gnome/gnc-plugin-page-report.c:1240
#, fuzzy
@@ -6084,9 +6039,8 @@ msgid "Create a new scheduled transaction"
msgstr "æ°å»ºä¸ç¬è®¡å交æ"
#: gnucash/gnome/gnc-plugin-page-sx-list.c:144
-#, fuzzy
msgid "_New 2"
-msgstr "æ°å¢(_N)"
+msgstr "æ°å¢ 2(_N)"
#: gnucash/gnome/gnc-plugin-page-sx-list.c:145
#, fuzzy
@@ -6098,9 +6052,8 @@ msgid "Edit the selected scheduled transaction"
msgstr "ç¼è¾éä¸ç计å交æ"
#: gnucash/gnome/gnc-plugin-page-sx-list.c:156
-#, fuzzy
msgid "_Edit 2"
-msgstr "ç¼è¾(_E)"
+msgstr "ç¼è¾ 2(_E)"
#: gnucash/gnome/gnc-plugin-page-sx-list.c:157
#, fuzzy
@@ -6143,9 +6096,8 @@ msgid "Register2 Open GL Account"
msgstr ""
#: gnucash/gnome/gnc-plugin-register.c:54
-#, fuzzy
msgid "Old St_yle General Journal"
-msgstr "æ®éæ¥è®°è´¦"
+msgstr "æ§å¼æ¥è®°è´¦(_Y)"
#: gnucash/gnome/gnc-plugin-register.c:55
#, fuzzy
@@ -6263,14 +6215,12 @@ msgstr ""
"项ï¼å¹¶ä¸å
³éå ä½ç¬¦å¤éæ¡ãæ¨ä¹å¯ä»¥æå¼ä¸ä¸ªç¬ç«çç§ç®ï¼è䏿¯ä¸ç»ç§ç®ã"
#: gnucash/gnome/gnc-split-reg.c:679
-#, fuzzy
msgid "Standard Order"
-msgstr "æ å顺åº(_S)"
+msgstr "æ å顺åº"
#: gnucash/gnome/gnc-split-reg.c:685
-#, fuzzy
msgid "Date of Entry"
-msgstr "æ¡ç®çæ¥æ(_E)"
+msgstr "æ¡ç®çæ¥æ"
#: gnucash/gnome/gnc-split-reg.c:688 gnucash/gnome/window-reconcile2.c:1759
#: gnucash/gnome/window-reconcile.c:1952
@@ -6337,9 +6287,8 @@ msgid "(no description)"
msgstr "(没ææè¿°)"
#: gnucash/gnome/gnc-split-reg.c:976
-#, fuzzy
msgid "_Cut Split"
-msgstr "åªååå½(_t)"
+msgstr "åªååå½(_C)"
#: gnucash/gnome/gnc-split-reg.c:990
msgid "Cut the current transaction?"
@@ -6354,9 +6303,8 @@ msgstr ""
"æ¨è¦å é¤ä¸ç¬å·²å¯¹è´¦ç交æäºé¡¹ï¼è¿ä¸æ¯ä¸ä¸ªå¥½ä¸»æï¼å 为è¿ä¼å¯¼è´æ¨ç对账ä¸å¹³è¡¡ã"
#: gnucash/gnome/gnc-split-reg.c:1014
-#, fuzzy
msgid "_Cut Transaction"
-msgstr "åªå交æäºé¡¹(_T)"
+msgstr "åªå交æäºé¡¹(_C)"
#: gnucash/gnome/gnc-split-reg.c:1158
#: gnucash/gnome-utils/gnc-tree-control-split-reg.c:66
@@ -7466,9 +7414,8 @@ msgstr "éæ©è¯å¸/è´§å¸"
#: gnucash/gnome-utils/dialog-commodity.c:276
#: gnucash/gtkbuilder/dialog-account.glade:1261
-#, fuzzy
msgid "_Security/currency"
-msgstr "è¯å¸/è´§å¸(_S)ï¼"
+msgstr "è¯å¸/è´§å¸(_S)"
#: gnucash/gnome-utils/dialog-commodity.c:280
msgid "Select security"
@@ -7476,9 +7423,8 @@ msgstr "éæ©è¯å¸"
#: gnucash/gnome-utils/dialog-commodity.c:281
#: gnucash/gtkbuilder/dialog-price.glade:146
-#, fuzzy
msgid "_Security"
-msgstr "è¯å¸(_S)ï¼"
+msgstr "è¯å¸(_S)"
#: gnucash/gnome-utils/dialog-commodity.c:285
msgid "Select currency"
@@ -7486,9 +7432,8 @@ msgstr "éæ©è´§å¸"
#: gnucash/gnome-utils/dialog-commodity.c:286
#: gnucash/gtkbuilder/dialog-price.glade:161
-#, fuzzy
msgid "Cu_rrency"
-msgstr "è´§å¸(_R)ï¼"
+msgstr "è´§å¸(_R)"
#: gnucash/gnome-utils/dialog-commodity.c:760
#: gnucash/gnome-utils/dialog-options.c:720
@@ -7695,7 +7640,7 @@ msgstr "éæ©ææåç§ç®"
#: gnucash/gnome-utils/dialog-options.c:1529
msgid "Select all descendents of selected account."
-msgstr "éæ©éä¸ç§ç®çææåç§ç®"
+msgstr "éæ©éä¸ç§ç®çææåç§ç®ã"
#: gnucash/gnome-utils/dialog-options.c:1535
#: gnucash/gnome-utils/dialog-options.c:1671
@@ -7716,7 +7661,7 @@ msgstr "æ¾ç¤ºè¢«æ 记为éèçç§ç®ã"
#: gnucash/gnome-utils/dialog-options.c:1659
msgid "Select all entries."
-msgstr "éæ©å
¨é¨"
+msgstr "éæ©æææ¡ç®ã"
#: gnucash/gnome-utils/dialog-options.c:1666
msgid "Clear the selection and unselect all entries."
@@ -7820,9 +7765,8 @@ msgstr ""
#: gnucash/gnome-utils/dialog-tax-table.c:635
#: gnucash/gtkbuilder/dialog-tax-table.glade:74
-#, fuzzy
msgid "_Rename"
-msgstr "éæ°ç¼å·(_R)"
+msgstr "éå½å(_R)"
#: gnucash/gnome-utils/dialog-tax-table.c:641
#, c-format
@@ -8079,9 +8023,8 @@ msgid "1 month"
msgstr "ä¸ä¸ªæ"
#: gnucash/gnome-utils/gnc-dense-cal.c:290
-#, fuzzy
msgid "View"
-msgstr "æ¥ç(_V)"
+msgstr "æ¥ç"
#: gnucash/gnome-utils/gnc-dense-cal.c:335
#: gnucash/report/stylesheets/footer.scm:383
@@ -8262,7 +8205,10 @@ msgid ""
"The file/URI %s could not be found.\n"
"\n"
"The file is in the history list, do you want to remove it?"
-msgstr "æ¾ä¸å°æä»¶/龿¥ %sãæ¤æä»¶å¨æå¼æä»¶åå²ä¸ï¼æ¯å¦è¦ä»æä»¶åå²ä¸ç§»é¤å®ï¼"
+msgstr ""
+"æ¾ä¸å°æä»¶/龿¥ %sã\n"
+"\n"
+"æ¤æä»¶å¨æå¼æä»¶åå²ä¸ï¼æ¯å¦è¦ä»æä»¶åå²ä¸ç§»é¤å®ï¼"
#: gnucash/gnome-utils/gnc-file.c:440
#, fuzzy, c-format
@@ -8341,6 +8287,9 @@ msgid ""
"installing a different version of \"libdbi\". Please see https://bugs."
"gnucash.org/show_bug.cgi?id=611936 for more information."
msgstr ""
+"ç³»ç»ä¸å®è£
çåºâ libdbiâæ²¡ææ£ç¡®åå¨å¤§éæ°åã è¿æå³çGnuCashæ æ³æ£ç¡®ä½¿ç¨SQLæ°æ®åºã "
+"Gnucashå°ä¸ä¼æå¼æä¿åå°SQLæ°æ®åºï¼é¤ééè¿å®è£
å
¶ä»çæ¬çâ libdbiâå°å
¶ä¿®å¤ã æå
³æ´å¤ä¿¡æ¯ï¼è¯·åè§https://bugs."
+"gnucash.org/show_bug.cgi?id=611936ã"
#: gnucash/gnome-utils/gnc-file.c:527
msgid ""
@@ -8349,6 +8298,8 @@ msgid ""
"your SQL database. Please see https://bugs.gnucash.org/show_bug.cgi?"
"id=645216 for more information."
msgstr ""
+"GnuCashæ æ³å®æå¯¹âlibdbiâåºä¸æ¯å¦åå¨é误çå
³é®æµè¯ãè¿å¯è½æ¯ç±äºSQLæ°æ®åºçæéé
ç½®éè¯¯é æçãæå
³æ´å¤ä¿¡æ¯ï¼è¯·åè§https://bu"
+"gs.gnucash.org/show_bug.cgi?id=645216ã"
#: gnucash/gnome-utils/gnc-file.c:537
msgid ""
@@ -8404,23 +8355,19 @@ msgstr ""
#: gnucash/gnome-utils/gnc-file.c:849
#: gnucash/gtkbuilder/dialog-file-access.glade:98
msgid "Open _Read-Only"
-msgstr ""
+msgstr "åªè¯»æå¼(_R)"
#: gnucash/gnome-utils/gnc-file.c:852
-#, fuzzy
-#| msgid "_Create New File"
msgid "Create _New File"
-msgstr "åå»ºæ°æä»¶(_C)"
+msgstr "åå»ºæ°æä»¶(_N)"
#: gnucash/gnome-utils/gnc-file.c:855
-#, fuzzy
msgid "Open _Anyway"
-msgstr "æ 论å¦ä½é½æå¼(_O)"
+msgstr "ä»è¦æå¼(_A)"
#: gnucash/gnome-utils/gnc-file.c:858
-#, fuzzy
msgid "Open _Folder"
-msgstr "å ä½ç¬¦"
+msgstr "æå¼æä»¶å¤¹ï¼_F)"
#: gnucash/gnome-utils/gnc-file.c:864 gnucash/gnome-utils/gnc-main-window.c:310
msgid "_Quit"
@@ -8437,7 +8384,7 @@ msgstr "æ£å¨å è½½ç¨æ·æ°æ®..."
#: gnucash/gnome-utils/gnc-file.c:1348
msgid "Exporting file..."
-msgstr "å¯¼åºæä»¶"
+msgstr "å¯¼åºæä»¶â¦"
#: gnucash/gnome-utils/gnc-file.c:1361
#, c-format
@@ -9029,7 +8976,7 @@ msgstr "å½å交æäºé¡¹å·²ç»è¢«ä¿®æ¹ãæ¨æ³å¨å¤å¶äº¤æäºé¡¹åä¿å
#. Translators: Return to the transaction to update
#: gnucash/gnome-utils/gnc-tree-control-split-reg.c:1737
msgid "_Return"
-msgstr ""
+msgstr "è¿å(_R)"
#: gnucash/gnome-utils/gnc-tree-control-split-reg.c:1780
#: gnucash/register/ledger-core/split-register-control.c:1830
@@ -10052,9 +9999,8 @@ msgid ""
msgstr "æ£å表达å¼å³å®äºåªä¸ªå½å空é´çååå°ä¼è¢«æ£ç´¢"
#: gnucash/gnucash-cli.cpp:104
-#, fuzzy
msgid "Report Generation Options"
-msgstr "æ¥è¡¨é项(_R)"
+msgstr "æ¥è¡¨çæé项"
#: gnucash/gnucash-cli.cpp:107
msgid ""
@@ -10216,9 +10162,8 @@ msgid "Show help for gtk options"
msgstr "第ä¸é项说æ"
#: gnucash/gnucash.cpp:339
-#, fuzzy
msgid "Deprecated Options"
-msgstr "æ¥è¡¨é项(_R)"
+msgstr "䏿¨è使ç¨çé项"
#: gnucash/gnucash.cpp:342
msgid ""
@@ -10683,9 +10628,8 @@ msgstr ""
"è¿ä¸ªå¼å
å«äºæ¯ç¥¨ä¸å¤æ³¨è¡å¼å§ç(X,Y)åæ ãåæ æ¯ä»æå®æ¯ç¥¨ä½ç½®çå·¦ä¸è§ç®èµ·ã"
#: gnucash/gschemas/org.gnucash.dialogs.checkprinting.gschema.xml.in:75
-#, fuzzy
msgid "Rotation angle"
-msgstr "æè½¬è§åº¦(_R)"
+msgstr "æè½¬è§åº¦"
#: gnucash/gschemas/org.gnucash.dialogs.checkprinting.gschema.xml.in:76
msgid "Number of degrees to rotate the check."
@@ -11049,7 +10993,7 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:20
msgid "Always reconcile to today"
-msgstr "æ»æ¯å¯¹è´¦å°ä»å¤©(_O)"
+msgstr "æ»æ¯å¯¹è´¦å°ä»å¤©"
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:21
msgid ""
@@ -11267,7 +11211,7 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:55
#: gnucash/gschemas/org.gnucash.gschema.xml.in:56
msgid "Display negative amounts in red"
-msgstr "è´æ°çº¢è²(_G)"
+msgstr "ç¨çº¢è²æ¾ç¤ºè´æ°"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:60
msgid "Automatically insert a decimal point"
@@ -11357,9 +11301,8 @@ msgid ""
"status of the account. The setting \"none\" doesn't reverse the sign on any "
"balances."
msgstr ""
-"æ¤è®¾ç½®å
许ç¹å®ç§ç®å¨å®ä»¬ä½é¢ä¸æ¹å符å·ï¼å¦æ£æ°åè´æ°ï¼åä¹äº¦ç¶ã妿æ³çå°è´"
-"æ°æ¯åºåæ£æ°æ¶å
¥çè¯è®¾ç½®âincome_expenseâï¼æ³çå°ä½é¢åæ äºç§ç®è´·/åç¶æç设"
-"ç½®âcreditâï¼ä¸æ³æ¹åä»»ä½ä½é¢ç符å·ï¼è®¾ç½®ânoneâã"
+"æ¤è®¾ç½®å
许æäºç§ç®å°å
¶ä½é¢ç符å·ä»æ£å转为è´ï¼åä¹äº¦ç¶ãè¥æ³çå°è´æ°æ¯åºåæ£æ°æ¶å
¥çè¯è®¾ç½®âæ¶å
¥-æ¯åºâï¼æ³æ¥çä½é¢åæ 叿·åæ¹/è´·æ¹ç¶æç设置âcred"
+"itâï¼ä¸æ³æ¹åä»»ä½ä½é¢ç¬¦å·ï¼è®¾ç½®âæ âã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:100
#: gnucash/gtkbuilder/dialog-preferences.glade:659
@@ -12677,9 +12620,8 @@ msgstr "å
¨é(_S)"
#: gnucash/gtkbuilder/assistant-csv-export.glade:463
#: gnucash/gtkbuilder/gnc-plugin-page-register.glade:141
-#, fuzzy
msgid "Select _Range"
-msgstr "éæ©èå´ï¼"
+msgstr "éæ©èå´(_R)"
#. Filter By Dialog, Date Tab, Start section
#: gnucash/gtkbuilder/assistant-csv-export.glade:490
@@ -13213,9 +13155,7 @@ msgid ""
"The selection you make here is only the starting point for your personalized "
"account hierarchy. Accounts can be added, renamed, moved, or deleted by hand "
"later at any time."
-msgstr ""
-"鿩坹åºäºæ¨å°ä½¿ç¨ GnuCash çç±»å«ãæ¨éæ©çæ¯ä¸ªç±»å«å°ä¼å¯¼è´å建ä¸äºç§ç®ã鿩䏿¨ç¸å
³çç±»å«ãæ¨ä¹å¯ä»¥ä¹åæå¨å建é¢å¤çç§ç®ã\n"
-"<b>注æï¼</b> æ¨å¨æ¤å¤æåçéæ©åªæ¯æ¨ç个æ§åç§ç®å±æ¬¡ç»æçèµ·ç¹ãä¹åæ¨å¯ä»¥éæ¶æå¨æ·»å ï¼éå½åï¼ç§»å¨æå é¤ç§ç®ã"
+msgstr "æ¨å¨æ¤å¤æåçéæ©åªæ¯æ¨ç个æ§åç§ç®å±æ¬¡ç»æçèµ·ç¹ãä¹åæ¨å¯ä»¥éæ¶æå¨æ·»å ï¼éå½åï¼ç§»å¨æå é¤ç§ç®ã"
#: gnucash/gtkbuilder/assistant-hierarchy.glade:507
#, fuzzy
@@ -13870,7 +13810,7 @@ msgstr ""
#: gnucash/gtkbuilder/assistant-qif-import.glade:1040
msgid "Enter Information about..."
-msgstr "è¾å
¥æå
³â¦â¦çä¿¡æ¯"
+msgstr "è¾å
¥æå
³â¦çä¿¡æ¯"
#: gnucash/gtkbuilder/assistant-qif-import.glade:1066
msgid "All fields must be complete to continue..."
@@ -15440,7 +15380,7 @@ msgstr "计ç®"
#: gnucash/gtkbuilder/dialog-fincalc.glade:367
msgid "Recalculate the (single) blank entry in the above fields."
-msgstr "å¨ä¸é¢çåæ®µä¸éæ°è®¡ç®(åç¬ç)空ç½äº¤æ"
+msgstr "éæ°è®¡ç®ä»¥ä¸å段ä¸ç(å个)ç©ºç½æ¡ç®ã"
#: gnucash/gtkbuilder/dialog-fincalc.glade:503
msgid "<b>Payment Options</b>"
@@ -17173,7 +17113,7 @@ msgid ""
"Check format must have an\n"
"ADDRESS item defined in order\n"
"to print an address on the check."
-msgstr "è¦å¨æ¯ç¥¨ä¸æå°å°åï¼æ¯ç¥¨æ ¼å¼å¿
é¡»æè®¢åå®ä¹çâå°åâ项ã"
+msgstr "è¦å¨æ¯ç¥¨ä¸æå°å°åï¼æ¯ç¥¨æ ¼å¼å¿
é¡»å®ä¹âå°åâ项ã"
#: gnucash/gtkbuilder/dialog-print-check.glade:535
#: gnucash/gtkbuilder/dialog-print-check.glade:1084
@@ -18638,13 +18578,13 @@ msgstr ""
#: gnucash/gtkbuilder/gnc-recurrence.glade:50
msgid "Every "
-msgstr "æ¯"
+msgstr "æ¯ "
#: gnucash/gtkbuilder/gnc-recurrence.glade:62
msgid ""
"Number of calendar units in the recurrence: E.g. Biweekly = every 2 weeks; "
"Quarterly = every 3 months"
-msgstr "éå¤çæ¥ååä½çæ°éï¼å¦ï¼æ¯ä¸¤å¨ç = æ¯ 2 å¨ï¼å£åº¦ç = æ¯ 3 æã"
+msgstr "éå¤çæ¥ååä½çæ°éï¼å¦ï¼æ¯ä¸¤å¨ç = æ¯ 2 å¨ï¼å£åº¦ç = æ¯ 3 æ"
#: gnucash/gtkbuilder/gnc-recurrence.glade:109
#, fuzzy
@@ -19652,7 +19592,7 @@ msgstr "ç½ä¸é¶è¡è®¾ç½®(_O)..."
msgid ""
"Initial setup of Online Banking access (HBCI, or OFX DirectConnect, using "
"AqBanking)"
-msgstr "åå§åç½ä¸é¶è¡è®¿é®(HBCIï¼æOFX DirectConnectï¼ä½¿ç¨AqBanking)ç设置ã"
+msgstr "ç½ä¸é¶è¡æ¥å
¥åå§è®¾ç½®(HBCIï¼æOFX DirectConnectï¼ä½¿ç¨AqBanking)"
#: gnucash/import-export/aqb/gnc-plugin-aqbanking.c:101
msgid "Get _Balance"
@@ -20813,7 +20753,7 @@ msgstr "ç§ç® %s æ¯ä¸ä¸ªå ä½ç§ç®ï¼å®ä¸è½æ¥åä»»ä½äº¤æäºé¡¹ã
#: gnucash/import-export/import-account-matcher.c:469
msgid "(Full account ID: "
-msgstr "(宿´çç§ç®ç¼å·ï¼"
+msgstr "(宿´çç§ç®ç¼å·: "
#: gnucash/import-export/import-commodity-matcher.c:113
msgid ""
@@ -21053,7 +20993,7 @@ msgstr "GnuCash ç§ç®å"
#: gnucash/import-export/qif-imp/assistant-qif-import.c:861
msgid "Enter a name or short description, such as \"Red Hat Stock\"."
-msgstr "请è¾å
¥ä¸ä¸ªåç§°æç®çæè¿°ï¼æ¯å¦âRed Hat Stockâ"
+msgstr "请è¾å
¥ä¸ä¸ªåç§°æç®çæè¿°ï¼æ¯å¦âRed Hat Stockâã"
#: gnucash/import-export/qif-imp/assistant-qif-import.c:863
msgid ""
@@ -21093,9 +21033,8 @@ msgid "(split)"
msgstr "(åå½)"
#: gnucash/import-export/qif-imp/assistant-qif-import.c:1369
-#, fuzzy
msgid "Are you sure you want to cancel?"
-msgstr "æ¨ç¡®å®è¦å é¤â%sâåï¼"
+msgstr "æ¨ç¡®å®è¦åæ¶åï¼"
#: gnucash/import-export/qif-imp/assistant-qif-import.c:1580
msgid "Please select a file to load."
@@ -21314,7 +21253,7 @@ msgstr "丢å¼äºä¸äºå符ã"
#: gnucash/import-export/qif-imp/qif-file.scm:185
#: gnucash/import-export/qif-imp/qif-file.scm:189
msgid "Converted to: "
-msgstr "转æ¢å°ï¼"
+msgstr "转æ¢å°: "
#: gnucash/import-export/qif-imp/qif-file.scm:188
msgid "Some characters have been converted according to your locale."
@@ -21670,10 +21609,9 @@ msgid "TI"
msgstr "ç¨ç"
#: gnucash/register/ledger-core/gncEntryLedgerLayout.c:141
-#, fuzzy
msgctxt "sample for 'Tax Table'"
msgid "Tax Table 1"
-msgstr "ç¨çè¡¨ï¼ "
+msgstr "ç¨ç表1"
#: gnucash/register/ledger-core/gncEntryLedgerLayout.c:149
#, fuzzy
@@ -21873,7 +21811,7 @@ msgstr "è¿ç¬äº¤æçå°è®¡å¼ "
#: gnucash/register/ledger-core/gncEntryLedgerModel.c:775
msgid "The total tax of this entry "
-msgstr "è¿ç¬äº¤æçç¨é¢å计"
+msgstr "è¿ç¬äº¤æçç¨é¢å计 "
#: gnucash/register/ledger-core/gncEntryLedgerModel.c:784
msgid "Is this entry billable to a customer or job?"
@@ -22761,14 +22699,11 @@ msgid ""
"One of your reports has a report-guid that is a duplicate. Please check the "
"report system, especially your saved reports, for a report with this report-"
"guid: "
-msgstr ""
-"å
¶ä¸ä¸ä¸ªæ¨çç§ç®æéå¤çæ¥è¡¨GUIDãè¯·æ£æ¥æ¥è¡¨ç³»ç»ï¼ç¹å«æ¯ä½¿ç¨è¿ä¸ªæ¥è¡¨GUIDçæ¨"
-"çä¿åçæ¥è¡¨ï¼"
+msgstr "å
¶ä¸ä¸ä¸ªæ¨çç§ç®æéå¤çæ¥è¡¨GUIDãè¯·æ£æ¥æ¥è¡¨ç³»ç»ï¼ç¹å«æ¯ä½¿ç¨è¿ä¸ªæ¥è¡¨GUIDçæ¨çä¿åçæ¥è¡¨: "
#: gnucash/report/report-core.scm:211
-#, fuzzy
msgid "Wrong report definition: "
-msgstr "设置é
置路å¾"
+msgstr "设置é
置路å¾: "
#: gnucash/report/report-core.scm:212
msgid " Report is missing a GUID."
@@ -25258,7 +25193,7 @@ msgstr ""
#: gnucash/report/reports/standard/balsheet-pnl.scm:662
#: gnucash/report/trep-engine.scm:1619
msgid "Total For "
-msgstr "å计"
+msgstr "å计 "
#: gnucash/report/reports/standard/balsheet-pnl.scm:869
#, fuzzy
@@ -28093,9 +28028,8 @@ msgid "CSS color."
msgstr "é¢è²"
#: gnucash/report/reports/standard/taxinvoice.scm:200
-#, fuzzy
msgid "Invoice number: "
-msgstr "å票å·ç ï¼"
+msgstr "å票å·ç : "
#: gnucash/report/reports/standard/taxinvoice.scm:202
msgid "To: "
@@ -28106,14 +28040,13 @@ msgid "Your ref: "
msgstr ""
#: gnucash/report/reports/standard/taxinvoice.scm:206
-#, fuzzy
msgid "Job number: "
-msgstr "ä»»å¡ç¼å·"
+msgstr "ä»»å¡ç¼å·: "
#: gnucash/report/reports/standard/taxinvoice.scm:208
#, fuzzy
msgid "Job name: "
-msgstr "ä»»å¡åç§°"
+msgstr "ä»»å¡åç§° "
#: gnucash/report/reports/standard/taxinvoice.scm:216
msgid "Embedded CSS."
@@ -28145,12 +28078,12 @@ msgstr "å°æéé¢"
#: gnucash/report/reports/standard/taxinvoice.scm:314
msgid "Invoice #: "
-msgstr "å票ç¼å·ï¼"
+msgstr "å票ç¼å·ï¼ "
#: gnucash/report/reports/standard/taxinvoice.scm:315
#, fuzzy
msgid "Reference: "
-msgstr "åè"
+msgstr "åè "
#: gnucash/report/reports/standard/taxinvoice.scm:316
msgid "Engagement: "
@@ -28715,13 +28648,13 @@ msgstr "è¡¨æ ¼æè§æ·±åº¦"
#: gnucash/report/stylesheets/head-or-tail.scm:432
#: gnucash/report/stylesheets/head-or-tail.scm:526
msgid "Prepared by: "
-msgstr "å¶ä½ï¼"
+msgstr "å¶ä½ï¼ "
#: gnucash/report/stylesheets/footer.scm:380
#: gnucash/report/stylesheets/head-or-tail.scm:440
#: gnucash/report/stylesheets/head-or-tail.scm:534
msgid "Prepared for: "
-msgstr "å¶ä½å¯¹è±¡ï¼"
+msgstr "å¶ä½å¯¹è±¡ï¼ "
#: gnucash/report/stylesheets/footer.scm:419
#: gnucash/report/stylesheets/footer.scm:435
@@ -28829,7 +28762,7 @@ msgstr ""
#: gnucash/report/stylesheets/head-or-tail.scm:550
#, fuzzy
msgid "Report Creation Date: "
-msgstr "æ¥è¡¨åå"
+msgstr "æ¥è¡¨åå "
#: gnucash/report/stylesheets/head-or-tail.scm:558
msgid "GnuCash "
commit 8124ab0ad40dab57adc878a91a51dce9490f2662
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu May 6 20:23:21 2021 +0800
[gnc-plugin-page-register] plug memory leak
nothing frees the g_strdup
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index c801aa9f4..fcf312599 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -3181,7 +3181,7 @@ gnc_plugin_page_register_filter_start_cb (GtkWidget* radio,
}
name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
- active = (g_strcmp0 (name, g_strdup ("start_date_choose")) == 0 ? 1 : 0);
+ active = !g_strcmp0 (name, "start_date_choose");
gtk_widget_set_sensitive (priv->fd.start_date, active);
get_filter_times (page);
gnc_ppr_update_date_query (page);
@@ -3229,7 +3229,7 @@ gnc_plugin_page_register_filter_end_cb (GtkWidget* radio,
}
name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
- active = (g_strcmp0 (name, g_strdup ("end_date_choose")) == 0 ? 1 : 0);
+ active = !g_strcmp0 (name, "end_date_choose");
gtk_widget_set_sensitive (priv->fd.end_date, active);
get_filter_times (page);
gnc_ppr_update_date_query (page);
commit 85a4baeb21a1b7e1d9158d3a202d69c3c4844c12
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Wed May 5 08:52:08 2021 +0800
[report-core] disallow define-report with incomplete export info
if exporting is allowed, 'export-types and 'export-thunk must both be
defined.
diff --git a/gnucash/report/report-core.scm b/gnucash/report/report-core.scm
index 853afce41..da12f1056 100644
--- a/gnucash/report/report-core.scm
+++ b/gnucash/report/report-core.scm
@@ -237,6 +237,7 @@ not found.")))
(define report-rec (make-report-template))
(define allowable-fields (record-type-fields <report-template>))
(define (not-a-field? fld) (not (memq fld allowable-fields)))
+ (define (xor . args) (fold (lambda (a b) (if a (if b #f a) b)) #f args))
(let loop ((args args))
(match args
@@ -252,6 +253,11 @@ not found.")))
((hash-ref *gnc:_report-templates_* report-guid)
(gui-error (string-append rpterr-dupe report-guid)))
+ ;; has export-type but no export-thunk. or vice versa.
+ ((xor (gnc:report-template-export-thunk report-rec)
+ (gnc:report-template-export-types report-rec))
+ (gui-error (format #f "Export needs both thunk and types: ~a" report-guid)))
+
;; good: new report definition, store into report-templates hash
(else
(hash-set! *gnc:_report-templates_* report-guid report-rec)))))
@@ -836,10 +842,8 @@ not found.")))
(cond
((not export-thunk)
(stderr-log "Only the following reports have export code:\n")
- (show-selected-reports (cut gnc:report-template-export-thunk <>)
- (current-error-port))
+ (show-selected-reports gnc:report-template-export-thunk (current-error-port))
(stderr-log "Use -R show to describe report\n"))
- ((not export-types) (stderr-log "Report ~s has no export-types\n" report))
((not (assoc export-type export-types))
(stderr-log "Export-type disallowed: ~a. Allowed types: ~a\n"
export-type (string-join (map car export-types) ", ")))
diff --git a/gnucash/report/test/test-report.scm b/gnucash/report/test/test-report.scm
index 26074c3bf..012e10aca 100644
--- a/gnucash/report/test/test-report.scm
+++ b/gnucash/report/test/test-report.scm
@@ -11,6 +11,7 @@
;; will create Testing/Temporary/test-asset-performance.log
(test-check1)
(test-check-invalid-field)
+ (test-check-incomplete-export)
(test-check2)
(test-check3)
(test-check4)
@@ -31,6 +32,21 @@
1
(length (gnc:all-report-template-guids))))
+(define (test-check-incomplete-export)
+ ;; it's not legit to define report with ONLY export-thunk or
+ ;; export-types. both must be defined.
+ (gnc:define-report 'version 3
+ 'name "Test Report Template4"
+ 'export-thunk #t
+ 'report-guid "incomplete-export-guid")
+ (gnc:define-report 'version 3
+ 'name "Test Report Template4"
+ 'export-types #t
+ 'report-guid "incomplete-export-guid")
+ (test-equal "report with incomplete export thunk"
+ 1
+ (length (gnc:all-report-template-guids))))
+
(define (test-check-invalid-field)
(gnc:define-report 'version 3
'name "Test Report Template4"
commit 45cb454bdc966501cc34083584a9000e0e9db892
Author: Frank H. Ellenberger <frank.h.ellenberger at gmail.com>
Date: Tue May 4 18:38:53 2021 +0200
I18N: Unify report option add-sort-method list
diff --git a/gnucash/report/options-utilities.scm b/gnucash/report/options-utilities.scm
index ebcc0d489..12c3b4ea5 100644
--- a/gnucash/report/options-utilities.scm
+++ b/gnucash/report/options-utilities.scm
@@ -202,7 +202,7 @@
(list
(vector 'acct-code (N_ "Alphabetical by account code"))
(vector 'alphabetical (N_ "Alphabetical by account name"))
- (vector 'amount (N_ "Amount, largest to smallest"))))))
+ (vector 'amount (N_ "Numerical by descending amount"))))))
;; These control the calculation and view mode of subtotal balances
commit f6b1d3c1a9c717f8c0e8e253382b3a9590402fc8
Author: chokore <byt2ooo at 163.com>
Date: Tue May 4 17:49:28 2021 +0200
Translation update by chokore <byt2ooo at 163.com> using Weblate
po/zh_CN.po: 60.7% (3326 of 5479 strings; 1460 fuzzy)
546 failing checks (9.9%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by chokore <byt2ooo at 163.com> using Weblate
po/zh_CN.po: 60.3% (3305 of 5479 strings; 1477 fuzzy)
547 failing checks (9.9%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by chokore <byt2ooo at 163.com> using Weblate
po/zh_CN.po: 60.1% (3293 of 5479 strings; 1489 fuzzy)
557 failing checks (10.1%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: chokore <byt2ooo at 163.com>
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 82d671842..15622f2b3 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -13,14 +13,15 @@
# TianXing_Yi <duguqiubailee at gmail.com>, 2021.
# Sean Guan <guanshangkang at gmail.com>, 2021.
# 峡å·ä»å£« <c at cjh0613.com>, 2021.
+# chokore <byt2ooo at 163.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: gnucash 3.7\n"
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-05-04 06:32+0000\n"
-"Last-Translator: 峡å·ä»å£« <c at cjh0613.com>\n"
+"PO-Revision-Date: 2021-05-04 15:49+0000\n"
+"Last-Translator: chokore <byt2ooo at 163.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -33,7 +34,7 @@ msgstr ""
#: bindings/guile/commodity-table.scm:44
msgid "ALL NON-CURRENCY"
-msgstr ""
+msgstr "ææéè´§å¸"
#: borrowed/goffice/go-charmap-sel.c:70
msgid "Arabic"
@@ -635,11 +636,10 @@ msgid ""
msgstr "æ¥è¡¨åºäºæ ·å¼è¡¨ï¼éæ©åéçæ ·å¼è¡¨ï¼âç¼è¾â->âæ ·å¼è¡¨âã"
#: doc/tip_of_the_day.list.c:99
-#, fuzzy
msgid ""
"To raise the accounts menu in the transfer field of a register page, press "
"the Menu key or the Ctrl-Down key combination."
-msgstr "æå交æçé¢è½¬è´¦å段çç§ç®èåï¼è¯·æâèåâé®ï¼æ Ctrl-Down ç»åé®ã"
+msgstr "è¦å¨è´¦ç°¿é¡µé¢çè½¬è´¦åæ®µä¸è°åºè´¦æ·èåï¼è¯·æèå鮿Ctrl-Downç»åé®ã"
#: doc/tip_of_the_day.list.c:102
msgid ""
@@ -1517,10 +1517,8 @@ msgstr "éæ©äºç¶ç§ç®ï¼å ä½ç¬¦ï¼ï¼è¯·éè¯ã"
#: gnucash/gnome/dialog-doclink.c:161
#: gnucash/gnome/gnc-plugin-page-register.c:4760
-#, fuzzy
-#| msgid "Select Account"
msgid "Select document"
-msgstr "éæ©ç§ç®"
+msgstr "éæ©åè¯"
#: gnucash/gnome/dialog-doclink.c:164 gnucash/gnome/gnc-plugin-budget.c:290
#: gnucash/gnome-search/search-account.c:238
@@ -1608,7 +1606,7 @@ msgstr "è¾å
¥ç½åï¼å¦http://www.gnucash.orgï¼"
#: gnucash/gnome/dialog-doclink.c:256
msgid "Existing Document Link is"
-msgstr "ç°æç交æé¾æ¥æ¯"
+msgstr "ç°æçåè¯é¾æ¥æ¯"
#: gnucash/gnome/dialog-doclink.c:525 gnucash/gnome/dialog-doclink.c:570
msgid "File Found"
@@ -1632,7 +1630,7 @@ msgstr "æä»¶æ»æ°"
#: gnucash/gnome/dialog-doclink.c:650
msgid "Business item can not be modified."
-msgstr "æ æ³ä¿®æ¹åä¸é¡¹ç®ã"
+msgstr "ä¸å¡é¡¹ç®æ æ³ä¿®æ¹ã"
#: gnucash/gnome/dialog-doclink.c:659 gnucash/gnome/dialog-doclink.c:760
#: gnucash/gnome/gnc-plugin-page-invoice.c:382
@@ -1641,7 +1639,7 @@ msgstr "æ æ³ä¿®æ¹åä¸é¡¹ç®ã"
#: gnucash/gnome/gnc-plugin-page-invoice.c:1361
#: gnucash/gnome/gnc-plugin-page-register.c:631
msgid "Manage Document Link"
-msgstr "管ç龿¥"
+msgstr "管çåè¯é¾æ¥"
#: gnucash/gnome/dialog-doclink.c:754
msgid "Transaction can not be modified."
@@ -1655,7 +1653,7 @@ msgstr "æªå®ä¹"
#. transaction that have files or URIs linked with them.
#: gnucash/gnome/dialog-doclink.c:1074
msgid "Transaction Document Links"
-msgstr "已龿¥æä»¶"
+msgstr "交æåè¯é¾æ¥"
#: gnucash/gnome/dialog-doclink.c:1077
#: gnucash/gnome/dialog-find-transactions2.c:157
@@ -1706,13 +1704,13 @@ msgid ""
"Double click on the entry in the Available column to modify the document "
"link."
msgstr ""
-"âåä¸â->â龿¥æä»¶âï¼åå»âIDâï¼è·³è½¬å°å票ãè´¦åæåè¯ï¼\n"
-"åå»âæä»¶åâï¼æå¼ã\n"
-"åå»âå¯ç¨âï¼ä¿®æ¹ã"
+"åå»âIdâåä¸çæ¡ç®ï¼è·³è½¬å°âä¸å¡é¡¹ç®âã\n"
+"åå»â龿¥âåä¸çæ¡ç®ä»¥æå¼å
³èçåè¯ã\n"
+"åå»âå¯ç¨âåä¸çæ¡ç®ä»¥ä¿®æ¹åè¯é¾æ¥ã"
#: gnucash/gnome/dialog-doclink.c:1097
msgid "Business Document Links"
-msgstr "龿¥"
+msgstr "ä¸å¡åè¯é¾æ¥"
#: gnucash/gnome/dialog-employee.c:199
msgid "You must enter a username."
@@ -1816,7 +1814,6 @@ msgid "The number of payments cannot be negative."
msgstr "仿¬¾æ°åä¸è½ä¸ºè´æ°ã"
#: gnucash/gnome/dialog-find-account.c:363
-#, fuzzy
msgid "Find Account"
msgstr "æ¥æ¾ç§ç®"
@@ -1847,10 +1844,9 @@ msgstr "ä¸ç¨ç¸å
³"
#. Translators: %s is a full account name.
#. This is a label in Search Account from context menu.
#: gnucash/gnome/dialog-find-account.c:474
-#, fuzzy, c-format
-#| msgid "Accounts in '%s'"
+#, c-format
msgid "Su_b-accounts of '%s'"
-msgstr "â%sâçç§ç®"
+msgstr "â%sâçåç§ç®(_B)"
#: gnucash/gnome/dialog-find-transactions2.c:107
#: gnucash/gnome/dialog-find-transactions.c:105
@@ -2130,9 +2126,8 @@ msgid "Bayesian"
msgstr "è´å¶æ¯"
#: gnucash/gnome/dialog-imap-editor.c:718
-#, fuzzy
msgid "Description Field"
-msgstr "æè¿°"
+msgstr "æè¿°å段"
#: gnucash/gnome/dialog-imap-editor.c:721
msgid "Memo Field"
@@ -2213,17 +2208,14 @@ msgid "Do you really want to post the invoice?"
msgstr "æ¨ç¡®å®è¦å
¥è´¦è¿å¼ å票åï¼"
#: gnucash/gnome/dialog-invoice.c:995
-#, fuzzy
msgid ""
"One or more of the entries are for accounts different from the invoice/bill "
"currency. You will be asked a conversion rate for each."
-msgstr ""
-"ç§ç®å
ä¸ç¬æå¤ç¬äº¤æä¸å票/è´¦åè´§å¸ä¸åãæ¨å°è¢«è¦æ±ä¸ºæ¯ç¬äº¤æè®¾ç½®ä¸ä¸ªæ±çã"
+msgstr "ç§ç®å
ä¸ç¬æå¤ç¬äº¤æå票/è´¦åè´§å¸ä¸åãæ¨å°è¢«è¦æ±ä¸ºæ¯ç¬äº¤æè®¾ç½®ä¸ä¸ªæ±çã"
#: gnucash/gnome/dialog-invoice.c:1128
-#, fuzzy
msgid "The post action was canceled because not all exchange rates were given."
-msgstr "å
¥è´¦å¨ä½åæ¶ï¼å 为æäºæ±ç没ç»åºã"
+msgstr "ç±äºæªç»åºæææ±çï¼å
¥å¸æä½è¢«åæ¶ã"
#: gnucash/gnome/dialog-invoice.c:1412
msgid "Total:"
@@ -2320,7 +2312,7 @@ msgstr "æ¥çæ¯åºåè¯"
#: gnucash/gnome/dialog-invoice.c:2510
msgid "Open Linked Document:"
-msgstr "æ°å»ºç§ç®ï¼"
+msgstr "æå¼å
³èçåè¯ï¼"
#: gnucash/gnome/dialog-invoice.c:2624 gnucash/gnome/dialog-invoice.c:2849
msgid "Bill Information"
@@ -2332,9 +2324,8 @@ msgid "Bill ID"
msgstr "è´¦åç¼å·"
#: gnucash/gnome/dialog-invoice.c:2630 gnucash/gnome/dialog-invoice.c:2856
-#, fuzzy
msgid "Voucher Information"
-msgstr "æ¯åºåè¯ä¿¡æ¯"
+msgstr "åè¯ä¿¡æ¯"
#: gnucash/gnome/dialog-invoice.c:2632 gnucash/gnome/dialog-invoice.c:2859
#: gnucash/gnome/dialog-invoice.c:3456
@@ -2355,7 +2346,6 @@ msgstr ""
"è¯·å¤æ¥æ¨çéæ©ã"
#: gnucash/gnome/dialog-invoice.c:3248
-#, fuzzy
msgid "Do you really want to post these invoices?"
msgstr "æ¨ç¡®å®è¦å
¥è´¦è¿äºå票åï¼"
@@ -2534,10 +2524,10 @@ msgstr "æ¥æ¾å票"
#. Translators: %d is the number of bills/credit notes due. This is a
#. ngettext(3) message.
#: gnucash/gnome/dialog-invoice.c:3708
-#, fuzzy, c-format
+#, c-format
msgid "The following vendor document is due:"
msgid_plural "The following %d vendor documents are due:"
-msgstr[0] "ä¸å %d è´¦å已尿ï¼"
+msgstr[0] "ä¸å%dä¾åºååè¯å°æï¼"
#: gnucash/gnome/dialog-invoice.c:3712
msgid "Due Bills Reminder"
@@ -2546,13 +2536,12 @@ msgstr "è´¦åå°ææé"
#. Translators: %d is the number of invoices/credit notes due. This is a
#. ngettext(3) message.
#: gnucash/gnome/dialog-invoice.c:3719
-#, fuzzy, c-format
+#, c-format
msgid "The following customer document is due:"
msgid_plural "The following %d customer documents are due:"
-msgstr[0] "ä¸å %d è´¦å已尿ï¼"
+msgstr[0] "ä¸å%d客æ·åè¯å°æï¼"
#: gnucash/gnome/dialog-invoice.c:3723
-#, fuzzy
msgid "Due Invoices Reminder"
msgstr "åç¥¨å°ææé"
@@ -2592,7 +2581,6 @@ msgstr "åªæ´»è·çï¼"
#: gnucash/gnome-utils/gnc-tree-view-split-reg.c:2929
#: gnucash/gtkbuilder/dialog-job.glade:204
#: gnucash/register/ledger-core/split-register-model.c:369
-#, fuzzy
msgid "Rate"
msgstr "æ¯ç"
@@ -2715,9 +2703,8 @@ msgid "Find Order"
msgstr "æ¥æ¾è®¢å"
#: gnucash/gnome/dialog-payment.c:231
-#, fuzzy
msgid "You must enter a valid account name for posting."
-msgstr "æ¨å¿
é¡»è¾å
¥ç¨äºå
¥è´¦çç§ç®åç§°ã"
+msgstr "æ¨å¿
é¡»è¾å
¥ä¸ä¸ªææçç§ç®åç§°ç¨äºå
¥è´¦ã"
#: gnucash/gnome/dialog-payment.c:240
msgid "You must select a company for payment processing."
@@ -2731,7 +2718,7 @@ msgstr "æ¨å¿
é¡»èªç§ç®è¡¨éæ©è½¬è´¦ç§ç®ã"
msgid ""
"No documents were selected to assign this payment to. This may create an "
"unattached payment."
-msgstr ""
+msgstr "没æéæ©è¦åé
æ¤ä»æ¬¾çåè¯ã è¿å¯è½ä¼äº§çæªéå ç仿¬¾ã"
#: gnucash/gnome/dialog-payment.c:529 gnucash/gnome/dialog-payment.c:1330
#: gnucash/report/reports/standard/new-aging.scm:192
@@ -3544,22 +3531,19 @@ msgstr "å¨ä¸ä¸ªä¼è®¡æé´ç»ææ¶è¿è¡è´¦ç°¿ç»è´¦"
#: gnucash/gnome/gnc-plugin-basic-commands.c:211
msgid "_Import Map Editor"
-msgstr ""
+msgstr "导å
¥æ å°ç¼è¾å¨(_I)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:212
msgid "View and Delete Bayesian and non-Bayesian information"
msgstr "æ¥çåå é¤è´å¶æ¯åéè´å¶æ¯çä¿¡æ¯"
#: gnucash/gnome/gnc-plugin-basic-commands.c:216
-#, fuzzy
-#| msgid "Transaction amount"
msgid "_Transaction Linked Documents"
-msgstr "交æéé¢"
+msgstr "交æå
³èçåè¯(_T)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:217
-#, fuzzy
msgid "View all Transaction Linked Documents"
-msgstr "æ¥çææäº¤æäºé¡¹å
³è"
+msgstr "æ¥çææäº¤æå
³èçåè¯"
#: gnucash/gnome/gnc-plugin-basic-commands.c:224
msgid "_Tips Of The Day"
@@ -3587,7 +3571,7 @@ msgstr[0] "æ¤æ¶æ²¡æè¾å
¥ç计å交æã(èªå¨åå»ºäº %d ç¬äº¤æäº
#: gnucash/gnome/gnc-plugin-budget.c:63
msgid "_New Budget"
-msgstr "æ°å»º(_N)"
+msgstr "æ°é¢ç®(_N)"
#: gnucash/gnome/gnc-plugin-budget.c:64
#, fuzzy
@@ -3596,7 +3580,7 @@ msgstr "å建ä¸ä¸ªæ°é¢ç®"
#: gnucash/gnome/gnc-plugin-budget.c:69
msgid "_Open Budget"
-msgstr "æå¼(_O)"
+msgstr "æå¼é¢ç®(_O)"
#: gnucash/gnome/gnc-plugin-budget.c:70
msgid ""
@@ -3606,7 +3590,7 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-budget.c:75
msgid "_Copy Budget"
-msgstr "å¤å¶(_C)"
+msgstr "å¤å¶é¢ç®(_C)"
#: gnucash/gnome/gnc-plugin-budget.c:76
#, fuzzy
@@ -3615,7 +3599,7 @@ msgstr "å¤å¶ä¸ä¸ªå·²æçé¢ç®"
#: gnucash/gnome/gnc-plugin-budget.c:80
msgid "_Delete Budget"
-msgstr "å é¤(_D)"
+msgstr "å é¤é¢ç®(_D)"
#: gnucash/gnome/gnc-plugin-budget.c:81
#, fuzzy
@@ -3629,7 +3613,7 @@ msgstr "éæ©ä¸ä¸ªé¢ç®"
#: gnucash/gnome/gnc-plugin-business.c:155
#: gnucash/gnome/gnc-plugin-business.c:305 gnucash/report/report-core.scm:163
msgid "_Business"
-msgstr "åä¸(_B)"
+msgstr "ä¸å¡(_B)"
#: gnucash/gnome/gnc-plugin-business.c:158
msgid "_Customer"
@@ -3772,7 +3756,7 @@ msgstr "åå·¥(_E)"
#: gnucash/gnome/gnc-plugin-business.c:251
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:170
msgid "_New Employee..."
-msgstr "æ°å¢(_N)..."
+msgstr "æ°å¢åå·¥(_N)..."
#: gnucash/gnome/gnc-plugin-business.c:252
msgid "Open the New Employee dialog"
@@ -3780,7 +3764,7 @@ msgstr "æå¼æ°å¢åå·¥å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:256
msgid "_Find Employee..."
-msgstr "æ¥æ¾(_F)..."
+msgstr "æ¥æ¾åå·¥(_F)..."
#: gnucash/gnome/gnc-plugin-business.c:257
msgid "Open the Find Employee dialog"
@@ -3804,11 +3788,11 @@ msgstr "æå¼æ¥æ¾æ¯åºåè¯å¯¹è¯æ¡(_V)"
#: gnucash/gnome/gnc-plugin-business.c:278
msgid "Business Linked Documents"
-msgstr "已龿¥æä»¶"
+msgstr "ä¸å¡å
³èçåè¯"
#: gnucash/gnome/gnc-plugin-business.c:279
msgid "View all Linked Business Documents"
-msgstr "æ¥çææé¾æ¥æä»¶"
+msgstr "æ¥çææå
³èçä¸å¡åè¯"
#: gnucash/gnome/gnc-plugin-business.c:283
msgid "Sales _Tax Table"
@@ -4583,7 +4567,7 @@ msgstr "æ¯ä»å票(_P)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:366
#: gnucash/gnome/gnc-plugin-page-register.c:300
msgid "_Manage Document Link..."
-msgstr ""
+msgstr "_管çåè¯é¾æ¥â¦"
#. Translators: This is a menu item that opens an external file or URI that may
#. be linked to the current bill, invoice, transaction, or voucher using
@@ -4593,9 +4577,8 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-page-invoice.c:346
#: gnucash/gnome/gnc-plugin-page-invoice.c:367
#: gnucash/gnome/gnc-plugin-page-register.c:304
-#, fuzzy
msgid "_Open Linked Document"
-msgstr "æ°å»ºç§ç®"
+msgstr "_æå¼å
³èçåè¯"
#: gnucash/gnome/gnc-plugin-page-invoice.c:310
msgid "_Use as Default Layout for Customer Documents"
@@ -19320,13 +19303,11 @@ msgid "Credited BIC (Bank Code)"
msgstr "è´·æ¹ç§ç®é¶è¡ä»£ç "
#: gnucash/import-export/aqb/dialog-ab-trans.c:494
-#, fuzzy, c-format
+#, c-format
msgid ""
"The internal check of the destination IBAN '%s' failed. This means the "
"account number might contain an error."
-msgstr ""
-"卿å®é¶è¡çç®çè´¦æ·å·â%sâçå
鍿£æ¥å¤±è´¥äºï¼è¯¥é¶è¡çé¶è¡ä»£ç 为â%sâãè¿æå³ç"
-"è´¦æ·å·å¯è½æéè¯¯ãæ¯å¦åºè¯¥å¼ºè¡è®©ç½ä¸è½¬è´¦ä»»å¡åç»è¿ä¸ªè´¦æ·å·ï¼"
+msgstr "卿å®é¶è¡çç®çè´¦æ·å·â%sâçå
鍿£æ¥å¤±è´¥äºï¼è¯¥é¶è¡çé¶è¡ä»£ç 为â%sâãè¿æå³çè´¦æ·å·å¯è½æé误ã"
#: gnucash/import-export/aqb/dialog-ab-trans.c:549
#, c-format
@@ -19357,17 +19338,13 @@ msgid ""
msgstr "æ²¡ææ¶æ¬¾é¶è¡ï¼ç½ä¸è½¬è´¦éè¦ä¸ä¸ªæ¶æ¬¾é¶è¡ã\n"
#: gnucash/import-export/aqb/dialog-ab-trans.c:618
-#, fuzzy
msgid ""
"The amount is zero or the amount field could not be interpreted correctly. "
"You might have mixed up decimal point and comma, compared to your locale "
"settings. This does not result in a valid online transfer job."
msgstr ""
-"éé¢ä¸ºé¶æéé¢åæ®µæ æ³è¢«æ£ç¡®è§£è¯»ãæ¨ä¹è®¸å°å°æ°ç¹åéå·å¼æ··äºï¼ä¸åçåºå设置"
-"å°æ°ç¹åéå·çå«ä¹ä¸åï¼è¯·æ£æ¥æ¨çåºåè®¾ç½®åæ°æ®ãè¿ä¸ä¼å¯¼è´ä»»ä½ææçç½ä¸è½¬"
-"账任å¡ã\n"
-"\n"
-"æ¨æ³å次è¿å
¥è¿ä¸ªä»»å¡ä¹ï¼"
+"éé¢ä¸ºé¶æéé¢åæ®µæ æ³è¢«æ£ç¡®è§£è¯»ãæ¨ä¹è®¸å°å°æ°ç¹åéå·å¼æ··äºï¼ä¸åçåºåè®¾ç½®å°æ°ç¹åéå·çå«ä¹ä¸åï¼è¯·æ£æ¥æ¨çåºåè®¾ç½®åæ°æ®ãè¿ä¸ä¼å¯¼è´ä»»ä½ææçç½ä¸è½¬è´¦"
+"ä»»å¡ã"
#: gnucash/import-export/aqb/dialog-ab-trans.c:635
msgid ""
@@ -19593,11 +19570,8 @@ msgid "Reconcile account now?"
msgstr "ç°å¨å¯¹è´¦ç§ç®ï¼"
#: gnucash/import-export/aqb/gnc-ab-utils.c:1279
-#, fuzzy
msgid "The bank has sent a message in its response."
-msgstr ""
-"é¶è¡å¨å®çååºä¸åéäºä½é¢ä¿¡æ¯ã\n"
-"æ¨æ³å¯¼å
¥å®ä¹ï¼"
+msgstr "é¶è¡å¨å®çååºä¸åéäºä½é¢ä¿¡æ¯ã"
#: gnucash/import-export/aqb/gnc-ab-utils.c:1280
msgid "Subject:"
@@ -19626,16 +19600,16 @@ msgid "...\n"
msgstr ""
#: gnucash/import-export/aqb/gnc-file-aqb-import.c:338
-#, fuzzy, c-format
+#, c-format
msgid ""
"An error occurred while executing jobs: %d of %d failed. Please check the "
"log window or gnucash.trace for the exact error message.\n"
"\n"
"%s"
msgstr ""
-"卿§è¡ä»»å¡æ¶åçé误ãè¯·æ£æ¥æ¥å¿çªå£ä¸çå
·ä½é误信æ¯ã\n"
+"æ§è¡ä½ä¸æ¶åçé误ï¼ç¬¬%d个ï¼å
±%d个失败ã è¯·æ£æ¥æ¥å¿çªå£ægnucash.trace以è·åç¡®åçéè¯¯æ¶æ¯ã\n"
"\n"
-"æ¨æ³å¨ä¸æ¬¡è¿å
¥ä»»å¡ä¹ï¼"
+"%s"
#: gnucash/import-export/aqb/gnc-file-aqb-import.c:348
#, fuzzy
@@ -22176,9 +22150,8 @@ msgstr ""
"â%sâ"
#: gnucash/register/ledger-core/split-register-model.c:2215
-#, fuzzy
msgid "Change transaction containing a reconciled split?"
-msgstr "ä¿®æ¹å·²å¯¹è´¦çåå½çå
容"
+msgstr "ä¿®æ¹å·²å¯¹è´¦çåå½çå
容ï¼"
#: gnucash/register/ledger-core/split-register-model.c:2217
#, fuzzy, c-format
@@ -22879,15 +22852,13 @@ msgid "Price Source"
msgstr "ä»·æ ¼æº"
#: gnucash/report/reports/aging.scm:42
-#, fuzzy
msgid "Show Multi-currency Totals"
-msgstr "æ¾ç¤ºå¤ç§è´§å¸å计ï¼"
+msgstr "æ¾ç¤ºå¤ç§è´§å¸å计"
#: gnucash/report/reports/aging.scm:43
#: gnucash/report/reports/standard/new-aging.scm:42
-#, fuzzy
msgid "Show zero balance items"
-msgstr "æ¾ç¤ºé¶ä½é¢æ¡ç®ä¹ï¼"
+msgstr "æ¾ç¤ºé¶ä½é¢æ¡ç®"
#: gnucash/report/reports/aging.scm:44
#: gnucash/report/reports/standard/new-aging.scm:43
@@ -23152,9 +23123,8 @@ msgid "Include Sub-Accounts"
msgstr "å
å«åç§ç®"
#: gnucash/report/reports/example/average-balance.scm:46
-#, fuzzy
msgid "Exclude transactions between selected accounts"
-msgstr "æéå®ç§ç®é´ç交æäºé¡¹æé¤å¨å¤ä¹ï¼"
+msgstr "æé¤æé叿·ä¹é´ç交æ"
#: gnucash/report/reports/example/average-balance.scm:47
#: gnucash/report/reports/example/daily-reports.scm:62
@@ -25256,9 +25226,8 @@ msgstr "æ¾ç¤ºåå§è´§å¸æ»é¢"
#: gnucash/report/reports/standard/balsheet-pnl.scm:124
#: gnucash/report/trep-engine.scm:574
-#, fuzzy
msgid "Also show original currency amounts"
-msgstr "æ¾ç¤ºç§ç®çå¤å¸éé¢ï¼"
+msgstr "åæ¶æ¾ç¤ºåå§è´§å¸éé¢"
#: gnucash/report/reports/standard/balsheet-pnl.scm:126
msgid "If more than 1 period column, include overall period?"
@@ -26026,9 +25995,8 @@ msgid "Use line charts."
msgstr "ä½é¢æçº¿å¾"
#: gnucash/report/reports/standard/category-barchart.scm:175
-#, fuzzy
msgid "Show charts as stacked charts?"
-msgstr "æ¾ç¤ºæ±ç¶å¾ä¸ºå å æ±ç¶å¾"
+msgstr "å°å¾è¡¨æ¾ç¤ºä¸ºå å å¾è¡¨åï¼"
#: gnucash/report/reports/standard/category-barchart.scm:181
#, fuzzy
@@ -26323,9 +26291,8 @@ msgstr "ç¨å·"
#: gnucash/report/reports/standard/general-ledger.scm:93
#: gnucash/report/trep-engine.scm:927 gnucash/report/trep-engine.scm:974
#: gnucash/report/trep-engine.scm:1120
-#, fuzzy
msgid "Use Full Account Name"
-msgstr "使ç¨ç§ç®å
¨åï¼"
+msgstr "使ç¨ç§ç®å
¨å"
#: gnucash/report/reports/standard/general-ledger.scm:75
#: gnucash/report/reports/standard/general-ledger.scm:95
@@ -26338,9 +26305,8 @@ msgstr "å
¶å®ç§ç®åç§°"
#: gnucash/report/reports/standard/general-ledger.scm:96
#: gnucash/report/trep-engine.scm:947 gnucash/report/trep-engine.scm:977
#: gnucash/report/trep-engine.scm:1128
-#, fuzzy
msgid "Use Full Other Account Name"
-msgstr "使ç¨å®æ´çå
¶å®ç§ç®åç§°ï¼"
+msgstr "使ç¨å®æ´çå
¶å®ç§ç®åç§°"
#: gnucash/report/reports/standard/general-ledger.scm:77
#: gnucash/report/reports/standard/general-ledger.scm:97
@@ -26353,9 +26319,8 @@ msgstr "å
¶å®ç§ç®ä»£ç "
#: gnucash/report/reports/standard/general-ledger.scm:104
#: gnucash/report/trep-engine.scm:935 gnucash/report/trep-engine.scm:1061
#: gnucash/report/trep-engine.scm:1162
-#, fuzzy
msgid "Sign Reverses"
-msgstr "符å·å转ï¼"
+msgstr "符å·å转"
#: gnucash/report/reports/standard/general-ledger.scm:111
#: gnucash/report/trep-engine.scm:73
@@ -26801,19 +26766,16 @@ msgid "Display the entry's discount?"
msgstr "æ¾ç¤ºäº¤æçææ£"
#: gnucash/report/reports/standard/invoice.scm:243
-#, fuzzy
msgid "Display the entry's taxable status?"
-msgstr "æ¾ç¤ºäº¤æç须纳ç¨çç¶æ"
+msgstr "æ¾ç¤ºäº¤æç须纳ç¨çç¶æï¼"
#: gnucash/report/reports/standard/invoice.scm:248
-#, fuzzy
msgid "Display each entry's total total tax?"
-msgstr "æ¾ç¤ºæ¯ç¬äº¤æçå
¨é¨ç¨é¢å计"
+msgstr "æ¾ç¤ºæ¯ç¬äº¤æçå
¨é¨æ»ç¨é¢ï¼"
#: gnucash/report/reports/standard/invoice.scm:253
-#, fuzzy
msgid "Display the entry's value?"
-msgstr "æ¾ç¤ºäº¤æçä»·å¼"
+msgstr "æ¾ç¤ºäº¤æçå¼ï¼"
#: gnucash/report/reports/standard/invoice.scm:258
msgid "Display due date?"
@@ -27401,22 +27363,19 @@ msgstr "æ¯å¦æ¾ç¤ºç§ç®ï¼"
#: gnucash/report/reports/standard/new-owner-report.scm:932
#: gnucash/report/reports/standard/owner-report.scm:597
-#, fuzzy
msgid "Display the period debits column?"
-msgstr "æ¾ç¤ºäº¤æçææ£"
+msgstr "æ¾ç¤ºæé´çåæ¹æ ï¼"
#: gnucash/report/reports/standard/new-owner-report.scm:937
#: gnucash/report/reports/standard/owner-report.scm:592
-#, fuzzy
msgid "Display the period credits column?"
-msgstr "æ¾ç¤ºäº¤æçææ£"
+msgstr "æ¾ç¤ºæé´çè´·æ¹æ ï¼"
#: gnucash/report/reports/standard/new-owner-report.scm:942
#: gnucash/report/reports/standard/register.scm:413
#: gnucash/report/trep-engine.scm:984
-#, fuzzy
msgid "Display a running balance?"
-msgstr "æ¾ç¤ºè¿è¡ä¸çç»ç®"
+msgstr "æ¾ç¤ºæµå¨ä½é¢ï¼"
#: gnucash/report/reports/standard/new-owner-report.scm:947
#, fuzzy
@@ -27448,9 +27407,8 @@ msgid ""
msgstr ""
#: gnucash/report/reports/standard/new-owner-report.scm:962
-#, fuzzy
msgid "Display document link?"
-msgstr "以è¶
龿¥æ¾ç¤ºç§ç®"
+msgstr "æ¾ç¤ºæä»¶é¾æ¥ï¼"
#: gnucash/report/reports/standard/new-owner-report.scm:1087
#, fuzzy
@@ -28092,9 +28050,8 @@ msgid "Display the Company Name?"
msgstr "æ¾ç¤ºç§ç®åç§°ï¼"
#: gnucash/report/reports/standard/taxinvoice.scm:142
-#, fuzzy
msgid "Invoice Number next to title?"
-msgstr "å票å·ç "
+msgstr "å票å·ç é è¿æ é¢ï¼"
#: gnucash/report/reports/standard/taxinvoice.scm:143
#, fuzzy
@@ -28107,9 +28064,8 @@ msgid "Invoice Job number?"
msgstr "å票å·ç "
#: gnucash/report/reports/standard/taxinvoice.scm:145
-#, fuzzy
msgid "Show net price?"
-msgstr "æ¾ç¤ºä»·æ ¼"
+msgstr "æ¾ç¤ºåä»·ï¼"
#: gnucash/report/reports/standard/taxinvoice.scm:162
#, fuzzy
@@ -28965,9 +28921,8 @@ msgid "Reconciled Status"
msgstr "å¯¹è´¦æ¥æ"
#: gnucash/report/trep-engine.scm:120
-#, fuzzy
msgid "Void Transactions"
-msgstr "使交æäºé¡¹æ æä¹ï¼"
+msgstr "ä½åºäº¤æ"
#: gnucash/report/trep-engine.scm:121
#, fuzzy
@@ -29270,9 +29225,8 @@ msgid ""
msgstr ""
#: gnucash/report/trep-engine.scm:660
-#, fuzzy
msgid "Filter by reconcile status."
-msgstr "æ¯å¦æ¾ç¤ºå¯¹è´¦æ¥æï¼"
+msgstr "ææ ¸å¯¹ç¶æçéã"
#: gnucash/report/trep-engine.scm:667
#, fuzzy
@@ -29313,14 +29267,12 @@ msgid "Show the account code for subtotals and subheadings?"
msgstr "æ¾ç¤ºå°è®¡ä¸å°æ é¢çç§ç®ä»£ç ï¼"
#: gnucash/report/trep-engine.scm:826
-#, fuzzy
msgid "Show the account description for subheadings?"
-msgstr "æ¾ç¤ºç§ç®æè¿°"
+msgstr "æ¾ç¤ºå¯æ é¢çç§ç®æè¿°ï¼"
#: gnucash/report/trep-engine.scm:833
-#, fuzzy
msgid "Show the informal headers for debit/credit accounts?"
-msgstr "æ¾ç¤ºæ¶çåè´¹ç¨ç§ç®"
+msgstr "æ¾ç¤ºåæ¹/è´·æ¹è´¦æ·ç鿣弿 é¢ï¼"
#: gnucash/report/trep-engine.scm:840
msgid "Add indenting columns with grouping and subtotals?"
@@ -29367,9 +29319,8 @@ msgid "Display the notes if the memo is unavailable?"
msgstr "妿夿³¨ä¸å¯ç¨ï¼æ¯å¦æ¾ç¤ºè¯´æï¼"
#: gnucash/report/trep-engine.scm:974 gnucash/report/trep-engine.scm:977
-#, fuzzy
msgid "Display the full account name?"
-msgstr "æ¾ç¤ºç§ç®å
¨å"
+msgstr "æ¾ç¤ºå®æ´ç§ç®åï¼"
#: gnucash/report/trep-engine.scm:975
#, fuzzy
@@ -29377,19 +29328,16 @@ msgid "Display the account code?"
msgstr "æ¾ç¤ºç§ç®ä»£ç ï¼"
#: gnucash/report/trep-engine.scm:978
-#, fuzzy
msgid "Display the other account code?"
-msgstr "æ¾ç¤ºå
¶å®ç§ç®ä»£ç "
+msgstr "æ¾ç¤ºå
¶å®ç§ç®ç¼å·ï¼"
#: gnucash/report/trep-engine.scm:980
-#, fuzzy
msgid "Display the transaction linked document"
-msgstr "æ¯å¦æ¾ç¤ºäº¤ææ¥æï¼"
+msgstr "æ¾ç¤ºäº¤æå
³èæä»¶ï¼"
#: gnucash/report/trep-engine.scm:983
-#, fuzzy
msgid "Display a subtotal summary table."
-msgstr "æ¾ç¤ºå°è®¡ä¹ï¼"
+msgstr "æ¾ç¤ºå°è®¡æ±æ»è¡¨ï¼"
#: gnucash/report/trep-engine.scm:991
#, fuzzy
commit 9a58dd1532c10fab540c25bcaa95f8d847fbfb31
Author: 峡å·ä»å£« <c at cjh0613.com>
Date: Tue May 4 17:49:27 2021 +0200
Translation update by 峡å·ä»å£« <c at cjh0613.com> using Weblate
po/zh_CN.po: 59.7% (3275 of 5479 strings; 1507 fuzzy)
574 failing checks (10.4%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: 峡å·ä»å£« <c at cjh0613.com>
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 6911f13b7..82d671842 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -12,14 +12,15 @@
# Boyuan Yang <073plan at gmail.com>, 2018, 2019, 2021.
# TianXing_Yi <duguqiubailee at gmail.com>, 2021.
# Sean Guan <guanshangkang at gmail.com>, 2021.
+# 峡å·ä»å£« <c at cjh0613.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: gnucash 3.7\n"
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-05-03 16:32+0000\n"
-"Last-Translator: TianXing_Yi <duguqiubailee at gmail.com>\n"
+"PO-Revision-Date: 2021-05-04 06:32+0000\n"
+"Last-Translator: 峡å·ä»å£« <c at cjh0613.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -2253,12 +2254,12 @@ msgstr "é¢ä»"
#: gnucash/gnome/dialog-invoice.c:2089
msgid "PAID"
-msgstr ""
+msgstr "å·²æ¯ä»"
#: gnucash/gnome/dialog-invoice.c:2091
#: gnucash/report/reports/standard/new-owner-report.scm:583
msgid "UNPAID"
-msgstr ""
+msgstr "æªæ¯ä»"
#: gnucash/gnome/dialog-invoice.c:2139 gnucash/gnome/dialog-invoice.c:2158
#: gnucash/gnome/dialog-invoice.c:2177
commit 90ae8e8bc9ae01bf4235f253688647034fed13ca
Author: Kristoffer Grundström <swedishsailfishosuser at tutanota.com>
Date: Tue May 4 17:49:26 2021 +0200
Translation update by Kristoffer Grundström <swedishsailfishosuser at tutanota.com> using Weblate
po/glossary/sv.po: 97.5% (203 of 208 strings; 3 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Swedish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/sv/
Co-authored-by: Kristoffer Grundström <swedishsailfishosuser at tutanota.com>
diff --git a/po/glossary/sv.po b/po/glossary/sv.po
index c3564c8b3..466cda468 100644
--- a/po/glossary/sv.po
+++ b/po/glossary/sv.po
@@ -14,7 +14,7 @@ msgstr ""
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
"PO-Revision-Date: 2021-05-02 17:32+0000\n"
-"Last-Translator: Arve Eriksson <031299870 at telia.com>\n"
+"Last-Translator: Kristoffer Grundström <swedishsailfishosuser at tutanota.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/gnucash/glossary/"
"sv/>\n"
"Language: sv\n"
@@ -98,9 +98,8 @@ msgid "account type: Passive"
msgstr "kontotyp: Passivt"
#. "Group of accounts tracking your success, complement of 'Assets & Liabilities'"
-#, fuzzy
msgid "account type: Profit & Loss"
-msgstr "kontotyp: Tillgång"
+msgstr "kontotyp: Förtjänst & Förlust"
#. "1. (US) any type of account that earns interest 2. (Brit) any type of bank account that earns a higher level of interest than a current account or deposit account"
msgid "account type: saving"
@@ -329,9 +328,8 @@ msgid "credit transfer"
msgstr "överföring"
#. "A document that you give to a client that says you owe money to the client, i.e. the opposite of an invoice"
-#, fuzzy
msgid "credit note"
-msgstr "överföring"
+msgstr "kreditnotering"
#. "The system of money used in a country"
msgid "currency"
@@ -391,7 +389,7 @@ msgstr "dubbel bokföring"
#. "Transactions or bills/invoices can contain a document link which links either to some file on the local disk or to some arbitrary URL."
msgid "document link"
-msgstr ""
+msgstr "länk till dokument"
#. "Electronic mail. Some languages allow different writings, but each team should use only one. https://en.wikipedia.org/wiki/Email"
msgid "email"
commit cf00dfed19b1e80f7466d5f99ea7d7bab2be8249
Author: Arve Eriksson <031299870 at telia.com>
Date: Tue May 4 17:49:26 2021 +0200
Translation update by Arve Eriksson <031299870 at telia.com> using Weblate
po/glossary/sv.po: 97.5% (203 of 208 strings; 3 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Swedish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/sv/
Co-authored-by: Arve Eriksson <031299870 at telia.com>
diff --git a/po/glossary/sv.po b/po/glossary/sv.po
index 8b4c12751..c3564c8b3 100644
--- a/po/glossary/sv.po
+++ b/po/glossary/sv.po
@@ -13,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-05-01 10:32+0000\n"
+"PO-Revision-Date: 2021-05-02 17:32+0000\n"
"Last-Translator: Arve Eriksson <031299870 at telia.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/gnucash/glossary/"
"sv/>\n"
@@ -26,7 +26,7 @@ msgstr ""
#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
msgid "Term (Dear translator: This file will never be visible to the user!)"
-msgstr ""
+msgstr "Term"
#. "Opening and closing quote symbols and optionally their key combos like [altgr]+[Y]/[X]. Define the preferred style of quotation, see https://en.wikipedia.org/wiki/Quotation_mark#Summary_table"
msgid "\"\""
@@ -57,9 +57,8 @@ msgid "account type: Asset"
msgstr "kontotyp: Tillgång"
#. "in fact: 'Active & Passive', group aka 'Balance Sheet accounts'; complement of 'Profit & Loss'"
-#, fuzzy
msgid "account type: Assets & Liabilities"
-msgstr "kontotyp: Skuld"
+msgstr "kontotyp: Tillgångar & Skulder"
# src/prefs.c:210
#. "(esp. US) (Brit = current account) a bank account from which money can be withdrawn without previous notice"
@@ -112,13 +111,12 @@ msgid "account type: Stock"
msgstr "kontotyp: aktie"
#. "This account type (new in gnucash-2.4.0) is used when exchanging or trading amounts from one currency into another"
-#, fuzzy
msgid "account type: trading"
-msgstr "kontotyp: spar"
+msgstr "kontotyp: handel"
#. "-"
msgid "account: parent account"
-msgstr "konto: förälderkonto"
+msgstr "konto: överliggande konto"
#. "-"
msgid "account: subaccount"
@@ -315,9 +313,8 @@ msgid "commodity option: Symbol"
msgstr "varualterativ: Symbol"
#. "interest which is earned on both the initial deposit and on any interest that has already been earned but left on deposit."
-#, fuzzy
msgid "compound interests"
-msgstr "ränta"
+msgstr "ränta på ränta"
#. "(a) A sum of money paid into an account. (b) A record of such a payment. (c) The state of having money in one's bank account."
msgid "Credit (column in register)"
@@ -346,7 +343,7 @@ msgstr "Anpassat"
#. "Compact, well-structured presentation of informations. See https://en.wikipedia.org/wiki/Dashboard_(business)"
msgid "dashboard"
-msgstr ""
+msgstr "översikt"
#. "The backend where the data is stored."
msgid "database"
@@ -410,11 +407,11 @@ msgstr "eget kapital"
#. "Report that ... FIXME: Add description."
msgid "equity statement"
-msgstr ""
+msgstr "förteckning över eget kapital"
#. "A trusted third party that holds a payment or deposit until a transaction is completed. In the US, many mortgage companies set up an escrow account when you get a mortgage. You pay into the account every month and they disburse amounts out of the escrow to pay for hazard insurance and property taxes. So they are holding funds 'in escrow' to complete the transactions (paying insurance and taxes)."
msgid "escrow (account)"
-msgstr ""
+msgstr "depositionskonto"
#. "The relation in value between the money used in different countries"
msgid "exchange rate"
@@ -441,9 +438,8 @@ msgid "financial calculator: payments"
msgstr "finansiell miniräknare: betalningar"
#. "formal records of the financial activities and position of a business, person, or other entity. See https://en.wikipedia.org/wiki/Financial_statement for a list."
-#, fuzzy
msgid "financial statement"
-msgstr "händelse: betalning"
+msgstr "kontoutdrag"
#. "Free software is a matter of liberty, not price ⦠see https://en.wikipedia.org/wiki/Free_software"
msgid "free software"
@@ -463,7 +459,7 @@ msgstr "import"
#. "Report that ... FIXME: add description. This report used to be called the 'Profit & Loss', but it was renamed on 2004-07-13."
msgid "income statement"
-msgstr ""
+msgstr "resultaträkning"
#. "Money charged for borrowing money, or paid to somebody who invests money"
msgid "interest"
@@ -492,10 +488,8 @@ msgstr "lån"
# src/languages.h:184
#. "Annual Percentage Rate, includes in contrast to the Nominal Rate some of the various costs to obtain a loan."
-#, fuzzy
-#| msgid "loan"
msgid "loan: APR"
-msgstr "lån"
+msgstr "lån: årsränta"
#. "The money lost in business activity"
msgid "loss"
@@ -518,9 +512,8 @@ msgid "marker"
msgstr "markering"
#. "1. Some text annotation, but this meaning isn't used inside gnucash. 2. In the Customer summary report: The ratio of profit vs. sales, i.e. the profit amount divided by the sales amount, shown in percent."
-#, fuzzy
msgid "markup"
-msgstr "markering"
+msgstr "marginal"
#. "The way how more than one window is displayed in GnuCash at the same time. MDI = Multiple Document Interface."
msgid "MDI modus"
@@ -535,16 +528,12 @@ msgid "Mortgage"
msgstr "Inteckning"
#. "Adjustable Rate Mortgage"
-#, fuzzy
-#| msgid "Mortgage"
msgid "mortgage: ARM"
-msgstr "Inteckning"
+msgstr "inteckning: rörlig ränta"
#. "Fixed Rate Mortgage"
-#, fuzzy
-#| msgid "Mortgage"
msgid "mortgage: FRM"
-msgstr "Inteckning"
+msgstr "inteckning: fast ränta"
#. "e.g. USD, DEM, see Currency."
msgid "national currency"
@@ -628,18 +617,16 @@ msgid "portfolio"
msgstr "portfölj"
#. "Register invoice, voucher in account register"
-#, fuzzy
msgid "post, to"
-msgstr "stänga, att"
+msgstr "registrera, att"
#. "A menu choice in many graphical user interface applications that allows the user to specify how the application will act each time it is used. "
msgid "preferences"
msgstr "inställningar"
#. "Loan repayment calculator: your payments are split in interests payment and principal payment"
-#, fuzzy
msgid "principal payment"
-msgstr "händelse: betalning"
+msgstr "amortering"
#. "An amount of money for which sth may be bought or sold"
msgid "price (in a split)"
@@ -663,7 +650,7 @@ msgstr "vinst"
#. "OBSOLETE. This report was renamed to 'income statement' on 2004-07-13. Old definition: A list that shows the amount of money spent compared with the amount earned by a business in a particular period"
msgid "Profit & Loss"
-msgstr "Vinst och förlust"
+msgstr "Vinst & Förlust"
#. "-"
msgid "quick-fill"
@@ -715,11 +702,11 @@ msgstr "läs om, att"
#. "aka 'two-sided form' is in Europe often used for the balance sheet. Complement: report form: Vertical Form"
msgid "report form: T Account Form"
-msgstr ""
+msgstr "rapportform: T-kontoform"
#. "aka 'running form' is in english speaking countries usually used for the balance sheet in one column. Complement: report form: T Account Form"
msgid "report form: Vertical Form"
-msgstr ""
+msgstr "rapportform: Vertikalt format"
#. "name of an equity account (?); to be distinguished from the opening balance."
msgid "Retained Earnings"
@@ -727,7 +714,7 @@ msgstr "Balanserade vinstmedel"
#. "Create a new transaction that is the inverse of the old one. When you add the two together they completely cancel out. Accounts use this instead of voiding transactions, usually because the prior month has been closed and can no longer be changed, or the entire accounting system is 'write only'."
msgid "reverse transaction, to (Action in the register)"
-msgstr ""
+msgstr "Ã¥terbetalning (Ã
tgärd i registret)"
#. "(In the customer summary report) The total amount of money received because something was sold."
msgid "sales"
@@ -784,14 +771,12 @@ msgid "tax info"
msgstr "skatteinformation"
#. "Amost everybody has to declare and probably pay it. See https://en.wikipedia.org/wiki/Income_tax"
-#, fuzzy
-#| msgid "account type: Income"
msgid "tax type: income tax"
-msgstr "kontotyp: Inkomst"
+msgstr "skattetyp: inkomstskatt"
#. "Usually only business users have to handle it, see https://en.wikipedia.org/wiki/Sales_tax."
msgid "tax type: sales tax"
-msgstr ""
+msgstr "skattetyp: försäljningsskatt"
#. "'Goods and Service Tax' is one form of sales tax."
msgid "tax type: GST"
@@ -852,7 +837,7 @@ msgstr "överföra, att (registerverktygsrad)"
#. "The trial balance is a worksheet on which you list all your general ledger accounts and their debit or credit balance. It is a tool that is used to alert you to errors in your books. The total debits must equal the total credits. If they don't equal, you know you have an error that must be tracked down."
msgid "trial balance (report)"
-msgstr ""
+msgstr "råbalans (rapport)"
#. "A class or things that have characteristics in common; type of an account, of a commodity etc."
msgid "type"
@@ -876,7 +861,7 @@ msgstr "leverantör"
#. "The terms 'Voucher' and 'Expense Voucher' are used interchangeably in gnucash. The 'Expense Voucher' is also a bit of a misnomer -- it's more like an 'Expense Report' in gnucash. The phrase is meant to be a list of expenses incurred by an employee for which the company will reminburse them."
msgid "voucher"
-msgstr ""
+msgstr "traktamente"
#. "see debit"
msgid "withdraw (in the reconcile dialog)"
commit a3174f894e7e0acfb08980b76848e901ff5bc20b
Author: TianXing_Yi <duguqiubailee at gmail.com>
Date: Tue May 4 17:49:25 2021 +0200
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 59.7% (3273 of 5479 strings; 1507 fuzzy)
574 failing checks (10.4%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/glossary/zh_CN.po: 100.0% (214 of 214 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 59.4% (3258 of 5479 strings; 1522 fuzzy)
577 failing checks (10.5%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 59.3% (3253 of 5479 strings; 1528 fuzzy)
577 failing checks (10.5%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 59.2% (3246 of 5479 strings; 1535 fuzzy)
577 failing checks (10.5%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 59.0% (3234 of 5479 strings; 1547 fuzzy)
597 failing checks (10.8%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: TianXing_Yi <duguqiubailee at gmail.com>
diff --git a/po/glossary/zh_CN.po b/po/glossary/zh_CN.po
index c7f2aa5a2..6587b7624 100644
--- a/po/glossary/zh_CN.po
+++ b/po/glossary/zh_CN.po
@@ -11,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-04-23 16:32+0000\n"
+"PO-Revision-Date: 2021-05-03 16:32+0000\n"
"Last-Translator: TianXing_Yi <duguqiubailee at gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/glossary/zh_Hans/>\n"
@@ -1046,10 +1046,10 @@ msgid "Invoices Due Reminder"
msgstr "åºæ¶å°ææé"
msgid "Employees Overview"
-msgstr "åå·¥æ¦è§"
+msgstr "åå·¥æ¦åµ"
msgid "Vendors Overview"
-msgstr "ä¾åºåæ¦è§"
+msgstr "ä¾åºåæ¦åµ"
msgid "Customers Overview"
-msgstr "å®¢æ·æ¦è§"
+msgstr "å®¢æ·æ¦åµ"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 14668e325..6911f13b7 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -18,7 +18,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-25 18:32+0000\n"
+"PO-Revision-Date: 2021-05-03 16:32+0000\n"
"Last-Translator: TianXing_Yi <duguqiubailee at gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
@@ -689,11 +689,9 @@ msgid ""
"\n"
"Douglas Adams, \"The Restaurant at the End of the Universe\""
msgstr ""
-"ä¸ç§ç论认为ï¼å¦ææäººåç°äºå®å®æ¯ä»ä¹ï¼ä¸ºä»ä¹ä¼åºç°å¨è¿éï¼é£ä¹å®å°±ä¼ç«å»æ¶"
-"失ï¼åè代ä¹çæ¯æ´å 诡å¼åè«åå
¶å¦çä¸è¥¿ã\n"
+"ä¸ç§ç论认为ï¼å¦ææäººåç°äºå®å®æ¯ä»ä¹ï¼ä¸ºä»ä¹ä¼åºç°å¨è¿éï¼é£ä¹å®å°±ä¼ç«å»æ¶å¤±ï¼åè代ä¹çæ¯æ´å 诡å¼åè«åå
¶å¦çä¸è¥¿ã\n"
"è¿æä¸ç§è¯´æ³ï¼è¿äºæ
å·²ç»åçäºã\n"
"\n"
-"\n"
"éæ ¼ææ¯-äºå½æ¯ï¼âå®å®å°½å¤´çé¤å
â"
#: gnucash/gnome/assistant-acct-period.c:188
@@ -2265,14 +2263,14 @@ msgstr ""
#: gnucash/gnome/dialog-invoice.c:2139 gnucash/gnome/dialog-invoice.c:2158
#: gnucash/gnome/dialog-invoice.c:2177
msgid "New Credit Note"
-msgstr "æ°å»º"
+msgstr "æ°å¢é¢ä»"
#: gnucash/gnome/dialog-invoice.c:2140
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:292
#: gnucash/gnome-search/dialog-search.c:1091
#: gnucash/gtkbuilder/dialog-invoice.glade:642
msgid "New Invoice"
-msgstr "æ°å»ºå票"
+msgstr "æ°å¢å票"
#: gnucash/gnome/dialog-invoice.c:2145 gnucash/gnome/dialog-invoice.c:2164
#: gnucash/gnome/dialog-invoice.c:2183
@@ -2296,7 +2294,7 @@ msgstr "æ¥çå票"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:291
#: gnucash/gnome-search/dialog-search.c:1075
msgid "New Bill"
-msgstr "æ°å»ºè´¦å"
+msgstr "æ°å¢è´¦å"
#: gnucash/gnome/dialog-invoice.c:2165
msgid "Edit Bill"
@@ -2571,7 +2569,7 @@ msgstr "ç¼è¾å·¥ä½"
#: gnucash/gnome/dialog-job.c:252 gnucash/gnome-search/dialog-search.c:1095
msgid "New Job"
-msgstr "æ°å»ºå·¥ä½"
+msgstr "æ°å¢é¡¹ç®"
#: gnucash/gnome/dialog-job.c:560
msgid "View/Edit Job"
@@ -3023,7 +3021,7 @@ msgstr "æ¥ç(_V)"
#: gnucash/gnome/dialog-sx-editor2.c:167 gnucash/gnome/dialog-sx-editor.c:169
#: gnucash/gnome-utils/gnc-main-window.c:275
msgid "_Actions"
-msgstr "æä½(_A)"
+msgstr "åè½(_A)"
#: gnucash/gnome/dialog-sx-editor2.c:199 gnucash/gnome/dialog-sx-editor.c:201
#, fuzzy
@@ -3120,9 +3118,9 @@ msgid ""
msgstr "æ æ³èªå¨å建带åéç计å交æã"
#: gnucash/gnome/dialog-sx-editor.c:674
-#, fuzzy, c-format
+#, c-format
msgid "Couldn't parse %s for split \"%s\"."
-msgstr "æ æ³è§£æåå½â%sâã"
+msgstr "æ æ³è§£æ%sçåå½\"%s\"ã"
#: gnucash/gnome/dialog-sx-editor.c:738
#, c-format
@@ -3224,11 +3222,11 @@ msgstr "å·²å建ç交æäºé¡¹"
#: gnucash/gnome/dialog-tax-info.c:289
msgid "Last Valid Year: "
-msgstr "ä¸ä¸ä¸ªææç年份ï¼"
+msgstr "ä¸ä¸ä¸ªææçå¹´ä»½ï¼ "
#: gnucash/gnome/dialog-tax-info.c:290
msgid "Form Line Data: "
-msgstr "表åè¡æ°æ®ï¼"
+msgstr "表åè¡æ°æ®ï¼ "
#. Translators: Tax Code
#: gnucash/gnome/dialog-tax-info.c:292
@@ -3264,15 +3262,15 @@ msgid "Form"
msgstr "表å"
#: gnucash/gnome/dialog-vendor.c:214
-#, fuzzy
msgid ""
"You must enter a company name. If this vendor is an individual (and not a "
"company) you should enter the same value for:\n"
"Identification - Company Name, and\n"
"Payment Address - Name."
msgstr ""
-"æ¨å¿
é¡»è¾å
¥ä¸ä¸ªå
¬å¸åç§°ã妿ä¾åºåæ¯ä¸ªäººèéå
¬å¸ï¼æ¨åºå½å°âå
¬å¸åç§°âä¸âè系人"
-"å§åâå¡«å
¥ç¸åçååã"
+"请è¾å
¥å
¬å¸åç§°ã\n"
+"è¥ä¾åºåæ¯ä¸ªäººèéå
¬å¸ï¼\n"
+"åâå
¬å¸åç§°âä¸âè系人å§åâåºç¸åã"
#: gnucash/gnome/dialog-vendor.c:226
msgid "You must enter a payment address."
@@ -3381,7 +3379,7 @@ msgstr "å计"
#: gnucash/gnome/gnc-plugin-account-tree.c:59
msgid "New Accounts _Page"
-msgstr "æ°å»ºç§ç®é¡µ(_P)"
+msgstr "ç§ç®å¯æ¬(_P)"
#: gnucash/gnome/gnc-plugin-account-tree.c:60
msgid "Open a new Account Tree page"
@@ -3389,7 +3387,7 @@ msgstr "æå¼ä¸ä¸ªæ°çæ ç¶ç§ç®è¡¨é¡µ"
#: gnucash/gnome/gnc-plugin-basic-commands.c:111
msgid "New _File"
-msgstr "æ°å»ºæä»¶(_F)"
+msgstr "æ°å»º(_F)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:112
msgid "Create a new file"
@@ -3432,7 +3430,7 @@ msgstr "éæ°å è½½å½åæ°æ®åºï¼å¹¶è¿åæææªä¿åçæ´æ¹"
#: gnucash/gnome/gnc-plugin-basic-commands.c:137
msgid "Export _Accounts"
-msgstr "导åºç§ç®(_A)"
+msgstr "ç§ç®(_A)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:138
msgid "Export the account hierarchy to a new GnuCash datafile"
@@ -3476,7 +3474,7 @@ msgstr "计å交æ(_S)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:166
msgid "_Scheduled Transaction Editor"
-msgstr "计å交æç¼è¾å¨(_S)"
+msgstr "ç¼è¾å¨(_S)"
#: gnucash/gnome/gnc-plugin-basic-commands.c:167
msgid "The list of Scheduled Transactions"
@@ -3492,7 +3490,7 @@ msgstr "å建èªä¸æ¬¡è¿è¡åç计å交æ"
#: gnucash/gnome/gnc-plugin-basic-commands.c:176
msgid "_Mortgage & Loan Repayment..."
-msgstr "å¿è¿æµæ¼æè´·æ¬¾(_M)..."
+msgstr "æµæ¼åè´·æ¬¾è¿æ¬¾(_M)..."
#: gnucash/gnome/gnc-plugin-basic-commands.c:177
msgid "Setup scheduled transactions for repayment of a loan"
@@ -3587,9 +3585,8 @@ msgid_plural ""
msgstr[0] "æ¤æ¶æ²¡æè¾å
¥ç计å交æã(èªå¨åå»ºäº %d ç¬äº¤æäºé¡¹)"
#: gnucash/gnome/gnc-plugin-budget.c:63
-#, fuzzy
msgid "_New Budget"
-msgstr "æ°å»ºé¢ç®"
+msgstr "æ°å»º(_N)"
#: gnucash/gnome/gnc-plugin-budget.c:64
#, fuzzy
@@ -3597,9 +3594,8 @@ msgid "Create a new Budget."
msgstr "å建ä¸ä¸ªæ°é¢ç®"
#: gnucash/gnome/gnc-plugin-budget.c:69
-#, fuzzy
msgid "_Open Budget"
-msgstr "æå¼é¢ç®"
+msgstr "æå¼(_O)"
#: gnucash/gnome/gnc-plugin-budget.c:70
msgid ""
@@ -3608,9 +3604,8 @@ msgid ""
msgstr ""
#: gnucash/gnome/gnc-plugin-budget.c:75
-#, fuzzy
msgid "_Copy Budget"
-msgstr "å¤å¶é¢ç®"
+msgstr "å¤å¶(_C)"
#: gnucash/gnome/gnc-plugin-budget.c:76
#, fuzzy
@@ -3619,7 +3614,7 @@ msgstr "å¤å¶ä¸ä¸ªå·²æçé¢ç®"
#: gnucash/gnome/gnc-plugin-budget.c:80
msgid "_Delete Budget"
-msgstr "å é¤é¢ç®(_D)"
+msgstr "å é¤(_D)"
#: gnucash/gnome/gnc-plugin-budget.c:81
#, fuzzy
@@ -3641,17 +3636,16 @@ msgstr "客æ·(_C)"
#: gnucash/gnome/gnc-plugin-business.c:160
msgid "Customers Overview"
-msgstr "å®¢æ·æ¦è§"
+msgstr "å®¢æ·æ¦åµ"
#: gnucash/gnome/gnc-plugin-business.c:161
-#, fuzzy
msgid "Open a Customer overview page"
-msgstr "æå¼å®¢æ·æ¦è§é¡µ"
+msgstr "æå¼å®¢æ·æ¦åµé¡µé¢"
#: gnucash/gnome/gnc-plugin-business.c:165
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:165
msgid "_New Customer..."
-msgstr "æ°å»ºå®¢æ·(_N)..."
+msgstr "æ°å¢(_N)..."
#: gnucash/gnome/gnc-plugin-business.c:166
msgid "Open the New Customer dialog"
@@ -3659,7 +3653,7 @@ msgstr "æå¼æ°å»ºå®¢æ·å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:170
msgid "_Find Customer..."
-msgstr "æ¥æ¾å®¢æ·(_F)..."
+msgstr "æ¥æ¾(_F)..."
#: gnucash/gnome/gnc-plugin-business.c:171
msgid "Open the Find Customer dialog"
@@ -3669,12 +3663,12 @@ msgstr "æå¼æ¥æ¾å®¢æ·å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:319
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:201
msgid "New _Invoice..."
-msgstr "æ°å»ºå票(_I)..."
+msgstr "æ°å¢å票(_I)..."
#: gnucash/gnome/gnc-plugin-business.c:176
#: gnucash/gnome/gnc-plugin-business.c:320
msgid "Open the New Invoice dialog"
-msgstr "æå¼æ°å»ºåç¥¨å¯¹è¯æ¡"
+msgstr "æå¼æ°å¢åç¥¨å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:180
msgid "Find In_voice..."
@@ -3687,17 +3681,17 @@ msgstr "æå¼æ¥æ¾åç¥¨å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:185
#: gnucash/gnome/gnc-plugin-business.c:228
msgid "New _Job..."
-msgstr "æ°å»ºå·¥ä½(_J)..."
+msgstr "æ°å¢é¡¹ç®(_J)..."
#: gnucash/gnome/gnc-plugin-business.c:186
#: gnucash/gnome/gnc-plugin-business.c:229
msgid "Open the New Job dialog"
-msgstr "æå¼æ°å»ºå·¥ä½å¯¹è¯æ¡"
+msgstr "æå¼æ°å¢é¡¹ç®å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:190
#: gnucash/gnome/gnc-plugin-business.c:233
msgid "Find Jo_b..."
-msgstr "æ¥æ¾å·¥ä½(_B)..."
+msgstr "æ¥æ¾é¡¹ç®(_B)..."
#: gnucash/gnome/gnc-plugin-business.c:191
#: gnucash/gnome/gnc-plugin-business.c:234
@@ -3708,7 +3702,7 @@ msgstr "æå¼æ¥æ¾å·¥ä½å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:238
#: gnucash/gnome/gnc-plugin-business.c:271
msgid "_Process Payment..."
-msgstr "å¤ç仿¬¾(_P)..."
+msgstr "仿¬¾(_P)..."
#: gnucash/gnome/gnc-plugin-business.c:196
#: gnucash/gnome/gnc-plugin-business.c:239
@@ -3718,12 +3712,11 @@ msgstr "æå¼å¤ç仿¬¾å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:202
msgid "Vendors Overview"
-msgstr "ä¾åºåæ¦è§"
+msgstr "ä¾åºåæ¦åµ"
#: gnucash/gnome/gnc-plugin-business.c:203
-#, fuzzy
msgid "Open a Vendor overview page"
-msgstr "æå¼ä¸ä¸ªæ°çæ ç¶ç§ç®è¡¨é¡µ"
+msgstr "æå¼ä¾åºåæ¦åµé¡µé¢"
#: gnucash/gnome/gnc-plugin-business.c:206
msgid "_Vendor"
@@ -3732,7 +3725,7 @@ msgstr "ä¾åºå(_V)"
#: gnucash/gnome/gnc-plugin-business.c:208
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:160
msgid "_New Vendor..."
-msgstr "æ°å¢ä¾åºå(_N)..."
+msgstr "æ°å¢(_N)..."
#: gnucash/gnome/gnc-plugin-business.c:209
msgid "Open the New Vendor dialog"
@@ -3740,7 +3733,7 @@ msgstr "æå¼æ°å¢ä¾åºåå¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:213
msgid "_Find Vendor..."
-msgstr "寻æ¾ä¾åºå(_F)..."
+msgstr "æ¥æ¾(_F)..."
#: gnucash/gnome/gnc-plugin-business.c:214
msgid "Open the Find Vendor dialog"
@@ -3749,11 +3742,11 @@ msgstr "æå¼å¯»æ¾ä¾åºåå¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:218
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:196
msgid "New _Bill..."
-msgstr "æ°å»ºè´¦å(_B)..."
+msgstr "æ°å¢è´¦å(_B)..."
#: gnucash/gnome/gnc-plugin-business.c:219
msgid "Open the New Bill dialog"
-msgstr "æå¼æ°å»ºè´¦åå¯¹è¯æ¡"
+msgstr "æå¼æ°å¢è´¦åå¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:223
msgid "Find Bi_ll..."
@@ -3765,12 +3758,11 @@ msgstr "æå¼æ¥æ¾è´¦åå¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:245
msgid "Employees Overview"
-msgstr "åå·¥æ¦è§"
+msgstr "åå·¥æ¦åµ"
#: gnucash/gnome/gnc-plugin-business.c:246
-#, fuzzy
msgid "Open a Employee overview page"
-msgstr "æå¼åå·¥æ¦è§é¡µ"
+msgstr "æå¼åå·¥æ¦åµé¡µé¢"
#: gnucash/gnome/gnc-plugin-business.c:249
msgid "_Employee"
@@ -3779,15 +3771,15 @@ msgstr "åå·¥(_E)"
#: gnucash/gnome/gnc-plugin-business.c:251
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:170
msgid "_New Employee..."
-msgstr "æ°å»ºåå·¥(_N)..."
+msgstr "æ°å¢(_N)..."
#: gnucash/gnome/gnc-plugin-business.c:252
msgid "Open the New Employee dialog"
-msgstr "æå¼æ°å»ºåå·¥å¯¹è¯æ¡"
+msgstr "æå¼æ°å¢åå·¥å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:256
msgid "_Find Employee..."
-msgstr "æ¥æ¾åå·¥(_F)..."
+msgstr "æ¥æ¾(_F)..."
#: gnucash/gnome/gnc-plugin-business.c:257
msgid "Open the Find Employee dialog"
@@ -3795,11 +3787,11 @@ msgstr "æå¼æ¥æ¾åå·¥å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:261
msgid "New _Expense Voucher..."
-msgstr "æ°å»ºæ¯åºåè¯(_E)..."
+msgstr "æ°å¢æ¯åºåè¯(_E)..."
#: gnucash/gnome/gnc-plugin-business.c:262
msgid "Open the New Expense Voucher dialog"
-msgstr "æå¼æ°å»ºæ¯åºåè¯å¯¹è¯æ¡"
+msgstr "æå¼æ°å¢æ¯åºåè¯å¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:266
msgid "Find Expense _Voucher..."
@@ -3811,7 +3803,7 @@ msgstr "æå¼æ¥æ¾æ¯åºåè¯å¯¹è¯æ¡(_V)"
#: gnucash/gnome/gnc-plugin-business.c:278
msgid "Business Linked Documents"
-msgstr "龿¥æä»¶"
+msgstr "已龿¥æä»¶"
#: gnucash/gnome/gnc-plugin-business.c:279
msgid "View all Linked Business Documents"
@@ -3819,7 +3811,7 @@ msgstr "æ¥çææé¾æ¥æä»¶"
#: gnucash/gnome/gnc-plugin-business.c:283
msgid "Sales _Tax Table"
-msgstr "éå®ç¨ç表(_T)"
+msgstr "ç¨ç表(_T)"
#: gnucash/gnome/gnc-plugin-business.c:284
msgid "View and edit the list of Sales Tax Tables (GST/VAT)"
@@ -3827,7 +3819,7 @@ msgstr "æ¥çå¹¶ç¼è¾éå®ç¨ç表çå表"
#: gnucash/gnome/gnc-plugin-business.c:288
msgid "_Billing Terms Editor"
-msgstr "ç»ç®æ¡æ¬¾ç¼è¾å¨(_B)"
+msgstr "è´¦æç¼è¾å¨(_B)"
#: gnucash/gnome/gnc-plugin-business.c:289
msgid "View and edit the list of Billing Terms"
@@ -3835,16 +3827,15 @@ msgstr "æ¥çå¹¶ç¼è¾å¸æ"
#: gnucash/gnome/gnc-plugin-business.c:293
msgid "Bills _Due Reminder"
-msgstr "è´¦åå°ææé(_D)"
+msgstr "åºä»æé(_D)"
#: gnucash/gnome/gnc-plugin-business.c:294
msgid "Open the Bills Due Reminder dialog"
msgstr "æå¼è´¦åå°ææéå¯¹è¯æ¡"
#: gnucash/gnome/gnc-plugin-business.c:298
-#, fuzzy
msgid "Invoices _Due Reminder"
-msgstr "åç¥¨å°ææé(_D)"
+msgstr "åºæ¶æé(_D)"
#: gnucash/gnome/gnc-plugin-business.c:299
#, fuzzy
@@ -3887,7 +3878,7 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-page-invoice.c:113
#: gnucash/gtkbuilder/dialog-import.glade:29
msgid "New _Account..."
-msgstr "æ°å»ºä¼è®¡ç§ç®(_A)..."
+msgstr "æ°å»ºç§ç®(_A)..."
#: gnucash/gnome/gnc-plugin-page-account-tree.c:199
msgid "Create a new Account"
@@ -3895,7 +3886,7 @@ msgstr "å建ä¸ä¸ªæ°ç§ç®"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:203
msgid "New Account _Hierarchy..."
-msgstr "æ°å»ºç§ç®å±æ¬¡(_H)..."
+msgstr "æ°å¢å±çº§ç§ç®(_H)..."
#: gnucash/gnome/gnc-plugin-page-account-tree.c:204
msgid "Extend the current book by merging with new account type categories"
@@ -3925,7 +3916,6 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-page-account-tree.c:228
#: gnucash/gnome/gnc-plugin-page-account-tree.c:239
#: gnucash/gnome/gnc-plugin-page-account-tree.c:349
-#, fuzzy
msgid "Open _SubAccounts"
msgstr "æå¼åç§ç®(_S)"
@@ -3964,9 +3954,8 @@ msgid "Delete selected account"
msgstr "å é¤éä¸çç§ç®"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:257
-#, fuzzy
msgid "_Cascade Account Properties..."
-msgstr "ç§ç®é¢è²(_C)..."
+msgstr "éå½ç§ç®å±æ§(_C)..."
#: gnucash/gnome/gnc-plugin-page-account-tree.c:258
#, fuzzy
@@ -3977,9 +3966,8 @@ msgstr "è¯·éæ©ææç贷款ç§ç®"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:267
#: gnucash/gnome/gnc-plugin-page-register2.c:250
#: gnucash/gnome/gnc-plugin-page-register.c:359
-#, fuzzy
msgid "F_ind Account"
-msgstr "æ¥æ¾ç§ç®"
+msgstr "æ¥æ¾ç§ç®(_I)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:263
#: gnucash/gnome/gnc-plugin-page-account-tree.c:268
@@ -4004,7 +3992,7 @@ msgstr "为éä¸çç§ç®çåç§ç®éæ°ç¼å·"
#: gnucash/gnome/gnc-plugin-page-register.c:458
#: gnucash/gnome-utils/gnc-main-window.c:345
msgid "_Filter By..."
-msgstr "è¿æ»¤(_F)..."
+msgstr "çé(_F)..."
#: gnucash/gnome/gnc-plugin-page-account-tree.c:294
#: gnucash/gnome/gnc-plugin-page-budget.c:198
@@ -4045,7 +4033,7 @@ msgstr "对éä¸çç§ç®è¿è¡å¯¹è´¦"
#: gnucash/gnome/gnc-plugin-page-register2.c:362
#: gnucash/gnome/gnc-plugin-page-register.c:480
msgid "_Auto-clear..."
-msgstr "èªå¨ç»æ¸
(_A)..."
+msgstr "èªå¨ç»ç®(_A)..."
#: gnucash/gnome/gnc-plugin-page-account-tree.c:307
msgid "Automatically clear individual transactions, given a cleared amount"
@@ -4080,9 +4068,8 @@ msgstr "è®°å½ä¸æ¬¡è¡ç¥¨æåæåå¹¶"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:321
#: gnucash/gnome/gnc-plugin-page-register2.c:372
#: gnucash/gnome/gnc-plugin-page-register.c:490
-#, fuzzy
msgid "View _Lots..."
-msgstr "æ¾ç¤º _Lot ..."
+msgstr ""
#: gnucash/gnome/gnc-plugin-page-account-tree.c:322
#: gnucash/gnome/gnc-plugin-page-register2.c:373
@@ -4093,7 +4080,7 @@ msgstr "æ¾ç¤º Lot æ¥çåç¼è¾çªå£"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:326
msgid "Check & Repair A_ccount"
-msgstr "æ£æ¥åä¿®å¤ç§ç®(_C)"
+msgstr "ç§ç®(_C)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:327
#: gnucash/gnome/window-reconcile2.c:2149 gnucash/gnome/window-reconcile.c:2370
@@ -4104,7 +4091,7 @@ msgstr "æ£æ¥å¹¶ä¿®å¤å¨æ¤ç§ç®ä¸æªç»ç®ç交æäºé¡¹ä¸å¤ç«çåå½
#: gnucash/gnome/gnc-plugin-page-account-tree.c:331
msgid "Check & Repair Su_baccounts"
-msgstr "æ£æ¥åä¿®å¤åç§ç®(_B)"
+msgstr "åç§ç®(_B)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:332
msgid ""
@@ -4114,7 +4101,7 @@ msgstr "æ£æ¥å¹¶ä¿®å¤å¨æ¤ç§ç®åå
¶åç§ç®ä¸æªç»ç®ç交æäºé¡¹ä¸
#: gnucash/gnome/gnc-plugin-page-account-tree.c:337
msgid "Check & Repair A_ll"
-msgstr "æ£æ¥åä¿®å¤ææç§ç®(_L)"
+msgstr "ææç§ç®(_L)"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:338
msgid ""
@@ -4198,12 +4185,14 @@ msgid "Accounts"
msgstr "ç§ç®"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1429
-#, fuzzy, c-format
+#, c-format
msgid ""
"Account %s does not have the same currency as the one you're moving "
"transactions from.\n"
"Are you sure you want to do this?"
-msgstr "æ¨è¦è¦çä¸ç¬ç°æç交æäºé¡¹ãæ¨ç¡®å®è¦è¿ä¹åä¹ï¼"
+msgstr ""
+"ç§ç®%sçå¸ç§ä¸æºç§ç®ä¸åï¼\n"
+"ç¡®å®è¦è¿æ ·ååï¼"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1437
#, fuzzy
@@ -4340,7 +4329,7 @@ msgstr "ç¼è¾éä¸çç§ç®"
#: gnucash/gnome/gnc-plugin-page-budget.c:187
#: gnucash/report/reports/standard/budget.scm:39
msgid "Budget Report"
-msgstr "é¢ç®æ¥è¡¨"
+msgstr "年度"
#: gnucash/gnome/gnc-plugin-page-budget.c:189
#, fuzzy
@@ -4578,7 +4567,7 @@ msgstr "åæ¶å票å
¥è´¦(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:301
msgid "New _Invoice"
-msgstr "æ°å»ºå票(_I)"
+msgstr "æ°å¢å票(_I)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:302
msgid "_Pay Invoice"
@@ -4640,9 +4629,8 @@ msgid "_Unpost Bill"
msgstr "åæ¶å票å
¥è´¦(_U)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:322
-#, fuzzy
msgid "New _Bill"
-msgstr "æ°å»ºè´¦å"
+msgstr "æ°å¢è´¦å(_B)"
#: gnucash/gnome/gnc-plugin-page-invoice.c:323
#, fuzzy
@@ -5036,9 +5024,8 @@ msgid "Create a new invoice"
msgstr "å建ä¸å¼ æ°çå票"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:206
-#, fuzzy
msgid "New _Voucher..."
-msgstr "æ°å»ºæ¯åºåè¯(_E)..."
+msgstr "æ°å¢åè¯(_V)..."
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:207
#, fuzzy
@@ -5139,17 +5126,17 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-page-register2.c:194
#: gnucash/gnome/gnc-plugin-page-register.c:292
msgid "Cu_t Transaction"
-msgstr "åªå交æäºé¡¹(_T)"
+msgstr "åªå交æ(_T)"
#: gnucash/gnome/gnc-plugin-page-register2.c:195
#: gnucash/gnome/gnc-plugin-page-register.c:293
msgid "_Copy Transaction"
-msgstr "å¤å¶äº¤æäºé¡¹(_C)"
+msgstr "å¤å¶äº¤æ(_C)"
#: gnucash/gnome/gnc-plugin-page-register2.c:196
#: gnucash/gnome/gnc-plugin-page-register.c:294
msgid "_Paste Transaction"
-msgstr "ç²è´´äº¤æäºé¡¹(_P)"
+msgstr "ç²è´´äº¤æ(_P)"
#: gnucash/gnome/gnc-plugin-page-register2.c:197
#: gnucash/gnome/gnc-plugin-page-register.c:295
@@ -5165,19 +5152,16 @@ msgstr "å é¤äº¤æäºé¡¹(_D)"
#: gnucash/gnome/gnc-plugin-page-register2.c:199
#: gnucash/gnome/gnc-plugin-page-register.c:308
-#, fuzzy
msgid "Cu_t Split"
-msgstr "åªååå½(_t)"
+msgstr "åªååå½(_T)"
#: gnucash/gnome/gnc-plugin-page-register2.c:200
#: gnucash/gnome/gnc-plugin-page-register.c:309
-#, fuzzy
msgid "_Copy Split"
msgstr "å¤å¶åå½(_C)"
#: gnucash/gnome/gnc-plugin-page-register2.c:201
#: gnucash/gnome/gnc-plugin-page-register.c:310
-#, fuzzy
msgid "_Paste Split"
msgstr "ç²è´´åå½(_P)"
@@ -5531,7 +5515,7 @@ msgstr "计å"
#: gnucash/gnome/gnc-plugin-page-register.c:630
#: gnucash/gnome/window-autoclear.c:88
msgid "Auto-clear"
-msgstr "èªå¨ç»æ¸
"
+msgstr "èªå¨ç»ç®"
#: gnucash/gnome/gnc-plugin-page-register2.c:681
msgid ""
@@ -6603,9 +6587,8 @@ msgstr "æ¾ç¤º ~a æ¥è¡¨"
#: gnucash/gnome/report-menus.scm:90
#: gnucash/gtkbuilder/dialog-custom-report.glade:8
-#, fuzzy
msgid "Saved Report Configurations"
-msgstr "设置é
置路å¾"
+msgstr "å·²ä¿åæ¥è¡¨æ¨¡æ¿"
#: gnucash/gnome/report-menus.scm:92
#, fuzzy
@@ -6848,7 +6831,7 @@ msgstr "ç¼è¾è¿ä¸ªè´¦ç°¿ç主ç§ç®"
#: gnucash/gnome/window-reconcile2.c:2148 gnucash/gnome/window-reconcile.c:2369
#: gnucash/gnome-utils/gnc-main-window.c:356
msgid "_Check & Repair"
-msgstr "æ£æ¥åä¿®å¤(_C)"
+msgstr "æ£æ¥ä¿®å¤(_C)"
#: gnucash/gnome/window-reconcile2.c:2157 gnucash/gnome/window-reconcile.c:2378
#: gnucash/gtkbuilder/dialog-account.glade:1753
@@ -6868,9 +6851,8 @@ msgid "Delete the selected transaction"
msgstr "å é¤éå®ç交æäºé¡¹"
#: gnucash/gnome/window-reconcile2.c:2172 gnucash/gnome/window-reconcile.c:2393
-#, fuzzy
msgid "_Reconcile Selection"
-msgstr "对账ç§ç®"
+msgstr "对账已é交æ(_R)"
#: gnucash/gnome/window-reconcile2.c:2173 gnucash/gnome/window-reconcile.c:2394
#, fuzzy
@@ -7437,16 +7419,16 @@ msgid ""
msgstr ""
#: gnucash/gnome-utils/dialog-account.c:2312
-#, fuzzy, c-format
+#, c-format
msgid ""
"Set the account placeholder value for account '%s' including all sub-accounts"
-msgstr "åªæ¾ç¤ºç¶ç§ç®çä½é¢ï¼ä¸å
æ¬ä»»ä½åç§ç®ã"
+msgstr "为ç§ç®'%s'åå
¶ææåç§ç®è®¾ç½®å ä½ç¬¦"
#: gnucash/gnome-utils/dialog-account.c:2326
-#, fuzzy, c-format
+#, c-format
msgid ""
"Set the account hidden value for account '%s' including all sub-accounts"
-msgstr "åªæ¾ç¤ºç¶ç§ç®çä½é¢ï¼ä¸å
æ¬ä»»ä½åç§ç®ã"
+msgstr "为ç§ç®'%s'åå
¶ææåç§ç®è®¾ç½®éè"
#: gnucash/gnome-utils/dialog-book-close.c:294
msgid "Please select an Equity account to hold the total Period Income."
@@ -7471,7 +7453,7 @@ msgid ""
"Commodity: "
msgstr ""
"\n"
-"ååï¼"
+"ååï¼ "
#. Translators: Replace here and later CUSIP by the name of your local
#. National Securities Identifying Number
@@ -7484,7 +7466,7 @@ msgid ""
"Exchange code (ISIN, CUSIP or similar): "
msgstr ""
"\n"
-"交æä»£ç (ISIN(å½é
è¯å¸è¯å«å·ç )ãCUSIP(ç¾å½è¯å¸åºæ¯æ®å·ç )ç)ï¼"
+"交æä»£ç (ISIN(å½é
è¯å¸è¯å«å·ç )ãCUSIP(ç¾å½è¯å¸åºæ¯æ®å·ç )ç)ï¼ "
#: gnucash/gnome-utils/dialog-commodity.c:176
msgid ""
@@ -7492,7 +7474,7 @@ msgid ""
"Mnemonic (Ticker symbol or similar): "
msgstr ""
"\n"
-"å©è®°ç¬¦å· (è¯å¸ä»£ç ç)ï¼"
+"å©è®°ç¬¦å· (è¯å¸ä»£ç ç)ï¼ "
#: gnucash/gnome-utils/dialog-commodity.c:275
msgid "Select security/currency"
@@ -7611,7 +7593,7 @@ msgstr "ç¼å·(_N)ï¼"
#: gnucash/gnome-utils/dialog-file-access.c:303
msgid "Open..."
-msgstr "æå¼(_O)..."
+msgstr "æå¼..."
#: gnucash/gnome-utils/dialog-file-access.c:304
#: gnucash/gnome-utils/gnc-file.c:88
@@ -7816,7 +7798,7 @@ msgstr "æ¶å
¥%så·¥èµ%såºç¨"
#: gnucash/gnome-utils/dialog-preferences.c:899
msgid "Path does not exist, "
-msgstr "è·¯å¾ä¸åå¨ï¼"
+msgstr "è·¯å¾ä¸åå¨ï¼ "
#: gnucash/gnome-utils/dialog-preferences.c:955
#: gnucash/gnome-utils/dialog-preferences.c:1462
@@ -8120,7 +8102,7 @@ msgstr "æ¥ç(_V)"
#: gnucash/gnome-utils/gnc-dense-cal.c:335
#: gnucash/report/stylesheets/footer.scm:383
msgid "Date: "
-msgstr "æ¥æï¼"
+msgstr "æ¥æï¼ "
#: gnucash/gnome-utils/gnc-dense-cal.c:348
#: gnucash/gnome-utils/gnc-tree-view-sx-list.c:147
@@ -8630,7 +8612,7 @@ msgstr "éç½®ææè¦åæ¶æ¯çç¶æä»¥æ¾ç¤ºå®ä»¬ã"
#: gnucash/gnome-utils/gnc-main-window.c:363
msgid "Re_name Page"
-msgstr "页颿¹å(_N)"
+msgstr "账簿æ¹å(_N)"
#: gnucash/gnome-utils/gnc-main-window.c:364
msgid "Rename this page."
@@ -8686,11 +8668,11 @@ msgstr "卿¤çªå£ä¸æ¾ç¤º/éèå·¥å
·æ "
#: gnucash/gnome-utils/gnc-main-window.c:412
msgid "Su_mmary Bar"
-msgstr "æ¦è¦æ (_M)"
+msgstr "æ±æ»æ (_M)"
#: gnucash/gnome-utils/gnc-main-window.c:413
msgid "Show/hide the summary bar on this window"
-msgstr "卿¤çªå£ä¸æ¾ç¤º/éèæ¦è¦æ "
+msgstr "æ¤çªå£æ¾ç¤º/éèæ±æ»æ "
#: gnucash/gnome-utils/gnc-main-window.c:417
msgid "Stat_us Bar"
@@ -10101,19 +10083,16 @@ msgid ""
msgstr ""
#: gnucash/gnucash-cli.cpp:113
-#, fuzzy
msgid "Name of the report to run\n"
-msgstr "å
¬å¸çåç§°"
+msgstr "è¦è¿è¡çæ¥è¡¨\n"
#: gnucash/gnucash-cli.cpp:115
-#, fuzzy
msgid "Specify export type\n"
-msgstr "éæ©ææ£ç±»å"
+msgstr "æå®ææ£ç±»å\n"
#: gnucash/gnucash-cli.cpp:117
-#, fuzzy
msgid "Output file for report\n"
-msgstr "æ¥è¡¨çå¢çº¸çã"
+msgstr "æ¥è¡¨çè¾åºæä»¶\n"
#: gnucash/gnucash-cli.cpp:132
msgid "Unknown quotes command '{1}'"
@@ -10138,9 +10117,8 @@ msgid "Missing command or option"
msgstr "è¿æ¯ä¸ä¸ªé¢è²é项ã"
#: gnucash/gnucash-commands.cpp:91
-#, fuzzy
msgid "No quotes retrieved. Finance::Quote isn't installed properly."
-msgstr "æªè·å任使¥ä»·ãFinance::Quote å¹¶æªæ£ç¡®å°å®è£
ã\n"
+msgstr "æ²¡ææ£ç´¢å°æ¥ä»·ï¼å°æªæ£ç¡®å®è£
Finance::Quoteã"
#: gnucash/gnucash-core-app.cpp:81
msgid "This is a development version. It may or may not work."
@@ -10170,9 +10148,8 @@ msgid "{1} [options] [datafile]"
msgstr ""
#: gnucash/gnucash-core-app.cpp:298
-#, fuzzy
msgid "GnuCash {1}"
-msgstr "GnuCash "
+msgstr "GnuCash {1}"
#: gnucash/gnucash-core-app.cpp:299
#, fuzzy
@@ -10834,7 +10811,7 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.dialogs.export.csv.gschema.xml.in:17
msgid "Window geometry"
-msgstr ""
+msgstr "çªå£å½¢ç¶"
#: gnucash/gschemas/org.gnucash.dialogs.export.csv.gschema.xml.in:18
#, fuzzy
@@ -11212,7 +11189,7 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:15
msgid "Save window sizes and locations"
-msgstr "ä¿åçªå£ç大å°åä½ç½®"
+msgstr "ä¿å大å°åä½ç½®"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:16
msgid ""
@@ -11450,7 +11427,7 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:125
msgid "Show close buttons on notebook tabs"
-msgstr "å¨é¡µé¢æ ç¾ä¸æ¾ç¤ºå
³éæé®"
+msgstr "å
³éæé®"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:126
msgid ""
@@ -11605,7 +11582,7 @@ msgstr "妿éä¸ï¼å¯å¨æ¶å°æ¾ç¤ºå¯å¨ç»é¢ãå¦åå°±ä¸ä¼æ¾ç¤ºå¯
#: gnucash/gschemas/org.gnucash.gschema.xml.in:190
#: gnucash/gtkbuilder/dialog-preferences.glade:3366
msgid "Display the notebook tabs at the top of the window."
-msgstr "å¨çªå£é¡¶é¨æ¾ç¤ºç§ç®é¡µæ ç¾ã"
+msgstr "顶鍿¾ç¤ºç§ç®é¡µã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:191
#: gnucash/gschemas/org.gnucash.gschema.xml.in:196
@@ -11622,22 +11599,22 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:195
#: gnucash/gtkbuilder/dialog-preferences.glade:3385
msgid "Display the notebook tabs at the bottom of the window."
-msgstr "å¨çªå£åºé¨æ¾ç¤ºç§ç®é¡µæ ç¾ã"
+msgstr "åºé¨æ¾ç¤ºç§ç®é¡µã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:200
#: gnucash/gtkbuilder/dialog-preferences.glade:3404
msgid "Display the notebook tabs at the left of the window."
-msgstr "å¨çªå£å·¦ä¾§æ¾ç¤ºç§ç®é¡µæ ç¾ã"
+msgstr "左侧æ¾ç¤ºç§ç®é¡µã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:205
#: gnucash/gtkbuilder/dialog-preferences.glade:3423
msgid "Display the notebook tabs at the right of the window."
-msgstr "å¨çªå£å³ä¾§æ¾ç¤ºç§ç®é¡µæ ç¾ã"
+msgstr "å³ä¾§æ¾ç¤ºç§ç®é¡µã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:210
#: gnucash/gtkbuilder/dialog-preferences.glade:3455
msgid "Display the summary bar at the top of the page."
-msgstr "å¨çªå£é¡¶é¨æ¾ç¤ºæè¦ã"
+msgstr "å¨çªå£é¡¶é¨æ¾ç¤ºæ±æ»æ ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:211
#: gnucash/gschemas/org.gnucash.gschema.xml.in:216
@@ -11645,19 +11622,17 @@ msgid ""
"This setting determines the edge at which the summary bar for various pages "
"is drawn. Possible values are \"top\" and \"bottom\". It defaults to \"bottom"
"\"."
-msgstr ""
-"æ¤è®¾ç½®æå®äºå¨åç§ç§ç®é¡µä¸åªéæ¾ç¤ºæè¦æ ãå¯è½çå¼ä¸ºâtopâåâbottomâãé»è®¤"
-"为âbottomâã"
+msgstr "æ¤ç½®è®¾ç½®ä¸»çé¢åªéæ¾ç¤ºæ±æ»æ ï¼å¯ä»¥æ¯âtopâæâbottomâï¼é»è®¤âbottomâã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:215
#: gnucash/gtkbuilder/dialog-preferences.glade:3474
msgid "Display the summary bar at the bottom of the page."
-msgstr "å¨çªå£åºé¨æ¾ç¤ºæè¦ã"
+msgstr "å¨çªå£åºé¨æ¾ç¤ºæ±æ»æ ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:220
#: gnucash/gtkbuilder/dialog-preferences.glade:3324
msgid "Closing a tab moves to the most recently visited tab."
-msgstr "å
³éæ ç¾é¡µåç§»å¨è³æè¿è®¿é®è¿çæ ç¾é¡µã"
+msgstr "å
³éç§ç®é¡µåç§»è³æè¿è®¿é®è¿çç§ç®é¡µã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:221
msgid ""
@@ -13268,7 +13243,6 @@ msgid "Choose accounts to create"
msgstr "éæ©è¦å建çç§ç®"
#: gnucash/gtkbuilder/assistant-hierarchy.glade:537
-#, fuzzy
msgid ""
"\n"
"If you would like to change an account's name, click on the row containing "
@@ -13289,14 +13263,12 @@ msgstr ""
"\n"
"å¦ææ¨æ³ä¿®æ¹ç§ç®åï¼ç¹å»å«æè¯¥ç§ç®åçè¡ï¼ç¶åç¹å»ç§ç®åå¹¶ä¸ä¿®æ¹å®ã\n"
"\n"
-"ä¸äºç§ç®è¢«æ 记为âå ä½ç¬¦âãå ä½ç§ç®æ¯ç¨äºå建ç§ç®å±æ¬¡ç¨çï¼é常ä¸ä¼å«æäº¤æäº"
-"项ææåä½é¢ã妿æ¨å¸æä¸ä¸ªç§ç®æ¯ä¸ä¸ªå ä½ç§ç®ï¼åªéè¦ç¹å»ç¸åºç§ç®çéæ©"
-"æ¡ã\n"
+"ä¸äºç§ç®è¢«æ 记为âå ä½ç¬¦âãå ä½ç§ç®æ¯ç¨äºå建ç§ç®å±æ¬¡ç¨çï¼é常ä¸ä¼å«æäº¤æäºé¡¹ææåä½é¢ã妿æ¨å¸æä¸ä¸ªç§ç®æ¯ä¸ä¸ªå ä½ç§ç®ï¼åªéè¦ç¹å»ç¸åºç§ç®çéæ©æ¡ã"
+"\n"
"\n"
-"妿æ¨å¸æä¸ä¸ªç§ç®ææåä½é¢ï¼ç¹å»è¯¥ç§ç®ä¸çä¸è¡ï¼ç¶åç¹å»ç§ç®åï¼å¹¶ä¸è¾å
¥ä¸"
-"个å¼å§æ¶çä½é¢ã\n"
+"妿æ¨å¸æä¸ä¸ªç§ç®ææåä½é¢ï¼ç¹å»è¯¥ç§ç®ä¸çä¸è¡ï¼ç¶åç¹å»ç§ç®åï¼å¹¶ä¸è¾å
¥ä¸ä¸ªå¼å§æ¶çä½é¢ã\n"
"\n"
-"注æï¼é¤äºææè
æçç§ç®åå ä½ç§ç®å¤ï¼ææç§ç®é½å¯ä»¥ææåä½é¢ã\n"
+"<b>注æ</b>ï¼é¤äºææè
æçç§ç®åå ä½ç§ç®å¤ï¼ææç§ç®é½å¯ä»¥ææåä½é¢ã\n"
#: gnucash/gtkbuilder/assistant-hierarchy.glade:575
msgid "Setup selected accounts"
@@ -13625,7 +13597,6 @@ msgstr "导å
¥QIFæ ¼å¼æä»¶"
#. Run the assistant in your language to see GTK's translation of the button labels.
#: gnucash/gtkbuilder/assistant-qif-import.glade:54
-#, fuzzy
msgid ""
"GnuCash can import financial data from QIF (Quicken Interchange Format) "
"files written by Quicken/QuickBooks, MS Money, Moneydance, and many other "
@@ -13637,13 +13608,12 @@ msgid ""
"Click \"Next\" to start loading your QIF data, or \"Cancel\" to abort the "
"process."
msgstr ""
-"GnuCash å¯ä»¥ä» Quicken/QuickBooksãMS MoneyãMoneydance以åå
¶å®ç¨åºçæç "
-"QIF (Quicken Interchange Format) ä¸å¯¼å
¥è´¢å¡æ°æ®ã\n"
+"GnuCash å¯ä»¥ä» Quicken/QuickBooksãMS MoneyãMoneydance以åå
¶å®ç¨åºçæç QIF (Quicken "
+"Interchange Format) ä¸å¯¼å
¥è´¢å¡æ°æ®ã\n"
"\n"
-"导å
¥è¿ç¨æå 个æ¥éª¤ã卿¨æå䏿¥ç¹å»âåºç¨âåï¼æ¨ç GnuCash ç§ç®å°ä¸ä¼è¢«æ¹"
-"å¨ã\n"
+"导å
¥è¿ç¨æå 个æ¥éª¤ã卿¨æå䏿¥ç¹å»âåºç¨âåï¼æ¨ç GnuCash ç§ç®å°ä¸ä¼è¢«æ¹å¨ã\n"
"\n"
-"å¼å§å è½½ QIF æ°æ®è¯·ç¹å»âåè¿âï¼éåºè¿ç¨è¯·ç¹å»âåæ¶âã "
+"å¼å§å è½½ QIF æ°æ®è¯·ç¹å»âåè¿âï¼éåºè¿ç¨è¯·ç¹å»âåæ¶âã"
#: gnucash/gtkbuilder/assistant-qif-import.glade:63
msgid "Import QIF files"
@@ -13735,7 +13705,6 @@ msgstr "设å®é»è®¤ç QIF ç§ç®å"
#. Run the assistant in your language to see GTK's translation of the button labels.
#: gnucash/gtkbuilder/assistant-qif-import.glade:468
-#, fuzzy
msgid ""
"Click \"Load another file\" if you have more data to import at this time. Do "
"this if you have saved your accounts to separate QIF files.\n"
@@ -13743,10 +13712,9 @@ msgid ""
"Click \"Next\" to finish loading files and move to the next step of the QIF "
"import process."
msgstr ""
-"妿æ¨å¸ææ¤æ¶å¯¼å
¥æ´å¤æ°æ®ï¼è¯·ç¹å»âå è½½å
¶å®æä»¶âã妿æ¨å°æ¨çç§ç®ä¿åäºä¸å"
-"ç QIF æä»¶çè¯è¯·è¿ä¹åã\n"
+"妿æ¨å¸ææ¤æ¶å¯¼å
¥æ´å¤æ°æ®ï¼è¯·ç¹å»âå è½½å
¶å®æä»¶âã妿æ¨å°æ¨çç§ç®ä¿åäºä¸åç QIF æä»¶çè¯è¯·è¿ä¹åã\n"
"\n"
-"ç»æå è½½æä»¶ï¼å¹¶ä¸è¿å
¥ QIF 导å
¥è¿ç¨çä¸ä¸æ¥ï¼è¯·ç¹å»âåè¿âã "
+"ç»æå è½½æä»¶ï¼å¹¶ä¸è¿å
¥ QIF 导å
¥è¿ç¨çä¸ä¸æ¥ï¼è¯·ç¹å»âåè¿âã"
#: gnucash/gtkbuilder/assistant-qif-import.glade:487
msgid "_Unload selected file"
@@ -13840,7 +13808,6 @@ msgid "Match QIF categories with GnuCash accounts"
msgstr "å¹é
QIF ç±»å«ä¸ GnuCash ç§ç®"
#: gnucash/gtkbuilder/assistant-qif-import.glade:802
-#, fuzzy
msgid ""
"QIF files downloaded from banks and other financial institutions may not "
"have information about Accounts and Categories which would allow them to be "
@@ -13851,12 +13818,10 @@ msgid ""
"these transactions are assigned to the 'Unspecified' account in GnuCash. If "
"you select a different account, it will be remembered for future QIF files."
msgstr ""
-"ä»é¶è¡æå
¶ä»éèæºæä¸è½½ç QIF æä»¶å¯è½æ²¡æå
³äºç§ç®ãç±»å«çä¿¡æ¯ï¼è¿ç±»ä¿¡æ¯å¯ä»¥"
-"帮å©å°è¿äºäº¤æäºé¡¹æ£ç¡®çåé
å°ç¸åºç GnuCash ç§ç®ã\n"
+"ä»é¶è¡æå
¶ä»éèæºæä¸è½½ç QIF æä»¶å¯è½æ²¡æå
³äºç§ç®ãç±»å«çä¿¡æ¯ï¼è¿ç±»ä¿¡æ¯å¯ä»¥å¸®å©å°è¿äºäº¤æäºé¡¹æ£ç¡®çåé
å°ç¸åºç GnuCash ç§ç®ã\n"
"\n"
-"å¨ä¸ä¸é¡µï¼æ¨å°ä¼çå°å¨äº¤ææ¶æ¬¾äººå夿³¨å段æ¾ç¤ºçæåï¼ä½æ¯æ²¡æ QIF ç§ç®æç±»"
-"å«ãé»è®¤æ
åµä¸ï¼è¿äºäº¤æäºé¡¹å°ä¼å¨ GnuCash ä¸åé
å°âæªæå®âç§ç®ä¸ã妿æ¨éæ©"
-"äºä¸åçç§ç®ï¼è¿å被记ä½ï¼å¹¶å¨å°æ¥å¯¼å
¥ QIF æä»¶çæ¶å帮æ¨éæ©å®ä»¬ã "
+"å¨ä¸ä¸é¡µï¼æ¨å°ä¼çå°å¨äº¤ææ¶æ¬¾äººå夿³¨å段æ¾ç¤ºçæåï¼ä½æ¯æ²¡æ QIF ç§ç®æç±»å«ãé»è®¤æ
åµä¸ï¼è¿äºäº¤æäºé¡¹å°ä¼å¨ GnuCash "
+"ä¸åé
å°âæªæå®âç§ç®ä¸ã妿æ¨éæ©äºä¸åçç§ç®ï¼è¿å被记ä½ï¼å¹¶å¨å°æ¥å¯¼å
¥ QIF æä»¶çæ¶å帮æ¨éæ©å®ä»¬ã"
#: gnucash/gtkbuilder/assistant-qif-import.glade:815
msgid "Payees and memos"
@@ -14805,9 +14770,8 @@ msgid "Discount Day"
msgstr "ææ£æ¥æ°ï¼"
#: gnucash/gtkbuilder/dialog-billterms.glade:249
-#, fuzzy
msgid "Cutoff Day"
-msgstr "æªæ¢æ¥ï¼ "
+msgstr "æªæ¢æ¥æ"
#: gnucash/gtkbuilder/dialog-billterms.glade:263
#, fuzzy
@@ -14973,9 +14937,7 @@ msgid ""
"Enter the ticker symbol for the commodity (e.g. CSCO or AAPL). If you are "
"retrieving quotes online, this field must exactly match the ticker symbol "
"used by the quote source (including case). "
-msgstr ""
-"è¾å
¥ååçè¡ç¥¨ä»£ç ï¼ä¾å¦CSCOæAAPLï¼ã妿éè¦ä½¿ç¨å¨çº¿æ£ç´¢ï¼åæ¤å段å¿
é¡»ä¸å¼"
-"ç¨æºä½¿ç¨çè¡ç¥¨ä»£ç å®å
¨å¹é
ï¼å
æ¬å¤§å°åï¼ã"
+msgstr "è¾å
¥ååçè¡ç¥¨ä»£ç ï¼ä¾å¦CSCOæAAPLï¼ã妿éè¦ä½¿ç¨å¨çº¿æ£ç´¢ï¼åæ¤å段å¿
é¡»ä¸å¼ç¨æºä½¿ç¨çè¡ç¥¨ä»£ç å®å
¨å¹é
ï¼å
æ¬å¤§å°åï¼ã "
#: gnucash/gtkbuilder/dialog-commodity.glade:165
msgid ""
@@ -15219,9 +15181,8 @@ msgid "Question"
msgstr "é®é¢"
#: gnucash/gtkbuilder/dialog-doclink.glade:49
-#, fuzzy
msgid "Change Linked Document path head"
-msgstr "å·²æå
³èæ¯ "
+msgstr "å·²æå
³èæ¯"
#: gnucash/gtkbuilder/dialog-doclink.glade:85
msgid ""
@@ -15240,9 +15201,8 @@ msgid "Note: Only Document Links that are not read-only will be changed."
msgstr ""
#: gnucash/gtkbuilder/dialog-doclink.glade:279
-#, fuzzy
msgid "Linked _File"
-msgstr "å·¥ä½å¯¹è¯æ¡"
+msgstr "龿¥çæä»¶(_F)"
#: gnucash/gtkbuilder/dialog-doclink.glade:295
#, fuzzy
@@ -15450,9 +15410,8 @@ msgid "Loan Repayment Calculator"
msgstr "è´¢å¡è®¡ç®å¨"
#: gnucash/gtkbuilder/dialog-fincalc.glade:136
-#, fuzzy
msgid "_Schedule"
-msgstr "已计å(_S)"
+msgstr "计å(_S)"
#: gnucash/gtkbuilder/dialog-fincalc.glade:171
msgid "<b>Calculations</b>"
@@ -15603,9 +15562,8 @@ msgid "Based On"
msgstr "éåºäº"
#: gnucash/gtkbuilder/dialog-imap-editor.glade:219
-#, fuzzy
msgid "Match String"
-msgstr "å¹é
éæ¼ï¼"
+msgstr "å符串å¹é
"
#: gnucash/gtkbuilder/dialog-imap-editor.glade:233
#, fuzzy
@@ -16186,7 +16144,7 @@ msgstr "GnuCash"
#: gnucash/gtkbuilder/dialog-preferences.glade:314
msgid "<b>Summarybar Content</b>"
-msgstr "<b>æè¦æ </b>"
+msgstr "<b>æ±æ»æ </b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:324
msgid "Include _grand total"
@@ -16205,7 +16163,7 @@ msgstr "å
å«éè´§å¸æ»è®¡(_N)"
msgid ""
"If checked, non-currency commodities will be shown in the summary bar. If "
"clear, only currencies will be shown."
-msgstr "妿éä¸ï¼æè¦æ å°æ¾ç¤ºéè´§å¸ååï¼å¦åï¼åªæ¾ç¤ºè´§å¸ã"
+msgstr "è¥éä¸ï¼æ±æ»æ å°æ¾ç¤ºéè´§å¸ååï¼å¦åï¼åªæ¾ç¤ºè´§å¸ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:390
msgid "_Relative"
@@ -16307,7 +16265,7 @@ msgstr "ä¸»çªæ ¼æ¾ç¤ºç§ç®é¢è²ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:840
msgid "Show the Account Color on tabs"
-msgstr "æ ç¾é¡µ"
+msgstr "ç§ç®é¡µæ¾ç¤ºé¢è²"
#: gnucash/gtkbuilder/dialog-preferences.glade:846
msgid "Show the Account Color as tab background."
@@ -16896,23 +16854,23 @@ msgstr "æ¥è¡¨"
#: gnucash/gtkbuilder/dialog-preferences.glade:3279
msgid "<b>Window Geometry</b>"
-msgstr "<b>çªå£ä½ç½®</b>"
+msgstr "<b>çªå£å½¢ç¶</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:3299
msgid "_Save window size and position"
-msgstr "ä¿åçªå£ç大å°åä½ç½®(_S)"
+msgstr "ä¿å大å°åä½ç½®(_S)"
#: gnucash/gtkbuilder/dialog-preferences.glade:3305
msgid "Save window size and location when it is closed."
-msgstr "è®°å¿çªå£å¤§å°ä¸ä½ç½®ã"
+msgstr "å
³éæ¶ä¿åçªå£ç大å°åä½ç½®ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:3318
msgid "Bring the most _recent tab to the front"
-msgstr "ææè¿çæ ç¾æ¾å°æåé¢(_R)"
+msgstr "åç½®æè¿ç§ç®é¡µ(_R)"
#: gnucash/gtkbuilder/dialog-preferences.glade:3350
msgid "<b>Tab Position</b>"
-msgstr "<b>è¡¨æ ¼ä½ç½®</b>"
+msgstr "<b>æ ç¾é¡µä½ç½®</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:3360
msgid "To_p"
@@ -16932,7 +16890,7 @@ msgstr "å³ä¾§(_R)"
#: gnucash/gtkbuilder/dialog-preferences.glade:3439
msgid "<b>Summary Bar Position</b>"
-msgstr "<b>æ¦è¦æ¡ä½ç½®</b>"
+msgstr "<b>æ±æ»æ ä½ç½®</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:3468
#: gnucash/gtkbuilder/dialog-print-check.glade:270
@@ -16941,36 +16899,31 @@ msgstr "åºé¨"
#: gnucash/gtkbuilder/dialog-preferences.glade:3500
msgid "<b>Tabs</b>"
-msgstr "<b>æ ç¾</b>"
+msgstr "<b>æ ç¾é¡µ</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:3510
msgid "Show close button on _notebook tabs"
-msgstr "å¨é¡µé¢æ ç¾ä¸æ¾ç¤ºå
³éæé®(_N)"
+msgstr "å
³éæé®(_N)"
#: gnucash/gtkbuilder/dialog-preferences.glade:3516
-#, fuzzy
msgid ""
"Show a close button on each notebook tab. These function identically to the "
"'Close' menu item."
-msgstr "卿¯ä¸ªç§ç®é¡µæ ç¾ä¸æ¾ç¤ºå
³éæé®ãè¿ä¸ªåè½ä¸èåä¸çâå
³éâç¸åã"
+msgstr "æ ç¾é¡µãç§ç®åå³ä¾§æ¾ç¤º [ X ] æé®ï¼åå·¥å
·æ âå
³éâã"
#: gnucash/gtkbuilder/dialog-preferences.glade:3537
-#, fuzzy
msgid ""
"If the text in the tab is longer than this value (the test is approximate) "
"then the tab label will have the middle cut and replaced with an ellipsis."
-msgstr ""
-"è¿ä¸ªå¼æå®äºç§ç®é¡µæ ç¾æå¤§å®½åº¦ã妿æ ç¾ä¸çææ¬é¿äºæ¤å®½åº¦(æµè¯æ¯è¿ä¼¼ç)ï¼é£"
-"ä¹è¯¥æ ç¾å°ä¼ä»ä¸æªæï¼ä½ä¸æ¾ç¤ºä¸ºçç¥å·ã"
+msgstr "è¥ç§ç®ååæ°å¤äºæ¤å¼ï¼æµè¯æ¯è¿ä¼¼çï¼ï¼åæ ç¾é¡µä¸ä¼ç¨çç¥å·ä»£æ¿é¨åç§ç®åã"
#: gnucash/gtkbuilder/dialog-preferences.glade:3557
msgid "characters"
-msgstr "符å·"
+msgstr "å符"
#: gnucash/gtkbuilder/dialog-preferences.glade:3576
-#, fuzzy
msgid "_Width"
-msgstr "宽度(_W)ï¼"
+msgstr "宽度(_W)"
#: gnucash/gtkbuilder/dialog-preferences.glade:3613
msgid "Windows"
@@ -17532,75 +17485,69 @@ msgstr "<b>èªä¸æ¬¡è¿è¡</b>"
#: gnucash/gtkbuilder/dialog-sx.glade:535
msgid "<b>Transaction Editor Defaults</b>"
-msgstr "<b>交æäºé¡¹ç¼è¾å¨é»è®¤</b>"
+msgstr "<b>é»è®¤äº¤æç¼è¾å¨</b>"
#: gnucash/gtkbuilder/dialog-sx.glade:545
msgid "_Run when data file opened"
-msgstr "æ°æ®æä»¶æå¼æ¶è¿è¡(_R)"
+msgstr "æä»¶æå¼æ¶è¿è¡(_R)"
#: gnucash/gtkbuilder/dialog-sx.glade:549
-#, fuzzy
msgid "Run the \"since last run\" process when a file is opened."
-msgstr "彿件æå¼æ¶ï¼æ¾ç¤ºâèªä»ä¸æ¬¡è¿è¡âçªå£ã"
+msgstr "æä»¶æå¼æ¶ï¼æ§è¡âèªä¸æ¬¡è¿è¡âè¿ç¨ã"
#: gnucash/gtkbuilder/dialog-sx.glade:562
msgid "_Show notification window"
-msgstr ""
+msgstr "æ¾ç¤ºéç¥(_S)"
#: gnucash/gtkbuilder/dialog-sx.glade:566
-#, fuzzy
msgid ""
"Show the notification window for the \"since last run\" process when a file "
"is opened."
-msgstr "彿件æå¼æ¶ï¼æ¾ç¤ºâèªä»ä¸æ¬¡è¿è¡âçªå£ã"
+msgstr "æä»¶æå¼æ¶ï¼æ¾ç¤ºâèªä¸æ¬¡è¿è¡âè¿ç¨çéç¥ã"
#: gnucash/gtkbuilder/dialog-sx.glade:579
msgid "_Auto-create new transactions"
-msgstr "èªå¨å建æ°äº¤æäºé¡¹(_A)"
+msgstr "èªå¨å建(_A)"
#: gnucash/gtkbuilder/dialog-sx.glade:583
msgid "Set the 'auto-create' flag on newly created scheduled transactions."
-msgstr "卿°å建ç计å交æä¸è®¾ç½®âèªå¨åå»ºâæ å¿ã"
+msgstr "æ°å建ç计å交æè®¾ç½®âèªå¨åå»ºâæ ç¾ã"
#: gnucash/gtkbuilder/dialog-sx.glade:603
msgid "Begin notifications this many days before the transaction is created."
-msgstr "å¨äº¤æäºé¡¹å建åè¿ä¹å¤å¤©å¼å§éç¥ã"
+msgstr "å¨äº¤æå建åè¿ä¹å¤å¤©éç¥ã"
#: gnucash/gtkbuilder/dialog-sx.glade:642
msgid "Create the transaction this many days before its effective date."
-msgstr "å¨çæåè¿ä¹å¤å¤©å建è¿ä¸ªäº¤æäºé¡¹ã"
+msgstr "å¨çææ¥åè¿ä¹å¤å¤©å建交æã"
#: gnucash/gtkbuilder/dialog-sx.glade:674
msgid "_Notify before transactions are created "
-msgstr "æ°äº¤æäºé¡¹å建åæé(_N) "
+msgstr "æ°äº¤æå建åæé(_N) "
#: gnucash/gtkbuilder/dialog-sx.glade:679
msgid "Set the 'notify' flag on newly created scheduled transactions."
-msgstr "卿°å建ç计å交æä¸è®¾ç½®âéç¥âæ å¿ã"
+msgstr "æ°å建ç计å交æè®¾ç½®âéç¥âæ ç¾ã"
#: gnucash/gtkbuilder/dialog-sx.glade:698
-#, fuzzy
msgid "Crea_te in advance"
-msgstr "æåå建ï¼"
+msgstr "æåå建(_T)"
#: gnucash/gtkbuilder/dialog-sx.glade:713
-#, fuzzy
msgid "R_emind in advance"
-msgstr "æåæé(_E)ï¼"
+msgstr "æåæé(_E)"
#: gnucash/gtkbuilder/dialog-sx.glade:748
msgid "Edit Scheduled Transaction"
msgstr "ç¼è¾è®¡å交æäºé¡¹"
#: gnucash/gtkbuilder/dialog-sx.glade:913
-#, fuzzy
msgid "Create in advance"
-msgstr "æåå建ï¼"
+msgstr "æåå建"
#: gnucash/gtkbuilder/dialog-sx.glade:928
-#, fuzzy
msgid "Remind in advance"
-msgstr "æåæéï¼"
+msgstr "æåæé"
#: gnucash/gtkbuilder/dialog-sx.glade:987
msgid "Create automatically"
@@ -17620,7 +17567,7 @@ msgstr "<b>äºä»¶(Occurrences)</b>"
#: gnucash/gtkbuilder/dialog-sx.glade:1133
msgid "Last Occurred: "
-msgstr "æè¿åççï¼"
+msgstr "æè¿åççï¼ "
#: gnucash/gtkbuilder/dialog-sx.glade:1167
msgid "Repeats:"
@@ -18748,10 +18695,8 @@ msgid "Show _zero balance owners"
msgstr ""
#: gnucash/gtkbuilder/window-autoclear.glade:71
-#, fuzzy
-#| msgid "Auto-clear"
msgid "About Auto-Clear"
-msgstr "èªå¨ç»æ¸
"
+msgstr "å
³äºèªå¨ç»ç®"
#: gnucash/gtkbuilder/window-autoclear.glade:86
msgid ""
@@ -18761,10 +18706,8 @@ msgid ""
msgstr ""
#: gnucash/gtkbuilder/window-autoclear.glade:101
-#, fuzzy
-#| msgid "Fraction"
msgid "Caution!"
-msgstr "åæ°"
+msgstr "è¦åï¼"
#: gnucash/gtkbuilder/window-autoclear.glade:116
msgid ""
@@ -19069,9 +19012,8 @@ msgid "Enter your password"
msgstr "è¾å
¥æ¨çå£ä»¤"
#: gnucash/import-export/aqb/dialog-ab.glade:652
-#, fuzzy
msgid "Bar_width"
-msgstr "宽度(_W)ï¼"
+msgstr "宽度(_W)"
#. TAN generator with flicker interface common in DE only
#: gnucash/import-export/aqb/dialog-ab.glade:670
@@ -19396,34 +19338,22 @@ msgid ""
msgstr ""
#: gnucash/import-export/aqb/dialog-ab-trans.c:564
-#, fuzzy
msgid ""
"You did not enter a recipient name. A recipient name is required for an "
"online transfer.\n"
-msgstr ""
-"æ¨æ²¡æè¾å
¥æ¶æ¬¾äººå§åãç½ä¸è½¬è´¦éè¦æä¾æ¶æ¬¾äººå§åã\n"
-"\n"
-"æ¨æ³å次è¿å
¥è¿ä¸ªä»»å¡ä¹ï¼"
+msgstr "æ æ¶æ¬¾äººå§åï¼å¨çº¿è½¬è´¦éè¦æ¶æ¬¾äººå§åã\n"
#: gnucash/import-export/aqb/dialog-ab-trans.c:584
-#, fuzzy
msgid ""
"You did not enter a recipient account. A recipient account is required for "
"an online transfer.\n"
-msgstr ""
-"æ¨æ²¡æè¾å
¥æ¶æ¬¾äººå§åãç½ä¸è½¬è´¦éè¦æä¾æ¶æ¬¾äººå§åã\n"
-"\n"
-"æ¨æ³å次è¿å
¥è¿ä¸ªä»»å¡ä¹ï¼"
+msgstr "æ æ¶æ¬¾äººè´¦æ·ï¼å¨çº¿è½¬è´¦éè¦ä¸ä¸ªæ¶æ¬¾äººè´¦æ·ã\n"
#: gnucash/import-export/aqb/dialog-ab-trans.c:600
-#, fuzzy
msgid ""
"You did not enter a recipient bank. A recipient bank is required for an "
"online transfer.\n"
-msgstr ""
-"æ¨æ²¡æè¾å
¥æ¶æ¬¾äººå§åãç½ä¸è½¬è´¦éè¦æä¾æ¶æ¬¾äººå§åã\n"
-"\n"
-"æ¨æ³å次è¿å
¥è¿ä¸ªä»»å¡ä¹ï¼"
+msgstr "æ²¡ææ¶æ¬¾é¶è¡ï¼ç½ä¸è½¬è´¦éè¦ä¸ä¸ªæ¶æ¬¾é¶è¡ã\n"
#: gnucash/import-export/aqb/dialog-ab-trans.c:618
#, fuzzy
@@ -19439,14 +19369,10 @@ msgstr ""
"æ¨æ³å次è¿å
¥è¿ä¸ªä»»å¡ä¹ï¼"
#: gnucash/import-export/aqb/dialog-ab-trans.c:635
-#, fuzzy
msgid ""
"You did not enter any transaction purpose. A purpose is required for an "
"online transfer.\n"
-msgstr ""
-"æ¨æ²¡æè¾å
¥ä»»ä½äº¤æç®çãç½ä¸è½¬è´¦éè¦æä¾ä¸ä¸ªç®çã\n"
-"\n"
-"æ¨æ³å次è¿å
¥è¿ä¸ªä»»å¡ä¹ï¼"
+msgstr "æ 转账说æï¼ç½ä¸è½¬è´¦éè¦ä¸ä¸ªè¯´æã\n"
#: gnucash/import-export/aqb/dialog-ab-trans.c:1047
#, fuzzy
@@ -19741,7 +19667,7 @@ msgstr "ç½ä¸é¶è¡ä¾æ§å¨è¿è¡ï¼æ¨ç¡®å®æ³åæ¶ä¹ï¼"
#: gnucash/import-export/aqb/gnc-plugin-aqbanking.c:92
msgid "_Online Actions"
-msgstr "ç½ä¸æä½(_O)"
+msgstr "èç½(_O)"
#: gnucash/import-export/aqb/gnc-plugin-aqbanking.c:96
msgid "_Online Banking Setup..."
@@ -19920,9 +19846,9 @@ msgstr ""
"å¼(称为âprofilesâ)ï¼æ¨å¯ä»¥å¨è¿éè¿è¡éæ©ã"
#: gnucash/import-export/bi-import/dialog-bi-import.c:297
-#, fuzzy, c-format
+#, c-format
msgid "Validation...\n"
-msgstr "åºç¨ç¨åº"
+msgstr "éªè¯...\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:327
#, c-format
@@ -19956,9 +19882,9 @@ msgstr ""
#: gnucash/import-export/bi-import/dialog-bi-import.c:404
#: gnucash/import-export/bi-import/dialog-bi-import.c:475
-#, fuzzy, c-format
+#, c-format
msgid "Row %d, invoice %s/%u: account %s does not exist.\n"
-msgstr "æ¾ç¤ºç§ç®è¯´æ"
+msgstr "第%dè¡ï¼å票%s/%uï¼ç§ç®%sä¸åå¨ã\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:416
#, c-format
@@ -19995,9 +19921,9 @@ msgstr ""
"å¤ç仿¬¾(_P)...\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:716
-#, fuzzy, c-format
+#, c-format
msgid "Invoice %s created.\n"
-msgstr "åç¥¨æ¥æ"
+msgstr "å建å票%sã\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:731
#, fuzzy
@@ -20017,7 +19943,7 @@ msgstr ""
#: gnucash/import-export/bi-import/dialog-bi-import.c:767
#, fuzzy, c-format
msgid "Invoice %s updated.\n"
-msgstr "åç¥¨æ¥æ"
+msgstr "å票%så·²æ´æ°ã\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:885
#, c-format
@@ -20035,9 +19961,9 @@ msgid "Invoice %s NOT posted because it requires currency conversion.\n"
msgstr ""
#: gnucash/import-export/bi-import/dialog-bi-import.c:920
-#, fuzzy, c-format
+#, c-format
msgid "Nothing to process.\n"
-msgstr "没æè¦éç½®çè¦åã"
+msgstr "没æä»ä¹éè¦å¤ççã\n"
#: gnucash/import-export/bi-import/dialog-bi-import-gui.c:142
#: gnucash/import-export/customer-import/dialog-customer-import-gui.c:128
@@ -20287,9 +20213,8 @@ msgid "Reconcile Date"
msgstr "å¯¹è´¦æ¥æ"
#: gnucash/import-export/csv-exp/gnc-plugin-csv-export.c:54
-#, fuzzy
msgid "Export Account T_ree to CSV..."
-msgstr "导åºä¼è®¡ç§ç®è¡¨å° QSF(_C)"
+msgstr "ç§ç® [CSV æä»¶] (_T)..."
#: gnucash/import-export/csv-exp/gnc-plugin-csv-export.c:55
#, fuzzy
@@ -20297,9 +20222,8 @@ msgid "Export the Account Tree to a CSV file"
msgstr "导åºç§ç®ä½ç³»è³æ°ç GnuCash æ°æ®æä»¶"
#: gnucash/import-export/csv-exp/gnc-plugin-csv-export.c:59
-#, fuzzy
msgid "Export _Transactions to CSV..."
-msgstr "导åºäº¤æäºé¡¹å°CSV"
+msgstr "交æ [CSV æä»¶] (_T)..."
#: gnucash/import-export/csv-exp/gnc-plugin-csv-export.c:60
#, fuzzy
@@ -20307,9 +20231,8 @@ msgid "Export the Transactions to a CSV file"
msgstr "导åºäº¤æäºé¡¹å°CSVæä»¶"
#: gnucash/import-export/csv-exp/gnc-plugin-csv-export.c:64
-#, fuzzy
msgid "Export A_ctive Register to CSV..."
-msgstr "导åºä¼è®¡ç§ç®è¡¨å° QSF(_C)"
+msgstr "å½åçé¢äº¤æ [CSV æä»¶] (_C)..."
#: gnucash/import-export/csv-exp/gnc-plugin-csv-export.c:66
msgid "Export the Active Register to a CSV file"
@@ -20514,9 +20437,9 @@ msgid "Row %u, commodity %s / %s not found\n"
msgstr ""
#: gnucash/import-export/csv-imp/csv-account-import.c:314
-#, fuzzy, c-format
+#, c-format
msgid "Row %u, account %s not in %s\n"
-msgstr "æ¾ç¤ºç§ç®è¯´æ"
+msgstr "第%uè¡ï¼ç§ç®%sä¸å¨%så
\n"
#: gnucash/import-export/csv-imp/gnc-import-price.cpp:60
#: gnucash/import-export/csv-imp/gnc-import-tx.cpp:57
@@ -20801,7 +20724,7 @@ msgstr "GnuCashå¯¼åºæ ¼å¼"
#: gnucash/import-export/csv-imp/gnc-plugin-csv-import.c:50
msgid "Import _Accounts from CSV..."
-msgstr "ç§ç® [CSV æ ¼å¼] (_A)..."
+msgstr "ç§ç® [CSV æä»¶] (_A)..."
#: gnucash/import-export/csv-imp/gnc-plugin-csv-import.c:51
msgid "Import Accounts from a CSV file"
@@ -20809,7 +20732,7 @@ msgstr "ä» CSV æä»¶å¯¼å
¥ç§ç®"
#: gnucash/import-export/csv-imp/gnc-plugin-csv-import.c:55
msgid "Import _Transactions from CSV..."
-msgstr "交æ [CSV æ ¼å¼] (_T)..."
+msgstr "交æ [CSV æä»¶] (_T)..."
#: gnucash/import-export/csv-imp/gnc-plugin-csv-import.c:56
msgid "Import Transactions from a CSV file"
@@ -20817,7 +20740,7 @@ msgstr "ä» CSV æä»¶å¯¼å
¥äº¤æ"
#: gnucash/import-export/csv-imp/gnc-plugin-csv-import.c:60
msgid "Import _Prices from a CSV file..."
-msgstr "æ±ç [CSV æ ¼å¼] (_P)..."
+msgstr "æ±ç [CSV æä»¶] (_P)..."
#: gnucash/import-export/csv-imp/gnc-plugin-csv-import.c:61
msgid "Import Prices from a CSV file"
@@ -20893,7 +20816,7 @@ msgstr ""
#: gnucash/import-export/customer-import/gnc-plugin-customer-import.c:59
msgid "Import _Customers & Vendors..."
-msgstr "导å
¥å®¢æ·(_C)æä¾åºå..."
+msgstr "客æ·åä¾åºå(_C)..."
#: gnucash/import-export/customer-import/gnc-plugin-customer-import.c:59
msgid "Import Customers and Vendors from a CSV text file."
@@ -21352,7 +21275,7 @@ msgstr "å ä½ç¬¦ï¼"
#: gnucash/import-export/qif-imp/gnc-plugin-qif-import.c:48
msgid "Import _QIF..."
-msgstr "导å
¥ QIF æä»¶(_Q)..."
+msgstr "QIF æä»¶(_Q)..."
#: gnucash/import-export/qif-imp/gnc-plugin-qif-import.c:49
msgid "Import a Quicken QIF file"
@@ -21624,7 +21547,7 @@ msgstr "å·²æ¾å° Finance::Quote çæ¬ ~Aã"
#: gnucash/python/init.py:18
#: gnucash/report/reports/example/welcome-to-gnucash.scm:49
msgid "Welcome to GnuCash"
-msgstr "欢è¿ä½¿ç¨ GnuCash"
+msgstr "æµ·å
åç¥å·± å¤©æ¶¯è¥æ¯é»"
#: gnucash/python/init.py:103
#: gnucash/report/reports/example/hello-world.scm:488
@@ -22051,10 +21974,9 @@ msgstr ""
#. used to estimate widths.
#: gnucash/register/ledger-core/split-register-layout.c:644
#: gnucash/register/ledger-core/split-register-layout.c:652
-#, fuzzy
msgctxt "sample"
msgid "22/02/2000"
-msgstr "sample:12/12/2000"
+msgstr "2000/02/22"
#. Translators: The 'sample' items are
#. strings which are not displayed, but only
@@ -22785,7 +22707,7 @@ msgstr "䏿¾ç¤ºç¶ç§ç®çå°è®¡"
#: gnucash/report/report-core.scm:150
msgid "_Assets & Liabilities"
-msgstr "èµäº§åè´åº(_A)"
+msgstr "èµäº§è´åº(_A)"
#: gnucash/report/report-core.scm:151
msgid "_Income & Expense"
@@ -22796,9 +22718,8 @@ msgid "_Taxes"
msgstr "ç¨å¡(_U)"
#: gnucash/report/report-core.scm:154
-#, fuzzy
msgid "E_xamples"
-msgstr "ä¾åï¼"
+msgstr "示ä¾(_X)"
#: gnucash/report/report-core.scm:155
#, fuzzy
@@ -23214,7 +23135,7 @@ msgstr "没æé䏿æç§ç®ãç¹å»âé项âæé®ï¼å¹¶ä¸éæ©è¦ä½¿
#: gnucash/report/reports/example/average-balance.scm:38
msgid "Average Balance"
-msgstr "å¹³åç»ç®"
+msgstr "å¹³åä½é¢"
#: gnucash/report/reports/example/average-balance.scm:42
#: gnucash/report/reports/standard/cashflow-barchart.scm:57
@@ -23320,9 +23241,8 @@ msgid "Average"
msgstr "åå¼"
#: gnucash/report/reports/example/average-balance.scm:129
-#, fuzzy
msgid "Average Balance."
-msgstr "å¹³åç»ç®"
+msgstr "å¹³åä½é¢ã"
#: gnucash/report/reports/example/average-balance.scm:130
#: gnucash/report/reports/example/average-balance.scm:151
@@ -23368,12 +23288,12 @@ msgstr "æå¤±"
#: gnucash/report/reports/example/daily-reports.scm:37
#: gnucash/report/reports/example/daily-reports.scm:49
msgid "Income vs. Day of Week"
-msgstr "æ¶å
¥ vs. ææå "
+msgstr "æ¶å
¥ VS ææ"
#: gnucash/report/reports/example/daily-reports.scm:38
#: gnucash/report/reports/example/daily-reports.scm:50
msgid "Expenses vs. Day of Week"
-msgstr "æ¯åº vs. ææå "
+msgstr "æ¯åº VS ææ"
#: gnucash/report/reports/example/daily-reports.scm:42
msgid "Shows a piechart with the total income for each day of the week"
@@ -23738,16 +23658,15 @@ msgstr "æ¾ç¤ºå¸®å©"
#: gnucash/report/reports/example/hello-world.scm:512
msgid "Sample Report with Examples"
-msgstr "å
·æèä¾çæ ·æ¬æ¥è¡¨"
+msgstr "举ä¾çæ¥è¡¨æ ·æ¬"
#: gnucash/report/reports/example/hello-world.scm:516
msgid "A sample report with examples."
msgstr "å
·æèä¾çæ ·æ¬æ¥è¡¨ã"
#: gnucash/report/reports/example/sample-graphs.scm:42
-#, fuzzy
msgid "Sample Graphs"
-msgstr "æ ·æ¬ï¼"
+msgstr "å¾è¡¨æ ·æ¬"
#: gnucash/report/reports/example/sample-graphs.scm:142
msgid "Pie:"
@@ -24103,7 +24022,7 @@ msgstr "æ¯åºé¥¼å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:38
msgid "Asset Piechart"
-msgstr "èµäº§é¥¼å¾"
+msgstr "èµäº§æå½¢å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:39
#, fuzzy
@@ -24124,12 +24043,11 @@ msgstr "æ¾ç¤ºæ¯ä¸ªæ¶é´é´éçæ¯åºå饼å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:49
msgid "Shows a piechart with the Assets balance at a given time"
-msgstr "æ¾ç¤ºç¹å®æ¶é´çèµäº§ä½é¢é¥¼å¾"
+msgstr "æ¾ç¤ºç¹å®æ¶é´çèµäº§æå½¢å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:51
-#, fuzzy
msgid "Shows a piechart with distribution of assets over securities"
-msgstr "æ¾ç¤ºç¹å®æ¶é´çè´åºä½é¢é¥¼å¾"
+msgstr "æ¾ç¤ºç¹å®æ¶é´çè´åºæå½¢å¾"
#: gnucash/report/reports/standard/account-piecharts.scm:53
msgid "Shows a piechart with the Liabilities balance at a given time"
@@ -24799,9 +24717,8 @@ msgid "** this commodity has no price and a price of 1 has been used."
msgstr ""
#: gnucash/report/reports/standard/balance-forecast.scm:35
-#, fuzzy
msgid "Balance Forecast"
-msgstr "%s çä½é¢"
+msgstr "ä½é¢é¢æµ"
#: gnucash/report/reports/standard/balance-forecast.scm:38
#: gnucash/report/reports/standard/budget-barchart.scm:134
@@ -25425,7 +25342,7 @@ msgstr "æç表"
#: gnucash/report/reports/standard/budget-balance-sheet.scm:38
msgid "Budget Balance Sheet"
-msgstr "é¢ç®èµäº§è´åºè¡¨"
+msgstr "èµäº§è´åº"
#: gnucash/report/reports/standard/budget-balance-sheet.scm:97
msgid "Include new/existing totals"
@@ -25499,9 +25416,8 @@ msgid "New Equity"
msgstr "æ°å»ºææè
æç"
#: gnucash/report/reports/standard/budget-barchart.scm:36
-#, fuzzy
msgid "Budget Chart"
-msgstr "é¢ç®æ±ç¶å¾"
+msgstr "æ±ç¶å¾"
#: gnucash/report/reports/standard/budget-barchart.scm:41
msgid "Running Sum"
@@ -25646,7 +25562,7 @@ msgstr "å®é
"
#: gnucash/report/reports/standard/budget-flow.scm:36
msgid "Budget Flow"
-msgstr "é¢ç®æµ"
+msgstr "æµæ°´"
#: gnucash/report/reports/standard/budget-flow.scm:70
#, fuzzy
@@ -25792,11 +25708,11 @@ msgstr "åäºæ"
#: gnucash/report/reports/standard/budget-income-statement.scm:601
msgid "Budget Income Statement"
-msgstr "é¢ç®æ¶ç表"
+msgstr "æ¶æ¯"
#: gnucash/report/reports/standard/budget-income-statement.scm:602
msgid "Budget Profit & Loss"
-msgstr "é¢ç®æç"
+msgstr "æç"
#: gnucash/report/reports/standard/budget.scm:45
#: gnucash/report/reports/standard/cash-flow.scm:45
@@ -26028,7 +25944,7 @@ msgstr "æ¯åºå¾"
#: gnucash/report/reports/standard/category-barchart.scm:43
#: gnucash/report/reports/standard/net-charts.scm:363
msgid "Asset Chart"
-msgstr "èµäº§å¾"
+msgstr "èµäº§æ±ç¶å¾"
#: gnucash/report/reports/standard/category-barchart.scm:44
#: gnucash/report/reports/standard/net-charts.scm:384
@@ -26046,9 +25962,8 @@ msgid "Shows a chart with the Expenses per interval developing over time"
msgstr "æ¾ç¤ºæ¯æ®µæé´æ¯åºéæ¶é´ååæ¡ç¶å¾"
#: gnucash/report/reports/standard/category-barchart.scm:55
-#, fuzzy
msgid "Shows a chart with the Assets developing over time"
-msgstr "æ¾ç¤ºèµäº§éæ¶é´ååæ¡ç¶å¾"
+msgstr "æ¾ç¤ºèµäº§éæ¶é´ååçæ±ç¶å¾"
#: gnucash/report/reports/standard/category-barchart.scm:57
#, fuzzy
@@ -27031,9 +26946,8 @@ msgstr "å票ä¸çé¢å¤è¯´æã"
#: gnucash/report/reports/standard/invoice.scm:344
#: gnucash/report/reports/standard/taxinvoice.scm:213
-#, fuzzy
msgid "Thank you for your patronage!"
-msgstr "æè°¢æ¨çæ 顾"
+msgstr "谢谢æ¨çèµå©ï¼"
#: gnucash/report/reports/standard/invoice.scm:348
msgid "Row 1 Left"
@@ -27242,9 +27156,8 @@ msgid "Show Net Profit"
msgstr "æ¾ç¤ºæ¶çåé¢"
#: gnucash/report/reports/standard/net-charts.scm:50
-#, fuzzy
msgid "Show Asset & Liability"
-msgstr "æ¾ç¤ºèµäº§&è´åºé¿æ¡"
+msgstr "æ¾ç¤ºèµäº§è´åº"
#: gnucash/report/reports/standard/net-charts.scm:51
#, fuzzy
@@ -27352,9 +27265,8 @@ msgid "Invalid Txn Type ~a"
msgstr ""
#: gnucash/report/reports/standard/new-aging.scm:384
-#, fuzzy
msgid "Payment has no owner"
-msgstr "仿¬¾ï¼è°¢è°¢ï¼"
+msgstr "仿¬¾æ²¡æææè
"
#: gnucash/report/reports/standard/new-aging.scm:414
#: gnucash/report/reports/standard/receivables.scm:65
commit 662048ba5f01ad643fa97e8b0089e0422fd8e73f
Author: Eugenia Russell <eugenia.russell2019 at gmail.com>
Date: Tue May 4 17:49:25 2021 +0200
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/glossary/el.po: 97.1% (202 of 208 strings; 5 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/el/
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/glossary/el.po: 96.1% (200 of 208 strings; 7 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/el/
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/glossary/el.po: 95.6% (199 of 208 strings; 8 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/el/
Co-authored-by: Eugenia Russell <eugenia.russell2019 at gmail.com>
diff --git a/po/glossary/el.po b/po/glossary/el.po
index 40cf5971c..f56a42958 100644
--- a/po/glossary/el.po
+++ b/po/glossary/el.po
@@ -11,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-04-29 23:09+0000\n"
+"PO-Revision-Date: 2021-05-03 11:32+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/gnucash/glossary/"
"el/>\n"
@@ -645,9 +645,8 @@ msgid "price type: ask"
msgstr "ÎµÎ¯Î´Î¿Ï ÏιμήÏ: ελάÏιÏÏη Ïιμή ÏÏοÏÏοÏάÏ"
#. "A bid is an offer to buy, and the price you want to buy at."
-#, fuzzy
msgid "price type: bid"
-msgstr "ΤÏÏÎ¿Ï Î±ÏÏείοÏ
:"
+msgstr "ÏÏÏÎ¿Ï ÏιμήÏ: ÏÏοÏÏοÏά"
#. "online quotes (rather: quotation!?) A statement of the current price of stocks or commodities"
msgid "price: quotes"
@@ -712,9 +711,8 @@ msgstr "ÎκκίνηÏη νÎÎ±Ï Î´Î¹ÎµÎ½ÎÏγειαÏ"
#
#. "reload the current document"
-#, fuzzy
msgid "reload, to"
-msgstr "ÎνανÎÏÏη"
+msgstr "εÏαναÏÏÏÏÏÏη, για να"
#. "aka 'two-sided form' is in Europe often used for the balance sheet. Complement: report form: Vertical Form"
msgid "report form: T Account Form"
@@ -767,7 +765,6 @@ msgid "source"
msgstr "Ïηγή"
#. "One of the two or several parts a transaction is divided into"
-#, fuzzy
msgid "split"
msgstr "ÎιαίÏεÏη"
@@ -776,9 +773,8 @@ msgid "style sheet"
msgstr "εÏίÏÏÏÏμα ÏÏοÏ
Ï"
#. "The total of a set of figures that are part of a larger group of figures"
-#, fuzzy
msgid "subtotal"
-msgstr "%d ÏÏ
νολικά"
+msgstr "Ï
ÏοÏÏνολο"
#. "On the government's tax forms, the tax code identifies the given line or place on the form where certain amounts must be specified according to the current country's legislation"
msgid "tax code"
commit 2b48fd375de12c1b4a6a896133a0fddd0aa92dbf
Author: John Ralls <jralls at ceridwen.us>
Date: Mon May 3 17:16:23 2021 -0700
Revert "Fix duplicate trading accounts."
This reverts commit ed486a58a45adcb90e6f1e5232b6d348bed83a4c.
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index d4b6b8215..b82180d07 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -3127,34 +3127,16 @@ gnc_account_lookup_by_type_and_commodity (Account* root,
gnc_commodity* commodity)
{
auto rpriv{GET_PRIVATE(root)};
- if (rpriv->type == acctype &&
- gnc_commodity_equiv(rpriv->commodity, commodity))
- {
- if (name)
- {
- if (strcmp(name, rpriv->accountName) == 0)
- return root;
- }
- else
- {
- return root;
- }
- }
-
- /* Nope. Make sure the types are compatible */
- if (!xaccAccountTypesCompatible(rpriv->type, acctype))
- return nullptr;
-
- /* Recurse */
for (auto node = rpriv->children; node; node = node->next)
{
auto account{static_cast<Account*>(node->data)};
+ if (xaccAccountGetType (account) == acctype &&
+ gnc_commodity_equiv(xaccAccountGetCommodity (account), commodity))
{
- auto child{gnc_account_lookup_by_type_and_commodity(account, name,
- acctype,
- commodity)};
- if (child)
- return child;
+ if (name && strcmp(name, xaccAccountGetName(account)))
+ continue; //name doesn't match so skip this one
+
+ return account;
}
}
return nullptr;
commit a60471c951689c3a1983fcc558ae160afed03e65
Author: Eugenia Russell <eugenia.russell2019 at gmail.com>
Date: Sat May 1 15:32:07 2021 +0200
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/el.po: 53.4% (2931 of 5479 strings; 1501 fuzzy)
611 failing checks (11.1%)
Translation: GnuCash/Program (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/el/
Co-authored-by: Eugenia Russell <eugenia.russell2019 at gmail.com>
diff --git a/po/el.po b/po/el.po
index 2dc0eaa5c..ec4b7f57b 100644
--- a/po/el.po
+++ b/po/el.po
@@ -40,7 +40,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-28 20:32+0000\n"
+"PO-Revision-Date: 2021-05-01 13:32+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/gnucash/gnucash/el/"
">\n"
@@ -311,7 +311,7 @@ msgstr "ÎβÏαÏκή (Windows-1255)"
#: borrowed/goffice/go-charmap-sel.c:182
msgid "Hindi (MacDevanagari)"
-msgstr ""
+msgstr "ΧίνÏι (ÎακÎÏεβαναγκάÏι)"
#: borrowed/goffice/go-charmap-sel.c:184
msgid "Icelandic (MacIcelandic)"
@@ -406,9 +406,8 @@ msgid "Unicode (UTF-32LE)"
msgstr "Unicode (UTF-32LE)"
#: borrowed/goffice/go-charmap-sel.c:214
-#, fuzzy
msgid "User Defined"
-msgstr "Îνομα ÏÏήÏÏη"
+msgstr "ÎÏιÏμÎνο αÏÏ Ïο ÏÏήÏÏη"
#: borrowed/goffice/go-charmap-sel.c:215
msgid "Vietnamese (TCVN)"
@@ -455,9 +454,8 @@ msgid "Locale: "
msgstr "ΠεÏιοÏή "
#: borrowed/goffice/go-charmap-sel.c:476
-#, fuzzy
msgid "Conversion Direction"
-msgstr "ΠμεÏαÏÏοÏή ολοκληÏÏθηκε"
+msgstr "ÎαÏεÏθÏ
νÏη μεÏαÏÏοÏήÏ"
#: borrowed/goffice/go-charmap-sel.c:477
msgid "This value determines which iconv test to perform."
@@ -476,6 +474,8 @@ msgid ""
"The GnuCash online manual has lots of helpful information. You can access "
"the manual under the Help menu."
msgstr ""
+"Το ηλεκÏÏÎ¿Î½Î¹ÎºÏ ÎµÎ³ÏειÏίδιο ÏοÏ
GnuCash ÏεÏιÎÏει ÏολλÎÏ ÏÏήÏÎ¹Î¼ÎµÏ ÏληÏοÏοÏίεÏ. "
+"ÎÏοÏείÏε να αÏοκÏήÏεÏε ÏÏÏÏβαÏη ÏÏο εγÏειÏίδιο αÏÏ Ïο Î¼ÎµÎ½Î¿Ï Îοήθεια."
#. Translators: You can replace the link, if a translated page exists.
#: doc/tip_of_the_day.list.c:5
commit 6cbc650d23da663c612f5d35e4187881c562bde0
Author: Arve Eriksson <031299870 at telia.com>
Date: Sat May 1 15:32:06 2021 +0200
Translation update by Arve Eriksson <031299870 at telia.com> using Weblate
po/glossary/sv.po: 85.5% (178 of 208 strings; 16 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Swedish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/sv/
Co-authored-by: Arve Eriksson <031299870 at telia.com>
diff --git a/po/glossary/sv.po b/po/glossary/sv.po
index 055b6053b..8b4c12751 100644
--- a/po/glossary/sv.po
+++ b/po/glossary/sv.po
@@ -3,6 +3,7 @@
# Christian Rose <menthos at menthos.com>, 2001, 2002, 2003.
# Jonas Norling <norling at lysator.liu.se>, 2006.
# Kristoffer Grundström <swedishsailfishosuser at tutanota.com>, 2021.
+# Arve Eriksson <031299870 at telia.com>, 2021.
#
# $Id$
#
@@ -12,8 +13,8 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-04-10 13:26+0000\n"
-"Last-Translator: Kristoffer Grundström <swedishsailfishosuser at tutanota.com>\n"
+"PO-Revision-Date: 2021-05-01 10:32+0000\n"
+"Last-Translator: Arve Eriksson <031299870 at telia.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/gnucash/glossary/"
"sv/>\n"
"Language: sv\n"
@@ -21,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
msgid "Term (Dear translator: This file will never be visible to the user!)"
@@ -397,7 +398,7 @@ msgstr ""
#. "Electronic mail. Some languages allow different writings, but each team should use only one. https://en.wikipedia.org/wiki/Email"
msgid "email"
-msgstr ""
+msgstr "e-post"
#. "a person who works for somebody or a company in return for wages"
msgid "employee"
@@ -446,7 +447,7 @@ msgstr "händelse: betalning"
#. "Free software is a matter of liberty, not price ⦠see https://en.wikipedia.org/wiki/Free_software"
msgid "free software"
-msgstr ""
+msgstr "fri mjukvara"
#. "An increase in wealth; profit; advantage (See also: capital gains)"
msgid "gain"
@@ -596,7 +597,7 @@ msgstr "föräldralös"
#. "The customer to (or employee or vendor from) which this invoice is sent - or short your business partner."
msgid "owner (of bill, invoice or expense voucher)"
-msgstr ""
+msgstr "ägare (räkning, faktura eller traktamente)"
#. "A secret phrase that one needs to know in order to get access to a user account "
msgid "passphrase"
@@ -730,7 +731,7 @@ msgstr ""
#. "(In the customer summary report) The total amount of money received because something was sold."
msgid "sales"
-msgstr ""
+msgstr "försäljning"
#. "To write data (typically a file) to a storage medium, such as a disk or tape."
msgid "save, to (to a file)"
commit ac1abcb8c356367dcac581bdb0b8d3a51fa48adc
Author: John Ralls <jralls at ceridwen.us>
Date: Sat May 1 09:53:56 2021 -0700
Fix reversed parameters in call to xaccAccountTypesCompatible.
Missed in 2258e7a4.
diff --git a/gnucash/gnome-utils/dialog-account.c b/gnucash/gnome-utils/dialog-account.c
index 508e191db..d90bc06df 100644
--- a/gnucash/gnome-utils/dialog-account.c
+++ b/gnucash/gnome-utils/dialog-account.c
@@ -879,7 +879,7 @@ gnc_common_ok (AccountWindow *aw)
}
/* check whether the types of child and parent are compatible */
- if (!xaccAccountTypesCompatible (aw->type, xaccAccountGetType (parent)))
+ if (!xaccAccountTypesCompatible (xaccAccountGetType (parent), aw->type))
{
const char *message = _("The selected account type is incompatible with "
"the one of the selected parent.");
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 52d0e0e57..d2f2ba6f5 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -487,6 +487,7 @@ gnucash/report/reports/standard/dashboard.scm
gnucash/report/reports/standard/equity-statement.scm
gnucash/report/reports/standard/general-journal.scm
gnucash/report/reports/standard/general-ledger.scm
+gnucash/report/reports/standard/ifrs-cost-basis.scm
gnucash/report/reports/standard/income-gst-statement.scm
gnucash/report/reports/standard/income-statement.scm
gnucash/report/reports/standard/invoice.scm
commit ca6fcf8af7c850f54ab7a11969d6888fc7f51a1f
Author: John Ralls <jralls at ceridwen.us>
Date: Thu Apr 29 17:52:21 2021 -0700
Restore French localizations to stripped Docker image.
diff --git a/util/ci/actions/archlinux-test/Dockerfile b/util/ci/actions/archlinux-test/Dockerfile
index 2e1b81412..ed83c49fe 100644
--- a/util/ci/actions/archlinux-test/Dockerfile
+++ b/util/ci/actions/archlinux-test/Dockerfile
@@ -1,5 +1,9 @@
from archlinux:latest
-run pacman -Syu --quiet --noconfirm gcc cmake make boost python2 pkg-config gettext gtk3 guile git ninja gtest gmock sqlite3 webkit2gtk swig gwenhywfar aqbanking intltool libxslt postgresql-libs libmariadbclient libdbi libdbi-drivers wayland-protocols > /dev/null
+
+run echo "NoExtract = !*locale*/fr*/* !usr/share/i18n/locales/fr_FR*" >> /etc/pacman.conf
+
+run pacman -Syu --quiet --noconfirm glibc gcc cmake make boost python2 pkg-config gettext gtk3 guile git ninja gtest gmock sqlite3 webkit2gtk swig gwenhywfar aqbanking intltool libxslt postgresql-libs libmariadbclient libdbi libdbi-drivers wayland-protocols > /dev/null
+
run echo en_US.UTF-8 UTF-8 >> /etc/locale.gen
run echo en_GB.UTF-8 UTF-8 >> /etc/locale.gen
run echo fr_FR.UTF-8 UTF-8 >> /etc/locale.gen
commit 185eb4465e36449f01a987915e8e511dbd7d61d7
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Fri Apr 30 19:42:52 2021 +0800
[test-ifrs-cost-basis] rename functions and report name
diff --git a/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm b/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm
index f0f0492cb..fee392dc3 100644
--- a/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm
+++ b/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm
@@ -1,7 +1,7 @@
(use-modules (gnucash engine))
(use-modules (gnucash app-utils))
(use-modules (tests test-engine-extras))
-(use-modules (gnucash reports standard average-cost-basis))
+(use-modules (gnucash reports standard ifrs-cost-basis))
(use-modules (gnucash report stylesheets plain))
(use-modules (gnucash report))
(use-modules (tests test-report-extras))
@@ -10,7 +10,7 @@
(use-modules (sxml simple))
(use-modules (sxml xpath))
-;; This is implementation testing for both the AVERAGE-COST-BASIS Tool
+;; This is implementation testing for both the IFRS-COST-BASIS Tool
(define uuid "15d5b744176c4625a703720338725291")
;; Explicitly set locale to make the report output predictable
@@ -20,7 +20,7 @@
(test-runner-factory gnc:test-runner)
(test-begin "test-ifrs-cost-basis.scm")
(null-test)
- (average-cost-basis-tests)
+ (ifrs-cost-basis-tests)
(test-end "test-ifrs-cost-basis.scm"))
(define (options->sxml uuid options test-title)
@@ -51,7 +51,7 @@
(gnc-commodity-table-insert comm-table new-comm)
new-comm))
-(define (create-average-cost-basis-test-data)
+(define (create-ifrs-cost-basis-test-data)
(define book (gnc-get-current-book))
(define env (create-test-env))
(define USD (mnemonic->commodity "USD"))
@@ -242,9 +242,9 @@
account-alist)
-(define (average-cost-basis-tests)
- (test-group-with-cleanup "average-cost-basis-tests"
- (let* ((account-alist (create-average-cost-basis-test-data))
+(define (ifrs-cost-basis-tests)
+ (test-group-with-cleanup "ifrs-cost-basis-tests"
+ (let* ((account-alist (create-ifrs-cost-basis-test-data))
(options (gnc:make-report-options uuid)))
;; (set-option! options "General" "Price Source" 'pricedb-latest)
(set-option! options "General" "Report's currency" (mnemonic->commodity "CAD"))
commit 254ccacafaa49dac8e848d509708f787aa3d034a
Merge: e3d4bd2e2 3168347ab
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Fri Apr 30 19:31:13 2021 +0800
Merge branch 'maint-ACB-report' into maint #978
commit 3168347ab7209ce8e85c52ae6a7991a4a1196131
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Wed Jul 8 22:42:57 2020 +0800
[ifrs-cost-basis] initial commit
Candidate Report https://bugs.gnucash.org/show_bug.cgi?id=797796#c153
diff --git a/gnucash/report/reports/CMakeLists.txt b/gnucash/report/reports/CMakeLists.txt
index deb34de22..6178d4ede 100644
--- a/gnucash/report/reports/CMakeLists.txt
+++ b/gnucash/report/reports/CMakeLists.txt
@@ -38,6 +38,7 @@ set (reports_standard_SCHEME
standard/equity-statement.scm
standard/general-journal.scm
standard/general-ledger.scm
+ standard/ifrs-cost-basis.scm
standard/income-gst-statement.scm
standard/income-statement.scm
standard/lot-viewer.scm
diff --git a/gnucash/report/reports/standard/ifrs-cost-basis.scm b/gnucash/report/reports/standard/ifrs-cost-basis.scm
new file mode 100644
index 000000000..af35c3f54
--- /dev/null
+++ b/gnucash/report/reports/standard/ifrs-cost-basis.scm
@@ -0,0 +1,436 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, contact:
+;;
+;; Free Software Foundation Voice: +1-617-542-5942
+;; 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
+;; Boston, MA 02110-1301, USA gnu at gnu.org
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define-module (gnucash reports standard ifrs-cost-basis))
+
+(use-modules (srfi srfi-1))
+(use-modules (ice-9 match))
+(use-modules (gnucash utilities))
+(use-modules (gnucash report))
+(use-modules (gnucash core-utils))
+(use-modules (gnucash app-utils))
+(use-modules (gnucash engine))
+
+(define disclaimer
+ (gnc:make-html-text
+ (gnc:html-markup-p "This report is designed for cost basis
+accumulation and capital gain/loss reporting using the weighted
+average cost basis method, which is most consistent with typical
+accounting frameworks (US GAAP, IFRS, etc.). This report allows for
+for the choice to capitalize (most consistent with typical accounting
+frameworks) vs expense (used by some taxing jurisdictions) commissions
+paid on purchase.")
+ (gnc:html-markup-p "This report is not appropriate for FIFO, LIFO, or
+specific-identification methods for cost basis accumulation and
+capital gain/loss reporting. This report may not be appropriate for
+tax purposes, if the taxing jurisdiction requires a method other than
+the weighted average cost basis method.")
+ (gnc:html-markup-p "This report is not designed with options
+reporting in mind. If your activity involves options and/or futures
+that are purchased, written, and/or exercised, there is no guarantee
+that this report will accurately portray this options activity.")))
+
+(define reportname "IFRS weighted-average cost basis report")
+
+(define optname-startdate (N_ "Start Date"))
+(define optname-enddate (N_ "End Date"))
+
+(define optname-stock-acct "Stock Account")
+(define optname-proceeds-acct "Proceeds Account")
+(define optname-dividend-acct "Dividend Account")
+(define optname-capgains-acct "Cap Gains Account")
+;; (define optname-fees-acct "Fees Account")
+(define optname-report-currency "Report's currency")
+
+(define optname-format-cells "Format monetary cells")
+(define opthelp-format-cells "Check this option to show cells with currency")
+
+(define optname-format-short "Alternative row-style for shorts")
+(define opthelp-format-short "Check this option to use alternate style \
+for shorts. Disable to use alternate style every other row")
+
+(define optname-cap-purch-costs "Capitalise purchase commissions")
+(define opthelp-cap-purch-costs "Check this option to capitalise purchase \
+commissions in cumulative average cost and gain/loss after commission")
+
+(define (options-generator)
+ (let ((options (gnc:new-options)))
+
+ (define (add-option new-option)
+ (gnc:register-option options new-option))
+
+ (gnc:options-add-date-interval!
+ options gnc:pagename-general optname-startdate optname-enddate " ")
+
+ (gnc:options-add-currency!
+ options gnc:pagename-general optname-report-currency "a")
+
+ (add-option
+ (gnc:make-account-sel-limited-option
+ gnc:pagename-general optname-stock-acct "b" "Stock Account"
+ #f #f (list ACCT-TYPE-STOCK ACCT-TYPE-MUTUAL)))
+
+ (add-option
+ (gnc:make-account-sel-limited-option
+ gnc:pagename-general optname-proceeds-acct "c" "Proceeds Account"
+ #f #f (list ACCT-TYPE-ASSET ACCT-TYPE-BANK)))
+
+ (add-option
+ (gnc:make-account-sel-limited-option
+ gnc:pagename-general optname-dividend-acct "c" "Dividend Account"
+ #f #f (list ACCT-TYPE-INCOME)))
+
+ (add-option
+ (gnc:make-account-sel-limited-option
+ gnc:pagename-general optname-capgains-acct "d" "Cap Gains Account"
+ #f #f (list ACCT-TYPE-INCOME)))
+
+ ;; (add-option
+ ;; (gnc:make-account-sel-limited-option
+ ;; gnc:pagename-general optname-fees-acct "c" "Fees Account"
+ ;; #f #f (list ACCT-TYPE-EXPENSE)))
+
+ (add-option
+ (gnc:make-simple-boolean-option
+ gnc:pagename-general optname-format-cells "e" opthelp-format-cells #t))
+
+ (add-option
+ (gnc:make-simple-boolean-option
+ gnc:pagename-general optname-format-short "f" opthelp-format-short #t))
+
+ (add-option
+ (gnc:make-simple-boolean-option
+ gnc:pagename-general optname-cap-purch-costs "g" opthelp-cap-purch-costs #t))
+
+ options))
+
+(define M+
+ (case-lambda
+ (() (error "M+ needs at least 1 arg"))
+ ((a b) (if a (if b (+ a b) a) b))
+ ((head . tail) (fold M+ head tail))))
+
+(define M-abs
+ (case-lambda
+ (() (error "M-abs needs 1 arg"))
+ ((a) (and a (abs a)))))
+
+(define M*
+ (case-lambda
+ (() (error "M* needs at least 1 arg"))
+ ((a b) (and a b (* a b)))
+ ((head . tail) (fold M* head tail))))
+
+(define M-
+ (case-lambda
+ (() (error "M- needs at least 1 arg"))
+ ((n) (and n (- n)))
+ ((minuend head . tail) (M+ minuend (M- (fold M+ head tail))))))
+
+(define M/
+ (case-lambda
+ (() (error "M/ needs at least 1 arg"))
+ ((n) (and n (not (zero? n)) (/ n)))
+ ((divisor head . tail) (M* divisor (M/ (fold M* head tail))))))
+
+(define (trans-extract trans account numfilter split->amount)
+ (define (not-account? s)
+ (and account (not (equal? (xaccSplitGetAccount s) account))))
+ (define (not-num-filter? s)
+ (and numfilter
+ (not (equal? (gnc-get-action-num (xaccSplitGetParent s) s) numfilter))))
+ (let lp ((splits (xaccTransGetSplitList trans)) (result #f))
+ (match splits
+ (() result)
+ (((? not-account?) . rest) (lp rest result))
+ (((? not-num-filter?) . rest) (lp rest result))
+ ((split . rest) (lp rest (M+ (split->amount split) result))))))
+
+(define (trans-extract-value trans account numfilter)
+ (trans-extract trans account numfilter xaccSplitGetValue))
+
+(define (trans-extract-amount trans account numfilter)
+ (trans-extract trans account numfilter xaccSplitGetAmount))
+
+(define (ifrs-cost-basis-renderer report-obj)
+ (define (opt-val section name)
+ (gnc:option-value
+ (gnc:lookup-option (gnc:report-options report-obj) section name)))
+
+ (define opt-startdate (opt-val gnc:pagename-general optname-startdate))
+ (define opt-enddate (opt-val gnc:pagename-general optname-enddate))
+ (define startdate
+ (gnc:time64-start-day-time
+ (gnc:date-option-absolute-time opt-startdate)))
+ (define enddate
+ (gnc:time64-start-day-time
+ (gnc:date-option-absolute-time opt-enddate)))
+ (define stock-acct (opt-val gnc:pagename-general optname-stock-acct))
+ (define proceeds-acct (opt-val gnc:pagename-general optname-proceeds-acct))
+ (define dividend-acct (opt-val gnc:pagename-general optname-dividend-acct))
+ (define capgains-acct (opt-val gnc:pagename-general optname-capgains-acct))
+ ;; (define fees-acct (opt-val gnc:pagename-general optname-fees-acct))
+ (define report-currency (opt-val gnc:pagename-general optname-report-currency))
+ (define format-cells (opt-val gnc:pagename-general optname-format-cells))
+ (define short-alternate-format? (opt-val gnc:pagename-general optname-format-short))
+ (define cap-purch-costs? (opt-val gnc:pagename-general optname-cap-purch-costs))
+ (define document (gnc:make-html-document))
+
+ (define (elt->cell split)
+ (gnc:html-markup-anchor
+ (gnc:split-anchor-text split)
+ (amount->monetary (xaccSplitGetAmount split))))
+
+ (define large 10000000)
+ (define (get-fx db from to time)
+ (/ (gnc-pricedb-convert-balance-nearest-price-t64 db large from to time)
+ large))
+
+ (define (stock-split prev delta)
+ (let ((exact (/ (+ delta prev) prev)))
+ (format #f "~a:~a Split" (numerator exact) (denominator exact))))
+
+ (define (to-cell elt)
+ (gnc:make-html-table-cell/markup "number-cell" elt))
+
+ (define (cmp amt neg zero pos)
+ (cond ((< amt 0) neg)
+ ((= amt 0) zero)
+ (else pos)))
+
+ (gnc:html-document-set-title! document "IFRS weighted average cost basis Report")
+
+ (cond
+ ((null? stock-acct)
+ (gnc:html-document-add-object!
+ document (gnc:html-make-generic-options-warning
+ reportname (gnc:report-id report-obj))))
+
+ (else
+ (let ((commodity (xaccAccountGetCommodity stock-acct))
+ (currency (gnc-account-get-currency-or-parent stock-acct))
+ (pricedb (gnc-pricedb-get-db (gnc-get-current-book)))
+ (splits
+ (let ((query (qof-query-create-for-splits)))
+ (qof-query-set-book query (gnc-get-current-book))
+ (xaccQueryAddSingleAccountMatch query stock-acct QOF-QUERY-AND)
+ (xaccQueryGetSplitsUniqueTrans query))))
+
+ (define (to-commodity amt)
+ (if format-cells
+ (and amt (gnc:make-gnc-monetary commodity amt))
+ amt))
+
+ (define (to-orig-currency amt)
+ (if format-cells
+ (and amt (gnc:make-gnc-monetary currency amt))
+ amt))
+
+ (define (to-report-currency amt)
+ (if format-cells
+ (and amt (gnc:make-gnc-monetary report-currency amt))
+ amt))
+
+ (define table (gnc:make-html-table))
+
+ (gnc:html-document-set-title!
+ document
+ (format #f "Average-Cost (Basis) Report: From ~a to ~a. Report-currency ~a"
+ (qof-print-date startdate)
+ (qof-print-date enddate)
+ (gnc-commodity-get-mnemonic report-currency)))
+
+ (gnc:html-table-set-col-headers!
+ table (list "date" "description" "trans-units" "cumul-units" "note"
+ "curr" "fx" "purchase-val" "purchase-cost" "cash-dividends"
+ "proceeds-val" "proceeds-cost" "conv-purchase-val"
+ "conv-purchase-cost" "conv-dividends"
+ "conv-proceeds-val" "conv-proceeds-cost"
+ "average-cost-basis/unit-for-sale" "average-cost-basis-of-sale"
+ "cumulative-average-cost-basis"
+ "gain-post-commission" "gain-pre-commission" "net-proceeds"
+ "cumul-gross-profit" "cumul-net-profit" "cumul-tot-return"))
+
+ (let lp ((splits splits)
+ (odd-row? #t)
+ (cumul-units 0)
+ (cumul-average-cost-basis 0)
+ (cumul-gross-profit 0)
+ (cumul-net-profit 0)
+ (cumul-tot-return 0))
+
+ (match splits
+ (() (gnc:html-document-add-object! document table))
+
+ ((split . rest-splits)
+ (let* ((trans (xaccSplitGetParent split))
+ (trans-units (trans-extract-amount trans stock-acct #f))
+ (trans-value (trans-extract-value trans stock-acct #f))
+ (proceeds-val (trans-extract-value trans proceeds-acct #f))
+ (dividends-val (trans-extract-value trans dividend-acct #f))
+ (capgains-val (trans-extract-value trans capgains-acct #f))
+ (fees-value (trans-extract-value trans #f "Fee"))
+ (new-units (M+ cumul-units trans-units))
+
+ (sale?
+ (cond
+ ((< trans-units 0) (<= 0 new-units))
+ ((> trans-units 0) (<= new-units 0))
+ (else #f)))
+
+ (purchase?
+ (cond
+ ((= trans-value 0) dividends-val) ;dividends
+ ((= trans-units 0) proceeds-val) ;return of capital
+ ((> trans-units 0) (< 0 new-units)) ;regular buy
+ ((< trans-units 0) (< new-units 0)))) ;buy during short
+
+ (shorting? (or (< new-units 0)
+ (and (= new-units 0) (< 0 trans-units))))
+
+ (purchase-cost (and purchase? fees-value))
+ (purchase-val (and purchase? (M- trans-value purchase-cost)))
+ (cash-dividends (M- dividends-val))
+ (proceeds-cost (and sale? fees-value))
+ (proceeds-val (and sale? (M+ proceeds-val proceeds-cost)))
+
+ ;; now convert to report-currency
+ (fx (get-fx pricedb currency report-currency
+ (time64CanonicalDayTime (xaccTransGetDate trans))))
+ (conv-purchase-val (M* fx purchase-val))
+ (conv-purchase-cost (M* fx purchase-cost))
+ (conv-dividends (M* fx cash-dividends))
+ (conv-proceeds-val (M* fx proceeds-val))
+ (conv-proceeds-cost (M* fx proceeds-cost))
+
+ ;; now perform AVERAGE-COST-BASIS calculations
+ (average-cost-basis/unit-for-sale
+ (M-abs (M/ cumul-average-cost-basis cumul-units)))
+ (average-cost-basis-of-sale
+ (and proceeds-val (M* average-cost-basis/unit-for-sale
+ trans-units)))
+ (cumul-average-cost-basis
+ (M+ cumul-average-cost-basis
+ conv-purchase-val
+ (and cap-purch-costs? conv-purchase-cost)
+ average-cost-basis-of-sale))
+
+ (net-proceeds (M- conv-proceeds-val conv-proceeds-cost))
+ (gain-post-commission (M+ net-proceeds average-cost-basis-of-sale
+ (and (not cap-purch-costs?)
+ conv-purchase-cost)))
+ (gain-pre-commission (M+ conv-proceeds-val
+ average-cost-basis-of-sale))
+
+ (new-gross-profit (M+ cumul-gross-profit gain-pre-commission))
+ (new-net-profit (M+ cumul-net-profit gain-post-commission))
+ (new-tot-return (M+ cumul-tot-return gain-post-commission
+ conv-dividends)))
+
+ ;; (gnc:pk trans 'trans-units trans-units 'trans-value trans-value
+ ;; 'cumul-units cumul-units 'proceeds-val proceeds-val
+ ;; 'sale? sale? 'purchase? purchase?)
+ (cond
+ ((not (< startdate (xaccTransGetDate (xaccSplitGetParent (car splits)))
+ enddate))
+ (lp rest-splits
+ odd-row?
+ new-units
+ cumul-average-cost-basis
+ new-gross-profit
+ new-net-profit
+ new-tot-return))
+
+ (else
+ (gnc:html-table-append-row/markup!
+ table (if short-alternate-format?
+ (if shorting? "alternate-row" "normal-row")
+ (if odd-row? "normal-row" "alternate-row"))
+ (list (qof-print-date (xaccTransGetDate trans))
+ (gnc:html-string-sanitize (xaccTransGetDescription trans))
+ (to-cell (gnc:html-split-anchor split (to-commodity trans-units)))
+ (to-cell (to-commodity new-units))
+ (cond
+ ((< new-units 0 cumul-units) "ERROR: longâshort")
+ ((< cumul-units 0 new-units) "ERROR: shortâlong")
+ ((= 0 cumul-units) (cmp new-units "Open Short" "1" "Open Long"))
+ ((= 0 new-units) (cmp trans-units "Close Long" "2" "Close Short"))
+ ((= 0 trans-units trans-value)
+ (cmp cumul-units "Compensatory Dividend" "7" "Dividend"))
+ ((= 0 trans-units)
+ (cond (cash-dividends
+ (cmp cumul-units
+ "Compensatory Notional Distribution"
+ "7"
+ "Notional Distribution"))
+ (purchase-val
+ (cmp cumul-units
+ "Compensatory Return Capital"
+ "8"
+ "Return Capital"))
+ (else "3")))
+ ((= 0 trans-value) (stock-split cumul-units trans-units))
+ (purchase-val (cmp purchase-val "Short Sell" "5" "Buy"))
+ (proceeds-val (cmp proceeds-val "Short Buy" "6" "Sell"))
+ (else "4"))
+ (gnc-commodity-get-mnemonic currency)
+ (to-cell (gnc:default-price-renderer report-currency fx))
+ (to-cell (to-orig-currency purchase-val))
+ (to-cell (to-orig-currency purchase-cost))
+ (to-cell (to-orig-currency cash-dividends))
+ (to-cell (to-orig-currency proceeds-val))
+ (to-cell (to-orig-currency proceeds-cost))
+ (to-cell (to-report-currency conv-purchase-val))
+ (to-cell (to-report-currency conv-purchase-cost))
+ (to-cell (to-report-currency conv-dividends))
+ (to-cell (to-report-currency conv-proceeds-val))
+ (to-cell (to-report-currency conv-proceeds-cost))
+ (to-cell (to-report-currency average-cost-basis/unit-for-sale))
+ (to-cell (to-report-currency (M- average-cost-basis-of-sale)))
+ (to-cell (to-report-currency cumul-average-cost-basis))
+ (to-cell (to-report-currency gain-post-commission))
+ (to-cell (to-report-currency gain-pre-commission))
+ (to-cell (to-report-currency net-proceeds))
+ (to-cell (to-report-currency new-gross-profit))
+ (to-cell (to-report-currency new-net-profit))
+ (to-cell (to-report-currency new-tot-return))))
+
+ (lp rest-splits
+ (not odd-row?)
+ new-units
+ cumul-average-cost-basis
+ new-gross-profit
+ new-net-profit
+ new-tot-return))))))))))
+
+ ;; (gnc:dump-all-transactions)
+ (gnc:html-document-add-object! document disclaimer)
+ document)
+
+
+;; Here we define the actual report
+(gnc:define-report
+ 'version 1
+ 'name reportname
+ 'report-guid "15d5b744176c4625a703720338725291"
+ 'menu-path (list gnc:menuname-experimental)
+ 'options-generator options-generator
+ 'renderer ifrs-cost-basis-renderer)
diff --git a/gnucash/report/reports/standard/test/CMakeLists.txt b/gnucash/report/reports/standard/test/CMakeLists.txt
index 0875bcbf1..49a850667 100644
--- a/gnucash/report/reports/standard/test/CMakeLists.txt
+++ b/gnucash/report/reports/standard/test/CMakeLists.txt
@@ -17,6 +17,7 @@ set(scm_test_with_srfi64_SOURCES
test-trial-balance.scm
test-equity-statement.scm
test-average-balance.scm
+ test-ifrs-cost-basis.scm
test-invoice.scm
test-new-owner-report.scm
test-owner-report.scm
diff --git a/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm b/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm
new file mode 100644
index 000000000..f0f0492cb
--- /dev/null
+++ b/gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm
@@ -0,0 +1,357 @@
+(use-modules (gnucash engine))
+(use-modules (gnucash app-utils))
+(use-modules (tests test-engine-extras))
+(use-modules (gnucash reports standard average-cost-basis))
+(use-modules (gnucash report stylesheets plain))
+(use-modules (gnucash report))
+(use-modules (tests test-report-extras))
+(use-modules (srfi srfi-64))
+(use-modules (tests srfi64-extras))
+(use-modules (sxml simple))
+(use-modules (sxml xpath))
+
+;; This is implementation testing for both the AVERAGE-COST-BASIS Tool
+(define uuid "15d5b744176c4625a703720338725291")
+
+;; Explicitly set locale to make the report output predictable
+(setlocale LC_ALL "C")
+
+(define (run-test)
+ (test-runner-factory gnc:test-runner)
+ (test-begin "test-ifrs-cost-basis.scm")
+ (null-test)
+ (average-cost-basis-tests)
+ (test-end "test-ifrs-cost-basis.scm"))
+
+(define (options->sxml uuid options test-title)
+ (gnc:options->sxml uuid options "test-ifrs-basis" test-title))
+
+(define (set-option! options section name value)
+ (let ((option (gnc:lookup-option options section name)))
+ (if option
+ (gnc:option-set-value option value)
+ (test-assert (format #f "wrong-option ~a ~a" section name) #f))))
+
+(define (null-test)
+ ;; This null-test tests for the presence of report.
+ (let ((options (gnc:make-report-options uuid)))
+ (test-assert "null-test"
+ (options->sxml uuid options "null-test"))))
+
+(define (mnemonic->commodity sym)
+ (gnc-commodity-table-lookup
+ (gnc-commodity-table-get-table (gnc-get-current-book))
+ (gnc-commodity-get-namespace (gnc-default-report-currency))
+ sym))
+
+(define (new-commodity name ns sym scu)
+ (let* ((book (gnc-get-current-book))
+ (comm-table (gnc-commodity-table-get-table book))
+ (new-comm (gnc-commodity-new book name ns sym "" scu)))
+ (gnc-commodity-table-insert comm-table new-comm)
+ new-comm))
+
+(define (create-average-cost-basis-test-data)
+ (define book (gnc-get-current-book))
+ (define env (create-test-env))
+ (define USD (mnemonic->commodity "USD"))
+ (define CAD (mnemonic->commodity "CAD"))
+ (define SPY (new-commodity "SPY" "NYSE" "SPY" 10000))
+ (define structure
+ (list "Root" (list (cons 'type ACCT-TYPE-ASSET)
+ (cons 'commodity CAD))
+ (list "Asset"
+ (list "Broker" (list (cons 'commodity CAD))
+ (list "CAD Cash" (list (cons 'commodity CAD)))
+ (list "USD Cash" (list (cons 'commodity USD)))
+ (list "SPY" (list (cons 'commodity SPY)
+ (cons 'type ACCT-TYPE-STOCK))))
+ (list "Current Assets"
+ (list "Checking Account")))
+ (list "Income" (list (cons 'type ACCT-TYPE-INCOME))
+ (list "USD CapGain" (list (cons 'commodity USD)))
+ (list "USD Interest" (list (cons 'commodity USD))))
+ (list "Expenses" (list (cons 'type ACCT-TYPE-EXPENSE))
+ (list "USD Commissions" (list (cons 'commodity USD))))
+ (list "Equity" (list (cons 'type ACCT-TYPE-EQUITY))
+ (list "Opening Balances")
+ (list "Opening Balances USD" (list (cons 'commodity USD))))))
+ (define account-alist (env-create-account-structure-alist env structure))
+ (define (get-acct name)
+ (or (assoc-ref account-alist name) (error "no account" name)))
+ (define usd-cash (get-acct "USD Cash"))
+ (define usd-comm (get-acct "USD Commissions"))
+ (define inc-capg (get-acct "USD CapGain"))
+ (define spy (get-acct "SPY"))
+
+ (env-transfer env 01 05 2020
+ (get-acct "Opening Balances")
+ (get-acct "Checking Account")
+ 200000 #:description "opening cash")
+
+ (env-transfer env 06 05 2020
+ (get-acct "Checking Account")
+ (get-acct "CAD Cash")
+ 100000 #:description "fund trading account")
+
+ (env-transfer-foreign env 10 05 2020
+ (get-acct "CAD Cash")
+ usd-cash
+ 100000 85000
+ #:description "Convert CAD to USD")
+
+ (env-create-multisplit-transaction
+ env 01 07 2019
+ (list (vector usd-cash -2000995/100 -2000995/100 "")
+ (vector spy 20000 100 "Buy")
+ (vector spy 995/100 0 "Fee"))
+ #:description "Buy SPY"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 11 12 2019
+ (list (vector usd-cash -1600995/100 -1600995/100 "")
+ (vector spy 16000 50 "Buy")
+ (vector spy 995/100 0 "Fee")
+ )
+ #:description "Buy SPY"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 18 03 2020
+ (list (vector usd-comm 995/100 995/100 "Fee")
+ (vector usd-cash 1199005/100 1199005/100 "")
+ (vector inc-capg 600995/100 600995/100 "")
+ (vector spy -12000 -75 "Sell")
+ (vector spy -600995/100 0 "") ;gross profit/loss
+ )
+ #:description "Sell SPY"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 01 04 2020
+ (list (vector usd-cash -4200995/100 -4200995/100 "")
+ (vector spy 42000 250 "Buy")
+ (vector spy 995/100 0 "Fee")
+ )
+ #:description "Buy SPY"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 16 04 2020
+ (list (vector usd-cash 2500 -2500)
+ (vector spy -2500 0 "Buy")
+ )
+ #:description "Return of Capital"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 02 05 2020
+ (list (vector usd-cash -47500 -47500 "")
+ (vector spy 47500 125 "Buy")
+ (vector spy 0 0 "Fee")
+ )
+ #:description "Buy spy"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 11 05 2020
+ (list (vector spy 0 450 "Buy"))
+ #:description "stock split"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 21 05 2020
+ (list (vector usd-comm 995/100 995/100 "Fee")
+ (vector usd-cash 2149005/100 2149005/100 "")
+ (vector inc-capg 574702/100 574702/100 "")
+ (vector spy -21500 -135 "Sell")
+ (vector spy -574702/100 0 "") ;gross profit/loss
+ )
+ #:description "Sell SPY"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 03 06 2020
+ (list (vector usd-cash -21000 -21000 "")
+ (vector spy 21000 150 "Buy")
+ (vector spy 0 0 "Fee")
+ )
+ #:description "Buy spy"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 10 06 2020
+ (list (vector usd-comm 995/100 995/100 "Fee")
+ (vector usd-cash 12809005/100 12809005/100 "")
+ (vector inc-capg 1783309/100 1783309/100 "")
+ (vector spy -128100 -915 "Sell")
+ (vector spy -1783309/100 0 "") ;gross profit/loss
+ )
+ #:description "Sell SPY"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 10 06 2020
+ (list (vector spy 995/100 0 "Fee")
+ (vector usd-cash 1189005/100 1189005/100 "")
+ (vector spy -11900 -85 "Sell")
+ )
+ #:description "Sell SPY Short"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 15 06 2020
+ (list (vector spy 995/100 0 "Fee")
+ (vector usd-cash 1104005/100 1104005/100 "")
+ (vector spy -11050 -65 "Sell")
+ )
+ #:description "Sell SPY Short"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 18 06 2020
+ (list (vector spy 5000 50 "Sell")
+ (vector usd-comm 995/100 995/100 "Fee")
+ (vector spy 264337/100 0 "") ;gross profit/loss
+ (vector usd-cash -500995/100 -500995/100 "")
+ (vector inc-capg -264337/100 -264337/100 "")
+ )
+ #:description "Buy SPY Close Short"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 20 06 2020
+ (list (vector spy 8000 100 "Sell")
+ (vector usd-comm 498/100 498/100 "Fee")
+ (vector spy 728673/100 0 "") ;gross profit/loss
+ (vector usd-cash -800498/100 -800498/100 "")
+ (vector inc-capg -728673/100 -728673/100 "")
+ )
+ #:description "Buy SPY Close Short"
+ #:currency CAD)
+
+ (env-create-multisplit-transaction
+ env 21 06 2020
+ (list (vector usd-cash -800498/100 -800498/100 "")
+ (vector spy 8000 100 "Buy")
+ (vector spy 498/100 0 "Fee")
+ )
+ #:description "Buy SPY"
+ #:currency CAD)
+
+ account-alist)
+
+(define (average-cost-basis-tests)
+ (test-group-with-cleanup "average-cost-basis-tests"
+ (let* ((account-alist (create-average-cost-basis-test-data))
+ (options (gnc:make-report-options uuid)))
+ ;; (set-option! options "General" "Price Source" 'pricedb-latest)
+ (set-option! options "General" "Report's currency" (mnemonic->commodity "CAD"))
+ (set-option! options "General" "Proceeds Account"
+ (assoc-ref account-alist "USD Cash"))
+ (set-option! options "General" "Start Date"
+ (cons 'absolute (gnc-dmy2time64 01 01 2019)))
+ (set-option! options "General" "End Date"
+ (cons 'absolute (gnc-dmy2time64 01 01 2021)))
+
+ ;; (gnc:dump-all-transactions)
+
+ (let ((sxml (options->sxml uuid options "latest")))
+ (test-equal "BUY 100 SPY"
+ '("07/01/19" "Buy SPY" "100 SPY" "100 SPY" "Open Long" "CAD"
+ "C$1.0000" "C$20,000.00" "C$9.95" "C$20,000.00" "C$9.95"
+ "C$20,009.95" "C$0.00" "C$0.00" "C$0.00")
+ (sxml->table-row-col sxml 1 1 #f))
+
+ (test-equal "BUY 50 SPY"
+ '("12/11/19" "Buy SPY" "50 SPY" "150 SPY" "Buy" "CAD" "C$1.0000"
+ "C$16,000.00" "C$9.95" "C$16,000.00" "C$9.95" "C$200.10"
+ "C$36,019.90" "C$0.00" "C$0.00" "C$0.00")
+ (sxml->table-row-col sxml 1 2 #f))
+
+ (test-equal "Sell 75 SPY"
+ '("03/18/20" "Sell SPY" "-75 SPY" "75 SPY" "Sell" "CAD" "C$1.0000"
+ "C$12,000.00" "C$9.95" "C$12,000.00" "C$9.95" "C$240.13"
+ "C$18,009.95" "C$18,009.95" "-C$6,019.90" "-C$6,009.95"
+ "C$11,990.05" "-C$6,009.95" "-C$6,019.90" "-C$6,019.90")
+ (sxml->table-row-col sxml 1 3 #f))
+
+ (test-equal "BUY 250 SPY"
+ '("04/01/20" "Buy SPY" "250 SPY" "325 SPY" "Buy" "CAD" "C$1.0000"
+ "C$42,000.00" "C$9.95" "C$42,000.00" "C$9.95" "C$240.13"
+ "C$60,019.90" "-C$6,009.95" "-C$6,019.90" "-C$6,019.90")
+ (sxml->table-row-col sxml 1 4 #f))
+
+ (test-equal "Return Capital $2500"
+ '("04/16/20" "Return of Capital" "0 SPY" "325 SPY" "Return Capital"
+ "CAD" "C$1.0000" "-C$2,500.00" "-C$2,500.00" "C$184.68"
+ "C$57,519.90" "-C$6,009.95" "-C$6,019.90" "-C$6,019.90")
+ (sxml->table-row-col sxml 1 5 #f))
+
+ (test-equal "BUY 125 SPY"
+ '("05/02/20" "Buy spy" "125 SPY" "450 SPY" "Buy" "CAD" "C$1.0000"
+ "C$47,500.00" "C$0.00" "C$47,500.00" "C$0.00" "C$176.98"
+ "C$105,019.90" "-C$6,009.95" "-C$6,019.90" "-C$6,019.90")
+ (sxml->table-row-col sxml 1 6 #f))
+
+ (test-equal "2:1 split"
+ '("05/11/20" "stock split" "450 SPY" "900 SPY" "2:1 Split"
+ "CAD" "C$1.0000" "C$233.38" "C$105,019.90" "-C$6,009.95"
+ "-C$6,019.90" "-C$6,019.90")
+ (sxml->table-row-col sxml 1 7 #f))
+
+ (test-equal "sell 135 SPY"
+ '("05/21/20" "Sell SPY" "-135 SPY" "765 SPY" "Sell" "CAD" "C$1.0000"
+ "C$21,500.00" "C$9.95" "C$21,500.00" "C$9.95" "C$116.69"
+ "C$15,752.98" "C$89,266.92" "C$5,737.06" "C$5,747.02"
+ "C$21,490.05" "-C$262.94" "-C$282.84" "-C$282.84")
+ (sxml->table-row-col sxml 1 8 #f))
+
+ (test-equal "BUY 150 SPY"
+ '("06/03/20" "Buy spy" "150 SPY" "915 SPY" "Buy" "CAD" "C$1.0000"
+ "C$21,000.00" "C$0.00" "C$21,000.00" "C$0.00" "C$116.69"
+ "C$110,266.92" "-C$262.94" "-C$282.84" "-C$282.84")
+ (sxml->table-row-col sxml 1 9 #f))
+
+ (test-equal "sell 915 SPY close long"
+ '("06/10/20" "Sell SPY" "-915 SPY" "0 SPY" "Close Long" "CAD"
+ "C$1.0000" "C$128,100.00" "C$9.95" "C$128,100.00" "C$9.95"
+ "C$120.51" "C$110,266.92" "C$0.00" "C$17,823.14" "C$17,833.08"
+ "C$128,090.05" "C$17,570.15" "C$17,540.30" "C$17,540.30")
+ (sxml->table-row-col sxml 1 10 #f))
+
+ (test-equal "short-sell 85 SPY"
+ '("06/10/20" "Sell SPY Short" "-85 SPY" "-85 SPY" "Open Short"
+ "CAD" "C$1.0000" "-C$11,900.00" "C$9.95" "-C$11,900.00" "C$9.95"
+ "-C$11,890.05" "C$17,570.15" "C$17,540.30" "C$17,540.30")
+ (sxml->table-row-col sxml 1 11 #f))
+
+ (test-equal "short-sell 65 SPY"
+ '("06/15/20" "Sell SPY Short" "-65 SPY" "-150 SPY" "Short Sell"
+ "CAD" "C$1.0000" "-C$11,050.00" "C$9.95" "-C$11,050.00" "C$9.95"
+ "C$139.88" "-C$22,930.10" "C$17,570.15" "C$17,540.30" "C$17,540.30")
+ (sxml->table-row-col sxml 1 12 #f))
+
+ (test-equal "buy 50 SPY short"
+ '("06/18/20" "Buy SPY Close Short" "50 SPY" "-100 SPY" "Short Buy"
+ "CAD" "C$1.0000" "-C$5,000.00" "C$9.95" "-C$5,000.00" "C$9.95"
+ "C$152.87" "-C$7,643.37" "-C$15,286.73" "C$2,633.42" "C$2,643.37"
+ "-C$5,009.95" "C$20,213.52" "C$20,173.72" "C$20,173.72")
+ (sxml->table-row-col sxml 1 13 #f))
+
+ (test-equal "BUY 100 SPY close short"
+ '("06/20/20" "Buy SPY Close Short" "100 SPY" "0 SPY" "Close Short"
+ "CAD" "C$1.0000" "-C$8,000.00" "C$4.98" "-C$8,000.00" "C$4.98"
+ "C$152.87" "-C$15,286.73" "C$0.00" "C$7,281.75" "C$7,286.73"
+ "-C$8,004.98" "C$27,500.25" "C$27,455.47" "C$27,455.47")
+ (sxml->table-row-col sxml 1 14 #f))
+
+ (test-equal "BUY 100 SPY"
+ '("06/21/20" "Buy SPY" "100 SPY" "100 SPY" "Open Long" "CAD"
+ "C$1.0000" "C$8,000.00" "C$4.98" "C$8,000.00" "C$4.98"
+ "C$8,004.98" "C$27,500.25" "C$27,455.47" "C$27,455.47")
+ (sxml->table-row-col sxml 1 15 #f))))
+ (gnc-clear-current-session)))
+
+
commit 14c523e4f158f677f9ea2211c77eca65f3634104
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sat Aug 22 00:10:56 2020 +0800
[test-engine-extras] augment book data generators
* txn-currency can be specified explicitly instead of currency of
first split
* split memos can be specified
Note test-register.scm gets some changes because the Trans Num field
was erroneously saved into Split Action fields. Now the num field is
only copied into the TransNum field.
diff --git a/bindings/guile/test/test-engine-extras.scm b/bindings/guile/test/test-engine-extras.scm
index 8e3087efa..b873e0d15 100644
--- a/bindings/guile/test/test-engine-extras.scm
+++ b/bindings/guile/test/test-engine-extras.scm
@@ -182,6 +182,7 @@
num ; string: num field (def = null)
notes ; string: notes (def = null)
memo ; string: memo (def = null)
+ currency ; commodity (def = commodity of 1st split)
)
(env-create-multisplit-transaction
env
@@ -193,6 +194,7 @@
#:reconcile reconcile
#:num num
#:memo memo
+ #:currency currency
#:notes notes))
(define* (env-transfer
@@ -239,42 +241,46 @@
(pricedb? #t) ; boolean: add pricedb entry?
void-reason ; string: void-reason (def = not-voided)
reconcile ; pair : (cons reconciled reconciled-date)
+ currency ; currency
num ; string: num field (def = null)
notes ; string: notes (def = null)
memo) ; string: memo (def = null)
(and (pair? list-of-splits)
(let* ((book (gnc-get-current-book))
(txn (xaccMallocTransaction book))
- (first-split (vector-ref (car list-of-splits) 0)))
+ (first-split (vector-ref (car list-of-splits) 0))
+ (txn-curr (or currency (xaccAccountGetCommodity first-split))))
(xaccTransBeginEdit txn)
(xaccTransSetDescription txn (or description (env-string env "ponies")))
- (xaccTransSetCurrency txn (xaccAccountGetCommodity first-split))
+ (xaccTransSetCurrency txn txn-curr)
(xaccTransSetDate txn DD MM YY)
(for-each
(lambda (split)
(let ((acc (vector-ref split 0))
(val (vector-ref split 1))
(amt (vector-ref split 2))
+ (action (and (> (vector-length split) 3)
+ (vector-ref split 3)))
(newsplit (xaccMallocSplit book)))
(xaccSplitSetParent newsplit txn)
(xaccSplitSetAccount newsplit acc)
(xaccSplitSetValue newsplit val)
(xaccSplitSetAmount newsplit amt)
- (if num (gnc-set-num-action txn newsplit num num))
- (if memo (xaccSplitSetMemo newsplit memo))
+ (if memo (xaccSplitSetMemo newsplit memo))
+ (if action (xaccSplitSetAction newsplit action))
(when reconcile
(xaccSplitSetReconcile newsplit (car reconcile))
(xaccSplitSetDateReconciledSecs newsplit (cdr reconcile)))
(if (and pricedb?
(not (zero? amt))
(not (gnc-commodity-equiv
- (xaccAccountGetCommodity first-split)
- (xaccAccountGetCommodity acc))))
- (gnc-pricedb-create (xaccAccountGetCommodity first-split)
+ txn-curr (xaccAccountGetCommodity acc))))
+ (gnc-pricedb-create txn-curr
(xaccAccountGetCommodity acc)
(gnc-dmy2time64 DD MM YY)
(/ val amt)))))
list-of-splits)
+ (if num (xaccTransSetNum txn num))
(if void-reason (xaccTransVoid txn void-reason))
(if notes (xaccTransSetNotes txn notes))
(xaccTransCommitEdit txn)
diff --git a/gnucash/report/reports/standard/test/test-register.scm b/gnucash/report/reports/standard/test/test-register.scm
index eb3967a73..12d6d1d77 100644
--- a/gnucash/report/reports/standard/test/test-register.scm
+++ b/gnucash/report/reports/standard/test/test-register.scm
@@ -66,6 +66,8 @@
(set-option options "__reg" "query" (gnc-query2scm query)))
(let ((sxml (options->sxml options "basic")))
+ ;; this is a simplistic test - counts the number of populated
+ ;; html-table-cells in the register table.
(test-equal "table has 232 cells"
232
(length (sxml->table-row-col sxml 1 #f #f)))
@@ -80,8 +82,10 @@
(set-option options "__reg" "journal" #t)
(let ((sxml (options->sxml options "journal")))
- (test-equal "table has 339 cells"
- 339
+ ;; this is a simplistic test - counts the number of populated
+ ;; html-table-cells in the register table.
+ (test-equal "table has 329 cells"
+ 329
(length (sxml->table-row-col sxml 1 #f #f)))
(test-equal "total debit = #6"
@@ -102,8 +106,10 @@
(set-option options "__reg" "ledger-type" #t)
(let ((sxml (options->sxml options "ledger-type")))
- (test-equal "table has 343 cells"
- 343
+ ;; this is a simplistic test - counts the number of populated
+ ;; html-table-cells in the register table.
+ (test-equal "table has 333 cells"
+ 333
(length (sxml->table-row-col sxml 1 #f #f)))
(test-equal "total debit = #6"
@@ -132,8 +138,10 @@
(set-option options "__reg" "double" #t)
(let ((sxml (options->sxml options "double")))
- (test-equal "table has 347 cells"
- 347
+ ;; this is a simplistic test - counts the number of populated
+ ;; html-table-cells in the register table.
+ (test-equal "table has 337 cells"
+ 337
(length (sxml->table-row-col sxml 1 #f #f)))
(test-equal "total debit = #6"
commit c38740fcd942a655ef30002bc46609c3d95294cf
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Wed Aug 19 20:19:13 2020 +0800
[report-utilities] more dump data functions
Two API to dump splits in whole book:
* gnc:dump-book - splits grouped by account
* gnc:dump-all-transactions - splits grouped by transaction
* gnc:dump-split - dumps single split
Example output -- note (gnc:dump-book) dumps each account followed by
its splits, then account balance. (gnc:dump-all-transactions) dumps all
transactions in date order, each followed by its splits.
(gnc:dump-book)
Account 8e56ef54: <Expense> Comm<USD> Type<Expense>
n Split 5dd1c0a9: 05/11/19 Amt<$200.00> $200.00 Desc<vend1> Memo<AP>
n Split f9cb052f: 05/11/19 Amt<$20.00> $20.00 Desc<emp1> Memo<vouch1>
n Split daafc64b: 05/11/19 Amt<$69.00> $69.00 Desc<vend1> Memo<job-bill>
n Split 5e6af9fe: 14/11/19 Amt<$86.00> $86.00 Desc<emp1> Memo<emp-voucher>
n Split 6d636ea2: 14/11/19 Amt<$46.00> $46.00 Desc<vend1>
n Split e618644b: 14/12/19 Amt<-$100.00> -$100.00 Desc<Vend-USD>
n Split 8be19fbd: 25/12/19 Amt<-$46.00> -$46.00 Desc<Vend-USD> Memo<CN$100-desc>
n Split ee4fe250: 01/04/20 Amt<$32.00> $32.00 Desc<Cell phone>
n Split 2cb02dac: 09/05/20 Amt<-$307.00> -$307.00
Balance: $0.00 Cleared: $0.00 Reconciled: $0.00
Account 6f39f557: <Closing> Comm<USD> Type<Equity>
n Split 13916652: 09/05/20 Amt<$307.00> $307.00
Balance: $307.00 Cleared: $0.00 Reconciled: $0.00
Account fa6507e1: <Closing:GBP> Comm<GBP> Type<Equity>
n Split 34ce3c03: 09/05/20 Amt<-£1,293.00> -£1,293.00
Balance: -£1,293.00 Cleared: £0.00 Reconciled: £0.00
(gnc:dump-all-transactions)
Trans cfbbc2a4: 12/07/19 Curr GBP Desc<Customer-GBP>
n Split d12f74b2: 12/07/19 Acc<AR-GBP> Amt<£120.00> £120.00 Desc<Customer-GBP> Memo<due 91+>
n Split 3880e99c: 12/07/19 Acc<Standard Sales> Amt<-£20.00> -£20.00 Desc<Customer-GBP> Memo<due 91+>
n Split 6bd9c7e4: 12/07/19 Acc<Income-GBP> Amt<-£100.00> -£100.00 Desc<Customer-GBP> Memo<due 91+>
Trans 60344bab: 09/10/19 Curr GBP Desc<Customer-GBP>
n Split aaca8ee0: 09/10/19 Acc<AR-GBP> Amt<£225.00> £225.00 Desc<Customer-GBP> Memo<due 2-3 months ago>
n Split ee49bde8: 09/10/19 Acc<Standard Sales> Amt<-£20.00> -£20.00 Desc<Customer-GBP> Memo<due 2-3 months ago>
n Split e989e863: 09/10/19 Acc<Reduced Sales> Amt<-£5.00> -£5.00 Desc<Customer-GBP> Memo<due 2-3 months ago>
n Split 91d6cadd: 09/10/19 Acc<Income-GBP> Amt<-£200.00> -£200.00 Desc<Customer-GBP> Memo<due 2-3 months ago
diff --git a/gnucash/report/report-utilities.scm b/gnucash/report/report-utilities.scm
index cb3240a0b..98ad3369c 100644
--- a/gnucash/report/report-utilities.scm
+++ b/gnucash/report/report-utilities.scm
@@ -1206,7 +1206,7 @@ query instead.")
(define-public (gnc:dump-split s show-acc?)
(define txn (xaccSplitGetParent s))
- (format #t "~a Split ~a: ~a~a Amt<~a> ~a~a~a\n"
+ (format #t "~a Split ~a: ~a~a Amt<~a> Val<~a> ~a~a~a\n"
(xaccSplitGetReconcile s)
(string-take (gncSplitGetGUID s) 8)
(qof-print-date (xaccTransGetDate txn))
@@ -1220,10 +1220,12 @@ query instead.")
(xaccTransGetCurrency txn)
(xaccSplitGetValue s)))
(maybe-str 'Desc (xaccTransGetDescription txn))
+ (maybe-str 'Action (xaccSplitGetAction s))
(maybe-str 'Memo (xaccSplitGetMemo s))))
(define-public (gnc:dump-all-transactions)
(define query (qof-query-create-for-splits))
+ (define (split-has-no-account? split) (null? (xaccSplitGetAccount split)))
(display "\n(gnc:dump-all-transactions)\n")
(qof-query-set-book query (gnc-get-current-book))
(qof-query-set-sort-order query (list SPLIT-TRANS TRANS-DATE-POSTED) '() '())
@@ -1232,6 +1234,7 @@ query instead.")
(newline)
(match splits
(() (qof-query-destroy query))
+ (((? split-has-no-account?) . rest) (lp rest))
((split . rest)
(let ((trans (xaccSplitGetParent split)))
(format #t " Trans ~a: ~a Curr ~a ~a~a\n"
commit e3d4bd2e24fb180d05ddce674bc486b3518e35d8
Author: Giuseppe Foti <foti.giuseppe at gmail.com>
Date: Fri Apr 30 01:09:57 2021 +0200
Translation update by Giuseppe Foti <foti.giuseppe at gmail.com> using Weblate
po/it.po: 100.0% (5479 of 5479 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Program (Italian)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/it/
Co-authored-by: Giuseppe Foti <foti.giuseppe at gmail.com>
diff --git a/po/it.po b/po/it.po
index 5c3925ab1..b01be4ca3 100644
--- a/po/it.po
+++ b/po/it.po
@@ -55,7 +55,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-26 08:32+0000\n"
+"PO-Revision-Date: 2021-04-29 06:32+0000\n"
"Last-Translator: Giuseppe Foti <foti.giuseppe at gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/gnucash/gnucash/"
"it/>\n"
@@ -633,11 +633,11 @@ msgid ""
"followed by ':' and the first letter(s) of the subaccount (e.g. A:C for "
"Assets:Cash)."
msgstr ""
-"Digitando le prime lettere del nome di un conto esistente nella colonna "
-"Transazione del registro, GnuCash completerà il nome prendendolo dall'elenco "
-"dei conti. Per i sottoconti, digitare le prime lettere del conto genitore "
-"seguito da «:» e dalle prime lettere del sottoconto (cioè A:L per Attività :"
-"Liquidi)."
+"Digita le prime lettere del nome di un conto esistente nella colonna "
+"Transazione del registro, e GnuCash completerà il nome prendendolo "
+"dall'elenco dei conti. Per i sottoconti, digita le prime lettere del conto "
+"genitore seguito da «:» e dalle prime lettere del sottoconto (cioè A:L per "
+"Attività :Liquidi)."
#: doc/tip_of_the_day.list.c:65
msgid ""
@@ -6098,8 +6098,9 @@ msgid ""
"Add the current report's configuration to the 'Reports->Saved Report "
"Configurations' menu. The report configuration will be saved in the file %s."
msgstr ""
-"Aggiunge la configurazione del resoconto corrente al menu «Configurazione di "
-"resoconto salvate». Il resoconto verrà salvato nel file %s."
+"Aggiunge la configurazione del resoconto corrente al menu «Resoconti-"
+">Configurazione di resoconto salvate». Il resoconto verrà salvato nel file "
+"%s."
#: gnucash/gnome/gnc-plugin-page-report.c:1205
msgid "_Print Report..."
@@ -12460,17 +12461,13 @@ msgstr ""
# Tooltip
#: gnucash/gschemas/org.gnucash.gschema.xml.in:290
#: gnucash/gtkbuilder/dialog-preferences.glade:2777
-#, fuzzy
-#| msgid ""
-#| "Automatically expand the current transaction to show all splits. All "
-#| "other transactions are shown on one line. (Two in double line mode.)"
msgid ""
"Automatically expand the current transaction to show all splits. All other "
"transactions are shown on one line or in double line mode on two."
msgstr ""
"Espande automaticamente la transazione selezionata mostrando tutte le "
"suddivisioni. Tutte le altre transazioni verranno mostrate su una singola "
-"riga (due nella modalità a riga doppia)"
+"riga (o su due nella modalità a riga doppia)."
# Tooltip
#: gnucash/gschemas/org.gnucash.gschema.xml.in:295
@@ -13536,38 +13533,6 @@ msgstr "Importazione prezzi CSV"
#. You should localize the (british) examples to your region.
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:65
-#, fuzzy
-#| msgid ""
-#| "This assistant will help you import Prices from a CSV file.\n"
-#| "\n"
-#| "There is a minimum number of columns that have to be present for a "
-#| "successful import, these are Date, Amount, From Namespace, From Symbol "
-#| "and Currency To. If all entries are for the same Commodity / Currency "
-#| "then you can select them and then the columns will be Date and Amount.\n"
-#| "\n"
-#| "Various options exist for specifying the delimiter as well as a fixed "
-#| "width option. With the fixed width option, double click on the table of "
-#| "rows displayed to set a column width, then right mouse to change if "
-#| "required.\n"
-#| "\n"
-#| "Examples are \"FTSE\",\"RR.L\",\"21/11/2016\",5.345,\"GBP\" and CURRENCY;"
-#| "USD;2016-11-21;1.56;GBP\n"
-#| "\n"
-#| "There is an option for specifying the start row, end row and an option to "
-#| "skip alternate rows beginning from the start row which can be used if you "
-#| "have some header text. Also there is an option to overwrite existing "
-#| "prices for that day if required.\n"
-#| "\n"
-#| "Lastly, for repeated imports the preview page has buttons to Load and "
-#| "Save the settings. To save the settings, tweak the settings to your "
-#| "preferences (optionally starting from an existing preset), then "
-#| "(optionally change the settings name and press the Save Settings button. "
-#| "Note you can't save to built-in presets.\n"
-#| "\n"
-#| "This operation is not reversible, so make sure you have a working "
-#| "backup.\n"
-#| "\n"
-#| "Click on \"Next\" to proceed or \"Cancel\" to Abort Import."
msgid ""
"This assistant will help you import Prices from a CSV file.\n"
"\n"
@@ -13621,11 +13586,11 @@ msgstr ""
"necessario.\n"
"\n"
"Infine, per le importazioni ripetute la pagina di anteprima ha i pulsanti "
-"per caricare e salvare le impostazioni. Per salvare le impostazioni, "
-"modifica le impostazioni in base alle tue preferenze (facoltativamente a "
-"partire da una preimpostazione esistente), quindi (facoltativamente) "
-"modifica il nome delle impostazioni e premi il pulsante Salva impostazioni. "
-"Nota che non puoi sovrascrivere le preimpostazioni integrate.\n"
+"per caricare e salvare le impostazioni. Puoi salvare le tue impostazioni per "
+"riutilizzarle in successive importazioni. Dopo aver caricato le tue "
+"impostazioni puoi anche regolarle per importazioni simili e salvare le "
+"impostazioni modificate con un altro nome. Nota che non puoi salvare sui "
+"predefiniti incorporati.\n"
"\n"
"Questa operazione non è reversibile, quindi assicurati di avere un backup "
"funzionante.\n"
@@ -13824,10 +13789,6 @@ msgid "Import Preview"
msgstr "Anteprima importazione"
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:1026
-#, fuzzy
-#| msgid ""
-#| "<b>Press Apply to add the Prices.\n"
-#| "Cancel to abort.</b>"
msgid ""
"<b>Press \"Apply\" to add the Prices.\n"
"\"Cancel\" to abort.</b>"
@@ -13844,34 +13805,6 @@ msgid "CSV Transaction Import"
msgstr "Importazione transazioni CSV"
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:56
-#, fuzzy
-#| msgid ""
-#| "This assistant will help you import a delimited file containing a list of "
-#| "transactions. It supports both token separated files (such as comma "
-#| "separated or semi-colon separated) and fixed width data.\n"
-#| "\n"
-#| "For a successful import three columns have to be available in the import "
-#| "data:\n"
-#| "⢠a Date column\n"
-#| "⢠a Description column\n"
-#| "⢠a Deposit or Withdrawal column\n"
-#| "\n"
-#| "If there is no Account data available, a base account can be selected to "
-#| "which all data will be imported.\n"
-#| "\n"
-#| "Apart from a choice of delimiter, there are several options to tweak the "
-#| "importer. For example a number of lines can be skipped at the start or "
-#| "the end of the data, as well as odd rows. Several date and number formats "
-#| "are supported. The file encoding can be defined.\n"
-#| "\n"
-#| "The importer can handle files where transactions are split over multiple "
-#| "lines, with each line representing one split.\n"
-#| "\n"
-#| "Lastly, for repeated imports the preview page has buttons to Load and "
-#| "Save the settings. To save the settings, tweak the settings to your "
-#| "preferences (optionally starting from an existing preset), then "
-#| "(optionally change the settings name and press the Save Settings button. "
-#| "Note you can't save to built-in presets."
msgid ""
"This assistant will help you import a delimited file containing a list of "
"transactions. It supports both token separated files (such as comma "
@@ -13921,11 +13854,10 @@ msgstr ""
"righe, ciascuna delle quali rappresenta una suddivisione.\n"
"\n"
"Infine, per le importazioni ripetute la pagina di anteprima ha i pulsanti "
-"per caricare e salvare le impostazioni. Per salvare le impostazioni, "
-"modifica le impostazioni in base alle tue preferenze (facoltativamente a "
-"partire da una preimpostazione esistente), quindi (facoltativamente) "
-"modifica il nome delle impostazioni e premi il pulsante Salva impostazioni. "
-"Nota che non puoi sovrascrivere le preimpostazioni integrate."
+"per caricare e salvare le impostazioni. Puoi salvare le tue impostazioni per "
+"riutilizzarle in successive importazioni. Dopo aver caricato le tue "
+"impostazioni puoi anche regolarle per importazioni simili e salvare le "
+"impostazioni modificate con un altro nome."
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:74
msgid "Transaction Import Assistant"
@@ -16213,10 +16145,8 @@ msgid "Linked _Location"
msgstr "_Posizione collegata"
#: gnucash/gtkbuilder/dialog-doclink.glade:349
-#, fuzzy
-#| msgid "(none)"
msgid "(None)"
-msgstr "(nessuno)"
+msgstr "(Nessuno)"
#: gnucash/gtkbuilder/dialog-doclink.glade:412
msgid "Enter URL like http://www.gnucash.org"
@@ -19948,17 +19878,36 @@ msgid ""
"Online Banking, because sometimes the bank does not give you correct "
"feedback when a transfer is rejected."
msgstr ""
+"I requisiti per l'online banking variano tra i diversi backend AqBanking "
+"supportati, ma generalmente avrai bisogno che:\n"
+"* la tua banca ti conceda l'accesso online. Vedi sul loro sito web o chiedi "
+"al loro servizio clienti come ottenerlo.\n"
+"Dovrebbero anche comunicarti:\n"
+"* il tuo ID utente che ti identifica sul loro server, spesso il tuo numero "
+"di conto di base;\n"
+"* l'URL del loro server di servizi bancari online;\n"
+"* in alcuni casi, in questo assistente ti servirà il numero di routing della "
+"filiale della tua banca;\n"
+"* i metodi di autenticazione variano in base al backend e al metodo scelto:\n"
+"* FinTS PIN / TAN: alcuni metodi richiedono un gadget specifico come un "
+"lettore di schede o un cellulare;\n"
+"* FinTS HBCI: devi scambiare le parti pubbliche delle chiavi asimmetriche "
+"con la tua banca ('Ini-Letter').\n"
+"* PayPal: indirizzo email registrato, password, firma API;\n"
+"\n"
+"Vedi https://wiki.gnucash.org/wiki/AqBanking per maggiori dettagli.\n"
+"\n"
+"Nota: NESSUNA GARANZIA DI FUNZIONAMENTO. Alcune banche gestiscono un server "
+"di Online Banking mal implementato. Non dovresti fare affidamento su Online "
+"Banking per trasferimenti critici in termini di tempo, perché a volte la "
+"banca non fornisce un feedback corretto quando un trasferimento viene "
+"rifiutato."
#: gnucash/import-export/aqb/assistant-ab-initial.glade:71
msgid "Initial Online Banking Setup"
msgstr "Impostazione iniziale dell'Online Banking"
#: gnucash/import-export/aqb/assistant-ab-initial.glade:90
-#, fuzzy
-#| msgid ""
-#| "The Setup of your Online Banking connection is handled by the external "
-#| "program \"AqBanking Setup Wizard\". Please press the button below to "
-#| "start this program."
msgid ""
"The Setup of your Online Banking connection is handled by the external "
"program \"AqBanking Setup Wizard\".\n"
@@ -19967,8 +19916,10 @@ msgid ""
"Please press the button below to start it."
msgstr ""
"L'impostazione della connessione all'Online Banking è gestita da un "
-"programma esterno denominato «assistente per l'impostazione di AqBanking». "
-"Fai clic sul pulsante qui sotto per avviare questo programma."
+"programma esterno denominato «assistente per l'impostazione di AqBanking».\n"
+"Per continuare, devi impostare almeno una connessione.\n"
+"\n"
+"Fai clic sul pulsante qui sotto per avviare la procedura."
#: gnucash/import-export/aqb/assistant-ab-initial.glade:104
msgid "_Start AqBanking Wizard"
@@ -21226,13 +21177,6 @@ msgid "Import bills and invoices from a CSV text file"
msgstr "Importa documenti di acquisto e vendita da un file di testo CSV"
#: gnucash/import-export/csv-exp/assistant-csv-export.c:80
-#, fuzzy
-#| msgid ""
-#| "This assistant will help you export the Account Tree to a file\n"
-#| "with the separator specified below.\n"
-#| "\n"
-#| "Select the settings you require for the file and then click \"Next\" to "
-#| "proceed or \"Cancel\" to abort the export.\n"
msgid ""
"This assistant will help you export the Account Tree to a file with the "
"separator specified below.\n"
@@ -21240,7 +21184,7 @@ msgid ""
"Select the settings you require for the file and then click \"Next\" to "
"proceed or \"Cancel\" to abort the export.\n"
msgstr ""
-"Questa procedura permette di esportare la struttura dei conti in un file\n"
+"Questa procedura permette di esportare la struttura dei conti in un file "
"utilizzando il separatore specificato.\n"
"\n"
"Seleziona le impostazioni richieste per il file e fai clic su «Avanti» per "
@@ -21248,22 +21192,7 @@ msgstr ""
#. Translators: %s is one of the following paragraphs about rows/transaction.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:87
-#, fuzzy, c-format
-#| msgid ""
-#| "This assistant will help you export the Transactions to a file\n"
-#| "with the separator specified below.\n"
-#| "\n"
-#| "There will be multiple rows for each transaction and may require further "
-#| "manipulation to get them in a format you can use.\n"
-#| "\n"
-#| "Each Transaction will appear once in the export and will be listed in the "
-#| "order the accounts were processed\n"
-#| "\n"
-#| "Price/Rate output format is controlled by the Preference setting,\n"
-#| "General->Force Prices to display as decimals\n"
-#| "\n"
-#| "Select the settings you require for the file and then click \"Next\" to "
-#| "proceed or \"Cancel\" to abort the export.\n"
+#, c-format
msgid ""
"This assistant will help you export the Transactions to a file with the "
"separator specified below.\n"
@@ -21280,33 +21209,39 @@ msgid ""
"Select the settings you require for the file and then click \"Next\" to "
"proceed or \"Cancel\" to abort the export.\n"
msgstr ""
-"Questa procedura ti aiuterà a esportare le transazioni in un file\n"
-"con il separatore specificato di seguito.\n"
+"Questa procedura ti aiuterà a esportare le transazioni in un file con il "
+"separatore specificato di seguito.\n"
+"\n"
+"%s\n"
"\n"
-"Vi saranno più righe per ogni transazione e potrebbe essere necessaria "
-"un'ulteriore manipolazione per ottenerle in un formato utilizzabile.\n"
+"Sebbene una transazione possa avere suddivisioni in diversi conti "
+"selezionati, ogni transazione verrà esportata solo una volta. Essa apparirà "
+"sotto il primo account elaborato di quelli in cui è suddivisa la transazione."
"\n"
-"Ogni transazione apparirà una sola volta nell'esportazione e sarà elencata "
-"nell'ordine in cui sono stati elaborati i conti\n"
"\n"
"Il formato di output per prezzo/tasso è controllato dall'impostazione "
"Preferenze,\n"
-"Generale-> Forza la visualizzazione dei prezzi come decimali\n"
+"«Numeri, Data, Orario»->«Forza la visualizzazione dei prezzi come decimali»\n"
"\n"
-"Selezionare le impostazioni richieste per il file e quindi fare clic su "
-"«Avanti» per procedere o su «Annulla» per interrompere l'esportazione.\n"
+"Seleziona le impostazioni richieste per il file e quindi fai clic su «Avanti»"
+" per procedere o su «Annulla» per interrompere l'esportazione.\n"
#: gnucash/import-export/csv-exp/assistant-csv-export.c:99
msgid ""
"There will be multiple rows for each transaction with each row representing "
"one split."
msgstr ""
+"Ci saranno più righe per ogni transazione con ogni riga che rappresenta una "
+"suddivisione."
#: gnucash/import-export/csv-exp/assistant-csv-export.c:103
msgid ""
"There will be one row for each transaction, equivalent to a single row in a "
"register in 'Basic Ledger' mode. As such some transfer detail could be lost."
msgstr ""
+"Ci sarà una riga per ogni transazione, equivalente a una singola riga in un "
+"registro in modalità «Libro mastro base» Pertanto, alcuni dettagli del "
+"trasferimento potrebbero andare persi."
#. Translators: %s is the file name.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:109
@@ -21817,16 +21752,12 @@ msgstr ""
"colonna collegata al trasferimento."
#: gnucash/import-export/csv-imp/gnc-import-tx.cpp:671
-#, fuzzy
-#| msgid ""
-#| "No account column selected and no default account specified either.\n"
-#| "This should never happen. Please report this as a bug."
msgid ""
"No account column selected and no base account specified either.\n"
"This should never happen. Please report this as a bug."
msgstr ""
"Non è stata selezionata alcuna colonna per il conto né è stato specificato "
-"un conto predefinito.\n"
+"un conto di base.\n"
"Questo non deve succedere. Segnalalo come un bug."
#: gnucash/import-export/csv-imp/gnc-imp-props-price.cpp:55
@@ -21896,10 +21827,8 @@ msgstr ""
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:520
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:575
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:583
-#, fuzzy
-#| msgid " could not be understood.\n"
msgid "Column '{1}' could not be understood.\n"
-msgstr " non può essere interpretato.\n"
+msgstr "Colonna '{1}' non può essere interpretato.\n"
#: gnucash/import-export/csv-imp/gnc-imp-props-price.cpp:280
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:328
commit 13871595ea9ada9f950744b548496d246f96a7ab
Author: Eugenia Russell <eugenia.russell2019 at gmail.com>
Date: Fri Apr 30 01:09:56 2021 +0200
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/glossary/el.po: 95.1% (198 of 208 strings; 9 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/el/
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/glossary/el.po: 93.7% (195 of 208 strings; 10 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/el/
Translation update by Eugenia Russell <eugenia.russell2019 at gmail.com> using Weblate
po/el.po: 53.4% (2927 of 5479 strings; 1503 fuzzy)
611 failing checks (11.1%)
Translation: GnuCash/Program (Greek)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/el/
Co-authored-by: Eugenia Russell <eugenia.russell2019 at gmail.com>
diff --git a/po/el.po b/po/el.po
index 026d25822..2dc0eaa5c 100644
--- a/po/el.po
+++ b/po/el.po
@@ -37,10 +37,10 @@
msgid ""
msgstr ""
"Project-Id-Version: GnuCash 2.4\n"
-"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug.cgi?"
-"product=GnuCash&component=Translations\n"
+"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
+"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-11 13:26+0000\n"
+"PO-Revision-Date: 2021-04-28 20:32+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/gnucash/gnucash/el/"
">\n"
@@ -49,7 +49,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
#: bindings/guile/commodity-table.scm:44
msgid "ALL NON-CURRENCY"
@@ -621,7 +621,6 @@ msgid ""
msgstr ""
#: doc/tip_of_the_day.list.c:80
-#, fuzzy
msgid ""
"To transfer funds between accounts with different currencies, click on the "
"Transfer button in the register toolbar, select the accounts, and the "
@@ -631,7 +630,7 @@ msgstr ""
"Îια να μεÏαÏÎÏεÏε κεÏάλαια μεÏÎ±Î¾Ï Î»Î¿Î³Î±ÏιαÏμÏν διαÏοÏεÏÎ¹ÎºÎ¿Ï Î½Î¿Î¼Î¯ÏμαÏοÏ, "
"ΠαÏήÏÏε Ïο κοÏ
μÏί ÎεÏαÏοÏά ÏοÏ
βÏίÏκεÏαι Ïην εÏγαλειοθήκη ÏοÏ
μηÏÏÏοÏ
, "
"εÏιλÎξÏε ÏοÏ
λογαÏιαÏμοÏÏ ÎºÎ±Î¹ ÏÎ¹Ï ÎµÏιλογÎÏ Î¼ÎµÏαÏοÏÎ¬Ï Î³Î¹Î± να ειÏάγεÏε Ïην "
-"ιÏοÏιμία η Ïο αλλο ÏοÏÏ"
+"ιÏοÏιμία η Ïο αλλο ÏοÏÏ."
#: doc/tip_of_the_day.list.c:85
msgid ""
@@ -701,7 +700,6 @@ msgid ""
msgstr ""
#: doc/tip_of_the_day.list.c:123
-#, fuzzy
msgid ""
"There is a theory that if ever anyone discovers what the Universe is for and "
"why it is here, it will instantly disappear and be replaced with something "
@@ -712,9 +710,10 @@ msgid ""
msgstr ""
"Î¥ÏάÏÏει η θεÏÏία ÏοÏ
λÎει ÏÏι αν μια μÎÏα κάÏÎ¿Î¹Î¿Ï Î±Î½Î±ÎºÎ±Î»ÏÏει Ïο λÏγο ÏÏαÏÎ¾Î·Ï "
"ÏοÏ
ÏÏμÏανÏοÏ, αÏ
ÏÏ Î¸Î± εξαÏανιÏÏεί ακαÏιαία και θα ανÏικαÏαÏÏαθεί αÏÏ ÎºÎ¬Ïι "
-"Ïιο αλλÏκοÏο και ακαÏανÏηÏο. Î¥ÏάÏÏει εÏίÏÎ·Ï ÎºÎ±Î¹ κάÏοια άλλη θεÏÏία ÏοÏ
λÎει "
-"ÏÏι αÏ
ÏÏ ÎÏει ήδη ÏÏ
μβεί. Douglas Adams, \"Το ÎÏÏιαÏÏÏιο ÏÏην ÎκÏη ÏοÏ
"
-"ΣÏμÏανÏοÏ\""
+"Ïιο αλλÏκοÏο και ακαÏανÏηÏο. \n"
+"Î¥ÏάÏÏει εÏίÏÎ·Ï ÎºÎ±Î¹ κάÏοια άλλη θεÏÏία ÏοÏ
λÎει ÏÏι αÏ
ÏÏ ÎÏει ήδη ÏÏ
μβεί. \n"
+"\n"
+"Douglas Adams, \"Το ÎÏÏιαÏÏÏιο ÏÏην ÎκÏη ÏοÏ
ΣÏμÏανÏοÏ\""
#: gnucash/gnome/assistant-acct-period.c:188
msgid "The book was closed successfully."
@@ -736,7 +735,7 @@ msgstr[1] ""
#. Translators: Run the assistant in your language to see GTK's translation of the button labels.
#: gnucash/gnome/assistant-acct-period.c:369
-#, fuzzy, c-format
+#, c-format
msgid ""
"You have asked for a book to be created. This book will contain all "
"transactions up to midnight %s (for a total of %d transactions spread over "
@@ -747,8 +746,10 @@ msgid ""
msgstr ""
"ÎηÏήÏαÏε να δημιοÏ
Ïγηθεί Îνα βιβλίο. ÎÏ
ÏÏ Ïο βιβλίο θα ÏεÏιÎÏει ÏÎ»ÎµÏ ÏÎ¹Ï "
"ÏÏ
ναλλαγÎÏ Î¼ÎÏÏι Ïα μεÏάνÏ
ÏÏα ÏÏÎ¹Ï %s (για Îνα ÏÏνολο %d ÏÏ
ναλλαγÏν αÏÏ %d "
-"λογαÏιαÏμοÏÏ). ΠαÏήÏÏε 'ÎÏÏοÏÏά' για να δημιοÏ
Ïγηθεί Ïο βιβλίο. ΠαÏήÏÏε "
-"'ΠίÏÏ' για να αλλάξεÏε ÏÎ¹Ï Î·Î¼ÎµÏομηνίεÏ."
+"λογαÏιαÏμοÏÏ).\n"
+"\n"
+"ΠαÏήÏÏε 'ÎÏÏοÏÏά' για να δημιοÏ
Ïγηθεί Ïο βιβλίο.\n"
+"ΠαÏήÏÏε 'ΠίÏÏ' για να αλλάξεÏε ÏÎ¹Ï Î·Î¼ÎµÏομηνίεÏ."
#: gnucash/gnome/assistant-acct-period.c:386
#, c-format
@@ -1400,16 +1401,16 @@ msgid "_Delete"
msgstr "_ÎιαγÏαÏή"
#: gnucash/gnome/dialog-customer.c:329
-#, fuzzy
msgid ""
"You must enter a company name. If this customer is an individual (and not a "
"company) you should enter the same value for:\n"
"Identification - Company Name, and\n"
"Payment Address - Name."
msgstr ""
-"Î ÏÎÏει να ειÏάγεÏε Îνα Ïνομα εÏαιÏείαÏ. Îν αÏ
ÏÏÏ Î¿ ÏελάÏÎ·Ï ÎµÎ¯Î½Î±Î¹ ιδιÏÏÎ·Ï "
-"(και ÏÏι εÏαιÏεία) ÏÏÏε ÏÏÎÏει να οÏίÏεÏε \"company name\" και \"contact "
-"name|\" να είναι ίδια."
+"Î ÏÎÏει να ειÏάγεÏε Îνα Ïνομα εÏαιÏείαÏ. Îν αÏ
ÏÏÏ Î¿ ÏελάÏÎ·Ï ÎµÎ¯Î½Î±Î¹ ιδιÏÏÎ·Ï ("
+"και ÏÏι εÏαιÏεία) ÏÏÏε ÏÏÎÏει να οÏίÏεÏε\n"
+"\"company name\" και \"contact name|\" \n"
+"να είναι ίδια."
#: gnucash/gnome/dialog-customer.c:341
msgid "You must enter a billing address."
@@ -30755,9 +30756,9 @@ msgstr "%s: %s - %s"
#. Translators: %d is the number of Recurrences in the list.
#: libgnucash/engine/Recurrence.c:727
-#, fuzzy, c-format
+#, c-format
msgid "Unknown, %d-size list."
-msgstr "ÎγνÏÏÏÎ¿Ï ÏÏÏÎ¿Ï Î±ÏÏείοÏ
"
+msgstr "ÎγνÏÏÏÎ¿Ï %d-ÏÏÏÎ¿Ï Î±ÏÏείοÏ
."
#: libgnucash/engine/ScrubBusiness.c:549
msgid ""
diff --git a/po/glossary/el.po b/po/glossary/el.po
index 3096815bb..40cf5971c 100644
--- a/po/glossary/el.po
+++ b/po/glossary/el.po
@@ -11,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-04-15 15:26+0000\n"
+"PO-Revision-Date: 2021-04-29 23:09+0000\n"
"Last-Translator: Eugenia Russell <eugenia.russell2019 at gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/gnucash/glossary/"
"el/>\n"
@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
msgid "Term (Dear translator: This file will never be visible to the user!)"
@@ -718,20 +718,19 @@ msgstr "ÎνανÎÏÏη"
#. "aka 'two-sided form' is in Europe often used for the balance sheet. Complement: report form: Vertical Form"
msgid "report form: T Account Form"
-msgstr ""
+msgstr "ÎνÏÏ
Ïο αναÏοÏάÏ: ΦÏÏμα λογαÏιαÏÎ¼Î¿Ï T"
#. "aka 'running form' is in english speaking countries usually used for the balance sheet in one column. Complement: report form: T Account Form"
msgid "report form: Vertical Form"
-msgstr ""
+msgstr "ÎνÏÏ
Ïο αναÏοÏάÏ: ÎάθεÏη ÏÏÏμα"
#. "name of an equity account (?); to be distinguished from the opening balance."
msgid "Retained Earnings"
msgstr "ÎιαÏηÏοÏμενα ÎÎÏδη"
#. "Create a new transaction that is the inverse of the old one. When you add the two together they completely cancel out. Accounts use this instead of voiding transactions, usually because the prior month has been closed and can no longer be changed, or the entire accounting system is 'write only'."
-#, fuzzy
msgid "reverse transaction, to (Action in the register)"
-msgstr "Î ÏεÏιγÏαÏή ÏεÏιÎÏει"
+msgstr "ανÏίÏÏÏοÏη ÏÏ
ναλλαγή, ÏÏÎ¿Ï (ενÎÏγεια ÏÏο μηÏÏÏο)"
#. "(In the customer summary report) The total amount of money received because something was sold."
msgid "sales"
@@ -757,7 +756,7 @@ msgstr "ÎÏÏάλεια"
#. "-"
msgid "Share Balance (register)"
-msgstr ""
+msgstr "Î¥ÏÏλοιÏο μεÏοÏÏν (μηÏÏÏο)"
#. "Any of the equal parts into which the money of a business company is divided, giving the holder a right to a portion of the profits"
msgid "shares"
commit b485f42f931aad7384309addff811fab71cb3c76
Author: Avi Markovitz <avi.markovitz at gmail.com>
Date: Fri Apr 30 01:09:55 2021 +0200
Translation update by Avi Markovitz <avi.markovitz at gmail.com> using Weblate
po/he.po: 100.0% (5479 of 5479 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Program (Hebrew)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/he/
Co-authored-by: Avi Markovitz <avi.markovitz at gmail.com>
diff --git a/po/he.po b/po/he.po
index 168e8da60..5700cd494 100644
--- a/po/he.po
+++ b/po/he.po
@@ -11,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-17 17:27+0000\n"
+"PO-Revision-Date: 2021-04-28 11:32+0000\n"
"Last-Translator: Avi Markovitz <avi.markovitz at gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/gnucash/gnucash/"
"he/>\n"
@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
"X-Poedit-Basepath: .\n"
#: bindings/guile/commodity-table.scm:44
@@ -1688,7 +1688,7 @@ msgstr "×× × ××ª× ×ער×× ×¤×¨×× ×¢×סק×."
#: gnucash/gnome/gnc-plugin-page-invoice.c:1361
#: gnucash/gnome/gnc-plugin-page-register.c:631
msgid "Manage Document Link"
-msgstr "× ×××× ×§×ש×ר ×ס××"
+msgstr "× ×××× ×ס×××× ××§×שר××"
#: gnucash/gnome/dialog-doclink.c:754
msgid "Transaction can not be modified."
@@ -4595,7 +4595,7 @@ msgstr "_תש××× ×ש×××"
#: gnucash/gnome/gnc-plugin-page-invoice.c:366
#: gnucash/gnome/gnc-plugin-page-register.c:300
msgid "_Manage Document Link..."
-msgstr "_× ×××× ×§×ש×ר ×ס××â¦"
+msgstr "_× ×××× ×ס×××× ××§×שר××â¦"
#. Translators: This is a menu item that opens an external file or URI that may
#. be linked to the current bill, invoice, transaction, or voucher using
@@ -4908,7 +4908,7 @@ msgstr "פת××ת ×××× ××× ×¡×¤×§ ×¢××ר × ××¢× ×××עת ××××
#: gnucash/gnome/gnc-plugin-page-invoice.c:445
msgid "Manage Document Link..."
-msgstr "× ×××× ×§×ש×ר ×ס××â¦"
+msgstr "× ×××× ×ס×××× ××§×שר××â¦"
#: gnucash/gnome/gnc-plugin-page-invoice.c:452
#: gnucash/gnome/gnc-plugin-page-register2.c:498
@@ -15196,11 +15196,11 @@ msgstr "×ער×: רק ×§×ש××¨× ×§×צ×× ×©××× × ×קר××× ××××
#: gnucash/gtkbuilder/dialog-doclink.glade:279
msgid "Linked _File"
-msgstr "×§×צ×× _××§×שר××"
+msgstr "×§×ש×ר _×§×צ××"
#: gnucash/gtkbuilder/dialog-doclink.glade:295
msgid "Linked _Location"
-msgstr "×××§×× _××§×שר"
+msgstr "×§×ש×ר _×××§××"
#: gnucash/gtkbuilder/dialog-doclink.glade:349
msgid "(None)"
@@ -16462,7 +16462,7 @@ msgstr ""
#: gnucash/gtkbuilder/dialog-preferences.glade:1943
msgid "<b>Linked Files</b>"
-msgstr "<b>×§×צ×× ××§×שר××</b>"
+msgstr "<b>×§×ש×ר ×§××××</b>"
#. Preferences->Online Banking:Generic
#: gnucash/gtkbuilder/dialog-preferences.glade:2038
commit 705db5aa0bf85762df5b3b27aa6d3832c4249e9d
Merge: b8e22b365 888676eb3
Author: John Ralls <jralls at ceridwen.us>
Date: Thu Apr 29 16:10:30 2021 -0700
Merge Hong Xu's 'from-to-price' into maint.
commit b8e22b36558bf87da2674dd3169e8b9618728ff8
Author: John Ralls <jralls at ceridwen.us>
Date: Thu Apr 29 15:53:06 2021 -0700
Fix archlinux dockerfile for github actions CI
diff --git a/util/ci/actions/archlinux-test/Dockerfile b/util/ci/actions/archlinux-test/Dockerfile
index 6de5dff05..2e1b81412 100644
--- a/util/ci/actions/archlinux-test/Dockerfile
+++ b/util/ci/actions/archlinux-test/Dockerfile
@@ -1,4 +1,4 @@
-from archlinux/base
+from archlinux:latest
run pacman -Syu --quiet --noconfirm gcc cmake make boost python2 pkg-config gettext gtk3 guile git ninja gtest gmock sqlite3 webkit2gtk swig gwenhywfar aqbanking intltool libxslt postgresql-libs libmariadbclient libdbi libdbi-drivers wayland-protocols > /dev/null
run echo en_US.UTF-8 UTF-8 >> /etc/locale.gen
run echo en_GB.UTF-8 UTF-8 >> /etc/locale.gen
commit 888676eb31d0a942d1ee12dec4bd3767517d2bcb
Author: Hong Xu <hong at topbug.net>
Date: Thu Apr 29 14:49:16 2021 -0700
from_price and to_price may be uninitialized in extract_comon_prices
Fix the compilation error on gcc 10:
gnucash/libgnucash/engine/gnc-pricedb.c: In function âÂÂextract_common_pricesâÂÂ:
gnucash/libgnucash/engine/gnc-pricedb.c:2469:40: error:
to_price may be used uninitialized in this function [-Werror=maybe-uninitialized]
2469 | if (from_price == NULL || to_price == NULL)
| ^
gnucash/libgnucash/engine/gnc-pricedb.c:2469:20:
error: âÂÂfrom_priceâ may be used uninitialized in this
function [-Werror=maybe-uninitialized]
2469 | if (from_price == NULL || to_price == NULL)
| ^
diff --git a/libgnucash/engine/gnc-pricedb.c b/libgnucash/engine/gnc-pricedb.c
index fb3d59869..e8686b49f 100644
--- a/libgnucash/engine/gnc-pricedb.c
+++ b/libgnucash/engine/gnc-pricedb.c
@@ -2439,7 +2439,7 @@ extract_common_prices (PriceList *from_prices, PriceList *to_prices,
{
PriceTuple retval = {NULL, NULL};
GList *from_node = NULL, *to_node = NULL;
- GNCPrice *from_price, *to_price;
+ GNCPrice *from_price = NULL, *to_price = NULL;
for (from_node = from_prices; from_node != NULL;
from_node = g_list_next(from_node))
commit 37afd65f2668cc8ff56b5b2eb55027f8b4e327fc
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Thu Apr 29 07:06:57 2021 +0800
[income-gst-statement] amend headers post Brexit
UK left EU, therefore VAT headers have now changed.
diff --git a/gnucash/report/reports/standard/income-gst-statement.scm b/gnucash/report/reports/standard/income-gst-statement.scm
index d89243291..481766b82 100644
--- a/gnucash/report/reports/standard/income-gst-statement.scm
+++ b/gnucash/report/reports/standard/income-gst-statement.scm
@@ -401,15 +401,15 @@ with *EUGOODS* in the account description."))
(box-8 (lambda (s) (myneg (split-adder s eu-sales-accts))))
(box-9 (lambda (s) (split-adder s eu-purch-accts))))
(list
- (vector "Box 1 VAT Sales" box-1 #f #t #f #f)
- (vector "Box 2 VAT Reverse EU" box-2 #f #t #f #f)
- (vector "Box 3 VAT Output" box-3 #f #t #f #f)
- (vector "Box 4 VAT Purchases" box-4 #f #t #f #f)
- (vector "Box 5 VAT Difference" box-5 #f #t #f #f)
- (vector "Box 6 Tot Sales" box-6 #f #t #f #f)
- (vector "Box 7 Tot Purchases" box-7 #f #t #f #f)
- (vector "Box 8 EU Goods Sales" box-8 #f #t #f #f)
- (vector "Box 9 EU Goods Purchases" box-9 #f #t #f #f)))))))
+ (vector "Box 1 VAT Sales" box-1 #f #t #f #f)
+ (vector "Box 2 VAT Goods Purchases from EU to NI" box-2 #f #t #f #f)
+ (vector "Box 3 VAT Output" box-3 #f #t #f #f)
+ (vector "Box 4 VAT Purchases" box-4 #f #t #f #f)
+ (vector "Box 5 VAT Difference" box-5 #f #t #f #f)
+ (vector "Box 6 Tot Sales" box-6 #f #t #f #f)
+ (vector "Box 7 Tot Purchases" box-7 #f #t #f #f)
+ (vector "Box 8 Net Goods Sales from NI to EU" box-8 #f #t #f #f)
+ (vector "Box 9 Net Goods Purchases from EU to NI" box-9 #f #t #f #f)))))))
;; Define the report.
(gnc:define-report
commit d60d5c30d2824d9550ffe19357102001d687a771
Author: John Ralls <jralls at ceridwen.us>
Date: Mon Apr 26 12:11:40 2021 -0700
Bug 798177 - Price of new stock transactions not saved in price database
Add call to xaccTransRecordPrice after every call to xaccTransCommitEdit
in gnc_split_register_save.
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index 427aedc02..101ca8023 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -1778,6 +1778,7 @@ gnc_split_register_save (SplitRegister* reg, gboolean do_commit)
PINFO ("committing trans (%p)", trans);
unreconcile_splits (reg);
xaccTransCommitEdit (trans);
+ xaccTransRecordPrice (trans, PRICE_SOURCE_SPLIT_REG);
gnc_resume_gui_refresh ();
}
@@ -1830,6 +1831,7 @@ gnc_split_register_save (SplitRegister* reg, gboolean do_commit)
g_warning ("Impossible? committing pending %p", pending_trans);
unreconcile_splits (reg);
xaccTransCommitEdit (pending_trans);
+ xaccTransRecordPrice (trans, PRICE_SOURCE_SPLIT_REG);
}
else if (pending_trans)
{
commit 6bb4faac5845be29e624cfe095f4c78e41923066
Author: John Ralls <jralls at ceridwen.us>
Date: Mon Apr 26 10:38:48 2021 -0700
Bug 795804 - Extremely slow save
Only update the status bar when the percentage changes by at least 1%
because running the mainloop is expensive on macOS and Microsoft
Windows. This speeds up all operations that run the progress bar with
overly-fine resolution.
diff --git a/gnucash/gnome-utils/gnc-splash.c b/gnucash/gnome-utils/gnc-splash.c
index efee10df6..9d4f4a5ac 100644
--- a/gnucash/gnome-utils/gnc-splash.c
+++ b/gnucash/gnome-utils/gnc-splash.c
@@ -24,6 +24,7 @@
#include <gtk/gtk.h>
#include <glib/gi18n.h>
+#include <math.h>
#include "gnc-gnome-utils.h"
#include "gnc-splash.h"
@@ -168,13 +169,19 @@ gnc_update_splash_screen (const gchar *string, double percentage)
}
}
- if (progress_bar)
+ if (progress_bar )
{
- if (percentage < 0)
+ double curr_fraction =
+ round(gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar)) * 100.0);
+ if (percentage >= 0 && percentage <= 100.0 &&
+ round(percentage) == curr_fraction)
+ return; // No change so don't wast time running the main loop
+
+ if (percentage <= 0)
{
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar), 0.0);
}
- else
+ else
{
if (percentage <= 100)
{
diff --git a/gnucash/gnome-utils/gnc-window.c b/gnucash/gnome-utils/gnc-window.c
index 2c9dd907b..fecacd4f9 100644
--- a/gnucash/gnome-utils/gnc-window.c
+++ b/gnucash/gnome-utils/gnc-window.c
@@ -25,6 +25,7 @@
#include <config.h>
#include <gtk/gtk.h>
+#include <math.h>
#include "gnc-engine.h"
#include "gnc-plugin-page.h"
@@ -167,6 +168,7 @@ gnc_window_show_progress (const char *message, double percentage)
{
GncWindow *window;
GtkWidget *progressbar;
+ double curr_fraction;
window = progress_bar_hack_window;
if (window == NULL)
@@ -179,6 +181,13 @@ gnc_window_show_progress (const char *message, double percentage)
return;
}
+ curr_fraction =
+ round(gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progressbar)) * 100.0);
+
+ if (percentage >= 0 && percentage <= 100 &&
+ round(percentage) == curr_fraction)
+ return; // No change, so don't waste time running the main loop.
+
gnc_update_splash_screen(message, percentage);
if (percentage < 0)
@@ -192,13 +201,13 @@ gnc_window_show_progress (const char *message, double percentage)
{
if (message && *message)
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progressbar), message);
- if ((percentage == 0) &&
+ if ((percentage == 0.0) &&
(GNC_WINDOW_GET_IFACE(window)->ui_set_sensitive != NULL))
GNC_WINDOW_GET_IFACE(window)->ui_set_sensitive(window, FALSE);
- if (percentage <= 100)
+ if (percentage <= 100.0)
{
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressbar),
- percentage / 100);
+ percentage / 100.0);
}
else
{
commit 2392bc2442011a0c252359b835aacf372076ec40
Author: Giuseppe Foti <foti.giuseppe at gmail.com>
Date: Mon Apr 26 10:32:03 2021 +0200
Translation update by Giuseppe Foti <foti.giuseppe at gmail.com> using Weblate
po/it.po: 99.7% (5466 of 5479 strings; 10 fuzzy)
5 failing checks (0.1%)
Translation: GnuCash/Program (Italian)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/it/
Co-authored-by: Giuseppe Foti <foti.giuseppe at gmail.com>
diff --git a/po/it.po b/po/it.po
index 81f1b94d9..5c3925ab1 100644
--- a/po/it.po
+++ b/po/it.po
@@ -52,10 +52,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Gnucash 4.3\n"
-"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug.cgi?"
-"product=GnuCash&component=Translations\n"
+"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
+"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-04 23:26+0000\n"
+"PO-Revision-Date: 2021-04-26 08:32+0000\n"
"Last-Translator: Giuseppe Foti <foti.giuseppe at gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/gnucash/gnucash/"
"it/>\n"
@@ -64,7 +64,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
#: bindings/guile/commodity-table.scm:44
msgid "ALL NON-CURRENCY"
@@ -4939,10 +4939,9 @@ msgstr ""
"Contabilizza un pagamento per l'intestatario di questo documento di vendita"
#: gnucash/gnome/gnc-plugin-page-invoice.c:381
-#, fuzzy
-#| msgid "Open a company report window for the owner of this invoice"
msgid "Open a customer report window for the owner of this invoice"
-msgstr "Apri un resoconto per l'intestatario di questo documento di vendita"
+msgstr ""
+"Apri un resoconto cliente per l'intestatario di questo documento di vendita"
#: gnucash/gnome/gnc-plugin-page-invoice.c:383
#: gnucash/gnome/gnc-plugin-page-invoice.c:404
@@ -5003,10 +5002,10 @@ msgstr ""
"Contabilizza un pagamento per l'intestatario di questo documento di acquisto"
#: gnucash/gnome/gnc-plugin-page-invoice.c:402
-#, fuzzy
-#| msgid "Open a company report window for the owner of this bill"
msgid "Open a vendor report window for the owner of this bill"
-msgstr "Apri un resoconto per l'intestatario di questo documento di acquisto"
+msgstr ""
+"Apri un resoconto fornitore per l'intestatario di questo documento di "
+"acquisto"
#: gnucash/gnome/gnc-plugin-page-invoice.c:409
msgid "Use the current layout as default for all vendor bills and credit notes"
@@ -5056,10 +5055,8 @@ msgid "Enter a payment for the owner of this voucher"
msgstr "Contabilizza un pagamento per l'intestatario di questa nota spese"
#: gnucash/gnome/gnc-plugin-page-invoice.c:423
-#, fuzzy
-#| msgid "Open a company report window for the owner of this voucher"
msgid "Open a employee report window for the owner of this voucher"
-msgstr "Apri un resoconto sull'intestatario di questa nota spese"
+msgstr "Apri un resoconto dipendente sull'intestatario di questa nota spese"
#: gnucash/gnome/gnc-plugin-page-invoice.c:430
msgid ""
@@ -7817,10 +7814,8 @@ msgid "Existing"
msgstr "Esistente"
#: gnucash/gnome-utils/dialog-dup-trans.c:148
-#, fuzzy
-#| msgid "Use +- keys to increment/decrement number"
msgid "You can type '+' or '-' to increment or decrement the number."
-msgstr "Usa i tasti +- per aumentare/diminuire il numero"
+msgstr "Puoi digitare «+» o «-» per aumentare o diminuire il numero."
#: gnucash/gnome-utils/dialog-dup-trans.c:297
msgid "Action/Number"
@@ -12439,12 +12434,10 @@ msgstr ""
# Tooltip
#: gnucash/gschemas/org.gnucash.gschema.xml.in:285
#: gnucash/gtkbuilder/dialog-preferences.glade:2758
-#, fuzzy
-#| msgid "Show all transactions on one line. (Two in double line mode.)"
msgid "Show all transactions on one line or in double line mode on two."
msgstr ""
-"Visualizza tutte le transazioni su una riga (due nella modalità a riga "
-"doppia)"
+"Visualizza tutte le transazioni su una riga o su due nella modalità a riga "
+"doppia."
#: gnucash/gschemas/org.gnucash.gschema.xml.in:286
#: gnucash/gschemas/org.gnucash.gschema.xml.in:291
@@ -14218,10 +14211,10 @@ msgid ""
"\n"
"Press 'Cancel' to close this dialog without creating any new accounts."
msgstr ""
-"Fai clic su «Applica» per creare i nuovi conti; sarà poi possibile salvarli "
-"in un file o in un database.\n"
+"Fai clic su «Applica» per creare i nuovi conti. Successivamente potrai "
+"salvarli in un file o in un database.\n"
"\n"
-"Fai clic su «Indietro» per modificare le impostazioni.\n"
+"Fai clic su «Indietro» per rivedere le impostazioni.\n"
"\n"
"Fai clic su «Annulla» per chiudere questa finestra senza creare alcun conto."
commit 42a41c792d566d19f18d3fdf26773f7e73d84ed1
Author: Frank H. Ellenberger <frank.h.ellenberger at gmail.com>
Date: Mon Apr 26 03:46:41 2021 +0200
I18N: Another improvement of price source list
diff --git a/gnucash/report/options-utilities.scm b/gnucash/report/options-utilities.scm
index cead02608..ebcc0d489 100644
--- a/gnucash/report/options-utilities.scm
+++ b/gnucash/report/options-utilities.scm
@@ -142,8 +142,8 @@
pagename optname
sort-tag (N_ "The source of price information.") default
(list (vector 'average-cost (N_ "Average cost of purchases weighted by volume"))
- (vector 'weighted-average (N_ "Weighted average of all past currency transactions"))
- (vector 'pricedb-before (N_ "Last up to report date"))
+ (vector 'weighted-average (N_ "Weighted average of all transactions in the past"))
+ (vector 'pricedb-before (N_ "Last up through report date"))
(vector 'pricedb-nearest (N_ "Closest to report date"))
(vector 'pricedb-latest (N_ "Most recent"))))))
commit 58abf252a347fba51501c23d700314593d08646a
Author: Guille Lopez <willelopz at gmail.com>
Date: Mon Apr 26 00:33:02 2021 +0200
Translation update by Guille Lopez <willelopz at gmail.com> using Weblate
po/es.po: 94.7% (5193 of 5479 strings; 242 fuzzy)
83 failing checks (1.5%)
Translation: GnuCash/Program (Spanish)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/es/
Co-authored-by: Guille Lopez <willelopz at gmail.com>
diff --git a/po/es.po b/po/es.po
index 23336f176..5c8a06cf1 100644
--- a/po/es.po
+++ b/po/es.po
@@ -12,10 +12,10 @@
msgid ""
msgstr ""
"Project-Id-Version: gnucash 2.7.8\n"
-"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug.cgi?"
-"product=GnuCash&component=Translations\n"
+"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
+"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-15 23:26+0000\n"
+"PO-Revision-Date: 2021-04-25 22:33+0000\n"
"Last-Translator: Guille Lopez <willelopz at gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/gnucash/gnucash/"
"es/>\n"
@@ -24,11 +24,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.6-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
"X-Bugs: Report translation errors to the Language-Team address.\n"
"X-Poedit-SourceCharset: UTF-8\n"
-"X-Poedit-KeywordsList: <b>;</b>;<span weight=\"bold\" size=\"larger\">;</"
-"span>;<span size=\"larger\" weight=\"bold\">\n"
+"X-Poedit-KeywordsList: <b>;</b>;<span weight=\"bold\" size=\"larger\""
+">;</span>;<span size=\"larger\" weight=\"bold\">\n"
#: bindings/guile/commodity-table.scm:44
msgid "ALL NON-CURRENCY"
@@ -2878,6 +2878,8 @@ msgid ""
"No documents were selected to assign this payment to. This may create an "
"unattached payment."
msgstr ""
+"No se ha seleccionado ningún documento para asociar a este pago. Esto podrÃa "
+"crear un pago sin adjuntar."
#: gnucash/gnome/dialog-payment.c:529 gnucash/gnome/dialog-payment.c:1330
#: gnucash/report/reports/standard/new-aging.scm:192
@@ -6214,6 +6216,8 @@ msgid ""
"This report must be upgraded to return a document object with export-string "
"or export-error."
msgstr ""
+"Este informe debe de ser actualizado para devolver un objeto de documento "
+"con export-string o export-error."
#: gnucash/gnome/gnc-plugin-page-report.c:1765
#, c-format
@@ -6640,6 +6644,9 @@ msgid ""
"have mismatched commodities or currencies.\n"
"You need to open each account individually to edit transactions."
msgstr ""
+"Las transacciones de esta cuenta no pueden ser editadas porque sus "
+"subcuentas tienen materias primas o monedas no coincidentes.\n"
+"Es necesario abrir cada cuenta individualmente para editar las transacciones."
#: gnucash/gnome/gnc-split-reg.c:2524
#, fuzzy
@@ -7100,16 +7107,16 @@ msgstr "Abre la ventana de ayuda de GnuCash"
#, c-format
msgid "Statement Date is %d day after today."
msgid_plural "Statement Date is %d days after today."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "La fecha del extracto es %d dÃa posterior a hoy."
+msgstr[1] "La fecha del extracto es %d dÃas posterior a hoy."
#. Translators: %d is the number of days in the future
#: gnucash/gnome/window-reconcile.c:364
#, c-format
msgid "The statement date you have chosen is %d day in the future."
msgid_plural "The statement date you have chosen is %d days in the future."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "La fecha del extracto seleccionada se encuentra %d dÃa en el futuro."
+msgstr[1] "La fecha del extracto seleccionada se encuentra %d dÃas en el futuro."
#: gnucash/gnome/window-reconcile.c:369
msgid ""
@@ -7124,6 +7131,8 @@ msgid ""
"WARNING! Account contains splits whose reconcile date is after statement "
"date. Reconciliation may be difficult."
msgstr ""
+"¡ATENCIÃN! La cuenta contiene desgloses cuya fecha de conciliación es "
+"posterior a la fecha del extracto. La conciliación puede ser difÃcil."
#: gnucash/gnome/window-reconcile.c:1856
msgid ""
@@ -7132,6 +7141,10 @@ msgid ""
"the case, you may use Find Transactions to find them, unreconcile, and re-"
"reconcile."
msgstr ""
+"Esta cuenta contiene desgloses cuya fecha de conciliación es posterior a la "
+"fecha del extracto. Estos desgloses pueden hacer la conciliación difÃcil. Si "
+"éste es el caso, se puede usar la búsqueda de transacciones para "
+"encontrarlos, des-conciliarlos y re-conciliarlos."
#: gnucash/gnome/window-report.c:115
msgid "Set the report options you want using this dialog."
@@ -7828,7 +7841,7 @@ msgstr "Cabecera de ruta no existe, "
#: gnucash/gnome-utils/dialog-doclink-utils.c:242
#, c-format
msgid "Path head not set, using '%s' for relative paths"
-msgstr ""
+msgstr "Cabecera de la ruta no establecida, usando '%s' para rutas relativas"
# menú
#: gnucash/gnome-utils/dialog-doclink-utils.c:426
@@ -10567,6 +10580,10 @@ msgid ""
"Note this option has been deprecated and will be removed in GnuCash 5.0.\n"
"Please use 'gnucash-cli --quotes get <datafile>' instead."
msgstr ""
+"Añadir cotización de precios a un archivo de datos de GnuCash determinado.\n"
+"Nota: esta opción se ha marcado como obsoleta y será eliminada en GnuCash 5."
+"0.\n"
+"Por favor, use 'gnucash-cli --quotes get <datafile>' en su lugar."
#: gnucash/gnucash.cpp:346
msgid ""
@@ -10576,6 +10593,12 @@ msgid ""
"Please use 'gnucash-cli --quotes get --namespace <namespace> <datafile>' "
"instead."
msgstr ""
+"Expresión regular definiendo qué productos de espacio de nombres se "
+"recuperarán.\n"
+"Nota: esta opción se ha marcado como obsoleta y será eliminada en GnuCash 5."
+"0.\n"
+"Por favor, use 'gnucash-cli --quotes get --namespace <namespace> <datafile>' "
+"en su lugar."
#: gnucash/gnucash.cpp:363
msgid ""
@@ -10583,6 +10606,9 @@ msgid ""
"removed in GnuCash 5.0. Please use 'gnucash-cli --quotes get <datafile>' "
"instead."
msgstr ""
+"La opción '--add-price-quotes' de gnucash se ha marcado como obsoleta y será "
+"eliminada en GnuCash 5.0. Por favor, use 'gnucash-cli --quotes get "
+"<datafile>' en su lugar."
#: gnucash/gnucash.cpp:399
#, fuzzy
@@ -19150,6 +19176,8 @@ msgid ""
"Replace the budget for all periods with new 'value'. Use empty value to "
"unset budget for the accounts."
msgstr ""
+"Reemplazar el presupuesto para todos los periodos con un nuevo 'valor'. "
+"Dejar el valor vacÃo para quitar el presupuesto de las cuentas."
#: gnucash/gtkbuilder/gnc-plugin-page-budget.glade:133
msgid "Add"
@@ -19179,7 +19207,7 @@ msgstr "DÃgitos significativos"
#: gnucash/gtkbuilder/gnc-plugin-page-budget.glade:208
msgid "Use a fixed value or apply transformation for all periods."
-msgstr ""
+msgstr "Usar un valor fijo o aplicar transformación a todos los periodos."
#: gnucash/gtkbuilder/gnc-plugin-page-budget.glade:240
msgid "Estimate Budget Values"
@@ -19524,6 +19552,9 @@ msgid ""
"than approximately 20. In that case please clear at least some of them "
"manually."
msgstr ""
+"Esta herramienta puede ser lenta o abortar si el número de desgloses no "
+"compensados es mayor que aproximadamente 20. En ese caso, compense algunos "
+"de manera manual."
#: gnucash/gtkbuilder/window-autoclear.glade:138
#: gnucash/gtkbuilder/window-reconcile.glade:117
@@ -19539,6 +19570,8 @@ msgstr "_Revisar transacciones creadas"
#: gnucash/gtkbuilder/window-autoclear.glade:181
msgid "Select this option to open a register tab with newly cleared splits."
msgstr ""
+"Seleccione esta opción para abrir una pestaña de libro de cuentas con "
+"desgloses recién compensados."
#: gnucash/gtkbuilder/window-reconcile.glade:71
msgid "<b>Reconcile Information</b>"
@@ -19630,6 +19663,8 @@ msgid ""
"This assistant helps you setting up your Online Banking connection with your "
"bank."
msgstr ""
+"Este asistente le ayuda a establecer la conexión bancaria online con su "
+"banco."
#. See https://wiki.gnucash.org/wiki/AqBanking for the used terminology and replace the link, if a localized version exists.
#: gnucash/import-export/aqb/assistant-ab-initial.glade:47
@@ -19808,7 +19843,7 @@ msgstr "_Introducir fecha:"
#: gnucash/import-export/aqb/dialog-ab.glade:512
msgid "No_w"
-msgstr ""
+msgstr "A_hora"
#: gnucash/import-export/aqb/dialog-ab.glade:572
msgid "Enter Password"
@@ -19825,7 +19860,7 @@ msgstr "A_nchura de la Barra"
#. TAN generator with flicker interface common in DE only
#: gnucash/import-export/aqb/dialog-ab.glade:670
msgid "Setting the bar width, adapting to the size of the TAN generator."
-msgstr ""
+msgstr "Definir el ancho de la barra, adaptando al tamaño del generador TAN."
#: gnucash/import-export/aqb/dialog-ab.glade:685
msgid "_Delay"
@@ -20571,6 +20606,7 @@ msgstr "Importar _MT940"
msgid ""
"Import an end-of-day account statement in SWIFT MT940 format into GnuCash."
msgstr ""
+"Importar un extracto de cuenta fin-de-dÃa con formato SWIFT MT940 a GnuCash."
#: gnucash/import-export/aqb/gnc-plugin-aqbanking.c:138
msgid "Import MT94_2"
@@ -20579,6 +20615,7 @@ msgstr "Importar MT94_2"
#: gnucash/import-export/aqb/gnc-plugin-aqbanking.c:139
msgid "Import an interim account statement in SWIFT MT942 format into GnuCash."
msgstr ""
+"Importar un extracto provisional de cuenta en formato SWIFT MT942 a GnuCash."
#. Translators: DTAUS is a traditional german exchange format.
#. https://de.wikipedia.org/wiki/Datentr%C3%A4geraustauschverfahren
@@ -20886,6 +20923,15 @@ msgid ""
"- invoices created: %u\n"
"- invoices updated: %u"
msgstr ""
+"Importación:\n"
+"- filas ignoradas: %i\n"
+"- filas importadas: %i\n"
+"\n"
+"Validación & procesamiento:\n"
+"- filas corregidas: %u\n"
+"- filas ignoradas: %u\n"
+"- facturas creadas: %u\n"
+"- facturas actualizadas: %u"
#: gnucash/import-export/bi-import/dialog-bi-import-gui.c:229
#: gnucash/import-export/customer-import/dialog-customer-import-gui.c:205
@@ -25696,6 +25742,8 @@ msgid ""
"The future minimum will add, for each date point, a projected minimum "
"balance including scheduled transactions."
msgstr ""
+"El mÃnimo futuro añadirá, para cada fecha, un balance proyectado mÃnimo "
+"incluyendo transacciones programadas."
#: gnucash/report/reports/standard/balance-forecast.scm:256
msgid "Target"
commit ae7eb9b3ad6ff81bc61f83f57b97ef5d80d76d60
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sun Apr 25 12:25:18 2021 +0800
[gnc-pricedb] extract common code into get_nearest_price
Extracts common code in:
* gnc_pricedb_get_nearest_before_price
* gnc_pricedb_get_nearest_price
* gnc_pricedb_get_latest_price
diff --git a/libgnucash/engine/gnc-pricedb.c b/libgnucash/engine/gnc-pricedb.c
index 05019feff..fb3d59869 100644
--- a/libgnucash/engine/gnc-pricedb.c
+++ b/libgnucash/engine/gnc-pricedb.c
@@ -2571,50 +2571,46 @@ direct_price_conversion (GNCPriceDB *db, const gnc_commodity *from,
return retval;
}
-gnc_numeric
-gnc_pricedb_get_nearest_before_price (GNCPriceDB *pdb,
- const gnc_commodity *orig_currency,
- const gnc_commodity *new_currency,
- const time64 t)
+static gnc_numeric
+get_nearest_price (GNCPriceDB *pdb,
+ const gnc_commodity *orig_curr,
+ const gnc_commodity *new_curr,
+ const time64 t,
+ gboolean before)
{
gnc_numeric price;
- if (gnc_commodity_equiv (orig_currency, new_currency))
+ if (gnc_commodity_equiv (orig_curr, new_curr))
return gnc_numeric_create (1, 1);
/* Look for a direct price. */
- price = direct_price_conversion (pdb, orig_currency, new_currency, t, TRUE);
+ price = direct_price_conversion (pdb, orig_curr, new_curr, t, before);
/*
* no direct price found, try find a price in another currency
*/
if (gnc_numeric_zero_p (price))
- price = indirect_price_conversion (pdb, orig_currency, new_currency, t, TRUE);
+ price = indirect_price_conversion (pdb, orig_curr, new_curr, t, before);
return gnc_numeric_reduce (price);
}
+gnc_numeric
+gnc_pricedb_get_nearest_before_price (GNCPriceDB *pdb,
+ const gnc_commodity *orig_currency,
+ const gnc_commodity *new_currency,
+ const time64 t)
+{
+ return get_nearest_price (pdb, orig_currency, new_currency, t, TRUE);
+}
+
gnc_numeric
gnc_pricedb_get_nearest_price (GNCPriceDB *pdb,
const gnc_commodity *orig_currency,
const gnc_commodity *new_currency,
const time64 t)
{
- gnc_numeric price;
-
- if (gnc_commodity_equiv (orig_currency, new_currency))
- return gnc_numeric_create (1, 1);
-
- /* Look for a direct price. */
- price = direct_price_conversion (pdb, orig_currency, new_currency, t, FALSE);
-
- /*
- * no direct price found, try find a price in another currency
- */
- if (gnc_numeric_zero_p (price))
- price = indirect_price_conversion (pdb, orig_currency, new_currency, t, FALSE);
-
- return gnc_numeric_reduce (price);
+ return get_nearest_price (pdb, orig_currency, new_currency, t, FALSE);
}
gnc_numeric
@@ -2622,7 +2618,7 @@ gnc_pricedb_get_latest_price (GNCPriceDB *pdb,
const gnc_commodity *orig_currency,
const gnc_commodity *new_currency)
{
- return gnc_pricedb_get_nearest_price (pdb, orig_currency, new_currency, INT64_MAX);
+ return get_nearest_price (pdb, orig_currency, new_currency, INT64_MAX, FALSE);
}
static gnc_numeric
@@ -2638,10 +2634,7 @@ convert_amount_at_date (GNCPriceDB *pdb,
if (gnc_numeric_zero_p (amount))
return amount;
- if (before_date)
- price = gnc_pricedb_get_nearest_before_price (pdb, orig_currency, new_currency, t);
- else
- price = gnc_pricedb_get_nearest_price (pdb, orig_currency, new_currency, t);
+ price = get_nearest_price (pdb, orig_currency, new_currency, t, before_date);
/* the price retrieved may be invalid. return zero. see 798015 */
if (gnc_numeric_check (price))
commit a2f5223148e72eae61ebe37c2a21322f4f19710e
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sun Apr 25 11:52:41 2021 +0800
[gnc-pricedb] use g_list_find and plug memory leak
found_coms was not being freed.
diff --git a/libgnucash/engine/gnc-pricedb.c b/libgnucash/engine/gnc-pricedb.c
index f3dae1dbd..05019feff 100644
--- a/libgnucash/engine/gnc-pricedb.c
+++ b/libgnucash/engine/gnc-pricedb.c
@@ -1878,16 +1878,6 @@ price_list_scan_any_currency(GList *price_list, gpointer data)
return TRUE;
}
-static gboolean
-is_in_list (GList *list, const gnc_commodity *c)
-{
- GList *node;
- for (node = list; node != NULL; node = g_list_next(node))
- if ((gnc_commodity*)node->data == c)
- return TRUE;
- return FALSE;
-}
-
/* This operates on the principal that the prices are sorted by date and that we
* want only the first one before the specified time containing both the target
* and some other commodity. */
@@ -1901,17 +1891,17 @@ latest_before (PriceList *prices, const gnc_commodity* target, time64 t)
gnc_commodity *com = gnc_price_get_commodity(price);
gnc_commodity *cur = gnc_price_get_currency(price);
time64 price_t = gnc_price_get_time64(price);
+
if (t < price_t ||
- (com == target && is_in_list(found_coms, cur)) ||
- (cur == target && is_in_list(found_coms, com)))
+ (com == target && g_list_find (found_coms, cur)) ||
+ (cur == target && g_list_find (found_coms, com)))
continue;
- else
- {
- gnc_price_ref(price);
- retval = g_list_prepend(retval, price);
- found_coms = g_list_prepend(found_coms, com == target ? cur : com);
- }
+
+ gnc_price_ref (price);
+ retval = g_list_prepend (retval, price);
+ found_coms = g_list_prepend (found_coms, com == target ? cur : com);
}
+ g_list_free (found_coms);
return g_list_reverse(retval);
}
commit a37060c95d18f96ae964ec3f646d270671efb601
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sun Apr 25 09:46:56 2021 +0800
ignore .vscode folder
diff --git a/.gitignore b/.gitignore
index f9ca4fde5..22637973a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@
.cproject
.project
.scm-links
+.vscode/
ChangeLog
Makefile
Makefile.in
commit 973a0bb7088755e91bf4857cfc1a75b118e73f91
Author: Frank H. Ellenberger <frank.h.ellenberger at gmail.com>
Date: Sun Apr 25 22:01:41 2021 +0200
Reorder and relabel price source list for better coherence
diff --git a/gnucash/report/options-utilities.scm b/gnucash/report/options-utilities.scm
index b120f32ef..cead02608 100644
--- a/gnucash/report/options-utilities.scm
+++ b/gnucash/report/options-utilities.scm
@@ -141,11 +141,11 @@
(gnc:make-multichoice-option
pagename optname
sort-tag (N_ "The source of price information.") default
- (list (vector 'average-cost (N_ "Average cost of purchases by volume-weighted"))
+ (list (vector 'average-cost (N_ "Average cost of purchases weighted by volume"))
(vector 'weighted-average (N_ "Weighted average of all past currency transactions"))
- (vector 'pricedb-latest (N_ "Most recent"))
- (vector 'pricedb-before (N_ "Nearest before report date"))
- (vector 'pricedb-nearest (N_ "Nearest to report date"))))))
+ (vector 'pricedb-before (N_ "Last up to report date"))
+ (vector 'pricedb-nearest (N_ "Closest to report date"))
+ (vector 'pricedb-latest (N_ "Most recent"))))))
;; The width- and height- options for charts
(define (gnc:options-add-plot-size!
commit b168de77afe9acd463825cb1dce092799f4db398
Author: TianXing_Yi <duguqiubailee at gmail.com>
Date: Sun Apr 25 20:32:01 2021 +0200
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 58.4% (3200 of 5479 strings; 1579 fuzzy)
627 failing checks (11.4%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 58.3% (3196 of 5479 strings; 1582 fuzzy)
627 failing checks (11.4%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: TianXing_Yi <duguqiubailee at gmail.com>
diff --git a/po/zh_CN.po b/po/zh_CN.po
index fb19cdb07..14668e325 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -18,7 +18,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-24 17:32+0000\n"
+"PO-Revision-Date: 2021-04-25 18:32+0000\n"
"Last-Translator: TianXing_Yi <duguqiubailee at gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
@@ -11088,7 +11088,7 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:20
msgid "Always reconcile to today"
-msgstr "æ»æ¯å¯¹è´¦å°ä»å¤©"
+msgstr "æ»æ¯å¯¹è´¦å°ä»å¤©(_O)"
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:21
msgid ""
@@ -11806,10 +11806,8 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:285
#: gnucash/gtkbuilder/dialog-preferences.glade:2758
-#, fuzzy
-#| msgid "Show all transactions on one line. (Two in double line mode.)"
msgid "Show all transactions on one line or in double line mode on two."
-msgstr "ææäº¤æäºé¡¹æ¾ç¤ºä¸è¡ã(åè¡æ¨¡å¼æ¶æ¾ç¤ºä¸¤è¡ã)"
+msgstr "ä¸è¡æ¾ç¤ºææäº¤æï¼æåè¡æ¨¡å¼æ¾ç¤ºä¸¤è¡ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:286
#: gnucash/gschemas/org.gnucash.gschema.xml.in:291
@@ -11918,16 +11916,15 @@ msgid ""
msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:330
-#, fuzzy
msgid "Number of transactions to show in a register."
-msgstr "å¨ä¸ä¸ªè´¦ç°¿ä¸æ¾ç¤ºç交æäºé¡¹æ°éã"
+msgstr "交æç颿¾ç¤ºçæ°éã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:331
#: gnucash/gtkbuilder/dialog-preferences.glade:2827
msgid ""
"Show this many transactions in a register. A value of zero means show all "
"transactions."
-msgstr "å¨è´¦ç°¿ä¸æ¾ç¤ºé£ä¹å¤äº¤æäºé¡¹ï¼0 表示æ¾ç¤ºææäº¤æäºé¡¹ã"
+msgstr "交æç颿¾ç¤ºæ¤å¼é¡¹äº¤æï¼0 表示ææã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:335
msgid "Number of characters for auto complete."
@@ -11990,7 +11987,7 @@ msgid ""
"On high resolution screens reports tend to be hard to read. This option "
"allows you to scale reports up by the set factor. For example setting this "
"to 2.0 will display reports at twice their typical size."
-msgstr ""
+msgstr "é«åè¾¨çæ¾ç¤ºå¨ä¸ï¼å¾å¾é¾ä»¥é
读æ¥è¡¨ï¼æ¤é项å°å
¶æè®¾å®çç³»æ°æ¾å¤§ï¼ä¾å¦ï¼è®¾ 2.0ï¼æ¥è¡¨å°æ¯æ£å¸¸å°ºå¯¸ç两å大å°ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:373
msgid "PDF export file name format"
@@ -16697,21 +16694,21 @@ msgstr "<b>对账</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:2500
msgid "Check cleared _transactions"
-msgstr "æ£æ¥å·²ç»æ¸
ç交æäºé¡¹(_T)"
+msgstr "æ£æ¥å·²ç»æ¸
交æ(_T)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2506
msgid "Pre-check cleared transactions when creating a reconcile dialog."
-msgstr "å½å建ä¸ä¸ªå¯¹è´¦å¯¹è¯æ¡çæ¶å颿¥å·²ç»æ¸
ç交æäºé¡¹ã"
+msgstr "åå»ºå¯¹è´¦å¯¹è¯æ¡æ¶ï¼é¢å
æ£æ¥å·²ç»æ¸
ç交æã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2518
msgid "Automatic credit card _payment"
-msgstr "èªå¨ä¿¡ç¨å¡ä»æ¬¾(_P)"
+msgstr "ä¿¡ç¨å¡æºè½è¿æ¬¾(_P)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2524
msgid ""
"After reconciling a credit card statement, prompt the user to enter a credit "
"card payment."
-msgstr "ä¿¡ç¨å¡è´¦å对账åï¼æç¤ºç¨æ·è¾å
¥ä¿¡ç¨å¡ä»æ¬¾ã"
+msgstr "ä¿¡ç¨å¡å¯¹è´¦ç¡®è®¤åï¼æç¤ºè¿æ¬¾ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2536
msgid "Always reconcile to t_oday"
@@ -16729,39 +16726,39 @@ msgstr "<b>å¾å½¢</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:2577
msgid "_Use GnuCash built-in color theme"
-msgstr ""
+msgstr "ä½¿ç¨ GnuCash å
ç½®çé¢è²ä¸»é¢(_U)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2583
msgid ""
"GnuCash uses a yellow/green theme by default for register windows. Uncheck "
"this if you want to use the system color theme instead."
-msgstr ""
+msgstr "交æçé¢é»è®¤ä½¿ç¨é»/绿é´éè²ï¼è¥ä½ æ³ç¨ç³»ç»é¢è²ï¼è¯·åæ¶å¾éã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2595
msgid "Double _mode colors alternate with transactions"
-msgstr "交æäºé¡¹ä»¥ä¸¤ç§æ¨¡å¼çé¢è²äº¤æ¿è¡¨ç¤º(_M)"
+msgstr "åè¡æ¨¡å¼ï¼é¢è²æäº¤æåºå(_M)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2601
msgid ""
"Alternate the primary and secondary colors by transaction instead of by "
"alternating by row."
-msgstr "以æ¯ä¸ç¬äº¤æäºé¡¹ä¸ºåä½äº¤æ¿ä½¿ç¨ä¸»è¦ä¸æ¬¡è¦é¢è²ï¼è䏿¯æ¯ä¸åã"
+msgstr "以交æä¸ºåä½äº¤æ¿ä½¿ç¨ä¸»è²ä¸ä»è²ï¼è䏿¯æ¯è¡ä¸ä¸ªé¢è²ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2613
msgid "Draw hori_zontal lines between rows"
-msgstr "å¨è¡ä¹é´ç»æ°´å¹³çº¿(_Z)"
+msgstr "æ°´å¹³åé线(_Z)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2619
msgid "Show horizontal borders on the cells."
-msgstr "为æ¯ä¸ªåå
æ¾ç¤ºæ°´å¹³è¾¹çã"
+msgstr "交æçé¢åå
æ ¼æ¾ç¤ºæ°´å¹³åé线(_Z)ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2631
msgid "Draw _vertical lines between columns"
-msgstr "å¨åä¹é´ç»åç´çº¿(_V)"
+msgstr "åç´åé线(_V)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2637
msgid "Show vertical borders on the cells."
-msgstr "为æ¯ä¸ªåå
æ¾ç¤ºåç´è¾¹çã"
+msgstr "交æçé¢åå
æ ¼æ¾ç¤ºåç´åé线(_V)ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2662
#: gnucash/report/reports/standard/invoice.scm:201
@@ -16772,29 +16769,27 @@ msgstr "为æ¯ä¸ªåå
æ¾ç¤ºåç´è¾¹çã"
#: gnucash/report/reports/standard/invoice.scm:369
#: gnucash/report/reports/standard/invoice.scm:376
#: gnucash/report/reports/standard/invoice.scm:383
-#, fuzzy
msgid "Layout"
-msgstr "<b>å°</b>"
+msgstr "<b>å¸å±</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:2674
-#, fuzzy
msgid "_Future transactions after blank transaction"
-msgstr "æâå车âç§»è³ç©ºç½äº¤æäºé¡¹(_E)"
+msgstr "æªæ¥äº¤æé´éä¸è¡(_F)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2680
msgid ""
"If checked, transactions with a date in the future will be displayed at the "
"bottom of the register after the blank transaction. If clear, the blank "
"transaction will be at the bottom of the register after all transactions."
-msgstr ""
+msgstr "å¾éï¼æªæ¥äº¤æå°æ¾ç¤ºå¨çé¢åºé¨ï¼éä¸è¡ï¼å¦åï¼æ é´éã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2719
msgid "<b>Default Style</b>"
-msgstr "<b>é»è®¤é£æ ¼</b>"
+msgstr "<b>é»è®¤æ ·å¼</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:2742
msgid "<b>Other Defaults</b>"
-msgstr "<b>å
¶å®é»è®¤å¼</b>"
+msgstr "<b>å
¶å®é项</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:2752
msgid "_Basic ledger"
@@ -16805,36 +16800,32 @@ msgid "_Auto-split ledger"
msgstr "èªå¨æåå类账(_A)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2812
-#, fuzzy
msgid "Number of _transactions"
-msgstr "交æäºé¡¹æ°é(_T)ï¼"
+msgstr "äº¤ææ°é(_T)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2845
msgid "_Double line mode"
msgstr "åè¡æ¨¡å¼(_D)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2851
-#, fuzzy
msgid ""
"Show two lines of information for each transaction instead of one. Does not "
"affect expanded transactions."
-msgstr "æ¯ä¸ªäº¤æäºé¡¹æ¾ç¤ºä¸¤è¡ä¿¡æ¯ï¼è䏿¯ä¸è¡ãä¸å½±åæ©å±ç交æäºé¡¹ã"
+msgstr "æ¯ç¬äº¤æä»¥ä¸¤è¡æ¾ç¤ºï¼èéä¸è¡ï¼ä½ä¸å½±åæ©å±ç交æã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2863
msgid "Register opens in a new _window"
-msgstr "卿°çªå£ä¸æå¼è´¦ç°¿(_W)"
+msgstr "æ°çªå£æå¼äº¤æçé¢(_W)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2869
-#, fuzzy
msgid ""
"If checked, each register will be opened in its own top level window. If "
"clear, the register will be opened in the current window."
-msgstr ""
-"妿éä¸ï¼æ¯ä¸ªè´¦ç°¿ä¼å¨å®èªå·±ç顶级çªå£æå¼ï¼å¦åï¼è´¦ç°¿ä¼å¨å½åçªå£æå¼ã"
+msgstr "å¾éï¼äº¤æçé¢å°å¨æ°çªå£æå¼ï¼å¦åï¼å½åçªå£ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2881
msgid "_Only display leaf account names"
-msgstr "åªæ¾ç¤ºæ«çº§ç§ç®åç§°(_O)"
+msgstr "åªæ¾ç¤ºæ«çº§ç§ç®(_O)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2887
msgid ""
@@ -16842,9 +16833,7 @@ msgid ""
"register and in the account selection popup. The default behaviour is to "
"display the full name, including the path in the account tree. Checking this "
"option implies that you use unique leaf names."
-msgstr ""
-"妿éä¸ï¼åªä¼å¨è´¦ç°¿åå¼¹åºç§ç®éæ©ä¸æ¾ç¤ºæ«çº§ç§ç®ãé»è®¤è¡ä¸ºæ¯æ¾ç¤ºå
¨åï¼å
æ¬ç§"
-"ç®è¡¨çè·¯å¾ãéä¸è¿ä¸ªé项æå³çæ¨ä½¿ç¨å¯ä¸çæ«çº§åç§°ã"
+msgstr "å¾éï¼è½¬è´¦åæ®µåªæ¾ç¤ºæ«çº§ç§ç®ï¼é»è®¤æ¾ç¤ºææç§ç®ï¼æ¤é项æå³çæ«çº§ç§ç®å¿
éå¯ä¸ã"
#. Register2 feature
#: gnucash/gtkbuilder/dialog-preferences.glade:2902
@@ -16876,11 +16865,11 @@ msgstr ""
#: gnucash/gtkbuilder/dialog-preferences.glade:3047
msgid "Register Defaults"
-msgstr "账簿é»è®¤å¼"
+msgstr "交æçé¢"
#: gnucash/gtkbuilder/dialog-preferences.glade:3078
msgid "<b>Default Report Currency</b>"
-msgstr "<b>é»è®¤æ¥è¡¨è´§å¸</b>"
+msgstr "<b>é»è®¤å¸ç§</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:3101
msgid "<b>Location</b>"
@@ -16888,20 +16877,18 @@ msgstr "<b>ä½ç½®</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:3111
msgid "Report opens in a new _window"
-msgstr "卿°çªå£ä¸æå¼æ¥è¡¨(_W)"
+msgstr "æ°çªå£æå¼æ¥è¡¨(_W)"
#: gnucash/gtkbuilder/dialog-preferences.glade:3117
-#, fuzzy
msgid ""
"If checked, each report will be opened in its own top level window. If "
"clear, the report will be opened in the current window."
-msgstr "妿éä¸ï¼æ¯ä¸ªæ¥è¡¨ä¼å¨èªå·±ç顶级çªå£æå¼ï¼å¦åï¼æ¥è¡¨ä¼å¨å½åçªå£æå¼ã"
+msgstr "å¾éï¼æ¥è¡¨å°å¨æ°çªå£æå¼ï¼å¦åï¼å½åçªå£ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:3145
#: gnucash/gtkbuilder/dialog-preferences.glade:3225
-#, fuzzy
msgid "Default zoom level"
-msgstr "<b>é»è®¤é£æ ¼</b>"
+msgstr "é»è®¤ç¼©æ¾ç级"
#: gnucash/gtkbuilder/dialog-preferences.glade:3260
msgid "Reports"
@@ -17540,9 +17527,8 @@ msgid "Number of Occurrences"
msgstr "åçæ¬¡æ°ï¼"
#: gnucash/gtkbuilder/dialog-sx.glade:512
-#, fuzzy
msgid "<b>Since Last Run</b>"
-msgstr "<b>èªä¸æ¬¡è¿è¡åå¯¹è¯æ¡</b>"
+msgstr "<b>èªä¸æ¬¡è¿è¡</b>"
#: gnucash/gtkbuilder/dialog-sx.glade:535
msgid "<b>Transaction Editor Defaults</b>"
commit a4fd8e8b3b36f1659b5b8a5f8d846f224f2dd1c9
Author: Frank H. Ellenberger <frank.h.ellenberger at gmail.com>
Date: Sun Apr 25 20:40:33 2021 +0200
I18N: Unify period labels; quote terms in a tooltip
diff --git a/gnucash/gtkbuilder/dialog-sx.glade b/gnucash/gtkbuilder/dialog-sx.glade
index 5d73f7849..7f14ca0bb 100644
--- a/gnucash/gtkbuilder/dialog-sx.glade
+++ b/gnucash/gtkbuilder/dialog-sx.glade
@@ -725,7 +725,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Set Review Created Transactions as the default in the Since Last Run dialog.</property>
+ <property name="tooltip_text" translatable="yes">Set 'Review Created Transactions' as the default in the 'Since Last Run' dialog.</property>
<property name="halign">start</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
diff --git a/gnucash/report/options-utilities.scm b/gnucash/report/options-utilities.scm
index ce982363b..b120f32ef 100644
--- a/gnucash/report/options-utilities.scm
+++ b/gnucash/report/options-utilities.scm
@@ -67,7 +67,7 @@
(vector 'WeekDelta (N_ "One Week"))
(vector 'TwoWeekDelta (N_ "Two Weeks"))
(vector 'MonthDelta (N_ "One Month"))
- (vector 'QuarterDelta (N_ "One Quarter"))
+ (vector 'QuarterDelta (N_ "Quarter Year"))
(vector 'HalfYearDelta (N_ "Half Year"))
(vector 'YearDelta (N_ "One Year"))))))
diff --git a/gnucash/report/reports/standard/balsheet-pnl.scm b/gnucash/report/reports/standard/balsheet-pnl.scm
index ac8cf75c9..79b81542f 100644
--- a/gnucash/report/reports/standard/balsheet-pnl.scm
+++ b/gnucash/report/reports/standard/balsheet-pnl.scm
@@ -152,12 +152,12 @@ also show overall period profit & loss."))
'disabled
(list
(vector 'disabled (G_ "Disabled"))
- (vector 'YearDelta (G_ "Year"))
+ (vector 'YearDelta (G_ "One Year"))
(vector 'HalfYearDelta (G_ "Half Year"))
- (vector 'QuarterDelta (G_ "Quarter"))
- (vector 'MonthDelta (G_ "Month"))
- (vector 'TwoWeekDelta (G_ "2Week"))
- (vector 'WeekDelta (G_ "Week")))
+ (vector 'QuarterDelta (G_ "Quarter Year"))
+ (vector 'MonthDelta (G_ "One Month"))
+ (vector 'TwoWeekDelta (G_ "Two Weeks"))
+ (vector 'WeekDelta (G_ "One Week")))
#f
(lambda (x)
(let ((x (not (eq? x 'disabled))))
commit 1b57c297af4eb2d8306ea585aee210c858ac6747
Author: Milo Ivir <mail at milotype.de>
Date: Sat Apr 24 19:32:08 2021 +0200
Translation update by Milo Ivir <mail at milotype.de> using Weblate
po/hr.po: 99.9% (5478 of 5479 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Program (Croatian)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/hr/
Co-authored-by: Milo Ivir <mail at milotype.de>
diff --git a/po/hr.po b/po/hr.po
index 9b48e012b..b4bd003df 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -5,10 +5,10 @@
msgid ""
msgstr ""
"Project-Id-Version: GnuCash 4.2\n"
-"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug.cgi?"
-"product=GnuCash&component=Translations\n"
+"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
+"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-03-25 12:29+0000\n"
+"PO-Revision-Date: 2021-04-24 17:32+0000\n"
"Last-Translator: Milo Ivir <mail at milotype.de>\n"
"Language-Team: Croatian <https://hosted.weblate.org/projects/gnucash/gnucash/"
"hr/>\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.5.2-dev\n"
+"X-Generator: Weblate 4.7-dev\n"
#: bindings/guile/commodity-table.scm:44
msgid "ALL NON-CURRENCY"
@@ -4826,10 +4826,8 @@ msgid "Enter a payment for the owner of this invoice"
msgstr "UpiÅ¡i plaÄanje za vlasnika ovog izlaznog raÄuna"
#: gnucash/gnome/gnc-plugin-page-invoice.c:381
-#, fuzzy
-#| msgid "Open a company report window for the owner of this invoice"
msgid "Open a customer report window for the owner of this invoice"
-msgstr "Otvori prozor izvjeÅ¡taja o poduzeÄu za vlasnika ovog izlaznog raÄuna"
+msgstr "Otvori prozor izvjeÅ¡taja o kupcu za vlasnika ovog izlaznog raÄuna"
#: gnucash/gnome/gnc-plugin-page-invoice.c:383
#: gnucash/gnome/gnc-plugin-page-invoice.c:404
@@ -4887,10 +4885,8 @@ msgid "Enter a payment for the owner of this bill"
msgstr "UpiÅ¡i plaÄanje za vlasnika ovog ulaznog raÄuna"
#: gnucash/gnome/gnc-plugin-page-invoice.c:402
-#, fuzzy
-#| msgid "Open a company report window for the owner of this bill"
msgid "Open a vendor report window for the owner of this bill"
-msgstr "Otvori prozor izvjeÅ¡taja o poduzeÄu za vlasnika ovog ulaznog raÄuna"
+msgstr "Otvori prozor izvjeÅ¡taja o kupcu za vlasnika ovog ulaznog raÄuna"
#: gnucash/gnome/gnc-plugin-page-invoice.c:409
msgid "Use the current layout as default for all vendor bills and credit notes"
@@ -4939,10 +4935,8 @@ msgid "Enter a payment for the owner of this voucher"
msgstr "UpiÅ¡i plaÄanje za vlasnika ovog vauÄera"
#: gnucash/gnome/gnc-plugin-page-invoice.c:423
-#, fuzzy
-#| msgid "Open a company report window for the owner of this voucher"
msgid "Open a employee report window for the owner of this voucher"
-msgstr "Otvori prozor izvjeÅ¡taja o poduzeÄu za vlasnika ovog vauÄera"
+msgstr "Otvori prozor izvjeÅ¡taja o zaposleniku za vlasnika ovog vauÄera"
#: gnucash/gnome/gnc-plugin-page-invoice.c:430
msgid ""
@@ -7628,10 +7622,8 @@ msgid "Existing"
msgstr "PostojeÄe"
#: gnucash/gnome-utils/dialog-dup-trans.c:148
-#, fuzzy
-#| msgid "Use +- keys to increment/decrement number"
msgid "You can type '+' or '-' to increment or decrement the number."
-msgstr "Koristi tipke + i - za poveÄavanje/smanjivanje broja"
+msgstr "Za poveÄavanje ili smanjivanje broja možeÅ¡ koristiti tipke â+â i â-â."
#: gnucash/gnome-utils/dialog-dup-trans.c:297
msgid "Action/Number"
@@ -12031,11 +12023,9 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:285
#: gnucash/gtkbuilder/dialog-preferences.glade:2758
-#, fuzzy
-#| msgid "Show all transactions on one line. (Two in double line mode.)"
msgid "Show all transactions on one line or in double line mode on two."
msgstr ""
-"Prikaži sve transakcije u jednom retku. (U dva retka, u dvorednom prikazu.)"
+"Prikaži sve transakcije u jednom retku ili u dva retka u dvorednom prikazu."
#: gnucash/gschemas/org.gnucash.gschema.xml.in:286
#: gnucash/gschemas/org.gnucash.gschema.xml.in:291
@@ -12057,16 +12047,12 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:290
#: gnucash/gtkbuilder/dialog-preferences.glade:2777
-#, fuzzy
-#| msgid ""
-#| "Automatically expand the current transaction to show all splits. All "
-#| "other transactions are shown on one line. (Two in double line mode.)"
msgid ""
"Automatically expand the current transaction to show all splits. All other "
"transactions are shown on one line or in double line mode on two."
msgstr ""
"Automatski rasklopi trenutaÄnu transakciju za prikaz svih stavaka. Sve druge "
-"transakcije se prikazuju u jednom retku. (U dva retka, u dvorednom prikazu.)"
+"transakcije prikazuju se u jednom retku ili u dva retka u dvorednom prikazu."
#: gnucash/gschemas/org.gnucash.gschema.xml.in:295
#: gnucash/gtkbuilder/dialog-preferences.glade:2796
@@ -13075,38 +13061,6 @@ msgstr "Uvoz CSV cijena"
#. You should localize the (british) examples to your region.
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:65
-#, fuzzy
-#| msgid ""
-#| "This assistant will help you import Prices from a CSV file.\n"
-#| "\n"
-#| "There is a minimum number of columns that have to be present for a "
-#| "successful import, these are Date, Amount, From Namespace, From Symbol "
-#| "and Currency To. If all entries are for the same Commodity / Currency "
-#| "then you can select them and then the columns will be Date and Amount.\n"
-#| "\n"
-#| "Various options exist for specifying the delimiter as well as a fixed "
-#| "width option. With the fixed width option, double click on the table of "
-#| "rows displayed to set a column width, then right mouse to change if "
-#| "required.\n"
-#| "\n"
-#| "Examples are \"FTSE\",\"RR.L\",\"21/11/2016\",5.345,\"GBP\" and CURRENCY;"
-#| "USD;2016-11-21;1.56;GBP\n"
-#| "\n"
-#| "There is an option for specifying the start row, end row and an option to "
-#| "skip alternate rows beginning from the start row which can be used if you "
-#| "have some header text. Also there is an option to overwrite existing "
-#| "prices for that day if required.\n"
-#| "\n"
-#| "Lastly, for repeated imports the preview page has buttons to Load and "
-#| "Save the settings. To save the settings, tweak the settings to your "
-#| "preferences (optionally starting from an existing preset), then "
-#| "(optionally change the settings name and press the Save Settings button. "
-#| "Note you can't save to built-in presets.\n"
-#| "\n"
-#| "This operation is not reversible, so make sure you have a working "
-#| "backup.\n"
-#| "\n"
-#| "Click on \"Next\" to proceed or \"Cancel\" to Abort Import."
msgid ""
"This assistant will help you import Prices from a CSV file.\n"
"\n"
@@ -13156,11 +13110,10 @@ msgstr ""
"zaglavlju tablice. MoguÄe je i prepisati postojeÄe cijene za taj dan, ako je "
"to potrebno.\n"
"\n"
-"I na kraju, za ponavljanje uvoza, pregled stranice ima gumbe za uÄitavanje i "
-"spremanje postavaka. Za spremanje postavaka, namjesti postavke po želji "
-"(poÄevÅ¡i sa zadanim postavkama), a zatim (opcionalno) promijeni naziv "
-"postavke i klikni âSpremi postavkeâ. Napomena: Spremati se može Äak i u "
-"ugraÄene postavke.\n"
+"I na kraju, za ponavljanje uvoza, stranica pregleda ima gumbove za "
+"uÄitavanje i spremanje postavaka. PrilagoÄene postavke možeÅ¡ spremiti za "
+"ponovnu upotrebu za kasnije uvoze. Nakon uÄitavanja postavki možeÅ¡ ih ponovo "
+"podesiti za sliÄan uvoz i spremiti ih pod drugim imenom.\n"
"\n"
"Ovo je nepovratna radnja, stoga imaj sigurnosnu kopiju pri ruci.\n"
"\n"
@@ -13353,10 +13306,6 @@ msgid "Import Preview"
msgstr "Uvezi pregled"
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:1026
-#, fuzzy
-#| msgid ""
-#| "<b>Press Apply to add the Prices.\n"
-#| "Cancel to abort.</b>"
msgid ""
"<b>Press \"Apply\" to add the Prices.\n"
"\"Cancel\" to abort.</b>"
@@ -13373,34 +13322,6 @@ msgid "CSV Transaction Import"
msgstr "Uvoz CSV transakcije"
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:56
-#, fuzzy
-#| msgid ""
-#| "This assistant will help you import a delimited file containing a list of "
-#| "transactions. It supports both token separated files (such as comma "
-#| "separated or semi-colon separated) and fixed width data.\n"
-#| "\n"
-#| "For a successful import three columns have to be available in the import "
-#| "data:\n"
-#| "⢠a Date column\n"
-#| "⢠a Description column\n"
-#| "⢠a Deposit or Withdrawal column\n"
-#| "\n"
-#| "If there is no Account data available, a base account can be selected to "
-#| "which all data will be imported.\n"
-#| "\n"
-#| "Apart from a choice of delimiter, there are several options to tweak the "
-#| "importer. For example a number of lines can be skipped at the start or "
-#| "the end of the data, as well as odd rows. Several date and number formats "
-#| "are supported. The file encoding can be defined.\n"
-#| "\n"
-#| "The importer can handle files where transactions are split over multiple "
-#| "lines, with each line representing one split.\n"
-#| "\n"
-#| "Lastly, for repeated imports the preview page has buttons to Load and "
-#| "Save the settings. To save the settings, tweak the settings to your "
-#| "preferences (optionally starting from an existing preset), then "
-#| "(optionally change the settings name and press the Save Settings button. "
-#| "Note you can't save to built-in presets."
msgid ""
"This assistant will help you import a delimited file containing a list of "
"transactions. It supports both token separated files (such as comma "
@@ -13449,10 +13370,9 @@ msgstr ""
"viÅ¡e redaka, pri Äemu svaki radak prikazuje jednu stavku.\n"
"\n"
"I na kraju, za ponavljanje uvoza, pregled stranice ima gumbe za uÄitavanje i "
-"spremanje postavaka. Za spremanje postavaka, namjesti postavke po želji "
-"(poÄevÅ¡i s ugraÄenim postavkama), a zatim (opcionalno) promijeni naziv "
-"postavke i klikni âSpremi postavkeâ. Napomena: Spremati se može Äak i u "
-"ugraÄene postavke."
+"spremanje postavaka. PrilagoÄene postavke možeÅ¡ spremiti za ponovnu upotrebu "
+"za kasnije uvoze. Nakon uÄitavanja postavki možeÅ¡ ih ponovo podesiti za "
+"sliÄan uvoz i spremiti ih pod drugim imenom."
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:74
msgid "Transaction Import Assistant"
@@ -14445,7 +14365,7 @@ msgstr ""
"uvoza.\n"
"\n"
"Klikni âNatragâ za pregledavanje poklapanja tvojih konta i kategorija, za "
-"mijenjenje postavaka za valute i vrijednosne papire novih konta ili za "
+"mijenjanje postavaka za valute i vrijednosne papire novih konta ili za "
"dodavanje daljnjih datoteka na podruÄje za izvoÄenje.\n"
"\n"
"Klikni âPrekiniâ za prekid procesa QIF uvoza."
@@ -15662,10 +15582,8 @@ msgid "Linked _Location"
msgstr "Povezano _mjesto"
#: gnucash/gtkbuilder/dialog-doclink.glade:349
-#, fuzzy
-#| msgid "(none)"
msgid "(None)"
-msgstr "(bez)"
+msgstr "(Ništa)"
#: gnucash/gtkbuilder/dialog-doclink.glade:412
msgid "Enter URL like http://www.gnucash.org"
@@ -19289,11 +19207,6 @@ msgid "Initial Online Banking Setup"
msgstr "Postavljanje internet bankarstva"
#: gnucash/import-export/aqb/assistant-ab-initial.glade:90
-#, fuzzy
-#| msgid ""
-#| "The Setup of your Online Banking connection is handled by the external "
-#| "program \"AqBanking Setup Wizard\". Please press the button below to "
-#| "start this program."
msgid ""
"The Setup of your Online Banking connection is handled by the external "
"program \"AqBanking Setup Wizard\".\n"
@@ -19302,7 +19215,10 @@ msgid ""
"Please press the button below to start it."
msgstr ""
"Postavkama veze tvog internet bankarstva upravlja vanjski program âÄarobnjak "
-"za postavljanje AqBankingâ. Klikni donji gumb za pokretanje ovog programa."
+"za postavljanje AqBankingâ.\n"
+"Za nastavljanje moraš postaviti barem jednu vezu.\n"
+"\n"
+"Klikni donji gumb za pokretanje."
#: gnucash/import-export/aqb/assistant-ab-initial.glade:104
msgid "_Start AqBanking Wizard"
@@ -20525,13 +20441,6 @@ msgid "Import bills and invoices from a CSV text file"
msgstr "Uvezi ulazne i izlazne raÄune iz tekstualne CSV datoteke"
#: gnucash/import-export/csv-exp/assistant-csv-export.c:80
-#, fuzzy
-#| msgid ""
-#| "This assistant will help you export the Account Tree to a file\n"
-#| "with the separator specified below.\n"
-#| "\n"
-#| "Select the settings you require for the file and then click \"Next\" to "
-#| "proceed or \"Cancel\" to abort the export.\n"
msgid ""
"This assistant will help you export the Account Tree to a file with the "
"separator specified below.\n"
@@ -20539,30 +20448,15 @@ msgid ""
"Select the settings you require for the file and then click \"Next\" to "
"proceed or \"Cancel\" to abort the export.\n"
msgstr ""
-"Ovaj pomoÄnik pomaže pri izvozu kontnog plana u datoteku\n"
-"s dolje odreÄenim znakom razdvajanja.\n"
+"Ovaj pomoÄnik pomaže pri izvozu kontnog plana u datoteku s dolje odreÄenim "
+"znakom razdvajanja.\n"
"\n"
"Odaberi potrebne postavke za datoteku, a zatim klikni âDaljeâ za nastavak "
"ili âPrekiniâ za prekid izvoza.\n"
#. Translators: %s is one of the following paragraphs about rows/transaction.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:87
-#, fuzzy, c-format
-#| msgid ""
-#| "This assistant will help you export the Transactions to a file\n"
-#| "with the separator specified below.\n"
-#| "\n"
-#| "There will be multiple rows for each transaction and may require further "
-#| "manipulation to get them in a format you can use.\n"
-#| "\n"
-#| "Each Transaction will appear once in the export and will be listed in the "
-#| "order the accounts were processed\n"
-#| "\n"
-#| "Price/Rate output format is controlled by the Preference setting,\n"
-#| "General->Force Prices to display as decimals\n"
-#| "\n"
-#| "Select the settings you require for the file and then click \"Next\" to "
-#| "proceed or \"Cancel\" to abort the export.\n"
+#, c-format
msgid ""
"This assistant will help you export the Transactions to a file with the "
"separator specified below.\n"
@@ -20579,17 +20473,17 @@ msgid ""
"Select the settings you require for the file and then click \"Next\" to "
"proceed or \"Cancel\" to abort the export.\n"
msgstr ""
-"Ovaj pomoÄnik pomaže izvesti transakcije u datoteku\n"
-"s dolje navedenim znakom razdvajanja.\n"
+"Ovaj pomoÄnik pomaže izvesti transakcije u datoteku s dolje navedenim znakom "
+"razdvajanja.\n"
"\n"
-"Za svaku transakciju postojat Äe viÅ¡e redaka i možda Äe biti potrebno "
-"dodatno ih obraditi u formatu koji možeš koristiti.\n"
+"%s\n"
"\n"
-"Svaka transakcija pojavit Äe se jednom u izvozu i navest Äe se redoslijedom "
-"obrade raÄuna\n"
+"Mada transakcija možda ima stavke u nekoliko odabranih raÄuna, ona Äe se "
+"izvesti samo jednom. Pojavit Äe se pod prvim obraÄenim raÄunom u kojem "
+"sadrži stavku.\n"
"\n"
-"Formatom rezultata cijene/stope upravlja se u postavkama,\n"
-"OpÄeâPrisili decimalni prikaz cijena\n"
+"Formatom rezultata cijene/stope upravlja se u postavkama\n"
+"âBrojevi, datum, vrijemeâââPrisili decimalni prikaz cijenaâ\n"
"\n"
"Odaberi potrebne postavke za datoteku, a zatim pritisni âDaljeâ za nastavak "
"ili âPrekiniâ za prekid izvoza.\n"
@@ -20599,12 +20493,17 @@ msgid ""
"There will be multiple rows for each transaction with each row representing "
"one split."
msgstr ""
+"Svaka transakcija Äe sadržavati viÅ¡e redaka, a svaki redak predstavlja jednu "
+"stavku."
#: gnucash/import-export/csv-exp/assistant-csv-export.c:103
msgid ""
"There will be one row for each transaction, equivalent to a single row in a "
"register in 'Basic Ledger' mode. As such some transfer detail could be lost."
msgstr ""
+"Za svaku transakciju koristit Äe se jedan redak, Å¡to odgovara jednom retku u "
+"registru u modusu âGlavna knjigaâ. Kao takva, neki detalji prijenosa Äe se "
+"možda izgubiti."
#. Translators: %s is the file name.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:109
@@ -21095,16 +20994,12 @@ msgstr ""
"Odaberi stupac konta prijenosa ili ukloni ostale stupce konta prijenosa."
#: gnucash/import-export/csv-imp/gnc-import-tx.cpp:671
-#, fuzzy
-#| msgid ""
-#| "No account column selected and no default account specified either.\n"
-#| "This should never happen. Please report this as a bug."
msgid ""
"No account column selected and no base account specified either.\n"
"This should never happen. Please report this as a bug."
msgstr ""
-"Niti je odabran stupac konta, niti standardni konto.\n"
-"Ovo se nikada ne bi trebalo dogoditi. Molimo te, da prijaviš ovu grešku."
+"Niti je odabran stupac konta, niti osnovni konto.\n"
+"Ovo se nikada ne bi trebalo dogoditi. Molimo te da prijaviš ovu grešku."
#: gnucash/import-export/csv-imp/gnc-imp-props-price.cpp:55
msgid "From Symbol"
@@ -21167,10 +21062,8 @@ msgstr "Vrijednost je obraÄena u neispravnu valutu za vrstu stupca valute."
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:520
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:575
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:583
-#, fuzzy
-#| msgid " could not be understood.\n"
msgid "Column '{1}' could not be understood.\n"
-msgstr " nije razumljivo.\n"
+msgstr "Nije bilo moguÄe razumjeti stupac â{1}â.\n"
#: gnucash/import-export/csv-imp/gnc-imp-props-price.cpp:280
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:328
commit 6103723d6937433dbe6a26c8d71b6a9de698ee7f
Author: TianXing_Yi <duguqiubailee at gmail.com>
Date: Sat Apr 24 19:32:07 2021 +0200
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 58.1% (3186 of 5479 strings; 1589 fuzzy)
629 failing checks (11.4%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Translation update by TianXing_Yi <duguqiubailee at gmail.com> using Weblate
po/zh_CN.po: 57.9% (3177 of 5479 strings; 1595 fuzzy)
631 failing checks (11.5%)
Translation: GnuCash/Program (Chinese (Simplified))
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/zh_Hans/
Co-authored-by: TianXing_Yi <duguqiubailee at gmail.com>
diff --git a/po/zh_CN.po b/po/zh_CN.po
index e4db8e7e1..fb19cdb07 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -18,7 +18,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-23 19:32+0000\n"
+"PO-Revision-Date: 2021-04-24 17:32+0000\n"
"Last-Translator: TianXing_Yi <duguqiubailee at gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"gnucash/gnucash/zh_Hans/>\n"
@@ -1996,9 +1996,8 @@ msgstr "å¨ä½"
#: gnucash/import-export/csv-exp/csv-transactions-export.c:614
#: gnucash/import-export/csv-exp/csv-transactions-export.c:623
#: gnucash/report/trep-engine.scm:259
-#, fuzzy
msgid "Transaction Number"
-msgstr "交æäºé¡¹ç¼å·"
+msgstr "交æç¼å·"
#: gnucash/gnome/dialog-find-transactions2.c:137
#: gnucash/gnome/dialog-find-transactions2.c:172
@@ -2085,7 +2084,7 @@ msgstr "说æ"
#: gnucash/gnome/dialog-find-transactions.c:229
#: gnucash/gnome-search/dialog-search.c:1482
msgid "Find Transaction"
-msgstr "寻æ¾äº¤æäºé¡¹"
+msgstr "寻æ¾äº¤æ"
#: gnucash/gnome/dialog-find-transactions.c:129
#: gnucash/report/reports/standard/general-ledger.scm:67
@@ -2882,7 +2881,7 @@ msgstr "æ¿æ¢ä»·æ ¼ï¼"
#: gnucash/gnome/dialog-price-editor.c:233
msgid "_Replace"
-msgstr "æ¿æ¢(R)"
+msgstr "æ¿æ¢(_R)"
#: gnucash/gnome/dialog-price-editor.c:263
#, fuzzy
@@ -5632,12 +5631,12 @@ msgstr "æç´¢ç»ææ¥å"
#: gnucash/report/reports/standard/general-journal.scm:37
#: gnucash/report/reports/standard/register.scm:64
msgid "Register"
-msgstr "账簿"
+msgstr "交æ"
#: gnucash/gnome/gnc-plugin-page-register2.c:2436
#: gnucash/report/reports/standard/register.scm:349
msgid "Register Report"
-msgstr "账簿æ¥è¡¨"
+msgstr "äº¤ææ¥è¡¨"
#: gnucash/gnome/gnc-plugin-page-register2.c:2452
#: gnucash/gnome/gnc-plugin-page-register.c:3595
@@ -7782,7 +7781,7 @@ msgstr ""
#: gnucash/gtkbuilder/dialog-fincalc.glade:299
#: gnucash/gtkbuilder/dialog-fincalc.glade:314
msgid "Clear"
-msgstr "åæ¶éæ©"
+msgstr "æ¸
空"
#: gnucash/gnome-utils/dialog-options.c:2898
msgid "Clear any selected image file."
@@ -9812,9 +9811,8 @@ msgid "Reference / Action"
msgstr "åè"
#: gnucash/gnome-utils/gnc-tree-view-split-reg.c:2770
-#, fuzzy
msgid "T-Number"
-msgstr "ç¼å·"
+msgstr "T-ç¼å·"
#: gnucash/gnome-utils/gnc-tree-view-split-reg.c:2776
#, fuzzy
@@ -10892,7 +10890,7 @@ msgstr "妿è¿åæ¡ç®æ°å°äºæ¤æ°ç®ï¼å°±é»è®¤å»âæ°æç´¢â"
#: gnucash/gschemas/org.gnucash.dialogs.import.generic.gschema.xml.in:5
msgid "Enable SKIP transaction action"
-msgstr "å¯ç¨âè·³è¿â交ææä½"
+msgstr "âè·³è¿â交æ"
#: gnucash/gschemas/org.gnucash.dialogs.import.generic.gschema.xml.in:6
#: gnucash/gtkbuilder/dialog-preferences.glade:2044
@@ -11267,13 +11265,11 @@ msgstr "æ¾ç¤ºèªå¨ä¿åçè§£é"
msgid ""
"If active, GnuCash shows an explanation of the auto-save feature the first "
"time that feature is started. Otherwise no extra explanation is shown."
-msgstr ""
-"妿éä¸ï¼GnuCash å¨èªå¨ä¿ååè½å¼å§æ¶ï¼æ¾ç¤ºä¸ä¸ªèªå¨ä¿ååè½çè§£éãå¦åä¸ä¼"
-"æ¾ç¤ºé¢å¤ä¿¡æ¯ã"
+msgstr "è¥å¾éï¼GnuCash 馿¬¡èªå¨ä¿åæ¶ä¼æè§£éï¼å¦åç´æ¥ä¿åã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:40
msgid "Auto-save time interval"
-msgstr "èªå¨ä¿åæ¶é´é´é"
+msgstr "èªå¨ä¿å卿"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:41
#: gnucash/gtkbuilder/dialog-preferences.glade:1656
@@ -11285,7 +11281,7 @@ msgstr "è·èªå¨å¼å§ä¿åæä»¶å°ç£çä¸çåéæ°ãå¦æä¸º0ï¼å°
#: gnucash/gschemas/org.gnucash.gschema.xml.in:45
#: gnucash/gtkbuilder/dialog-preferences.glade:1773
msgid "Enable timeout on \"Save changes on closing\" question"
-msgstr ""
+msgstr "âå
³éæ¶ä¿åâè¶
æ¶"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:46
#: gnucash/gtkbuilder/dialog-preferences.glade:1777
@@ -11294,7 +11290,7 @@ msgid ""
"limited number of seconds for an answer. If the user didn't answer within "
"that time, the changes will be saved automatically and the question window "
"closed."
-msgstr ""
+msgstr "å¾éï¼âå
³éæ¶ä¿åâä¼çå¾
å ç§ï¼è¥ç¨æ·æªæå
¶ä»æä½ï¼æä»¶å°ä¿åå¹¶å
³éã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:50
msgid "Time to wait for answer"
@@ -11337,7 +11333,7 @@ msgstr "è¿åºåæå®èªå¨å°æ°åè½æå¡«å
¥ç使°å¤å¯¡ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:70
msgid "Force prices to display as decimals even if they must be rounded."
-msgstr "å³ä½¿æ±çå¾åèäºå
¥ï¼ä¹è¦å¼ºå¶æ¾ç¤ºå°æ°ã"
+msgstr "æ±ç以尿°æ¾ç¤ºã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:71
#: gnucash/gtkbuilder/dialog-preferences.glade:1214
@@ -11345,13 +11341,12 @@ msgid ""
"If active, GnuCash will round prices as necessary to display them as "
"decimals instead of displaying the exact fraction if the fractional part "
"cannot be exactly represented as a decimal."
-msgstr ""
+msgstr "è¥å¾éï¼ç²¾ç¡®çåæ°å°è½¬æ¢ä¸ºå°æ°ï¼å½ç¶ä¼åèäºå
¥ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:75
#: gnucash/gtkbuilder/dialog-preferences.glade:1725
-#, fuzzy
msgid "Do not create log/backup files."
-msgstr "è¦ä¿çæ¥å¿ãå¤ä»½æä»¶å¤å°å¤©ã"
+msgstr "ä¸å建æ¥å¿/å¤ä»½ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:76
#: gnucash/gschemas/org.gnucash.gschema.xml.in:81
@@ -11367,17 +11362,16 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:80
#: gnucash/gtkbuilder/dialog-preferences.glade:1743
msgid "Delete old log/backup files after this many days (0 = never)."
-msgstr "ç»è¿è¿ä¸ªæ¥æ°ä¹åå 餿§çè®°å½/å¤ä»½æä»¶æ¡(0 = æ°¸ä¸)ã"
+msgstr "æ¥å¿/å¤ä»½ä¿çå¤å°å¤©ï¼0 = ä»ä¸ï¼ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:85
#: gnucash/gtkbuilder/dialog-preferences.glade:1761
-#, fuzzy
msgid "Do not delete log/backup files."
-msgstr "è¦ä¿çæ¥å¿ãå¤ä»½æä»¶å¤å°å¤©ã"
+msgstr "æ°¸ä¹
ä¿çæ¥å¿/å¤ä»½ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:90
msgid "Delete old log/backup files after this many days (0 = never)"
-msgstr "ç»è¿è¿ä¸ªæ¥æ°ä¹åå 餿§çè®°å½/å¤ä»½æä»¶æ¡(0 = æ°¸ä¸)ã"
+msgstr "æ¥å¿/å¤ä»½ä¿çå¤å°å¤©ï¼0 = ä»ä¸ï¼"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:91
msgid ""
@@ -11546,9 +11540,8 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:160
#: gnucash/gtkbuilder/dialog-preferences.glade:1108
-#, fuzzy
msgid "In the current calendar year"
-msgstr "æ¥åå¹´åº¦çæ«å°¾"
+msgstr "æ¬å¹´"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:161
#: gnucash/gschemas/org.gnucash.gschema.xml.in:166
@@ -11573,7 +11566,7 @@ msgstr ""
msgid ""
"Dates will be completed so that they are close to the current date. Enter "
"the maximum number of months to go backwards in time when completing dates."
-msgstr ""
+msgstr "å½å
¥æä»½åæ¬æå·®å¼å¨éé¢å
ï¼å°äºçäºï¼ï¼å³æ¬å¹´ï¼è¶
åºï¼å¤§äºï¼ä¸ºæå¹´ã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:175
#, fuzzy
@@ -11679,7 +11672,7 @@ msgstr ""
msgid ""
"Set book option on new files to use split \"action\" field for \"Num\" field "
"on registers/reports"
-msgstr ""
+msgstr "æ°è´¦ç°¿ï¼åè¡æ¨¡å¼ï¼å彿 æ¾ç¤ºâT-ç¼å·â"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:226
#: gnucash/gtkbuilder/dialog-preferences.glade:1427
@@ -11690,7 +11683,7 @@ msgid ""
"visible in single line mode). Otherwise, the default book option for new "
"files is set so that the 'Num' cell on registers shows/updates the "
"transaction 'num' field."
-msgstr ""
+msgstr "è¥å¾éï¼æ°è´¦ç°¿åè¡æ¨¡å¼ï¼äº¤æå彿 æ¾ç¤ºâT-ç¼å·âï¼å¦åï¼æ¾ç¤ºâæä½âã"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:235
#, fuzzy
@@ -11731,13 +11724,12 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:250
#: gnucash/gschemas/org.gnucash.gschema.xml.in:251
-#, fuzzy
msgid "Automatically raise the list of accounts or actions during input"
-msgstr "è¾å
¥æ¶èªå¨æé«ç§ç®ææä½å表"
+msgstr "è¾å
¥æ¶èªå¨æåç§ç®æå¨ä½å表"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:255
msgid "Move to Transfer field when memorised transaction auto filled"
-msgstr "å¨èªå¨å¡«å
¥äºè®°å¿ä¸ç交æäºé¡¹åï¼è½¬å°è½¬è´¦å段"
+msgstr "è®°å¿å¡«å
交æåï¼è·³è½¬è´¦å段"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:256
msgid ""
@@ -12969,7 +12961,7 @@ msgstr "<b>æ¶é´æ ¼å¼</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1029
#: gnucash/gtkbuilder/gnc-date-format.glade:39
msgid "Date Format"
-msgstr "æ¥æ"
+msgstr "æ¥ææ ¼å¼"
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:604
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:611
@@ -14304,7 +14296,7 @@ msgstr "å票æ¯å¦é»è®¤å«ç¨ï¼éç¨äºæ°å®¢æ·åä¾åºåã"
#. See the tooltip "At post time..." for details.
#: gnucash/gtkbuilder/business-prefs.glade:192
msgid "_Process payments on posting"
-msgstr "å
¥å¸æµæ£"
+msgstr "å
¥å¸æµæ£(_P)"
#: gnucash/gtkbuilder/business-prefs.glade:223
msgid "<b>Bills</b>"
@@ -15755,7 +15747,7 @@ msgstr "é¢è²"
#: gnucash/gtkbuilder/dialog-import.glade:644
#: gnucash/gtkbuilder/dialog-preferences.glade:2413
msgid "<b>Actions</b>"
-msgstr "<b>å¨ä½</b>"
+msgstr "<b>æä½</b>"
#: gnucash/gtkbuilder/dialog-import.glade:656
msgid "\"A\""
@@ -16171,7 +16163,7 @@ msgstr "ISO"
#: gnucash/import-export/csv-imp/gnc-import-price.cpp:59
#: gnucash/import-export/csv-imp/gnc-import-tx.cpp:56
msgid "Locale"
-msgstr "é»è®¤"
+msgstr "æ¬å°"
#: gnucash/gtkbuilder/dialog-preferences.glade:133
#, fuzzy
@@ -16353,7 +16345,7 @@ msgstr "ç²¾ç¾çæ¥ææ ¼å¼"
#: gnucash/gtkbuilder/dialog-preferences.glade:1044
msgid "<b>Time Format</b>"
-msgstr "<b>æ¶é´</b>"
+msgstr "<b>æ¶é´æ ¼å¼</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1064
msgid "U_se 24-hour clock"
@@ -16361,20 +16353,20 @@ msgstr "使ç¨24å°æ¶æ¶é(_S)"
#: gnucash/gtkbuilder/dialog-preferences.glade:1070
msgid "Use a 24 hour (instead of a 12 hour) time format."
-msgstr "ä½¿ç¨ 24 å°æ¶å¶(ä»£æ¿ 12 å°æ¶å¶)ã"
+msgstr "ä½¿ç¨ 24 å°æ¶ï¼èé 12 å°æ¶ï¼çæ¶é´æ ¼å¼ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1085
msgid "<b>Date Completion</b>"
-msgstr "<b>æªæ¢æ¥æ</b>"
+msgstr "<b>æ¥æè¡¥å
¨</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1098
msgid "When a date is entered without year, it should be taken"
-msgstr ""
+msgstr "è¾å
¥çæ¥ææ²¡æå¹´ä»½æ¶ï¼å
¶åºå±äº"
#: gnucash/gtkbuilder/dialog-preferences.glade:1114
msgid ""
"Dates will be completed so that they are within the current calendar year."
-msgstr ""
+msgstr "æ¥æå¹´ä»½è¡¥å
¨ä¸ºæ¬å¹´ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1127
msgid ""
@@ -16392,7 +16384,7 @@ msgstr "使ç¨ç³»ç»æ¬å°åºåè®¾ç½®çæ¥ææ ¼å¼ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1198
msgid "<b>Numbers</b>"
-msgstr "<b>ç¼å·</b>"
+msgstr "<b>æ°å¼</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1208
msgid "Force P_rices to display as decimals"
@@ -16408,7 +16400,7 @@ msgstr "ä»¥çº¢è²æ¾ç¤ºè´æ°ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1244
msgid "_Automatic decimal point"
-msgstr "èªå¨æå
¥å°æ°ç¹(_A)"
+msgstr "èªå¨å°æ°ç¹(_A)"
#: gnucash/gtkbuilder/dialog-preferences.glade:1250
msgid ""
@@ -16457,17 +16449,16 @@ msgid "days"
msgstr "天"
#: gnucash/gtkbuilder/dialog-preferences.glade:1505
-#, fuzzy
msgid "<b>_Retain log/backup files</b>"
-msgstr "<b>ä¿çæ¥å¿/å¤ä»½æä»¶(_R)ï¼</b>"
+msgstr "<b>æ¥å¿/å¤ä»½(_R)</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1517
msgid "Com_press files"
-msgstr "å缩æä»¶(_P)"
+msgstr "å缩(_P)"
#: gnucash/gtkbuilder/dialog-preferences.glade:1523
msgid "Compress the data file with gzip when saving it to disk."
-msgstr "å¨ä¿åæ°æ®æä»¶æ¶ç¨ gzip å缩ã"
+msgstr "æ°æ®ä¿åæ¶ç¨ gzip å缩ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1538
msgid "<b>Files</b>"
@@ -16475,12 +16466,11 @@ msgstr "<b>æä»¶</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1571
msgid "<b>Search Dialog</b>"
-msgstr "<b>æç´¢å¯¹è¯æ¡</b>"
+msgstr "<b>æç´¢æ¡</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1584
-#, fuzzy
msgid "New search _limit"
-msgstr "æ°å»ºæç´¢ä¸é(_L)ï¼"
+msgstr "æ°æç´¢éæ°(_L)"
#: gnucash/gtkbuilder/dialog-preferences.glade:1599
msgid "Default to 'new search' if fewer than this number of items is returned."
@@ -16495,9 +16485,8 @@ msgid "Show splash screen at startup."
msgstr "ç¨åºå¯å¨æ¶æ¾ç¤ºæ¬¢è¿çé¢ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1636
-#, fuzzy
msgid "Auto-save time _interval"
-msgstr "èªå¨ä¿åæ¶é´é´é(_I)ï¼"
+msgstr "èªå¨ä¿å卿(_I)"
#: gnucash/gtkbuilder/dialog-preferences.glade:1675
msgid "minutes"
@@ -16505,15 +16494,13 @@ msgstr "åé"
#: gnucash/gtkbuilder/dialog-preferences.glade:1691
msgid "Show auto-save confirmation _question"
-msgstr "æ¾ç¤ºèªå¨ä¿å确认æé®(_Q)"
+msgstr "èªå¨ä¿åæé(_Q)"
#: gnucash/gtkbuilder/dialog-preferences.glade:1697
msgid ""
"If active, GnuCash shows a confirmation question each time the auto-save "
"feature is started. Otherwise no extra explanation is shown."
-msgstr ""
-"妿éä¸ï¼GnuCash ä¼å¨æ¯æ¬¡èªå¨ä¿ååè½å¼å§çæ¶åæ¾ç¤ºä¸ä¸ªç¡®è®¤æç¤ºãå¦åï¼ä¸ä¼"
-"æ¾ç¤ºä»»ä½é¢å¤ä¿¡æ¯ã"
+msgstr "è¥å¾éï¼GnuCash èªå¨ä¿åæ¶éè¦ç¡®è®¤ï¼å¦åç´æ¥ä¿åã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1737
#: gnucash/gtkbuilder/dialog-sx.glade:1217
@@ -16524,7 +16511,7 @@ msgstr "表å"
#: gnucash/gtkbuilder/dialog-preferences.glade:1755
#: gnucash/gtkbuilder/dialog-sx.glade:1185
msgid "Forever"
-msgstr "æ°¸è¿"
+msgstr "æ°¸ä¹
"
#: gnucash/gtkbuilder/dialog-preferences.glade:1794
msgid "Time to _wait for answer"
@@ -16532,39 +16519,36 @@ msgstr ""
#: gnucash/gtkbuilder/dialog-preferences.glade:1831
msgid "seconds"
-msgstr ""
+msgstr "ç§é"
#: gnucash/gtkbuilder/dialog-preferences.glade:1859
#: gnucash/gtkbuilder/dialog-preferences.glade:1877
-#, fuzzy
msgid "Path head for Linked Files Relative Paths"
-msgstr "å
³èæä»¶"
+msgstr "æä»¶ä½ç½®"
#: gnucash/gtkbuilder/dialog-preferences.glade:1906
msgid "Enable horizontal grid lines on table displays"
-msgstr "ä¸ºè¡¨æ ¼è§å¾å¯ç¨æ°´å¹³ç½æ ¼çº¿"
+msgstr "æ°´å¹³ç½æ ¼çº¿"
#: gnucash/gtkbuilder/dialog-preferences.glade:1910
msgid ""
"Enable horizontal grid lines on table displays. These will mainly be tree "
"views like the Accounts page."
-msgstr ""
+msgstr "ä¸»çªæ ¼æ¾ç¤ºæ°´å¹³ç½æ ¼çº¿ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1923
msgid "Enable vertical grid lines on table displays"
-msgstr ""
+msgstr "åç´ç½æ ¼çº¿"
#: gnucash/gtkbuilder/dialog-preferences.glade:1927
msgid ""
"Enable vertical grid lines on table displays. These will mainly be tree "
"views like the Accounts page."
-msgstr ""
+msgstr "ä¸»çªæ ¼æ¾ç¤ºåç´ç½æ ¼çº¿ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:1943
-#, fuzzy
-#| msgid "<b>Files</b>"
msgid "<b>Linked Files</b>"
-msgstr "<b>æä»¶</b>"
+msgstr "<b>龿¥æä»¶</b>"
#. Preferences->Online Banking:Generic
#: gnucash/gtkbuilder/dialog-preferences.glade:2038
@@ -16658,42 +16642,38 @@ msgstr "é»è®¤æ¯ç¥¨æå°åä½ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2326
msgid "Print _date format"
-msgstr "æå°æ¥ææ ¼å¼(_D)"
+msgstr "æ¥ææ ¼å¼(_D)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2332
msgid "Below the actual date, print the format of that date in 8 point type."
-msgstr "卿¥æä¹ä¸ä»¥ 8 ç¹åå°åºæç¨çæ¥ææ ¼å¼"
+msgstr "å¨å®é
æ¥æä¸æ¹ï¼ç¨ 8 å·å使å°è¯¥æ¥æã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2344
msgid "Print _blocking chars"
-msgstr "æå°ååå符串(_B)"
+msgstr "åé符(_B)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2350
msgid "Print '***' before and after each text field on the check."
-msgstr "卿¯ç¥¨æ¯ä¸ªææ¬å段çååæå°â***âã"
+msgstr "卿¯ç¥¨æ¯æ®µææ¬ååæå°â***âã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2365
-#, fuzzy
msgid "Default _font"
-msgstr "é»è®¤åä½(_F)ï¼"
+msgstr "é»è®¤åä½(_F)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2394
msgid "Printing"
-msgstr "æ£å¨æå°"
+msgstr "æå°"
#: gnucash/gtkbuilder/dialog-preferences.glade:2423
msgid "'_Enter' moves to blank transaction"
-msgstr "æâå车âç§»è³ç©ºç½äº¤æäºé¡¹(_E)"
+msgstr "âå车âç§»è³ç©ºç½äº¤æ(_E)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2429
-#, fuzzy
msgid ""
"If checked, pressing the 'Enter' key will move to the location of the blank "
"transaction in the register. If clear, pressing the 'Enter' key will move "
"down one row."
-msgstr ""
-"妿éä¸ï¼æâå车âå°ä¼ç§»å¨å°è´¦ç°¿åºé¨ç空ç½äº¤æäºé¡¹å¤ï¼å¦åï¼æâå车âå°ä¼å°ä¸"
-"ä¸è¡ã"
+msgstr "å¾éï¼âå车âå°ç§»å¨å
æ è³äº¤æçé¢åºé¨ç©ºç½å¤ï¼å¦åï¼ç§»å°ä¸ä¸è¡ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2441
msgid "_Auto-raise lists"
@@ -16701,11 +16681,11 @@ msgstr "èªå¨æåå表(_A)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2447
msgid "Automatically raise the list of accounts or actions during input."
-msgstr "èªå¨å°ç§ç®å表æè¿è¡è¾å
¥æä½è
æ¬è³ä¸å±ã"
+msgstr "è¾å
¥æ¶èªå¨æåç§ç®æå¨ä½å表ã"
#: gnucash/gtkbuilder/dialog-preferences.glade:2459
msgid "Tab order in_cludes Transfer on Memorised Transactions"
-msgstr "Tab å½ä»¤è¿å
æ¬å¨è®°ä½ç交æäºé¡¹ä¸ç转账(_C)"
+msgstr "è®°å¿å¡«å
æ¶ï¼Tab å
å«è½¬è´¦å段(_C)"
#: gnucash/gtkbuilder/dialog-preferences.glade:2465
msgid "Move to Transfer field when memorised transaction auto filled."
@@ -17011,9 +16991,8 @@ msgstr "çªå£"
#: gnucash/gtkbuilder/dialog-preferences.glade:3656
#: gnucash/gtkbuilder/dialog-preferences.glade:3679
-#, fuzzy
msgid "Online Quotes"
-msgstr "è·åç½ä¸æ¥ä»·(_G)"
+msgstr "ç½ä¸æ¥ä»·"
#: gnucash/gtkbuilder/dialog-price.glade:12
msgid "Bid"
@@ -22180,7 +22159,7 @@ msgstr ""
#: gnucash/register/ledger-core/split-register-model.c:278
#: gnucash/report/reports/standard/register.scm:134
msgid "T-Num"
-msgstr ""
+msgstr "T-ç¼å·"
#: gnucash/register/ledger-core/split-register-model.c:404
msgid "Exch. Rate"
@@ -24042,14 +24021,12 @@ msgid "Show TXF export parameters for each TXF code/account on report."
msgstr "卿¥è¡¨ä¸ä¸ºæ¯ä¸ª TXF 代ç /ç§ç®æ¾ç¤º TXF è¾åºåæ°"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:239
-#, fuzzy
msgid "Do not print T-Num:Memo data"
-msgstr "䏿å°âæä½ï¼å¤æ³¨âæ°æ®"
+msgstr "ä¸æå° T-ç¼å·ï¼å¤æ³¨"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:240
-#, fuzzy
msgid "Do not print T-Num:Memo data for transactions."
-msgstr "䏿å°äº¤æäºé¡¹çâæä½ï¼å¤æ³¨âæ°æ®"
+msgstr "䏿å°äº¤æç T-ç¼å·ï¼å¤æ³¨ã"
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:243
msgid "Do not print Action:Memo data"
@@ -29564,7 +29541,7 @@ msgstr "å转æäºç§ç®ç±»åçé颿¾ç¤º"
#: gnucash/report/trep-engine.scm:1213
msgid "Num/T-Num"
-msgstr ""
+msgstr "ç¼å·/T-ç¼å·"
#: gnucash/report/trep-engine.scm:1262
msgid "Transfer from/to"
commit 46582a66a421b255fdd5ed36847529c0964a08f6
Author: Anonymous <noreply at weblate.org>
Date: Sat Apr 24 19:32:06 2021 +0200
Translation update by Anonymous <noreply at weblate.org> using Weblate
po/glossary/fr.po: 100.0% (209 of 209 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/fr/
Co-authored-by: Anonymous <noreply at weblate.org>
diff --git a/po/glossary/fr.po b/po/glossary/fr.po
index fb92e399e..43e4ba35e 100644
--- a/po/glossary/fr.po
+++ b/po/glossary/fr.po
@@ -16,7 +16,7 @@ msgstr ""
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
"PO-Revision-Date: 2021-04-24 07:32+0000\n"
-"Last-Translator: Thomas Jungers <thomasjungers at gmail.com>\n"
+"Last-Translator: Anonymous <noreply at weblate.org>\n"
"Language-Team: French <https://hosted.weblate.org/projects/gnucash/glossary/"
"fr/>\n"
"Language: fr\n"
@@ -862,3 +862,6 @@ msgstr "retrait (dans le dialogue de rapprochement)"
#~ msgid "invoice owner"
#~ msgstr "destinataire de la facture"
+
+msgid "enter"
+msgstr "saisir, saisie"
commit 2e78ffdc8b3007d229753218a5aeabe0d4a14489
Author: Thomas Jungers <thomasjungers at gmail.com>
Date: Sat Apr 24 19:32:06 2021 +0200
Translation update by Thomas Jungers <thomasjungers at gmail.com> using Weblate
po/glossary/fr.po: 100.0% (209 of 209 strings; 0 fuzzy)
0 failing checks (0.0%)
Translation: GnuCash/Glossary (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/glossary/fr/
Translation update by Thomas Jungers <thomasjungers at gmail.com> using Weblate
po/fr.po: 74.7% (4096 of 5479 strings; 982 fuzzy)
484 failing checks (8.8%)
Translation: GnuCash/Program (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/fr/
Translation update by Thomas Jungers <thomasjungers at gmail.com> using Weblate
po/fr.po: 73.8% (4046 of 5479 strings; 985 fuzzy)
485 failing checks (8.8%)
Translation: GnuCash/Program (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/fr/
Co-authored-by: Thomas Jungers <thomasjungers at gmail.com>
diff --git a/po/fr.po b/po/fr.po
index 21f0b6f6d..969d86b11 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -30,8 +30,8 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-24 06:13+0000\n"
-"Last-Translator: Christopher Lam <christopher.lck at gmail.com>\n"
+"PO-Revision-Date: 2021-04-24 07:32+0000\n"
+"Last-Translator: Thomas Jungers <thomasjungers at gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/gnucash/gnucash/"
"fr/>\n"
"Language: fr\n"
@@ -2030,9 +2030,8 @@ msgstr "Inutilisé"
# po/guile_strings.txt:197
#: gnucash/gnome/dialog-find-account.c:431
-#, fuzzy
msgid "Balance Zero"
-msgstr "Solde (période)"
+msgstr "Solde"
# messages-i18n.c:211
#: gnucash/gnome/dialog-find-account.c:442
@@ -3140,9 +3139,8 @@ msgstr ""
"\n"
#: gnucash/gnome/dialog-payment.c:1596
-#, fuzzy
msgid "Warning"
-msgstr "Réactivation des avertissements"
+msgstr "Avertissement"
# src/gnome/glade-gnc-dialogs.c:1460
#: gnucash/gnome/dialog-payment.c:1599 gnucash/gnome/dialog-payment.c:1717
@@ -3200,9 +3198,8 @@ msgstr "Saisies"
# messages-i18n.c:56
#: gnucash/gnome/dialog-price-edit-db.c:457
-#, fuzzy
msgid "Are you sure you want to delete these prices?"
-msgstr "Confirmez-vous la suppression du cours sélectionné ?"
+msgstr "Ãtes-vous sûr de vouloir supprimer ces cours ?"
# messages-i18n.c:56
#: gnucash/gnome/dialog-price-editor.c:221
@@ -6674,6 +6671,7 @@ msgstr "%s %s de %s, émise le %s pour un montant de %s"
#: gnucash/gnome/gnc-plugin-page-register.c:4761
msgid "Several documents are linked with this transaction. Please choose one:"
msgstr ""
+"Plusieurs documents sont liés à cette transaction. Veuillez en choisir un :"
# src/gnome/glade-gnc-dialogs.c:936 src/gnome/glade-gnc-dialogs.c:943
#: gnucash/gnome/gnc-plugin-page-register.c:4762
@@ -6692,7 +6690,7 @@ msgstr "Date de facturation"
#: gnucash/gnome/gnc-plugin-page-register.c:5088
#, c-format
msgid "Checking splits in current register: %u of %u"
-msgstr ""
+msgstr "Vérification des répartitions dans le registre actuel : %u sur %u"
# po/guile_strings.txt:22
#: gnucash/gnome/gnc-plugin-page-report.c:302
@@ -6716,7 +6714,7 @@ msgstr "Exporter"
#. to be used as toolbar button label.
#: gnucash/gnome/gnc-plugin-page-report.c:1140
msgid "Save Config"
-msgstr ""
+msgstr "Enregistrer Config"
#. Translators: This string is meant to be a short alternative for "Save Report Configuration As..."
#. to be used as toolbar button label.
@@ -6727,7 +6725,7 @@ msgstr "Enregistrer sous..."
#: gnucash/gnome/gnc-plugin-page-report.c:1144
msgid "Make Pdf"
-msgstr ""
+msgstr "Créer le PDF"
#: gnucash/gnome/gnc-plugin-page-report.c:1196
#, c-format
@@ -6888,6 +6886,8 @@ msgid ""
"This report must be upgraded to return a document object with export-string "
"or export-error."
msgstr ""
+"Ce rapport doit être mis à jour pour retourner un objet document avec export-"
+"string ou export-error."
# messages-i18n.c:35
#: gnucash/gnome/gnc-plugin-page-report.c:1765
@@ -7121,6 +7121,9 @@ msgid ""
"Changing the entries may cause harm, please use the business options to "
"change the entries."
msgstr ""
+"Le registre affiché est celui du compte à payer ou du compte à recevoir. "
+"Modifier des entrées peut causer des dommages, veuillez utiliser les options "
+"commerciales pour modifier les entrées."
# po/guile_strings.txt:262
#: gnucash/gnome/gnc-split-reg2.c:937 gnucash/gnome/gnc-split-reg.c:2447
@@ -7374,6 +7377,12 @@ msgid ""
"Select OK to temporarily clear filter and proceed,\n"
"otherwise the last active cell will be selected."
msgstr ""
+"La répartition cible est actuellement masquée dans ce registre.\n"
+"\n"
+"%s\n"
+"\n"
+"Cliquez sur OK pour effacer temporairement le filtre et continuer, \n"
+"autrement la dernière cellule active sera sélectionnée."
# messages-i18n.c:225
#: gnucash/gnome/gnc-split-reg.c:2371
@@ -7386,6 +7395,10 @@ msgid ""
"have mismatched commodities or currencies.\n"
"You need to open each account individually to edit transactions."
msgstr ""
+"Les transactions de ce compte ne peuvent pas être modifiées parce que ses "
+"sous-comptes ont des produits ou des devises non concordantes.\n"
+"Vous devez ouvrir chaque compte individuellement pour modifier les "
+"transactions."
#: gnucash/gnome/gnc-split-reg.c:2524
msgid ""
@@ -7436,18 +7449,23 @@ msgid ""
"principles like double-entry accounting to ensure balanced books and "
"accurate reports."
msgstr ""
+"Conçu pour être facile à utiliser, mais puissant et flexible, GnuCash vous "
+"permet de suivre les comptes bancaires, les actions, les revenus et les "
+"dépenses. Aussi rapide et intuitif à utiliser qu'un registre papier, il est "
+"basé sur des principes comptables professionnels comme la comptabilité en "
+"partie double pour garantir des livres équilibrés et des rapports précis."
#: gnucash/gnome/gnucash.appdata.xml.in.in:15
msgid "With GnuCash you can (but are not limited to):"
-msgstr ""
+msgstr "Avec GnuCash vous pouvez (entre autres) :"
#: gnucash/gnome/gnucash.appdata.xml.in.in:17
msgid "Keep track of your day to day personal income and expenses"
-msgstr ""
+msgstr "Suivre vos revenus et vos dépenses personnelles au jour le jour"
#: gnucash/gnome/gnucash.appdata.xml.in.in:18
msgid "Manage your stock, bond and mutual fund accounts with ease"
-msgstr ""
+msgstr "Gérer facilement vos actions, obligations et fonds communs de placement"
# messages-i18n.c:120
#: gnucash/gnome/gnucash.appdata.xml.in.in:19
@@ -7458,6 +7476,8 @@ msgstr "Conserve l'ordre normal du compte."
#: gnucash/gnome/gnucash.appdata.xml.in.in:20
msgid "Create accurate reports and graphs from your financial data"
msgstr ""
+"Créer des rapports et des graphiques précis à partir de vos données "
+"financières"
#: gnucash/gnome/gnucash.appdata.xml.in.in:21
#, fuzzy
@@ -7469,10 +7489,12 @@ msgid ""
"Exchange by CSV/FinTS(former HBCI) or import SWIFT-MT9xx/QIF/OFX data "
"including Transaction Matching"
msgstr ""
+"Ãchanger par CSV/FinTS (anciennement HBCI) ou importer des données "
+"SWIFT-MT9xx/QIF/OFX, y compris avec une correspondance des transactions"
#: gnucash/gnome/gnucash.appdata.xml.in.in:23
msgid "Perform financial calculations, such as a loan repayment"
-msgstr ""
+msgstr "Effectuer des calculs financiers, comme le remboursement d'un prêt"
# messages-i18n.c:291
#: gnucash/gnome/gnucash.appdata.xml.in.in:33
@@ -7517,7 +7539,7 @@ msgstr "Tireté"
#: gnucash/gnome/report-menus.scm:118
msgid "A basic dashboard for your accounting data"
-msgstr ""
+msgstr "Un tableau de bord de base pour vos données comptables"
# po/guile_strings.txt:48
#: gnucash/gnome/search-owner.c:136
@@ -7830,28 +7852,33 @@ msgstr "Ouvre la fenêtre d'aide de GnuCash."
#, c-format
msgid "Statement Date is %d day after today."
msgid_plural "Statement Date is %d days after today."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "La date du relevé est %d jour après aujourd'hui."
+msgstr[1] "La date du relevé est %d jours après aujourd'hui."
#. Translators: %d is the number of days in the future
#: gnucash/gnome/window-reconcile.c:364
#, c-format
msgid "The statement date you have chosen is %d day in the future."
msgid_plural "The statement date you have chosen is %d days in the future."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "La date de relevé que vous avez choisi est %d jour dans le futur."
+msgstr[1] "La date de relevé que vous avez choisi est %d jours dans le futur."
#: gnucash/gnome/window-reconcile.c:369
msgid ""
"This may cause issues for future reconciliation actions on this account. "
"Please double-check this is the date you intended."
msgstr ""
+"Cela peut causer des problèmes pour les futures actions de réconciliation "
+"sur ce compte. Veuillez vérifier qu'il s'agit bien de la date correcte."
#: gnucash/gnome/window-reconcile.c:1852
msgid ""
"WARNING! Account contains splits whose reconcile date is after statement "
"date. Reconciliation may be difficult."
msgstr ""
+"ATTENTION ! Le compte contient des répartitions dont la date de "
+"rapprochement est postérieure à la date du relevé. La réconciliation peut "
+"être difficile."
#: gnucash/gnome/window-reconcile.c:1856
msgid ""
@@ -7860,6 +7887,11 @@ msgid ""
"the case, you may use Find Transactions to find them, unreconcile, and re-"
"reconcile."
msgstr ""
+"Ce compte comporte des répartitions dont la date de rapprochement est "
+"postérieure à cette date d'état de rapprochement. Ces répartitions peuvent "
+"rendre le rapprochement difficile. Si c'est le cas, vous pouvez utiliser la "
+"fonction Rechercher des transactions pour les trouver, les dé-rapprocher et "
+"les re-rapprocher."
#: gnucash/gnome/window-report.c:115
msgid "Set the report options you want using this dialog."
@@ -8382,6 +8414,7 @@ msgstr ""
msgid ""
"An account with opening balance already exists for the desired currency."
msgstr ""
+"Un compte avec un solde d'ouverture existe déjà pour la devise souhaitée."
# messages-i18n.c:72
#: gnucash/gnome-utils/dialog-account.c:1329
@@ -8431,7 +8464,7 @@ msgstr ""
msgid ""
"Set the account color for account '%s' including all sub-accounts to the "
"selected color"
-msgstr ""
+msgstr "Définir la couleur pour le compte \"%s\"et tous ses sous-comptes"
#: gnucash/gnome-utils/dialog-account.c:2312
#, c-format
@@ -8577,7 +8610,7 @@ msgstr "Vous ne pouvez pas créer une nouvelle devise nationale."
#: gnucash/gnome-utils/dialog-commodity.c:1279
#, c-format
msgid "%s is a reserved commodity type. Please use something else."
-msgstr ""
+msgstr "%s est un type de produit réservé. Veuillez utiliser un autre type."
#: gnucash/gnome-utils/dialog-commodity.c:1294
msgid "That commodity already exists."
@@ -8598,12 +8631,14 @@ msgstr "Exporter les transactions vers un fichier CSV"
#: gnucash/gnome-utils/dialog-doclink-utils.c:239
msgid "Path head does not exist,"
-msgstr ""
+msgstr "Le début du chemin n'existe pas,"
#: gnucash/gnome-utils/dialog-doclink-utils.c:242
#, c-format
msgid "Path head not set, using '%s' for relative paths"
msgstr ""
+"Le début du chemin n'est pas défini. Utilisation de \"%s\" pour les chemins "
+"relatifs"
# po/guile_strings.txt:122
#: gnucash/gnome-utils/dialog-doclink-utils.c:426
@@ -8613,7 +8648,7 @@ msgstr "Utilise existant"
#: gnucash/gnome-utils/dialog-dup-trans.c:148
msgid "You can type '+' or '-' to increment or decrement the number."
-msgstr ""
+msgstr "Vous pouvez taper '+' ou '-' pour incrémenter ou décrémenter le nombre."
# po/guile_strings.txt:173
#: gnucash/gnome-utils/dialog-dup-trans.c:297
@@ -8680,6 +8715,9 @@ msgid ""
"dialog (via File->Properties), after account setup, if you want to set a "
"default gain/loss account."
msgstr ""
+"Comme aucun compte n'a encore été configuré, vous devrez revenir à cette "
+"boîte de dialogue (via Fichier -> Propriétés), après la configuration du "
+"compte, si vous voulez définir un compte de gain/perte par défaut."
# src/gnome/glade-gnc-dialogs.c:506
#: gnucash/gnome-utils/dialog-options.c:704
@@ -8691,7 +8729,7 @@ msgstr "Sélectionner les comptes"
#: gnucash/gnome-utils/gnc-tree-view-account.c:989
msgctxt "Column header for 'Placeholder'"
msgid "P"
-msgstr ""
+msgstr "V"
#: gnucash/gnome-utils/dialog-options.c:804
msgid ""
@@ -8700,6 +8738,10 @@ msgid ""
"(via File->Properties), after account setup, to select a\n"
"default gain/loss account."
msgstr ""
+"Il n'y a pas de comptes de revenus ou de dépenses dans la devise\n"
+"comptable spécifiée ; vous devrez revenir à cette boîte de dialogue\n"
+"(via Fichier -> Propriétés) après la configuration du compte pour\n"
+"sélectionner un compte de gains/pertes par défaut."
#: gnucash/gnome-utils/dialog-options.c:872
#: gnucash/import-export/qif-imp/dialog-account-picker.c:299
@@ -8718,7 +8760,7 @@ msgstr "Devise "
#: gnucash/gnome-utils/dialog-options.c:1324
msgid "Default lot tracking policy"
-msgstr ""
+msgstr "Politique de suivi des lots par défaut"
# src/gnome/glade-gnc-dialogs.c:506
#: gnucash/gnome-utils/dialog-options.c:1347
@@ -8834,7 +8876,7 @@ msgstr "Selectionne un fichier image."
#: gnucash/gnome-utils/dialog-options.c:3082
msgid "Pixels"
-msgstr ""
+msgstr "Pixels"
#: gnucash/gnome-utils/dialog-options.c:3088
msgid "Percent"
@@ -8854,7 +8896,7 @@ msgstr "Revenus%sSalaire%sImposable"
#: gnucash/gnome-utils/dialog-preferences.c:899
msgid "Path does not exist, "
-msgstr ""
+msgstr "Le chemin n'existe pas, "
# messages-i18n.c:136
#: gnucash/gnome-utils/dialog-preferences.c:955
@@ -8892,7 +8934,7 @@ msgstr "nom"
#: gnucash/gnome-utils/dialog-tax-table.c:634
msgid "Please enter new name"
-msgstr ""
+msgstr "Veuillez saisir le nouveau nom"
# po/guile_strings.txt:173
#: gnucash/gnome-utils/dialog-tax-table.c:635
@@ -8904,7 +8946,7 @@ msgstr "_Renuméroter"
#: gnucash/gnome-utils/dialog-tax-table.c:641
#, c-format
msgid "Tax table name \"%s\" already exists."
-msgstr "Le nom de la table de taxation \"%s\" existe déjà ."
+msgstr "Le nom de table de taxation \"%s\" existe déjà ."
#: gnucash/gnome-utils/dialog-tax-table.c:665
#, c-format
@@ -8940,6 +8982,8 @@ msgid ""
"Retrieve the current online quote. This will fail if there is a manually-"
"created price for today."
msgstr ""
+"Récupérer le cours actuel en ligne. Cette opération échouera s'il existe un "
+"cours créé manuellement pour aujourd'hui."
#: gnucash/gnome-utils/dialog-transfer.c:1325
#, fuzzy
@@ -9034,6 +9078,8 @@ msgid ""
"The entered date is out of the range 01/01/1400 - 31/12/9999, resetting to "
"this year"
msgstr ""
+"La date saisie n'est pas comprise entre le 01/01/1400 et le 31/12/9999 ; "
+"elle est réinitialisée à cette année"
# messages-i18n.c:135
#: gnucash/gnome-utils/dialog-utils.c:437
@@ -9138,6 +9184,8 @@ msgstr "Aujourd'hui"
#: gnucash/gnome-utils/gnc-cell-view.c:78
msgid "Use Shift combined with Return or Keypad Enter to finish editing"
msgstr ""
+"Utiliser la touche Majuscule combinée à une touche Entrée (du clavier ou du "
+"pavé numérique) pour terminer l'édition"
# po/guile_strings.txt:113
#: gnucash/gnome-utils/gnc-date-delta.c:224
@@ -9425,6 +9473,9 @@ msgid ""
"\n"
"The file is in the history list, do you want to remove it?"
msgstr ""
+"Le fichier / l'URI %s n'a pas pu être trouvé.\n"
+"\n"
+"Le fichier est dans l'historique, voulez-vous le supprimer ?"
# messages-i18n.c:37
#: gnucash/gnome-utils/gnc-file.c:440
@@ -9540,6 +9591,11 @@ msgid ""
"your SQL database. Please see https://bugs.gnucash.org/show_bug.cgi?"
"id=645216 for more information."
msgstr ""
+"GnuCash n'a pas pu effectuer un test critique pour vérifier la présence d'un "
+"bogue dans la bibliothèque \"libdbi\". Ceci peut être causé par une mauvaise "
+"configuration des permissions de votre base de données SQL. Veuillez "
+"consulter https://bugs.gnucash.org/show_bug.cgi?id=645216 pour plus "
+"d'informations."
#: gnucash/gnome-utils/gnc-file.c:537
msgid ""
@@ -9548,6 +9604,11 @@ msgid ""
"older version of Gnucash (it will report an \"error parsing the file\"). If "
"you wish to preserve the old version, exit without saving."
msgstr ""
+"Ce fichier provient d'une ancienne version de GnuCash et sera mis à jour "
+"lorsqu'il sera sauvegardé par cette version. Vous ne pourrez plus lire le "
+"fichier enregistré avec l'ancienne version de Gnucash (il signalera une "
+"\"erreur d'analyse du fichier\"). Si vous souhaitez conserver l'ancienne "
+"version, quittez sans sauvegarder."
#: gnucash/gnome-utils/gnc-file.c:548
#, c-format
@@ -9983,7 +10044,7 @@ msgstr "Fermer _sans enregistrer"
#: gnucash/gnome-utils/gnc-main-window.c:1452
msgid "This window is closing and will not be restored."
-msgstr ""
+msgstr "Cette fenêtre se ferme et ne sera pas rétablie."
# messages-i18n.c:74
#: gnucash/gnome-utils/gnc-main-window.c:1458
@@ -10003,7 +10064,7 @@ msgstr "Livre non enregistré"
#: gnucash/gnome-utils/gnc-main-window.c:1759
msgid "Last modified on %a, %b %d, %Y at %I:%M %p"
-msgstr ""
+msgstr "Dernière modification le %a %d %b %Y à %H:%M"
# messages-i18n.c:44
#. Translators: This message appears in the status bar after opening the file.
@@ -10015,7 +10076,7 @@ msgstr "Fichier %s ouvert. %s"
#: gnucash/gnome-utils/gnc-main-window.c:2884
msgctxt "lower case key for short cut to 'Accounts'"
msgid "a"
-msgstr ""
+msgstr "c"
#: gnucash/gnome-utils/gnc-main-window.c:2974
msgid "Unable to save to database."
@@ -10037,7 +10098,7 @@ msgstr "Options du Grand Livre"
#: gnucash/gnome-utils/gnc-main-window.c:4702
#, c-format
msgid "Copyright © 1997-%s The GnuCash contributors."
-msgstr ""
+msgstr "Copyright © 1997- %s Les contributeurs de GnuCash."
#: gnucash/gnome-utils/gnc-main-window.c:4714
#: gnucash/gnome-utils/gnc-splash.c:97
@@ -10047,7 +10108,7 @@ msgstr "Version"
#: gnucash/gnome-utils/gnc-main-window.c:4715
#: gnucash/gnome-utils/gnc-splash.c:98 gnucash/gnucash-core-app.cpp:306
msgid "Build ID"
-msgstr ""
+msgstr "ID de build"
#: gnucash/gnome-utils/gnc-main-window.c:4723
#, fuzzy
@@ -10078,7 +10139,7 @@ msgstr ""
#: gnucash/gnome-utils/gnc-main-window.c:4735
msgid "Visit the GnuCash website."
-msgstr ""
+msgstr "Visitez le site web de GnuCash."
#: gnucash/gnome-utils/gnc-period-select.c:71
#: libgnucash/app-utils/date-utilities.scm:976
@@ -10276,6 +10337,8 @@ msgid ""
"This is the split anchoring this transaction to the register. You can not "
"duplicate it from this register window."
msgstr ""
+"Il s'agit de la répartition qui ancre cette transaction dans le registre. "
+"Vous ne pouvez pas la dupliquer à partir de cette fenêtre de registre."
# po/guile_strings.txt:219
#: gnucash/gnome-utils/gnc-tree-control-split-reg.c:1357
@@ -14659,7 +14722,7 @@ msgstr ""
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:201
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:191
msgid "<b>Load and Save Settings</b>"
-msgstr "<b>Charger et Enregistrer les paramètres</b>"
+msgstr "<b>Charger et Enregistrer les préférences</b>"
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:249
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:238
@@ -15043,10 +15106,9 @@ msgid ""
"account hierarchy. Accounts can be added, renamed, moved, or deleted by hand "
"later at any time."
msgstr ""
-"Sélectionnez les catégories correspondantes à votre utilisation de GnuCash. "
-"Chaque catégorie sélectionnée entrainera la création de plusieurs comptes. "
-"Choisissez les catégories vous concernant. Vous pourrez toujours créer des "
-"comptes supplémentaires manuellement plus tard."
+"La sélection que vous faites ici n'est que le point de départ de votre "
+"arborescence de comptes personnalisée. Des comptes peuvent être ajoutés, "
+"renommés, déplacés ou supprimés manuellement à tout moment."
# src/gnome/glade-gnc-dialogs.c:347 src/gnome/glade-gnc-dialogs.c:401
#: gnucash/gtkbuilder/assistant-hierarchy.glade:507
@@ -24320,7 +24382,7 @@ msgstr "Bonne journée !"
#: gnucash/python/init.py:118
#, python-format
msgid "Welcome to GnuCash %s Shell"
-msgstr "Bienvenue dans la console GnuCash %s !"
+msgstr "Bienvenue dans la console GnuCash %s"
#: gnucash/register/ledger-core/gncEntryLedger.c:250
msgid "Hours"
diff --git a/po/glossary/fr.po b/po/glossary/fr.po
index 1b73a7692..fb92e399e 100644
--- a/po/glossary/fr.po
+++ b/po/glossary/fr.po
@@ -15,7 +15,7 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-01-10 08:00+0100\n"
-"PO-Revision-Date: 2021-04-23 09:32+0000\n"
+"PO-Revision-Date: 2021-04-24 07:32+0000\n"
"Last-Translator: Thomas Jungers <thomasjungers at gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/gnucash/glossary/"
"fr/>\n"
@@ -470,7 +470,7 @@ msgstr "facture"
#. "In business accounting: Jobs are a mechanism by which you can group multiple invoices or bills that belong to the same customer or vendor. The job describes a (larger) piece of work or a task undertaken on order, for which one or many invoices or bills will be issued."
msgid "job"
-msgstr "tâche"
+msgstr "tâche (informatique), prestation (facturée)"
#. "A book in which a bank, business firm, etc. records its financial accounts"
msgid "ledger"
@@ -722,11 +722,11 @@ msgstr "enregistrement, pour (un fichier)"
#. "A transaction or reminder of a transaction that can be automatically executed at a specific time. It can be executed either once, or several times at regular intervals."
msgid "Scheduled Transaction"
-msgstr "Transaction répartie"
+msgstr "Transaction récurrente"
#. "DEPRECATED. To repair unbalanced transactions and orphan splits in an account tree. Any transactions that have debits != credits will get a balancing split added (pointing to a special new account called 'Imbalance'). Any splits that do not have accounts are put into another special account called 'Orphan'. Deprecated - use the term 'to check and repair' now."
msgid "scrub, to"
-msgstr "nettoyer, pour"
+msgstr "nettoyer"
#. "A document or certificate showing who owns shares"
msgid "security"
@@ -854,7 +854,7 @@ msgstr "fournisseur"
#. "The terms 'Voucher' and 'Expense Voucher' are used interchangeably in gnucash. The 'Expense Voucher' is also a bit of a misnomer -- it's more like an 'Expense Report' in gnucash. The phrase is meant to be a list of expenses incurred by an employee for which the company will reminburse them."
msgid "voucher"
-msgstr "bon (commande)"
+msgstr "bon (commande), pièce justificative"
#. "see debit"
msgid "withdraw (in the reconcile dialog)"
commit be1c67e5934a77daac30c32b8ea143851bdd91dc
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sat Apr 24 19:32:05 2021 +0200
Translation update by Christopher Lam <christopher.lck at gmail.com> using Weblate
po/fr.po: 73.8% (4046 of 5479 strings; 985 fuzzy)
485 failing checks (8.8%)
Translation: GnuCash/Program (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/fr/
Co-authored-by: Christopher Lam <christopher.lck at gmail.com>
diff --git a/po/fr.po b/po/fr.po
index c253b4a42..21f0b6f6d 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -30,8 +30,8 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-24 06:10+0000\n"
-"Last-Translator: Thomas Jungers <thomasjungers at gmail.com>\n"
+"PO-Revision-Date: 2021-04-24 06:13+0000\n"
+"Last-Translator: Christopher Lam <christopher.lck at gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/gnucash/gnucash/"
"fr/>\n"
"Language: fr\n"
@@ -15043,7 +15043,7 @@ msgid ""
"account hierarchy. Accounts can be added, renamed, moved, or deleted by hand "
"later at any time."
msgstr ""
-"sélectionnez les catégories correspondantes à votre utilisation de GnuCash. "
+"Sélectionnez les catégories correspondantes à votre utilisation de GnuCash. "
"Chaque catégorie sélectionnée entrainera la création de plusieurs comptes. "
"Choisissez les catégories vous concernant. Vous pourrez toujours créer des "
"comptes supplémentaires manuellement plus tard."
commit 9ec6e58c86233ee8488fea95b4e68757ef685358
Author: Thomas Jungers <thomasjungers at gmail.com>
Date: Sat Apr 24 19:32:05 2021 +0200
Translation update by Thomas Jungers <thomasjungers at gmail.com> using Weblate
po/fr.po: 73.8% (4046 of 5479 strings; 985 fuzzy)
485 failing checks (8.8%)
Translation: GnuCash/Program (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/fr/
Co-authored-by: Thomas Jungers <thomasjungers at gmail.com>
diff --git a/po/fr.po b/po/fr.po
index ee54192e3..c253b4a42 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -31,7 +31,7 @@ msgstr ""
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
"PO-Revision-Date: 2021-04-24 06:10+0000\n"
-"Last-Translator: Christopher Lam <christopher.lck at gmail.com>\n"
+"Last-Translator: Thomas Jungers <thomasjungers at gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/gnucash/gnucash/"
"fr/>\n"
"Language: fr\n"
@@ -443,7 +443,7 @@ msgstr "Occidental (Windows-1252)"
#: borrowed/goffice/go-charmap-sel.c:441
msgid "Locale: "
-msgstr "Locale :"
+msgstr "Locale : "
#: borrowed/goffice/go-charmap-sel.c:476
msgid "Conversion Direction"
@@ -489,7 +489,7 @@ msgid ""
msgstr ""
"L'équipe de développement de GnuCash est facile à contacter. En plus des "
"listes de diffusion, vous pouvez discuter avec eux en direct sur IRC. "
-"Connectez-vous sur la canal #gnucash sur irc.gnome.org."
+"Connectez-vous sur la canal #gnucash sur irc.gnome.org"
#: doc/tip_of_the_day.list.c:13
msgid ""
@@ -727,15 +727,15 @@ msgid ""
"frequency and then set 'Every 12 months'."
msgstr ""
"L'éditeur de transactions récurrentes a un éditeur de fréquence très "
-"flexible. Les fréquences de base sont: quotidien, hebdomadaire,\n"
-"et mensuel. Des fréquences avancées sont aussi possibles. Des exemples:\n"
+"flexible. Les fréquences de base sont : quotidien, hebdomadaire et mensuel. "
+"Des fréquences avancées sont aussi possibles. Par exemple :\n"
"\n"
"Pour créer une transaction qui se répète toutes les trois semaines, "
-"choisissez une fréquence hebdomadaire, et choisissez \"Toutes les 3 semaines."
+"choisissez une fréquence hebdomadaire et choisissez \"Toutes les 3 semaines."
"\"\n"
"\n"
-"Pour créer une transaction annuelle, choisissez une fréquence mensuelle, et "
-"choisissez \"Tous les 12 mois.\""
+"Pour créer une transaction annuelle, choisissez une fréquence mensuelle et "
+"choisissez \"Tous les 12 mois\"."
#: doc/tip_of_the_day.list.c:111
msgid ""
@@ -779,7 +779,8 @@ msgstr ""
"D'après une théorie, le jour où quelqu'un découvrira exactement à quoi sert "
"l'Univers et pourquoi il est là , ledit Univers disparaîtra sur-le-champ pour "
"se voir remplacé par quelque chose de considérablement plus inexplicable et "
-"bizarre. Selon une autre théorie, la chose se serait en fait déjà produite.\n"
+"bizarre. \n"
+"Selon une autre théorie, la chose se serait en fait déjà produite.\n"
"\n"
"Douglas Adams, \"Le dernier restaurant avant la fin du monde\""
@@ -1135,7 +1136,7 @@ msgstr "Répartition"
#: gnucash/gnome/assistant-stock-split.c:408
msgid "Error adding price."
-msgstr "Erreur d'ajout de prix"
+msgstr "Erreur d'ajout de prix."
# messages-i18n.c:236 po/guile_strings.txt:56
#: gnucash/gnome/assistant-stock-split.c:573
@@ -1558,7 +1559,7 @@ msgstr "<sans nom>"
# src/gnome/glade-gnc-dialogs.c:1276
#: gnucash/gnome/dialog-customer.c:440
msgid "Edit Customer"
-msgstr "Modification du client"
+msgstr "Modifier un client"
# src/gnome/glade-gnc-dialogs.c:1219 src/gnome/glade-gnc-dialogs.c:1240
# src/gnome/glade-gnc-dialogs.c:1276
@@ -1578,7 +1579,7 @@ msgstr "Prestations du client"
#: gnucash/gnome/dialog-customer.c:913
msgid "Customer's Invoices"
-msgstr "Factures du client"
+msgstr "Factures au client"
# messages-i18n.c:312
#: gnucash/gnome/dialog-customer.c:914 gnucash/gnome/dialog-employee.c:695
@@ -1804,7 +1805,6 @@ msgstr "Adresse non trouvée"
# po/guile_strings.txt:186
#: gnucash/gnome/dialog-doclink.c:592 gnucash/gnome/dialog-imap-editor.c:882
-#, fuzzy
msgid "Total Entries"
msgstr "Nombre d'entrées total"
@@ -1888,6 +1888,10 @@ msgid ""
"Double click on the entry in the Available column to modify the document "
"link."
msgstr ""
+"Double-cliquez sur l'entrée de la colonne Id pour accéder à l'élément.\n"
+"Double-cliquez sur l'entrée de la colonne Lien pour ouvrir le document lié.\n"
+"Double-cliquez sur l'entrée de la colonne Disponible pour modifier le lien "
+"vers le document."
# messages-i18n.c:231
#: gnucash/gnome/dialog-doclink.c:1097
@@ -2304,7 +2308,7 @@ msgstr "Date de rapprochement"
# messages-i18n.c:54
#. Translators: This is a ngettext(3) message, %d is the number of maps missing
#: gnucash/gnome/dialog-imap-editor.c:362
-#, fuzzy, c-format
+#, c-format
msgid ""
"There is %d invalid mapping,\n"
"\n"
@@ -2313,8 +2317,14 @@ msgid_plural ""
"There are %d invalid mappings,\n"
"\n"
"Would you like to remove them now?"
-msgstr[0] "La table de taxation %s n'existe pas. Voulez-vous la créer ?"
-msgstr[1] "La table de taxation %s n'existe pas. Voulez-vous la créer ?"
+msgstr[0] ""
+"%d correspondance est invalide,\n"
+"\n"
+"Voulez-vous la supprimer maintenant ?"
+msgstr[1] ""
+"%d correspondances sont invalides,\n"
+"\n"
+"Voulez-vous les supprimer maintenant ?"
#: gnucash/gnome/dialog-imap-editor.c:367
#, c-format
@@ -2334,7 +2344,7 @@ msgstr "(Note, si beaucoup de données, cette opération peut prendre du temps)"
#: gnucash/gnome/dialog-imap-editor.c:703
#: gnucash/gtkbuilder/dialog-imap-editor.glade:123
msgid "Bayesian"
-msgstr ""
+msgstr "Bayésien"
# messages-i18n.c:275 po/guile_strings.txt:129
#: gnucash/gnome/dialog-imap-editor.c:718
@@ -2347,21 +2357,18 @@ msgstr "Mémo"
# messages-i18n.c:165 po/guile_strings.txt:7
#: gnucash/gnome/dialog-imap-editor.c:724
-#, fuzzy
msgid "CSV Account Map"
-msgstr "Nom du compte"
+msgstr "Correspondance du compte avec le fichier CSV"
# messages-i18n.c:309
#: gnucash/gnome/dialog-imap-editor.c:764
-#, fuzzy
msgid "Online Id"
-msgstr "En ligne"
+msgstr "Id en ligne"
# messages-i18n.c:309
#: gnucash/gnome/dialog-imap-editor.c:790
-#, fuzzy
msgid "Online HBCI"
-msgstr "En ligne"
+msgstr "HBCI online"
#. Translators: In this context,
#. 'Billing information' maps to the
@@ -2413,7 +2420,7 @@ msgstr "Date de facturation"
# messages-i18n.c:186
#: gnucash/gnome/dialog-invoice.c:864
msgid "Post to Account"
-msgstr "Publier dans le compte"
+msgstr "Enregistrer dans le compte"
# messages-i18n.c:338 po/guile_strings.txt:298
# src/gnome/glade-gnc-dialogs.c:635
@@ -2428,7 +2435,7 @@ msgstr "La facture doit avoir au moins une ligne."
# messages-i18n.c:56
#: gnucash/gnome/dialog-invoice.c:977
msgid "Do you really want to post the invoice?"
-msgstr "Voulez-vous vraiment publier la facture ?"
+msgstr "Voulez-vous vraiment émettre la facture ?"
#: gnucash/gnome/dialog-invoice.c:995
msgid ""
@@ -2441,13 +2448,13 @@ msgstr ""
#: gnucash/gnome/dialog-invoice.c:1128
msgid "The post action was canceled because not all exchange rates were given."
msgstr ""
-"Lâaction de publication a été annulée car tous les taux de changes nâont pas "
-"été donnés."
+"Lâaction d'enregistrement a été annulée car tous les taux de changes nâont "
+"pas été donnés."
# messages-i18n.c:344
#: gnucash/gnome/dialog-invoice.c:1412
msgid "Total:"
-msgstr "Total : "
+msgstr "Total :"
# messages-i18n.c:344
#: gnucash/gnome/dialog-invoice.c:1418
@@ -2534,7 +2541,7 @@ msgstr "Nouvelle facture à payer"
#: gnucash/gnome/dialog-invoice.c:2165
msgid "Edit Bill"
-msgstr "Modifier la facture à payer "
+msgstr "Modifier la facture fournisseur"
# messages-i18n.c:192
#: gnucash/gnome/dialog-invoice.c:2169
@@ -2591,18 +2598,17 @@ msgid "Date of duplicated entries"
msgstr "Date des entrées dupliquées"
#: gnucash/gnome/dialog-invoice.c:3244
-#, fuzzy
msgid ""
"One or more selected invoices have already been posted.\n"
"Re-check your selection."
msgstr ""
-"Une ou plusieurs facture(s) sélectionnée(s) ont déjà été publiées.\n"
+"Une ou plusieurs facture(s) sélectionnée(s) ont déjà été émises.\n"
"Revérifiez votre sélection."
# messages-i18n.c:56
#: gnucash/gnome/dialog-invoice.c:3248
msgid "Do you really want to post these invoices?"
-msgstr "Voulez-vous vraiment publier ces factures ?"
+msgstr "Voulez-vous vraiment émettre ces factures ?"
#: gnucash/gnome/dialog-invoice.c:3326 gnucash/gnome/dialog-invoice.c:3607
msgid "View/Edit Invoice"
@@ -2621,7 +2627,7 @@ msgstr "Dupliquer"
#: gnucash/gnome/dialog-invoice.c:3349
#: gnucash/gnome/gnc-plugin-page-invoice.c:459
msgid "Post"
-msgstr "Publier"
+msgstr "Ãmettre"
# messages-i18n.c:324 po/guile_strings.txt:181
#: gnucash/gnome/dialog-invoice.c:3330 gnucash/gnome/dialog-invoice.c:3339
@@ -2671,7 +2677,7 @@ msgstr "Est payé ?"
#: gnucash/gnome/dialog-invoice.c:3375 gnucash/gnome/dialog-invoice.c:3409
#: gnucash/gnome/dialog-invoice.c:3443
msgid "Is Posted?"
-msgstr "Est publié ?"
+msgstr "Est émise ?"
# messages-i18n.c:135
#: gnucash/gnome/dialog-invoice.c:3378 gnucash/gnome/dialog-invoice.c:3412
@@ -2749,7 +2755,7 @@ msgstr "Payé"
#: gnucash/gnome/dialog-invoice.c:3470
msgid "Posted"
-msgstr "Publié"
+msgstr "Ãmis"
# messages-i18n.c:168 po/guile_strings.txt:259
#: gnucash/gnome/dialog-invoice.c:3475 gnucash/gnome/dialog-invoice.c:3628
@@ -2807,11 +2813,11 @@ msgstr "Recherche de facture"
#. Translators: %d is the number of bills/credit notes due. This is a
#. ngettext(3) message.
#: gnucash/gnome/dialog-invoice.c:3708
-#, fuzzy, c-format
+#, c-format
msgid "The following vendor document is due:"
msgid_plural "The following %d vendor documents are due:"
-msgstr[0] "La facture suivante est dûe :"
-msgstr[1] "Les %d factures suivantes sont dûes :"
+msgstr[0] "La facture fournisseur suivante est due :"
+msgstr[1] "Les %d factures fournisseurs suivantes sont dues :"
#: gnucash/gnome/dialog-invoice.c:3712
msgid "Due Bills Reminder"
@@ -2820,14 +2826,13 @@ msgstr "Rappel des factures à payer"
#. Translators: %d is the number of invoices/credit notes due. This is a
#. ngettext(3) message.
#: gnucash/gnome/dialog-invoice.c:3719
-#, fuzzy, c-format
+#, c-format
msgid "The following customer document is due:"
msgid_plural "The following %d customer documents are due:"
-msgstr[0] "La facture suivante est due :"
-msgstr[1] "Les %d factures suivantes sont dues :"
+msgstr[0] "La facture client suivante est due :"
+msgstr[1] "Les %d factures clients suivantes sont dues :"
#: gnucash/gnome/dialog-invoice.c:3723
-#, fuzzy
msgid "Due Invoices Reminder"
msgstr "Rappel des factures à payer"
@@ -3018,7 +3023,7 @@ msgstr "Trouver commande"
# messages-i18n.c:21
#: gnucash/gnome/dialog-payment.c:231
msgid "You must enter a valid account name for posting."
-msgstr "Vous devez saisir un nom de compte valide pour la publication."
+msgstr "Vous devez saisir un nom de compte valide pour l'enregistrement."
# messages-i18n.c:21
#: gnucash/gnome/dialog-payment.c:240
@@ -3131,8 +3136,7 @@ msgid ""
msgstr ""
"Cette transaction a plusieurs répartitions qui peuvent être considérées \n"
"comme \"payement\", gnucash ne peut en considérer qu'une.\n"
-"Sélectionner s'il vous plaît une répartition, les autres\n"
-"seront ignorées.\n"
+"Veuillez sélectionner une répartition, les autres seront ignorées.\n"
"\n"
#: gnucash/gnome/dialog-payment.c:1596
@@ -3164,6 +3168,12 @@ msgid ""
"%s\n"
"Do you wish to continue and ignore these splits?"
msgstr ""
+"La transaction comporte au moins une répartition dans un compte d'affaires "
+"qui ne fait pas partie d'une transaction d'affaires.\n"
+"Si vous continuez, ces répartitions seront ignorées :\n"
+"\n"
+"%s\n"
+"Voulez-vous continuer et ignorer ces répartitions ?"
# messages-i18n.c:56
#. Translators: %d is the number of prices. This is a ngettext(3) message.
@@ -3326,7 +3336,7 @@ msgstr "Cols"
#: gnucash/gnome/dialog-report-style-sheet.c:172
#, c-format
msgid "HTML Style Sheet Properties: %s"
-msgstr "Propriétés de la feuille de style HTML: %s"
+msgstr "Propriétés de la feuille de style HTML : %s"
#: gnucash/gnome/dialog-report-style-sheet.c:269
msgid "You must provide a name for the new style sheet."
@@ -3455,8 +3465,8 @@ msgid ""
"Note: If you have already accepted changes to the Template, Cancel will not "
"revoke them."
msgstr ""
-"Note: si vous avez déjà accepté les changements du modèle, \"Annuler\" ne va "
-"pas les révoquer."
+"Remarque : si vous avez déjà accepté les changements du modèle, \"Annuler\" "
+"ne va pas les révoquer."
# messages-i18n.c:305 src/gnome/print-session.c:108
# src/gnome/print-session.c:197
@@ -3489,12 +3499,13 @@ msgstr ""
"avec des variables."
#: gnucash/gnome/dialog-sx-editor.c:674
-#, fuzzy, c-format
+#, c-format
msgid "Couldn't parse %s for split \"%s\"."
-msgstr "Impossible de traiter la formule de débit pour la répartition \"%s\"."
+msgstr ""
+"Impossible de traiter la formule de débit %s pour la répartition \"%s\"."
#: gnucash/gnome/dialog-sx-editor.c:738
-#, fuzzy, c-format
+#, c-format
msgid "Split with memo %s has an invalid account."
msgstr "La répartition avec le mémo %s possède un compte invalide."
@@ -3504,19 +3515,18 @@ msgid "Invalid Account in Split"
msgstr "Inclure le total des mouvements des comptes"
#: gnucash/gnome/dialog-sx-editor.c:753
-#, fuzzy, c-format
+#, c-format
msgid "Split with memo %s has an unparseable Credit Formula."
msgstr ""
"La répartition avec le mémo %s possède une Formule de Crédit qui ne peut pas "
"être analysée."
#: gnucash/gnome/dialog-sx-editor.c:756 gnucash/gnome/dialog-sx-editor.c:772
-#, fuzzy
msgid "Unparsable Formula in Split"
msgstr "Formule non analysable dans la répartition"
#: gnucash/gnome/dialog-sx-editor.c:769
-#, fuzzy, c-format
+#, c-format
msgid "Split with memo %s has an unparseable Debit Formula."
msgstr ""
"La répartition avec le mémo %s possède une Formule de Débit qui ne peut pas "
@@ -3617,12 +3627,12 @@ msgstr "Transaction créées"
# po/guile_strings.txt:182
#: gnucash/gnome/dialog-tax-info.c:289
msgid "Last Valid Year: "
-msgstr "Dernière année valide :"
+msgstr "Dernière année valide : "
# messages-i18n.c:290 po/guile_strings.txt:106
#: gnucash/gnome/dialog-tax-info.c:290
msgid "Form Line Data: "
-msgstr "Forme de donnée :"
+msgstr "Forme de donnée : "
# po/guile_strings.txt:194
#. Translators: Tax Code
@@ -3670,9 +3680,9 @@ msgid ""
"Payment Address - Name."
msgstr ""
"Vous devez saisir le nom de la société. Si ce fournisseur est une personne "
-"physique (et non morale) vous devez entrer la même valeur pour:\n"
+"physique (et non morale) vous devez entrer la même valeur pour :\n"
"Identification - Nom de la société et\n"
-"Adresse de facturation -."
+"Adresse de facturation - Nom."
# messages-i18n.c:21
#: gnucash/gnome/dialog-vendor.c:226
@@ -3681,7 +3691,7 @@ msgstr "Vous devez saisir une adresse de paiement."
#: gnucash/gnome/dialog-vendor.c:307
msgid "Edit Vendor"
-msgstr "Modification de fournisseur"
+msgstr "Modifier un fournisseur"
# messages-i18n.c:348 po/guile_strings.txt:57
#: gnucash/gnome/dialog-vendor.c:309 gnucash/gnome-search/dialog-search.c:1111
@@ -3974,12 +3984,10 @@ msgid "Close the Book at the end of the Period"
msgstr "Clôture le livre à la fin de la période"
#: gnucash/gnome/gnc-plugin-basic-commands.c:211
-#, fuzzy
msgid "_Import Map Editor"
-msgstr "_Importer un Ãditeur de Correspondance"
+msgstr "Ãditeur de Correspondance pour _Importation"
#: gnucash/gnome/gnc-plugin-basic-commands.c:212
-#, fuzzy
msgid "View and Delete Bayesian and non-Bayesian information"
msgstr "Afficher et Supprimer des informations bayésiennes et non bayésiennes"
@@ -4198,7 +4206,7 @@ msgstr "_Fournisseur"
#: gnucash/gnome/gnc-plugin-business.c:208
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:160
msgid "_New Vendor..."
-msgstr "_Nouveau fournisseur"
+msgstr "_Nouveau fournisseur..."
# messages-i18n.c:85
#: gnucash/gnome/gnc-plugin-business.c:209
@@ -4304,7 +4312,7 @@ msgstr "_Table de taxation des ventes"
#: gnucash/gnome/gnc-plugin-business.c:284
msgid "View and edit the list of Sales Tax Tables (GST/VAT)"
-msgstr "Affiche et modifie la liste des tables de taxation des ventes"
+msgstr "Affiche et modifie la liste des tables de taxation des ventes (TVA)"
#: gnucash/gnome/gnc-plugin-business.c:288
msgid "_Billing Terms Editor"
@@ -4565,7 +4573,7 @@ msgstr "_Auto pointage..."
#: gnucash/gnome/gnc-plugin-page-account-tree.c:307
msgid "Automatically clear individual transactions, given a cleared amount"
msgstr ""
-"Pointer automatiquement les transactions individuelles, fournissant un "
+"Pointer automatiquement des transactions individuelles, sur la base d'un "
"compte pointé"
# messages-i18n.c:163
@@ -4690,7 +4698,6 @@ msgstr "Supprimer"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1991
#: gnucash/gnome/gnc-plugin-page-register.c:1960
#: gnucash/gnome/gnc-plugin-page-register.c:5065
-#, fuzzy
msgid "'Check & Repair' is currently running, do you want to abort it?"
msgstr "\"Vérifier & Réparer\" est en cours ; voulez-vous l'interrompre ?"
@@ -4734,14 +4741,15 @@ msgstr "Comptes"
# messages-i18n.c:48
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1429
-#, fuzzy, c-format
+#, c-format
msgid ""
"Account %s does not have the same currency as the one you're moving "
"transactions from.\n"
"Are you sure you want to do this?"
msgstr ""
-"Vous êtes sur le point d'écraser une transaction existante. Ãtes-vous sûr de "
-"vouloir faire cela ?"
+"Le compte %s n'utilise pas la même devise que celui d'où provient la "
+"transaction à déplacer.\n"
+"Ãtes-vous sûr de vouloir faire cela ?"
# src/gnome/glade-gnc-dialogs.c:506
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1437
@@ -4750,7 +4758,6 @@ msgid "_Pick another account"
msgstr "Depuis le compte _sélectionné"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1438
-#, fuzzy
msgid "_Do it anyway"
msgstr "Le _faire tout de même"
@@ -4769,7 +4776,6 @@ msgid "Deleting account %s"
msgstr "Suppression du compte %s"
#: gnucash/gnome/gnc-plugin-page-account-tree.c:1647
-#, fuzzy
msgid ""
"The list below shows objects which make use of the account which you want to "
"delete.\n"
@@ -4852,7 +4858,6 @@ msgid "_Delete Budget..."
msgstr "_Supprimer ce budget"
#: gnucash/gnome/gnc-plugin-page-budget.c:160
-#, fuzzy
msgid "Select this or another budget and delete it."
msgstr "Sélectionner ce budget ou un autre et le supprimer."
@@ -5185,7 +5190,7 @@ msgstr "_Dupliquer la facture"
# src/gnome/glade-gnc-dialogs.c:644
#: gnucash/gnome/gnc-plugin-page-invoice.c:299
msgid "_Post Invoice"
-msgstr "_Publier la facture"
+msgstr "Ãmettre la _facture"
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
@@ -5229,12 +5234,10 @@ msgid "_Open Linked Document"
msgstr "_Ouvrir le Document lié"
#: gnucash/gnome/gnc-plugin-page-invoice.c:310
-#, fuzzy
msgid "_Use as Default Layout for Customer Documents"
msgstr "_Utiliser comme Mise en Page par défaut pour les Documents Clients"
#: gnucash/gnome/gnc-plugin-page-invoice.c:311
-#, fuzzy
msgid "_Reset Default Layout for Customer Documents"
msgstr "_Réinitialiser la Mise en Page par défaut pour les Documents Clients"
@@ -5279,15 +5282,13 @@ msgid "_Pay Bill"
msgstr "Payer une facture"
#: gnucash/gnome/gnc-plugin-page-invoice.c:331
-#, fuzzy
msgid "_Use as Default Layout for Vendor Documents"
-msgstr "Utiliser comme Mise en Page par défaut pour les Documents Fournisseurs"
+msgstr "_Utiliser comme Mise en Page par défaut pour les Documents Fournisseurs"
#: gnucash/gnome/gnc-plugin-page-invoice.c:332
-#, fuzzy
msgid "_Reset Default Layout for Vendor Documents"
msgstr ""
-"_Réinitialiser la Mise en Page par défaut pour les Documents Fournisseurs"
+"_Réinitialiser la Mise en Page par défaut pour les Documents de Fournisseurs"
# src/gnome/glade-gnc-dialogs.c:1149
#: gnucash/gnome/gnc-plugin-page-invoice.c:338
@@ -5330,12 +5331,10 @@ msgid "_Pay Voucher"
msgstr "Bon"
#: gnucash/gnome/gnc-plugin-page-invoice.c:352
-#, fuzzy
msgid "_Use as Default Layout for Employee Documents"
msgstr "_Utiliser comme Mise en Page par défaut pour les Documents Employés"
#: gnucash/gnome/gnc-plugin-page-invoice.c:353
-#, fuzzy
msgid "_Reset Default Layout for Employee Documents"
msgstr "_Réinitialiser la Mise en Page par défaut pour les Documents Employés"
@@ -5395,9 +5394,8 @@ msgid "Create a new invoice as a duplicate of the current one"
msgstr "Créer une nouvelle facture comme double de l'actuelle"
#: gnucash/gnome/gnc-plugin-page-invoice.c:376
-#, fuzzy
msgid "Post this invoice to your Chart of Accounts"
-msgstr "Publie cette facture dans votre plan comptable"
+msgstr "Enregistre cette facture client dans votre plan comptable"
#: gnucash/gnome/gnc-plugin-page-invoice.c:377
#, fuzzy
@@ -5437,7 +5435,6 @@ msgid "Open Linked Document"
msgstr "Ouvrir le Document lié"
#: gnucash/gnome/gnc-plugin-page-invoice.c:388
-#, fuzzy
msgid ""
"Use the current layout as default for all customer invoices and credit notes"
msgstr ""
@@ -5470,9 +5467,8 @@ msgid "Create a new bill as a duplicate of the current one"
msgstr "Créer une nouvelle facture comme double de l'actuelle"
#: gnucash/gnome/gnc-plugin-page-invoice.c:397
-#, fuzzy
msgid "Post this bill to your Chart of Accounts"
-msgstr "Publie cette facture dans votre plan comptable"
+msgstr "Enregistre cette facture fournisseur dans votre plan comptable"
#: gnucash/gnome/gnc-plugin-page-invoice.c:398
#, fuzzy
@@ -5498,13 +5494,11 @@ msgstr "Saisissez un paiement pour le destinataire de cette facture"
# messages-i18n.c:104
#: gnucash/gnome/gnc-plugin-page-invoice.c:402
-#, fuzzy
msgid "Open a vendor report window for the owner of this bill"
msgstr ""
-"Ouvre une fenêtre de rapport société pour le destinataire de cette facture"
+"Ouvre une fenêtre de rapport de fournisseur pour l'émetteur de cette facture"
#: gnucash/gnome/gnc-plugin-page-invoice.c:409
-#, fuzzy
msgid "Use the current layout as default for all vendor bills and credit notes"
msgstr ""
"Utiliser par défaut la mise en page actuelle pour toutes les factures des "
@@ -5536,9 +5530,8 @@ msgid "Create a new voucher as a duplicate of the current one"
msgstr "Créer une nouvelle facture comme double de l'actuelle"
#: gnucash/gnome/gnc-plugin-page-invoice.c:418
-#, fuzzy
msgid "Post this voucher to your Chart of Accounts"
-msgstr "Publie cette facture dans votre plan comptable"
+msgstr "Enregistre cette pièce justificative dans votre plan comptable"
#: gnucash/gnome/gnc-plugin-page-invoice.c:419
#, fuzzy
@@ -5573,12 +5566,17 @@ msgstr ""
msgid ""
"Use the current layout as default for all employee vouchers and credit notes"
msgstr ""
+"Utiliser la mise en page actuelle par défaut pour toutes les pièces "
+"justificatives et les notes de crédit des employés"
#: gnucash/gnome/gnc-plugin-page-invoice.c:431
msgid ""
"Reset default layout for all employee vouchers and credit notes back to "
"built-in defaults and update the current page accordingly"
msgstr ""
+"Réinitialiser la mise en page par défaut, pour toutes les pièces "
+"justificatives et notes de crédit des employés, à celle intégrée par défaut "
+"et mettre à jour la page actuelle en fonction"
#: gnucash/gnome/gnc-plugin-page-invoice.c:436
#, fuzzy
@@ -5597,9 +5595,8 @@ msgid "Create a new credit note as a duplicate of the current one"
msgstr "Créer une nouvelle facture comme double de l'actuelle"
#: gnucash/gnome/gnc-plugin-page-invoice.c:439
-#, fuzzy
msgid "Post this credit note to your Chart of Accounts"
-msgstr "Publie cette facture dans votre plan comptable"
+msgstr "Enregistre cette note de crédit dans votre plan comptable"
#: gnucash/gnome/gnc-plugin-page-invoice.c:440
#, fuzzy
@@ -5632,7 +5629,7 @@ msgstr ""
#: gnucash/gnome/gnc-plugin-page-invoice.c:445
msgid "Manage Document Link..."
-msgstr ""
+msgstr "Gérer le lien vers le document..."
#: gnucash/gnome/gnc-plugin-page-invoice.c:452
#: gnucash/gnome/gnc-plugin-page-register2.c:498
@@ -5675,7 +5672,7 @@ msgstr "_Modifier le fournisseur"
# messages-i18n.c:80
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:146
msgid "Edit the selected vendor"
-msgstr "Modifie le fournisseur sélectionné"
+msgstr "Modifier le fournisseur sélectionné"
# src/gnome/glade-gnc-dialogs.c:1219 src/gnome/glade-gnc-dialogs.c:1240
# src/gnome/glade-gnc-dialogs.c:1276
@@ -5700,7 +5697,7 @@ msgstr "Modifie lâemployé sélectionné"
# messages-i18n.c:93
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:161
msgid "Create a new vendor"
-msgstr "Crée un nouveau fournisseur"
+msgstr "Créer un nouveau fournisseur"
# messages-i18n.c:92
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:166
@@ -5748,7 +5745,7 @@ msgstr "Crée un nouveau bon de dépense"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:294
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:928
msgid "Vendor Listing"
-msgstr "Listing des fournisseurs"
+msgstr "Liste des fournisseurs"
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:212
msgid "Show vendor aging overview for all vendors"
@@ -5776,7 +5773,7 @@ msgstr "Rapport fournisseur"
# messages-i18n.c:183
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:222
msgid "Show vendor report"
-msgstr "Affiche le rapport fournisseur"
+msgstr "Affiche le rapport du fournisseur"
# messages-i18n.c:324 po/guile_strings.txt:181
#: gnucash/gnome/gnc-plugin-page-owner-tree.c:226
@@ -6069,6 +6066,9 @@ msgid ""
"Move the current transaction one row upwards. Only available if the date and "
"number of both rows are identical and the register window is sorted by date."
msgstr ""
+"Déplace la transaction actuelle d'une ligne vers le haut. Disponible "
+"uniquement si la date et le numéro des deux lignes sont identiques et si la "
+"fenêtre de registre est triée par date."
# messages-i18n.c:176
#: gnucash/gnome/gnc-plugin-page-register2.c:332
@@ -6081,6 +6081,9 @@ msgid ""
"and number of both rows are identical and the register window is sorted by "
"date."
msgstr ""
+"Déplace la transaction actuelle d'une ligne vers le bas. Disponible "
+"uniquement si la date et le numéro des deux lignes sont identiques et si la "
+"fenêtre de registre est triée par date."
#: gnucash/gnome/gnc-plugin-page-register2.c:363
#: gnucash/gnome/gnc-plugin-page-register.c:481
@@ -6088,8 +6091,8 @@ msgid ""
"Automatically clear individual transactions, so as to reach a certain "
"cleared amount"
msgstr ""
-"Pointer automatiquement les transactions individuelles, pour avoir un compte "
-"pointé"
+"Pointer automatiquement des transactions individuelles, jusqu'Ã atteindre un "
+"certain montant pointé"
# messages-i18n.c:162
#: gnucash/gnome/gnc-plugin-page-register2.c:377
@@ -6290,6 +6293,8 @@ msgid ""
"You have tried to open an account in the new register while it is open in "
"the old register."
msgstr ""
+"Vous avez essayé d'ouvrir un compte dans le nouveau registre alors qu'il est "
+"ouvert dans l'ancien registre."
# messages-i18n.c:183
#: gnucash/gnome/gnc-plugin-page-register2.c:755
@@ -6515,7 +6520,7 @@ msgstr "Associe un emplacement à la transaction courante"
#: gnucash/gnome/gnc-plugin-page-register.c:320
msgid "Jump to the linked bill, invoice, or voucher"
-msgstr ""
+msgstr "Accéder à la facture ou à la pièce justificative liée"
# messages-i18n.c:57
#: gnucash/gnome/gnc-plugin-page-register.c:409
@@ -6551,9 +6556,8 @@ msgstr ""
# po/guile_strings.txt:227
#: gnucash/gnome/gnc-plugin-page-register.c:3405
-#, fuzzy
msgid "Filter By:"
-msgstr "Filtrer selon..."
+msgstr "Filtrer par :"
# messages-i18n.c:227
#: gnucash/gnome/gnc-plugin-page-register.c:3419
@@ -6562,9 +6566,8 @@ msgstr "Date de début :"
# messages-i18n.c:127
#: gnucash/gnome/gnc-plugin-page-register.c:3425
-#, fuzzy
msgid "Show previous number of days:"
-msgstr "Afficher le nombre de titres"
+msgstr "Afficher le nombre de jours précédents :"
# messages-i18n.c:180
#: gnucash/gnome/gnc-plugin-page-register.c:3432
@@ -6612,11 +6615,11 @@ msgstr "Invalidé"
#: gnucash/gnome/gnc-plugin-page-register.c:3454
#: gnucash/gnome/gnc-plugin-page-register.c:3456
msgid "Hide:"
-msgstr ""
+msgstr "Masquer :"
#: gnucash/gnome/gnc-plugin-page-register.c:3456
msgid "Show:"
-msgstr ""
+msgstr "Afficher :"
# messages-i18n.c:346
#: gnucash/gnome/gnc-plugin-page-register.c:3561
@@ -6666,7 +6669,7 @@ msgstr "Trier %s par..."
#: gnucash/gnome/gnc-plugin-page-register.c:4751
#, c-format
msgid "%s %s from %s, posted %s, amount %s"
-msgstr ""
+msgstr "%s %s de %s, émise le %s pour un montant de %s"
#: gnucash/gnome/gnc-plugin-page-register.c:4761
msgid "Several documents are linked with this transaction. Please choose one:"
@@ -7126,10 +7129,9 @@ msgstr "Ce registre de compte est en lecture seule."
# po/guile_strings.txt:262
#: gnucash/gnome/gnc-split-reg2.c:938 gnucash/gnome/gnc-split-reg.c:2448
-#, fuzzy, c-format
-#| msgid "This account register is read-only."
+#, c-format
msgid "The '%s' account register is read-only."
-msgstr "Ce registre de compte est en lecture seule."
+msgstr "Le registre de compte \"%s\" est en lecture seule."
#: gnucash/gnome/gnc-split-reg2.c:1003
msgid ""
@@ -7296,8 +7298,8 @@ msgid ""
"This transaction contains reconciled splits. Modifying it is not a good idea "
"because that will cause your reconciled balance to be off."
msgstr ""
-"Vous effaceriez une transaction avec des répartitions déjà rapprochées.\n"
-"Ce n'est pas une bonne idée, car votre solde rapproché sera incorrecte."
+"Vous effaceriez une transaction avec des répartitions déjà rapprochées. Ce "
+"n'est pas une bonne idée, car votre solde rapproché sera incorrect."
# messages-i18n.c:57
#. Translators: This is the confirmation button in a warning dialog
@@ -7375,9 +7377,8 @@ msgstr ""
# messages-i18n.c:225
#: gnucash/gnome/gnc-split-reg.c:2371
-#, fuzzy
msgid "Sort By:"
-msgstr "Trier par"
+msgstr "Trier par :"
#: gnucash/gnome/gnc-split-reg.c:2509
msgid ""
@@ -7387,28 +7388,28 @@ msgid ""
msgstr ""
#: gnucash/gnome/gnc-split-reg.c:2524
-#, fuzzy
msgid ""
"The transactions of this account may not be edited.\n"
"If you want to edit transactions in this register, please open the account "
"options and turn off the placeholder checkbox."
msgstr ""
-"Ce compte ne peut pas être édité. Si vous souhaitez éditer des transactions "
-"dans ce registre, ouvrez les options du compte et désactivez lâoption "
-"« Virtuel »."
+"Les transaction de ce compte ne peuvent pas être modifiées.\n"
+"Si vous souhaitez modifier des transactions dans ce registre, ouvrez les "
+"options du compte et décochez la case « Virtuel »."
#: gnucash/gnome/gnc-split-reg.c:2531
-#, fuzzy
msgid ""
"The transactions in one of the selected sub-accounts may not be edited.\n"
"If you want to edit transactions in this register, please open the sub-"
"account options and turn off the placeholder checkbox.\n"
"You may also open an individual account instead of a set of accounts."
msgstr ""
-"L'un des sous-comptes sélectionnés ne peut être édité. Si vous souhaitez "
-"éditer des transactions dans ce registre, ouvrez les options du sous-compte "
-"et désactivez l'option « Virtuel ». Vous pouvez également ouvrir des comptes "
-"individuels au lieu d'un groupe de comptes."
+"Les transactions de l'un des sous-comptes sélectionnés ne peuvent pas être "
+"modifiées.\n"
+"Si vous souhaitez modifier des transactions dans ce registre, ouvrez les "
+"options du sous-compte et décochez la case « Virtuel ».\n"
+"Vous pouvez également ouvrir un compte individuel au lieu d'un groupe de "
+"comptes."
# messages-i18n.c:83
#: gnucash/gnome/gnucash.appdata.xml.in.in:5
@@ -7496,7 +7497,7 @@ msgstr "R"
#: gnucash/gnome/report-menus.scm:57
#, scheme-format
msgid "Display the ~a report"
-msgstr "Afficher le rapport ~s"
+msgstr "Afficher le rapport ~a"
# po/guile_strings.txt:138
#: gnucash/gnome/report-menus.scm:90
@@ -7574,10 +7575,8 @@ msgstr "Affaires"
# messages-i18n.c:176
#: gnucash/gnome/window-autoclear.c:115
-#, fuzzy
-#| msgid "Created Transactions"
msgid "Cleared Transactions"
-msgstr "Transaction créées"
+msgstr "Transaction pointées"
# messages-i18n.c:227
#: gnucash/gnome/window-reconcile2.c:417 gnucash/gnome/window-reconcile.c:458
@@ -7668,8 +7667,8 @@ msgid ""
"You have made changes to this reconcile window. Are you sure you want to "
"cancel?"
msgstr ""
-"Vous avez fait des modifications dans cette fenêtre de rapprochement.\n"
-"Voulez-vous vraiment les annuler ?"
+"Vous avez fait des modifications dans cette fenêtre de rapprochement. Voulez-"
+"vous vraiment les annuler ?"
# messages-i18n.c:47
#: gnucash/gnome/window-reconcile2.c:2006 gnucash/gnome/window-reconcile.c:2227
@@ -8393,13 +8392,12 @@ msgstr "Annule la ligne en cours"
# messages-i18n.c:17
#: gnucash/gnome-utils/dialog-account.c:1416
-#, fuzzy
msgid ""
"This Account contains Transactions.\n"
"Changing this option is not possible."
msgstr ""
-"Ce compte contient des transactions en lecture seule qui ne peuvent être "
-"effacées."
+"Ce compte contient des transactions.\n"
+"Il n'est pas possible de modifier cette option."
# messages-i18n.c:178
#: gnucash/gnome-utils/dialog-account.c:1606
@@ -8436,18 +8434,20 @@ msgid ""
msgstr ""
#: gnucash/gnome-utils/dialog-account.c:2312
-#, fuzzy, c-format
+#, c-format
msgid ""
"Set the account placeholder value for account '%s' including all sub-accounts"
msgstr ""
-"Afficher seulement le solde du compte parent, sans aucun de ses sous-comptes."
+"Afficher le sous-total pour le compte \"%s\", en incluant tous les sous-"
+"comptes"
#: gnucash/gnome-utils/dialog-account.c:2326
-#, fuzzy, c-format
+#, c-format
msgid ""
"Set the account hidden value for account '%s' including all sub-accounts"
msgstr ""
-"Afficher seulement le solde du compte parent, sans aucun de ses sous-comptes."
+"Définir la valeur cachée pour le compte \"%s\", en incluant tous les sous-"
+"comptes"
#: gnucash/gnome-utils/dialog-book-close.c:294
msgid "Please select an Equity account to hold the total Period Income."
@@ -8463,13 +8463,12 @@ msgstr ""
# src/gnome/dialog-qif-import.c:310
#: gnucash/gnome-utils/dialog-commodity.c:160
-#, fuzzy
msgid ""
"\n"
"Please select a commodity to match"
msgstr ""
"\n"
-"Sélectionnez un produit à faire correspondre :"
+"Sélectionnez un produit à faire correspondre"
# messages-i18n.c:262
#: gnucash/gnome-utils/dialog-commodity.c:167
@@ -9588,9 +9587,8 @@ msgid ""
"open the database. What would you like to do?"
msgstr ""
"Cette base de données est peut-être utilisée par un autre utilisateur. Dans "
-"ce cas, vous ne devriez pas ouvrir la base de données.\n"
-"\n"
-"Que voulez-vous faire ?"
+"ce cas, vous ne devriez pas ouvrir la base de données. Que voulez-vous faire "
+"?"
#: gnucash/gnome-utils/gnc-file.c:826
#, fuzzy
@@ -10044,7 +10042,7 @@ msgstr ""
#: gnucash/gnome-utils/gnc-main-window.c:4714
#: gnucash/gnome-utils/gnc-splash.c:97
msgid "Version"
-msgstr ""
+msgstr "Version"
#: gnucash/gnome-utils/gnc-main-window.c:4715
#: gnucash/gnome-utils/gnc-splash.c:98 gnucash/gnucash-core-app.cpp:306
@@ -10327,8 +10325,9 @@ msgid ""
"You are about to mark a reconciled split as unreconciled. Doing so might "
"make future reconciliation difficult! Continue with this change?"
msgstr ""
-"Voulez-vous réellement marquer cette transaction comme non rapprochée ?\n"
-"Faire cela peut rendre difficile un futur rapprochement !"
+"Vous êtes sur le point de marquer cette transaction comme non rapprochée. "
+"Cela peut rendre difficile un futur rapprochement ! Ãtes-vous sûr de vouloir "
+"faire cela ?"
# messages-i18n.c:322
#: gnucash/gnome-utils/gnc-tree-control-split-reg.c:1826
@@ -11466,9 +11465,8 @@ msgstr "Sélectionner le type d'exportation\n"
# po/guile_strings.txt:70
#: gnucash/gnucash-cli.cpp:117
-#, fuzzy
msgid "Output file for report\n"
-msgstr "Couleur d'arrière-plan pour les rapports"
+msgstr "Fichier de sortie pour le rapport\n"
#: gnucash/gnucash-cli.cpp:132
msgid "Unknown quotes command '{1}'"
@@ -11668,14 +11666,14 @@ msgstr ""
#. Translators: Do not translate $DISPLAY! It is an environment variable for X11
#: gnucash/gnucash.cpp:402
-#, fuzzy
msgid ""
"Error: could not initialize graphical user interface and option add-price-"
"quotes was not set.\n"
"Perhaps you need to set the $DISPLAY environment variable?"
msgstr ""
-"Erreur: lâinterface utilisateur graphique nâa pas pu être initialisée et "
-"lâoption « add-price-quotes » nâa pas été utilisée."
+"Erreur : lâinterface utilisateur graphique nâa pas pu être initialisée et lâ"
+"option « add-price-quotes » nâa pas été utilisée.\n"
+"Peut-être devez-vous définir la variable d'environnement $DISPLAY ?"
#: gnucash/gschemas/org.gnucash.dialogs.business.gschema.xml.in:17
#: gnucash/gschemas/org.gnucash.dialogs.business.gschema.xml.in:32
@@ -11824,11 +11822,11 @@ msgid ""
"are documents with opposite sign. For example for an invoice, customer "
"credit notes and negative invoices are considered counter documents."
msgstr ""
-"Au moment de la publication, essayer automatiquement de payer les documents "
-"clients avec des pré-paiements et des contre-documents en attente. Les pré-"
-"paiements et les documents doivent évidemment être affectés au même client. "
-"Les contre-documents sont des documents avec le signe opposé. Par exemple, "
-"pour une facture, les avoirs clients et les factures négatives sont "
+"Au moment de l'émission, essayer automatiquement de payer les documents "
+"clients avec des prépaiements et des contre-documents en attente. Les "
+"prépaiements et les documents doivent évidemment être affectés au même "
+"client. Les contre-documents sont des documents avec le signe opposé. Par "
+"exemple, pour une facture, les avoirs clients et les factures négatives sont "
"considérés comme des contre-documents."
#: gnucash/gschemas/org.gnucash.dialogs.business.gschema.xml.in:117
@@ -11914,10 +11912,10 @@ msgid ""
"the same account will be accumulated into a single split. This field can be "
"overridden per invoice in the Posting dialog."
msgstr ""
-"Si cette option est cochée, alors les répartitions multiples d'une même "
-"facture qui transfèrent vers un même compte sont accumulées en une seule "
-"répartition. Ce choix peut être modifié pour chaque facture dans le dialogue "
-"de publication."
+"Si cette option est cochée, alors les entrées multiples d'une même facture "
+"qui transfèrent vers un même compte sont accumulées en une seule "
+"répartition. Ce choix peut être modifié pour chaque facture dans la boîte de "
+"dialogue d'émission."
#: gnucash/gschemas/org.gnucash.dialogs.business.gschema.xml.in:155
#: gnucash/gtkbuilder/business-prefs.glade:275
@@ -11928,12 +11926,13 @@ msgid ""
"opposite sign. For example for a bill, vendor credit notes and negative "
"bills are considered counter documents."
msgstr ""
-"Au moment de la publication, essayer automatiquement de payer les documents "
-"fournisseurs avec des pré-paiements et des contre-documents en attente. Les "
-"pré-paiements et les documents doivent évidemment être affectés au même "
-"fournisseur. Les contre-documents sont des documents avec le signe opposé. "
-"Par exemple, pour une facture fournisseur, les avoirs fournisseurs et les "
-"factures fournisseur négatives sont considérés comme des contre-documents."
+"Au moment de l'enregistrement, essayer automatiquement de payer les "
+"documents fournisseurs avec des prépaiements et des contre-documents en "
+"attente. Les prépaiements et les documents doivent évidemment être affectés "
+"au même fournisseur. Les contre-documents sont des documents avec le signe "
+"opposé. Par exemple, pour une facture fournisseur, les avoirs fournisseurs "
+"et les factures fournisseur négatives sont considérés comme des contre-"
+"documents."
#: gnucash/gschemas/org.gnucash.dialogs.business.gschema.xml.in:159
msgid "Show bills due reminder at startup"
@@ -12368,10 +12367,11 @@ msgid ""
"transaction will cause the existing transaction to be updated and cleared by "
"default."
msgstr ""
-"Autoriser la MISE Ã JOUR et le RAPPROCHEMENT dans l'outil d'association de "
-"transactions. Si actif, la transaction dont le score de la meilleure "
-"similarité - est dans la zone jaune, au dessus du seuil d'ajout automatique "
-"mais sous le seuil de pointage automatique - sera non traitée par défaut."
+"Active l'action METTRE Ã JOUR ET RAPPROCHER dans l'outil d'association de "
+"transactions. Si actif, pour toute transaction dont le score de meilleure "
+"similarité est au-dessus du seuil d'auto-POINTAGE et qui possède une date ou "
+"un montant différent de la transaction correspondante existante, la "
+"transaction existante sera mise à jour et pointée par défaut."
#: gnucash/gschemas/org.gnucash.dialogs.import.generic.gschema.xml.in:15
msgid "Use bayesian matching"
@@ -12428,9 +12428,9 @@ msgid ""
"green zone (above or equal to this Clear threshold) will be cleared by "
"default."
msgstr ""
-"Ce champ définit le seuil au dessus duquel une transaction similaire sera "
-"pointée par défaut. Une transaction dont le score de la meilleure similarité "
-"est dans la zone verte ( égale ou au dessus de ce seuil de pointage ) sera "
+"Ce champ définit le seuil au-dessus duquel une transaction similaire sera "
+"pointée par défaut. Une transaction dont le score de meilleure similarité "
+"est dans la zone verte (égale ou supérieure à ce seuil de pointage) sera "
"pointée par défaut."
#: gnucash/gschemas/org.gnucash.dialogs.import.generic.gschema.xml.in:35
@@ -12524,7 +12524,7 @@ msgstr ""
# messages-i18n.c:80
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:5
msgid "Pre-select cleared transactions"
-msgstr "Préselectionner les transactions pointées"
+msgstr "Présélectionner les transactions pointées"
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:6
msgid ""
@@ -12534,7 +12534,7 @@ msgid ""
msgstr ""
"Si cette option est cochée, toutes les transactions pointées dans le "
"registre apparaîtront déjà pointées dans la boîte de dialogue de "
-"rapprochement."
+"rapprochement. Autrement, aucune transaction ne sera sélectionnée au départ."
#: gnucash/gschemas/org.gnucash.dialogs.reconcile.gschema.xml.in:10
msgid "Prompt for interest charges"
@@ -12848,6 +12848,8 @@ msgstr ""
#: gnucash/gschemas/org.gnucash.gschema.xml.in:70
msgid "Force prices to display as decimals even if they must be rounded."
msgstr ""
+"Forcer les prix à s'afficher sous forme de décimales, même s'ils doivent "
+"être arrondis."
#: gnucash/gschemas/org.gnucash.gschema.xml.in:71
#: gnucash/gtkbuilder/dialog-preferences.glade:1214
@@ -13075,7 +13077,7 @@ msgstr ""
# src/gnome/glade-gnc-dialogs.c:1364
#: gnucash/gschemas/org.gnucash.gschema.xml.in:155
msgid "Date format choice"
-msgstr "Format de la date :"
+msgstr "Format de la date"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:156
msgid ""
@@ -13480,7 +13482,8 @@ msgid ""
"reconciled date on split row."
msgstr ""
"Afficher la date à laquelle la transaction a été saisie en dessous de la "
-"date de publication et celle de rapprochement sur la ligne de la répartition."
+"date d'enregistrement et celle de rapprochement sur la ligne de la "
+"répartition."
#: gnucash/gschemas/org.gnucash.gschema.xml.in:315
msgid "Show entered and reconciled dates on selection"
@@ -13523,9 +13526,8 @@ msgstr ""
# po/guile_strings.txt:144
#: gnucash/gschemas/org.gnucash.gschema.xml.in:330
-#, fuzzy
msgid "Number of transactions to show in a register."
-msgstr "Nombre de _transactions :"
+msgstr "Nombre de transactions à afficher dans le registre."
#: gnucash/gschemas/org.gnucash.gschema.xml.in:331
#: gnucash/gtkbuilder/dialog-preferences.glade:2827
@@ -13626,9 +13628,8 @@ msgstr ""
# src/gnome/glade-gnc-dialogs.c:191 src/gnome/glade-gnc-dialogs.c:1194
# src/gnome/glade-gnc-dialogs.c:1364
#: gnucash/gschemas/org.gnucash.gschema.xml.in:378
-#, fuzzy
msgid "PDF export file name date format choice"
-msgstr "Format de la date :"
+msgstr "Format de la date pour le nom du fichier PDF à exporter"
#: gnucash/gschemas/org.gnucash.gschema.xml.in:379
#, fuzzy
@@ -14260,6 +14261,21 @@ msgid ""
"\n"
"Click on \"Next\" to proceed or \"Cancel\" to Abort Import.\n"
msgstr ""
+"\n"
+"Cet assistant va vous aider à importer des Comptes à partir d'un fichier.\n"
+"\n"
+"Le fichier doit être au même format que le fichier exporté, car il s'agit "
+"d'un format fixe. Vous pouvez visualiser ce format en consultant un fichier "
+"créé à l'aide de l'option \"Exporter l'arborescence des comptes en CSV\" "
+"dans le menu.\n"
+"\n"
+"Si le compte n'existe pas, sur la base du nom complet du compte, il sera "
+"ajouté pour autant que le titre / la devise indiqué(e) existe. Si le compte "
+"existe déjà , quatre champs seront mis à jour : le code, la description, les "
+"notes et la couleur.\n"
+"\n"
+"Cliquez sur \"Suivant\" pour continuer ou sur \"Annuler\" pour interrompre "
+"l'importation.\n"
# messages-i18n.c:186
#: gnucash/gtkbuilder/assistant-csv-account-import.glade:63
@@ -14325,6 +14341,8 @@ msgid ""
"Press Apply to create export file.\n"
"Cancel to abort."
msgstr ""
+"Appuyez sur Appliquer pour créer le fichier d'exportation ou\n"
+"Annuler pour abandonner."
# messages-i18n.c:186
#: gnucash/gtkbuilder/assistant-csv-account-import.glade:296
@@ -14354,9 +14372,8 @@ msgstr "Utiliser les cotations"
# messages-i18n.c:227
#: gnucash/gtkbuilder/assistant-csv-export.glade:88
-#, fuzzy
msgid "Simple Layout"
-msgstr "Données d'exemple :"
+msgstr "Mise en page simple"
#: gnucash/gtkbuilder/assistant-csv-export.glade:135
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:322
@@ -14390,7 +14407,7 @@ msgstr "Choisir les réglages dâexportation"
#: gnucash/gtkbuilder/assistant-csv-export.glade:252
msgid "Select the accounts to be exported and date range if required."
-msgstr ""
+msgstr "Sélectionnez les comptes à exporter et la plage de dates si nécessaire."
#: gnucash/gtkbuilder/assistant-csv-export.glade:327
#: gnucash/gtkbuilder/dialog-tax-info.glade:372
@@ -14563,7 +14580,7 @@ msgid ""
"\n"
"Click on \"Next\" to proceed or \"Cancel\" to Abort Import."
msgstr ""
-"Cet assistant vous aidera à importer des Prix à partir d'un fichier CSV.\n"
+"Cet assistant va vous aider à importer des Prix à partir d'un fichier CSV.\n"
"\n"
"Un nombre minimal de colonnes doivent être présentes pour que l'importation "
"réussisse : il s'agit de Date, Montant, Espace de nom d'origine, Symbole "
@@ -14595,7 +14612,7 @@ msgstr ""
"Cette opération est irréversible : assurez-vous d'avoir une sauvegarde "
"fonctionnelle.\n"
"\n"
-"Cliquez sur \"Suivant\" pour continuer ou \"Annuler\" pour annuler "
+"Cliquez sur \"Suivant\" pour continuer ou \"Annuler\" pour interrompre "
"l'importation."
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:84
@@ -14641,9 +14658,8 @@ msgstr ""
# messages-i18n.c:328
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:201
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:191
-#, fuzzy
msgid "<b>Load and Save Settings</b>"
-msgstr "Ãpargne"
+msgstr "<b>Charger et Enregistrer les paramètres</b>"
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:249
#: gnucash/gtkbuilder/assistant-csv-trans-import.glade:238
@@ -14786,6 +14802,8 @@ msgid ""
"<b>Press \"Apply\" to add the Prices.\n"
"\"Cancel\" to abort.</b>"
msgstr ""
+"<b>Appuyez sur \"Appliquer\" pour ajouter les prix ou\n"
+"\"Annuler\" pour abandonner.</b>"
# messages-i18n.c:186
#: gnucash/gtkbuilder/assistant-csv-price-import.glade:1041
@@ -14935,7 +14953,6 @@ msgid "Match Transactions"
msgstr "Faire correspondre les transactions"
#: gnucash/gtkbuilder/assistant-hierarchy.glade:30
-#, fuzzy
msgid ""
"This assistant will help you create a set of GnuCash accounts for your "
"assets (such as investments, checking or savings accounts), liabilities "
@@ -14954,6 +14971,12 @@ msgstr ""
"vos passifs (empruntsâ¦) et les différents types de revenus et dépenses que "
"vous pouvez avoir.\n"
"\n"
+"Vous pouvez sélectionner un ensemble de comptes ici qui se rapprochent de "
+"vos besoins. Lorsque l'assistant sera terminé, vous pourrez ajouter, "
+"renommer, modifier et supprimer des comptes à tout moment. Vous pourrez "
+"également ajouter des sous-comptes, ainsi que déplacer des comptes (avec "
+"leurs sous-comptes) d'un compte parent à un autre.\n"
+"\n"
"Cliquez sur « Annuler » si vous ne voulez pas créer de nouveaux comptes "
"maintenant."
@@ -15037,7 +15060,6 @@ msgid "Choose accounts to create"
msgstr "Choisissez les comptes à créer"
#: gnucash/gtkbuilder/assistant-hierarchy.glade:537
-#, fuzzy
msgid ""
"\n"
"If you would like to change an account's name, click on the row containing "
@@ -15057,18 +15079,19 @@ msgid ""
msgstr ""
"\n"
"Si vous voulez changer le nom dâun compte, cliquez sur la ligne contenant le "
-"compte, ensuite cliquez sur le nom du compte et changez-le.\n"
+"compte, puis cliquez sur le nom du compte et changez-le.\n"
"\n"
"Certains comptes sont marqués comme « Virtuels ». Les comptes virtuels sont "
"utilisés pour créer une hiérarchie de comptes et ne reçoivent normalement "
-"pas de transactions ni de soldes initiaux.\n"
+"pas de transactions ni de soldes initiaux. Si vous voulez qu'un compte soit "
+"virtuel, cochez la case correspondante pour ce compte.\n"
"\n"
"Si vous voulez quâun compte ait un solde initial, cliquez sur la ligne "
"contenant ce compte, puis cliquez sur le champ solde initial et entrez le "
"solde initial.\n"
"\n"
-"Note : tous les comptes excepté ceux de capitaux propres et ceux qui sont "
-"virtuels peuvent avoir un solde initial.\n"
+"<b>Remarque</b> : tous les comptes exceptés ceux de capitaux propres et ceux "
+"qui sont virtuels peuvent avoir un solde initial.\n"
# messages-i18n.c:76
#: gnucash/gtkbuilder/assistant-hierarchy.glade:575
@@ -15214,7 +15237,7 @@ msgstr ""
#: gnucash/report/reports/standard/price-scatter.scm:36
#: gnucash/report/trep-engine.scm:95
msgid "Start Date"
-msgstr "Date de début :"
+msgstr "Date de début"
#: gnucash/gtkbuilder/assistant-loan.glade:186
msgid "Length"
@@ -15421,7 +15444,6 @@ msgstr "Assistant dâimportation QIF"
#. Run the assistant in your language to see GTK's translation of the button labels.
#: gnucash/gtkbuilder/assistant-qif-import.glade:54
-#, fuzzy
msgid ""
"GnuCash can import financial data from QIF (Quicken Interchange Format) "
"files written by Quicken/QuickBooks, MS Money, Moneydance, and many other "
@@ -15433,16 +15455,16 @@ msgid ""
"Click \"Next\" to start loading your QIF data, or \"Cancel\" to abort the "
"process."
msgstr ""
-"GnuCash peut importer des données financières à partir de fichiers QIF "
-"(Quicken Interchange Format) écrit par Quicken/Quickbooks, Microsoft Money, "
+"GnuCash peut importer des données financières à partir de fichiers QIF ("
+"Quicken Interchange Format) écrit par Quicken/Quickbooks, Microsoft Money, "
"Moneydance, et beaucoup d'autres programmes.\n"
"\n"
"Le processus d'import a plusieurs étapes. Vos comptes GnuCash ne seront pas "
-"changés jusqu'à ce que vous cliquiez sur \"Appliquer\" à la fin du "
-"processus.\n"
+"changés jusqu'à ce que vous cliquiez sur \"Appliquer\" à la fin du processus."
+"\n"
"\n"
"Cliquez sur \"Suivant\" pour commencer le chargement de vos données QIF, ou "
-"sur \"Annuler\" pour annuler le processus. "
+"sur \"Annuler\" pour interrompre le processus."
# src/gnome/glade-gnc-dialogs.c:74
#: gnucash/gtkbuilder/assistant-qif-import.glade:63
@@ -15845,7 +15867,7 @@ msgstr ""
"catégories, et changer les paramètres de devise et titres pour les nouveaux "
"comptes, ou ajouter plus de fichiers dans la zone temporaire.\n"
"\n"
-"Cliquez sur \"Annuler\" pour annuler le processus dâimportation QIF."
+"Cliquez sur \"Annuler\" pour interrompre le processus dâimportation QIF."
#: gnucash/gtkbuilder/assistant-qif-import.glade:1379
msgid "Update your GnuCash accounts"
@@ -15868,7 +15890,7 @@ msgstr "Assistant de division d'actions"
#: gnucash/gtkbuilder/assistant-stock-split.glade:31
msgid "This assistant will help you record a stock split or stock merger.\n"
msgstr ""
-"L'assistant va vous aider à enregistrer une division ou une fusion "
+"Cet assistant va vous aider à enregistrer une division ou une fusion "
"d'actions.\n"
#: gnucash/gtkbuilder/assistant-stock-split.glade:53
@@ -15941,9 +15963,8 @@ msgstr ""
# messages-i18n.c:242 po/guile_strings.txt:50
#: gnucash/gtkbuilder/assistant-stock-split.glade:286
#: gnucash/import-export/aqb/dialog-ab.glade:1212
-#, fuzzy
msgid "_Amount"
-msgstr "_Montant brut :"
+msgstr "_Montant"
# messages-i18n.c:302 po/guile_strings.txt:26
#: gnucash/gtkbuilder/assistant-stock-split.glade:300
@@ -16118,7 +16139,7 @@ msgid ""
msgstr ""
"Indique si par défaut, les entrées multiples d'une facture ciblant le même "
"compte doivent être accumulées en une seule répartition. Cette option peut "
-"être modifiée au cas par cas dans le dialogue de publication."
+"être modifiée au cas par cas dans la boîte de dialogue d'émission."
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
@@ -16156,9 +16177,8 @@ msgstr ""
#. See the tooltip "At post time..." for details.
#: gnucash/gtkbuilder/business-prefs.glade:192
-#, fuzzy
msgid "_Process payments on posting"
-msgstr "_Paiement automatique à la publication"
+msgstr "_Paiement automatique à l'enregistrement"
#: gnucash/gtkbuilder/business-prefs.glade:223
msgid "<b>Bills</b>"
@@ -16183,9 +16203,8 @@ msgstr ""
#. See the tooltip "At post time..." for details.
#: gnucash/gtkbuilder/business-prefs.glade:269
-#, fuzzy
msgid "Pro_cess payments on posting"
-msgstr "_Paiement automatique à la publication"
+msgstr "_Paiement automatique à l'enregistrement"
#: gnucash/gtkbuilder/business-prefs.glade:289
msgid "Days in ad_vance"
@@ -16571,7 +16590,7 @@ msgstr "_Rapproché"
# messages-i18n.c:260
#: gnucash/gtkbuilder/dialog-account-picker.glade:71
msgid "_Cleared"
-msgstr "_Pointé(e)"
+msgstr "_Pointé"
#: gnucash/gtkbuilder/dialog-account-picker.glade:77
msgid ""
@@ -16584,7 +16603,7 @@ msgstr ""
# messages-i18n.c:260
#: gnucash/gtkbuilder/dialog-account-picker.glade:90
msgid "_Not cleared"
-msgstr "_Non pointé(e)"
+msgstr "_Non pointé"
#: gnucash/gtkbuilder/dialog-account-picker.glade:96
msgid ""
@@ -17145,7 +17164,7 @@ msgstr ""
#: gnucash/gtkbuilder/dialog-customer-import-gui.glade:174
msgid "For importing vendor lists."
-msgstr ""
+msgstr "Pour importer des listes de fournisseurs."
# src/gnome/glade-gnc-dialogs.c:506
#: gnucash/gtkbuilder/dialog-customer-import-gui.glade:192
@@ -17546,10 +17565,8 @@ msgid "All _accounts"
msgstr "Tous les comptes"
#: gnucash/gtkbuilder/dialog-find-account.glade:165
-#, fuzzy
-#| msgid " Search "
msgid "Search scope"
-msgstr " Recherche "
+msgstr "Recherche"
# messages-i18n.c:165 po/guile_strings.txt:7
#: gnucash/gtkbuilder/dialog-find-account.glade:191
@@ -17682,9 +17699,8 @@ msgstr "Première répartition de la transaction importée "
# messages-i18n.c:82
#. Dialog Select matching transactions
#: gnucash/gtkbuilder/dialog-import.glade:414
-#, fuzzy
msgid "Potential splits matching the selected transaction"
-msgstr "Duplicata potentiels pour la transaction sélectionnée :"
+msgstr "Répartitions potentielles correspondant à la transaction sélectionnée"
#: gnucash/gtkbuilder/dialog-import.glade:463
msgid ""
@@ -17779,18 +17795,16 @@ msgstr ""
# messages-i18n.c:77
#: gnucash/gtkbuilder/dialog-import.glade:702
-#, fuzzy
msgid ""
"Select \"U+C\" to update a matching transaction and mark it as cleared (c)."
msgstr ""
-"Sélectionner \"U+R\" pour mettre à jour et rapprocher une transaction "
-"homologue."
+"Sélectionner \"U+R\" pour mettre à jour et pointer (p) une transaction "
+"correspondante."
# messages-i18n.c:77
#: gnucash/gtkbuilder/dialog-import.glade:714
-#, fuzzy
msgid "Select \"C\" to mark a matching transaction as cleared (c)."
-msgstr "Selectionner \"R\" pour rapprocher une transaction homologue"
+msgstr "Selectionner \"R\" pour pointer(p) une transaction correspondante."
#: gnucash/gtkbuilder/dialog-import.glade:726
msgid "Select neither to skip the transaction (it won't be imported at all)."
@@ -17853,7 +17867,7 @@ msgstr "Outil générique d'association des transactions"
# messages-i18n.c:186
#: gnucash/gtkbuilder/dialog-invoice.glade:119
msgid "Posted Account"
-msgstr "Compte des factures publiées"
+msgstr "Compte des factures enregistrées"
# messages-i18n.c:231
#: gnucash/gtkbuilder/dialog-invoice.glade:231
@@ -17900,7 +17914,7 @@ msgid ""
"Unposting this Invoice will delete the posted transaction.\n"
"Are you sure you want to unpost it?"
msgstr ""
-"Annuler cette facture supprimera la transaction publiée.\n"
+"Annuler cette facture supprimera la transaction enregistrée.\n"
"Confirmez-vous l'annulation ?"
#: gnucash/gtkbuilder/dialog-invoice.glade:1292
@@ -18031,9 +18045,9 @@ msgid ""
"will be displayed again next time you start GnuCash. If you press the <i>No</"
"i> button, it will not be displayed again."
msgstr ""
-"Si vous choisissez le bouton <i>Oui</i>, la boîte de dialogue de bienvenue "
-"sera affichée la prochaine fois que vous lancerez GnuCash. Si vous "
-"choisissez le bouton <i>Non</i>, elle ne sera plus affichée."
+"Si vous appuyez sur le bouton <i>Oui</i>, la boîte de dialogue <i>Bienvenue "
+"sur GnuCash</i> sera affichée la prochaine fois que vous lancerez GnuCash. "
+"Si vous appuyez sur le bouton <i>Non</i>, elle ne sera plus affichée."
#: gnucash/gtkbuilder/dialog-new-user.glade:211
msgid "<span size=\"larger\" weight=\"bold\">Welcome to GnuCash!</span>"
@@ -18132,7 +18146,7 @@ msgstr ""
#: gnucash/gtkbuilder/dialog-payment.glade:204
msgid "Post To"
-msgstr "Publier sur"
+msgstr "Enregistrer sur"
# po/guile_strings.txt:228
#: gnucash/gtkbuilder/dialog-payment.glade:331
@@ -18446,9 +18460,8 @@ msgid "<b>Date Completion</b>"
msgstr "<b>Compléter la date</b>"
#: gnucash/gtkbuilder/dialog-preferences.glade:1098
-#, fuzzy
msgid "When a date is entered without year, it should be taken"
-msgstr "Quand une date est entrée sans année, on doit utiliser :"
+msgstr "Quand une date est entrée sans année, on doit utiliser"
#: gnucash/gtkbuilder/dialog-preferences.glade:1114
msgid ""
@@ -18456,13 +18469,12 @@ msgid ""
msgstr "Les dates seront complétées en conformité avec le calendrier actuel."
#: gnucash/gtkbuilder/dialog-preferences.glade:1127
-#, fuzzy
msgid ""
"In a sliding 12-month window starting this\n"
"many months before the current month"
msgstr ""
-"Dans une fenêtre glissante de 12 mois commençant tant de mois avant le mois "
-"actuel :"
+"Dans une fenêtre glissante de 12 mois commençant \n"
+"tant de mois avant le mois actuel"
# messages-i18n.c:123
#: gnucash/gtkbuilder/dialog-preferences.glade:1151
@@ -18507,9 +18519,8 @@ msgstr ""
"sans."
#: gnucash/gtkbuilder/dialog-preferences.glade:1265
-#, fuzzy
msgid "_Decimal places"
-msgstr "Nombre de _décimales :"
+msgstr "Nombre de _décimales"
#: gnucash/gtkbuilder/dialog-preferences.glade:1280
msgid "How many automatic decimal places will be filled in."
@@ -18694,21 +18705,20 @@ msgstr ""
"directement au montant de la transaction au lieu d'apparaître dans des "
"transactions séparées ou dans les frais bancaires mensuels. Par exemple, "
"vous retirez 100 EUR, et vous êtes débité de 101,50 EUR plus les frais "
-"habituels.\n"
-"Si vous avez saisi ce montant de 100Â EUR manuellement dans votre compte de "
-"caisse, les montants ne correspondront pas, et les duplicata ne seront "
-"probablement pas repérés. Vous devez saisir la valeur maximum de tels frais "
-"dans votre région (dans votre devise locale), ou 0 si vous n'utilisez jamais "
-"de tels guichets."
+"habituels. Si vous avez saisi ce montant de 100Â EUR manuellement dans votre "
+"compte de caisse, les montants ne correspondront pas, et les duplicata ne "
+"seront probablement pas repérés. Vous devez saisir la valeur maximum de tels "
+"frais dans votre région (dans votre devise locale), ou 0 si vous n'utilisez "
+"jamais de tels guichets."
#: gnucash/gtkbuilder/dialog-preferences.glade:2119
msgid ""
"A transaction whose best match's score is in the green zone (above or equal "
"to the Auto-CLEAR threshold) will be CLEARed by default."
msgstr ""
-"Une transaction pour laquelle le score du meilleur duplicata potentiel est "
-"dans la zone VERTE (au-dessus ou égal au seuil de POINTAGE automatique) sera "
-"POINTÃE par défaut"
+"Une transaction pour laquelle le score meilleure concordance est dans la "
+"zone verte (supérieur ou égal au seuil de POINTAGE automatique) sera POINTÃE "
+"par défaut"
#: gnucash/gtkbuilder/dialog-preferences.glade:2141
msgid ""
@@ -19691,7 +19701,7 @@ msgstr "<b>Vérifier toutes les entrées</b>"
#: gnucash/gtkbuilder/dialog-search.glade:298
msgid "Search Criteria"
-msgstr "Critère de recherche :"
+msgstr "Critère de recherche"
#: gnucash/gtkbuilder/dialog-search.glade:331
msgid "New search"
@@ -19885,7 +19895,7 @@ msgstr "<b>Occurences</b>"
#: gnucash/gtkbuilder/dialog-sx.glade:1133
msgid "Last Occurred: "
-msgstr "Dernière occurrence :"
+msgstr "Dernière occurrence : "
# messages-i18n.c:325 po/guile_strings.txt:175
#: gnucash/gtkbuilder/dialog-sx.glade:1167
@@ -20662,9 +20672,8 @@ msgstr "Le"
# po/guile_strings.txt:186
#: gnucash/gtkbuilder/gnc-plugin-page-budget.glade:15
-#, fuzzy
msgid "Edit budget for all periods"
-msgstr "Fréquence du budget :"
+msgstr "Modifier le budget pour toutes les périodes"
#: gnucash/gtkbuilder/gnc-plugin-page-budget.glade:116
msgid "Replace"
@@ -20849,7 +20858,7 @@ msgstr "_Tout afficher"
# messages-i18n.c:158
#: gnucash/gtkbuilder/gnc-plugin-page-register2.glade:298
msgid "Select Range:"
-msgstr "_Entre..."
+msgstr "Sélectionner la plage :"
# messages-i18n.c:261
#: gnucash/gtkbuilder/gnc-plugin-page-register2.glade:351
@@ -20940,13 +20949,14 @@ msgstr "Trier par la date de saisie."
# messages-i18n.c:210
#: gnucash/gtkbuilder/gnc-plugin-page-register.glade:901
msgid "S_tatement Date"
-msgstr "Date du _relevé :"
+msgstr "Date du _relevé"
#: gnucash/gtkbuilder/gnc-plugin-page-register.glade:905
-#, fuzzy
msgid ""
"Sort by the statement date (and group by cleared, unreconciled, reconciled)."
-msgstr "Trier par la date du relevé (éléments non rapprochés en dernier)."
+msgstr ""
+"Trier par la date du relevé (et grouper selon le statut : pointé, non "
+"rapproché, rapproché)."
# po/guile_strings.txt:173
#: gnucash/gtkbuilder/gnc-plugin-page-register.glade:920
@@ -21090,6 +21100,10 @@ msgid ""
"are cleared, given an ending balance. For example, said ending balance can "
"be the current balance given by your bank online."
msgstr ""
+"Utilisez cette boîte de dialogue si vous voulez que GnuCash trouve "
+"automatiquement quelles transactions sont pointées, compte tenu d'un solde "
+"final. Par exemple, ce solde final peut être le solde actuel indiqué par "
+"votre banque en ligne."
# messages-i18n.c:346
#: gnucash/gtkbuilder/window-autoclear.glade:101
@@ -21104,6 +21118,9 @@ msgid ""
"than approximately 20. In that case please clear at least some of them "
"manually."
msgstr ""
+"Cet outil peut être lent ou échouer si le nombre de répartitions non "
+"pointées est supérieur à environ 20. Dans ce cas, veuillez en pointer au "
+"moins quelques-unes manuellement."
# messages-i18n.c:179
#: gnucash/gtkbuilder/window-autoclear.glade:138
@@ -21113,14 +21130,14 @@ msgstr "Solde _final "
# messages-i18n.c:80
#: gnucash/gtkbuilder/window-autoclear.glade:177
-#, fuzzy
-#| msgid "_Review created transactions"
msgid "_Review cleared splits"
-msgstr "_Vérifier les transactions créées"
+msgstr "_Vérifier les répartitions pointées"
#: gnucash/gtkbuilder/window-autoclear.glade:181
msgid "Select this option to open a register tab with newly cleared splits."
msgstr ""
+"Sélectionnez cette option pour ouvrir un onglet de registre avec les "
+"répartitions nouvellement pointées."
# messages-i18n.c:238
#: gnucash/gtkbuilder/window-reconcile.glade:71
@@ -21248,17 +21265,38 @@ msgid ""
"Online Banking, because sometimes the bank does not give you correct "
"feedback when a transfer is rejected."
msgstr ""
+"Les conditions requises pour la banque en ligne varient selon les différents "
+"backends d'AqBanking pris en charge, mais en général, vous aurez besoin des "
+"éléments suivants :\n"
+"* Votre banque doit vous accorder l'accès en ligne. Consultez son site Web "
+"ou demandez à son service clientèle comment l'obtenir.\n"
+"Elle doit également vous indiquer :\n"
+"* Votre ID utilisateur qui vous identifie auprès de leur serveur, souvent "
+"votre numéro de compte de base ;\n"
+"* L'URL de leur serveur de banque en ligne ;\n"
+"* Dans certains cas, le numéro d'acheminement de l'agence de votre banque "
+"est utile à cet assistant ;\n"
+"* Les méthodes d'authentification varient selon le backend et la méthode "
+"choisie :\n"
+"* FinTS PIN/TAN : Certaines méthodes nécessitent un gadget spécifique comme "
+"un lecteur de carte ou un mobile ;\n"
+"* FinTS HBCI : Vous devez échanger les parties publiques des clés "
+"asymétriques avec votre banque (\"Ini-Letter\").\n"
+"* PayPal : adresse e-mail enregistrée, mot de passe, signature API ;\n"
+"\n"
+"Voir https://wiki.gnucash.org/wiki/AqBanking pour plus de détails.\n"
+"\n"
+"Remarque : AUCUNE GARANTIE POUR QUELQUE CHOSE QUE CE SOIT. Certaines banques "
+"utilisent un serveur de banque en ligne mal implémenté. Vous ne devez pas "
+"compter sur des transferts urgents par le biais de la banque en ligne, car "
+"parfois la banque ne vous donne pas un retour d'information correct "
+"lorsqu'un transfert est rejeté."
#: gnucash/import-export/aqb/assistant-ab-initial.glade:71
msgid "Initial Online Banking Setup"
msgstr "Configuration initiale de la banque en ligne"
#: gnucash/import-export/aqb/assistant-ab-initial.glade:90
-#, fuzzy
-#| msgid ""
-#| "The Setup of your Online Banking connection is handled by the external "
-#| "program \"AqBanking Setup Wizard\". Please press the button below to "
-#| "start this program."
msgid ""
"The Setup of your Online Banking connection is handled by the external "
"program \"AqBanking Setup Wizard\".\n"
@@ -21266,9 +21304,11 @@ msgid ""
"\n"
"Please press the button below to start it."
msgstr ""
-"La configuration de votre connexion à la banque en ligne est contôlée par le "
-"programme externe \"Assistant de configuration AqBanking\". Cliquez sur le "
-"bouton ci-dessous pour lancer le programme.\t"
+"La configuration de votre connexion à la banque en ligne est contrôlée par "
+"le programme externe \"Assistant de configuration AqBanking\". \n"
+"Vous devez configurer au moins une connexion avant de continuer.\n"
+"\n"
+"Cliquez sur le bouton ci-dessous pour lancer le programme."
#: gnucash/import-export/aqb/assistant-ab-initial.glade:104
msgid "_Start AqBanking Wizard"
@@ -21329,9 +21369,8 @@ msgstr "Fenêtre de connexion à la banque en ligne"
# messages-i18n.c:242 po/guile_strings.txt:50
#: gnucash/import-export/aqb/dialog-ab.glade:26
-#, fuzzy
msgid "_Abort"
-msgstr "Ã _propos"
+msgstr "_Interrompre"
#: gnucash/import-export/aqb/dialog-ab.glade:82
#: gnucash/import-export/aqb/dialog-ab.glade:147
@@ -21458,9 +21497,8 @@ msgid ""
msgstr ""
#: gnucash/import-export/aqb/dialog-ab.glade:802
-#, fuzzy
msgid "Con_firm Password"
-msgstr "Confirmez le mot de passe :"
+msgstr "Confirmer le _mot de passe"
#: gnucash/import-export/aqb/dialog-ab.glade:842
#, fuzzy
@@ -21490,9 +21528,8 @@ msgstr "_Nom du nouveau modèle"
# messages-i18n.c:123
#: gnucash/import-export/aqb/dialog-ab.glade:962
-#, fuzzy
msgid "Enter a unique name for the new template."
-msgstr "Saisissez un nom pour le nouveau modèle :"
+msgstr "Saisir un nom unique pour le nouveau modèle."
# src/gnome/glade-gnc-dialogs.c:340 src/gnome/glade-gnc-dialogs.c:394
#: gnucash/import-export/aqb/dialog-ab.glade:995
@@ -21773,14 +21810,14 @@ msgid "Credited BIC (Bank Code)"
msgstr "BIC du compte débité (code dâidentification de la banque)"
#: gnucash/import-export/aqb/dialog-ab-trans.c:494
-#, fuzzy, c-format
+#, c-format
msgid ""
"The internal check of the destination IBAN '%s' failed. This means the "
"account number might contain an error."
msgstr ""
-"La vérification interne du numéro de compte destinataire \"%s\" dans la "
-"banque dont le code est \"%s\" a échoué. Cela signifie que le numéro de "
-"compte contient probablement une erreur."
+"La vérification interne du numéro de compte IBAN destinataire \"%s\" a "
+"échoué. Cela signifie que le numéro de compte contient probablement une "
+"erreur."
#: gnucash/import-export/aqb/dialog-ab-trans.c:549
#, c-format
@@ -21865,15 +21902,15 @@ msgstr ""
"L'action en ligne \"Obtenir le bilan\" n'est pas disponible pour ce compte. "
#: gnucash/import-export/aqb/gnc-ab-getbalance.c:150
-#, fuzzy, c-format
+#, c-format
msgid ""
"Error on executing job.\n"
"\n"
"Status: %s"
msgstr ""
-"Erreur à l'exécution de la prestation.\n"
+"Erreur à l'exécution de la tâche.\n"
"\n"
-"Statut : %s - %s"
+"Statut : %s"
#: gnucash/import-export/aqb/gnc-ab-getbalance.c:154
#: gnucash/import-export/aqb/gnc-ab-gettrans.c:234
@@ -21895,15 +21932,15 @@ msgstr ""
"compte."
#: gnucash/import-export/aqb/gnc-ab-gettrans.c:229
-#, fuzzy, c-format
+#, c-format
msgid ""
"Error on executing job.\n"
"\n"
"Status: %s (%d)"
msgstr ""
-"Erreur à l'exécution de la prestation.\n"
+"Erreur à l'exécution de la tâche.\n"
"\n"
-"Statut : %s - %s"
+"Statut : %s (%d)"
#: gnucash/import-export/aqb/gnc-ab-gettrans.c:253
msgid ""
@@ -22103,9 +22140,9 @@ msgid "Import module for DTAUS import not found."
msgstr "Le module d'importation pour DTAUS non trouvé."
#: gnucash/import-export/aqb/gnc-file-aqb-import.c:295
-#, fuzzy, c-format
+#, c-format
msgid "Job %d status %d - %s\n"
-msgstr "Prestation %d statut %d - %s : %s\n"
+msgstr "Tâche %d statut %d - %s\n"
#: gnucash/import-export/aqb/gnc-file-aqb-import.c:297
#, fuzzy, c-format
@@ -22382,9 +22419,9 @@ msgstr ""
# messages-i18n.c:176
#: gnucash/import-export/bi-import/dialog-bi-import.c:297
-#, fuzzy, c-format
+#, c-format
msgid "Validation...\n"
-msgstr "application"
+msgstr "Validation...\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:327
#, c-format
@@ -22399,7 +22436,7 @@ msgstr ""
#: gnucash/import-export/bi-import/dialog-bi-import.c:347
#, c-format
msgid "Row %d, invoice %s/%u: vendor %s does not exist.\n"
-msgstr ""
+msgstr "Ligne %d, facture %s/%u : le fournisseur %s n'eiste pas.\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:359
#, c-format
@@ -22419,9 +22456,9 @@ msgstr ""
# po/guile_strings.txt:55
#: gnucash/import-export/bi-import/dialog-bi-import.c:404
#: gnucash/import-export/bi-import/dialog-bi-import.c:475
-#, fuzzy, c-format
+#, c-format
msgid "Row %d, invoice %s/%u: account %s does not exist.\n"
-msgstr "Ligne %u, le compte %s nâest pas dans %s\n"
+msgstr "Ligne %d, facture %s/%u : le compte %s n'existe pas.\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:416
#, c-format
@@ -22450,26 +22487,25 @@ msgstr ""
# messages-i18n.c:312
#: gnucash/import-export/bi-import/dialog-bi-import.c:647
-#, fuzzy, c-format
+#, c-format
msgid ""
"\n"
"Processing...\n"
msgstr ""
"\n"
-"Saisir un _paiement...\n"
+"Traitement...\n"
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
#: gnucash/import-export/bi-import/dialog-bi-import.c:716
-#, fuzzy, c-format
+#, c-format
msgid "Invoice %s created.\n"
-msgstr "Notes de facture"
+msgstr "Facture %s créée.\n"
# messages-i18n.c:56
#: gnucash/import-export/bi-import/dialog-bi-import.c:731
-#, fuzzy
msgid "Do you want to update existing bills/invoices?"
-msgstr "Voulez-vous vraiment publier ces factures ?"
+msgstr "Voulez-vous mettre à jour ces factures existantes ?"
#: gnucash/import-export/bi-import/dialog-bi-import.c:739
#, c-format
@@ -22484,16 +22520,16 @@ msgstr ""
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
#: gnucash/import-export/bi-import/dialog-bi-import.c:767
-#, fuzzy, c-format
+#, c-format
msgid "Invoice %s updated.\n"
-msgstr "Notes de facture"
+msgstr "Facture %s mise à jour.\n"
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
#: gnucash/import-export/bi-import/dialog-bi-import.c:885
-#, fuzzy, c-format
+#, c-format
msgid "Invoice %s posted.\n"
-msgstr "Notes de facture"
+msgstr "Facture %s émise.\n"
#: gnucash/import-export/bi-import/dialog-bi-import.c:890
#, c-format
@@ -22506,9 +22542,9 @@ msgid "Invoice %s NOT posted because it requires currency conversion.\n"
msgstr ""
#: gnucash/import-export/bi-import/dialog-bi-import.c:920
-#, fuzzy, c-format
+#, c-format
msgid "Nothing to process.\n"
-msgstr "Pas d'avertissement à réactiver"
+msgstr "Rien à traiter.\n"
#: gnucash/import-export/bi-import/dialog-bi-import-gui.c:142
#: gnucash/import-export/customer-import/dialog-customer-import-gui.c:128
@@ -22572,7 +22608,7 @@ msgstr "Notes des comptes"
#: gnucash/import-export/bi-import/dialog-bi-import-gui.c:164
msgid "Memo-posted"
-msgstr "(publié)"
+msgstr "Mémo publié"
# messages-i18n.c:188 po/guile_strings.txt:51
#: gnucash/import-export/bi-import/dialog-bi-import-gui.c:165
@@ -22643,6 +22679,12 @@ msgid ""
"Select the settings you require for the file and then click \"Next\" to "
"proceed or \"Cancel\" to abort the export.\n"
msgstr ""
+"Cet assistant va vous aider à exporter l'arborescence de comptes vers un "
+"fichier avec le séparateur défini ci-dessous.\n"
+"\n"
+"Sélectionnez les paramètres dont vous avez besoin pour ce fichier, puis "
+"cliquez sur \"Suivant\" pour continuer ou \"Annuler\" pour interrompre "
+"l'exportation.\n"
#. Translators: %s is one of the following paragraphs about rows/transaction.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:87
@@ -22663,6 +22705,23 @@ msgid ""
"Select the settings you require for the file and then click \"Next\" to "
"proceed or \"Cancel\" to abort the export.\n"
msgstr ""
+"Cet assistant va vous aider à exporter les Transactions vers un fichier, "
+"avec le séparateur défini ci-dessous.\n"
+"\n"
+"%s\n"
+"\n"
+"Même si une transaction est répartie dans plusieurs des comptes "
+"sélectionnés, elle ne sera exportée qu'une seule fois. La transaction "
+"apparaîtra dans le premier des comptes exportés parmi ceux où elle est "
+"répartie.\n"
+"\n"
+"Le format de sortie des Prix / Taux est déterminé par la préférence\n"
+"\"Nombres, Date, Heure\" -> \"Forcer les Prix à s'afficher sous forme de "
+"décimales\".\n"
+"\n"
+"Sélectionnez les paramètres dont vous avez besoin pour le fichier, puis "
+"cliquez sur \"Suivant\" pour continuer ou \"Annuler\" pour interrompre "
+"l'exportation.\n"
#: gnucash/import-export/csv-exp/assistant-csv-export.c:99
msgid ""
@@ -22678,7 +22737,7 @@ msgstr ""
#. Translators: %s is the file name.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:109
-#, fuzzy, c-format
+#, c-format
msgid ""
"The account tree will be exported to the file '%s' when you click \"Apply"
"\".\n"
@@ -22686,13 +22745,15 @@ msgid ""
"You can also verify your selections by clicking on \"Back\" or \"Cancel\" to "
"abort the export.\n"
msgstr ""
-"Le livre sera créé avec le titre %s quand vous cliquerez sur \"Appliquer\". "
-"Cliquez sur \"Retour\" pour ajuster, ou sur \"Annuler\" pour ne pas créer de "
-"livre."
+"L'arborescence des comptes sera exportée vers le fichier \"%s\" quand vous "
+"cliquerez sur \"Appliquer\". \n"
+"\n"
+"Cliquez sur \"Retour\" pour ajuster la sélection ou sur \"Annuler\" pour "
+"interrompre l'exportation.\n"
#. Translators: %s is the file name and %u the number of accounts.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:114
-#, fuzzy, c-format
+#, c-format
msgid ""
"When you click \"Apply\", the transactions will be exported to the file '%s' "
"and the number of accounts exported will be %u.\n"
@@ -22700,13 +22761,15 @@ msgid ""
"You can also verify your selections by clicking on \"Back\" or \"Cancel\" to "
"abort the export.\n"
msgstr ""
-"Le livre sera créé avec le titre %s quand vous cliquerez sur \"Appliquer\". "
-"Cliquez sur \"Retour\" pour ajuster, ou sur \"Annuler\" pour ne pas créer de "
-"livre."
+"Les transactions seront exportées vers le fichier \"%s\" quand vous "
+"cliquerez sur \"Appliquer\" ; le nombre de comptes à exporter est de %u.\n"
+"\n"
+"Cliquez sur \"Retour\" pour ajuster la sélection ou sur \"Annuler\" pour "
+"interrompre l'exportation.\n"
#. Translators: %s is the file name.
#: gnucash/import-export/csv-exp/assistant-csv-export.c:120
-#, fuzzy, c-format
+#, c-format
msgid ""
"When you click \"Apply\", the transactions will be exported to the file "
"'%s'.\n"
@@ -22714,9 +22777,11 @@ msgid ""
"You can also verify your selections by clicking on \"Back\" or \"Cancel\" to "
"abort the export.\n"
msgstr ""
-"Le livre sera créé avec le titre %s quand vous cliquerez sur \"Appliquer\". "
-"Cliquez sur \"Retour\" pour ajuster, ou sur \"Annuler\" pour ne pas créer de "
-"livre."
+"Les transactions seront exportées vers le fichier \"%s\" quand vous "
+"cliquerez sur \"Appliquer\".\n"
+"\n"
+"Cliquez sur \"Retour\" pour ajuster la sélection ou sur \"Annuler\" pour "
+"interrompre l'exportation.\n"
#: gnucash/import-export/csv-exp/assistant-csv-export.c:763
msgid ""
@@ -22813,16 +22878,18 @@ msgid "Export the Active Register to a CSV file"
msgstr "Exporte la hiérarchie des comptes vers un fichier CSV"
#: gnucash/import-export/csv-imp/assistant-csv-account-import.c:71
-#, fuzzy, c-format
+#, c-format
msgid ""
"The accounts will be imported from the file '%s' when you click 'Apply'.\n"
"\n"
"You can verify your selections by clicking on 'Back' or 'Cancel' to Abort "
"Import.\n"
msgstr ""
-"Le livre sera créé avec le titre %s quand vous cliquerez sur \"Appliquer\". "
-"Cliquez sur \"Retour\" pour ajuster, ou sur \"Annuler\" pour ne pas créer de "
-"livre."
+"Les comptes seront importés à partir du fichier \"%s\" quand vous cliquerez "
+"sur \"Appliquer\". \n"
+"\n"
+"Cliquez sur \"Retour\" pour ajuster la sélection ou sur \"Annuler\" pour "
+"abandonner l'importation.\n"
#: gnucash/import-export/csv-imp/assistant-csv-account-import.c:75
#, c-format
@@ -22838,6 +22905,19 @@ msgid ""
"Note: After import, you may need to use 'View / Filter By / Other' menu "
"option and select to show unused Accounts.\n"
msgstr ""
+"Les comptes seront importés à partir du fichier \"%s\" quand vous cliquerez "
+"sur \"Appliquer\".\n"
+"\n"
+"Vous pouvez vérifier la sélection en cliquant sur \"Retour\" ou interrompre "
+"l'importation en cliquant sur \"Annuler\".\n"
+"\n"
+"S'il s'agit de votre première importation dans un nouveau fichier, vous "
+"verrez d'abord une boîte de dialogue pour définir les options du livre, "
+"puisque celles-ci peuvent affecter la façon dont les données importées sont "
+"converties en transactions GnuCash.\n"
+"Remarque : après l'importation, vous devrez peut-être utiliser l'option "
+"\"Filtrer par / Autre\" dans le menu \"Affichage\" pour afficher les comptes "
+"inutilisés.\n"
#: gnucash/import-export/csv-imp/assistant-csv-account-import.c:528
#, c-format
@@ -22930,24 +23010,24 @@ msgstr[1] "Ajouter des %d nouveaux cours."
# src/gnome/glade-gnc-dialogs.c:644
#. Translators: This is a ngettext(3) message, %d is the number of duplicate prices
#: gnucash/import-export/csv-imp/assistant-csv-price-import.cpp:1886
-#, fuzzy, c-format
+#, c-format
msgid "%d duplicate price"
msgid_plural "%d duplicate prices"
-msgstr[0] "_Dupliquer la facture"
-msgstr[1] "_Dupliquer les factures"
+msgstr[0] "%d prix en doublon"
+msgstr[1] "%d prix en doublons"
# messages-i18n.c:46
#. Translators: This is a ngettext(3) message, %d is the number of replaced prices
#: gnucash/import-export/csv-imp/assistant-csv-price-import.cpp:1891
-#, fuzzy, c-format
+#, c-format
msgid "%d replaced price"
msgid_plural "%d replaced prices"
-msgstr[0] "Les cours enregistrés"
-msgstr[1] "Les cours enregistrés"
+msgstr[0] "%d cours enregistré"
+msgstr[1] "%d cours enregistrés"
# messages-i18n.c:34
#: gnucash/import-export/csv-imp/assistant-csv-price-import.cpp:1896
-#, fuzzy, c-format
+#, c-format
msgid ""
"The prices were imported from file '%s'.\n"
"\n"
@@ -22955,7 +23035,13 @@ msgid ""
"- %s\n"
"- %s\n"
"- %s"
-msgstr "Les transactions ont été importées à partir du fichier « %s »."
+msgstr ""
+"Les prix ont été importés à partir du fichier « %s »\n"
+"\n"
+"Résumé de l'importation :\n"
+"- %s\n"
+"- %s\n"
+"- %s"
#: gnucash/import-export/csv-imp/assistant-csv-price-import.cpp:1940
#, c-format
@@ -23217,10 +23303,8 @@ msgstr ""
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:520
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:575
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:583
-#, fuzzy
-#| msgid " could not be understood.\n"
msgid "Column '{1}' could not be understood.\n"
-msgstr " La colonne %s n'a pas pu être comprise.\n"
+msgstr "La colonne \"{1}\" n'a pas pu être comprise.\n"
# po/guile_strings.txt:230
#: gnucash/import-export/csv-imp/gnc-imp-props-price.cpp:280
@@ -23247,9 +23331,8 @@ msgid "No 'Commodity from'."
msgstr "Afficher la colonne du produit"
#: gnucash/import-export/csv-imp/gnc-imp-props-price.cpp:356
-#, fuzzy
msgid "Failed to create price from selected columns."
-msgstr "Impossible de créer un cours pour ces éléments :"
+msgstr "Impossible de créer un prix à partir de ces colonnes."
# messages-i18n.c:346
#: gnucash/import-export/csv-imp/gnc-imp-props-tx.cpp:67
@@ -23436,14 +23519,12 @@ msgstr ""
" %u %s mises à jour (sur la base de lâID)"
#: gnucash/import-export/customer-import/gnc-plugin-customer-import.c:59
-#, fuzzy
msgid "Import _Customers & Vendors..."
-msgstr "Importer des clients et des fournisseurs"
+msgstr "Importer des _clients et des fournisseurs..."
#: gnucash/import-export/customer-import/gnc-plugin-customer-import.c:59
-#, fuzzy
msgid "Import Customers and Vendors from a CSV text file."
-msgstr "Importer des fournisseurs ou des vendeurs depuis un fichier texte"
+msgstr "Importer des clients ou des fournisseurs depuis un fichier CSV."
#: gnucash/import-export/import-account-matcher.c:260
#, fuzzy, c-format
@@ -23455,12 +23536,12 @@ msgstr ""
"Choisissez un autre compte."
#: gnucash/import-export/import-account-matcher.c:277
-#, fuzzy, c-format
+#, c-format
msgid ""
"The account '%s' has a different commodity to the one required, '%s'. Please "
"choose a different account."
msgstr ""
-"Le compte %s est un compte virtuel et n'autorise pas les transactions. "
+"Le compte \"%s\" possède une devise différente de celle requise, \"%s\". "
"Choisissez un autre compte."
# src/gnome/dialog-account-picker.c:93
@@ -23521,11 +23602,9 @@ msgid "U+C"
msgstr "U+R"
#: gnucash/import-export/import-main-matcher.c:1101
-#, fuzzy
-#| msgid "C"
msgctxt "Column header for 'Clearing transaction'"
msgid "C"
-msgstr "C"
+msgstr "P"
# messages-i18n.c:231
#: gnucash/import-export/import-main-matcher.c:1108
@@ -23534,9 +23613,8 @@ msgstr "Info"
#: gnucash/import-export/import-main-matcher.c:1115
#: gnucash/report/stylesheets/head-or-tail.scm:102
-#, fuzzy
msgid "Additional Comments"
-msgstr "Supplément à la carte :"
+msgstr "Commentaires supplémentaires"
#: gnucash/import-export/import-main-matcher.c:1479
msgid "New, already balanced"
@@ -23999,7 +24077,7 @@ msgstr "Certains caractères ont été ignorés."
#: gnucash/import-export/qif-imp/qif-file.scm:185
#: gnucash/import-export/qif-imp/qif-file.scm:189
msgid "Converted to: "
-msgstr "Converti à :"
+msgstr "Converti en : "
#: gnucash/import-export/qif-imp/qif-file.scm:188
msgid "Some characters have been converted according to your locale."
@@ -24138,14 +24216,14 @@ msgid "Unrecognized account type '~s'. Defaulting to Bank."
msgstr "Type de compte ~s inconnu. Par défaut, devient \"Banque\""
#: gnucash/import-export/qif-imp/qif-parse.scm:235
-#, fuzzy, scheme-format
+#, scheme-format
msgid "Unrecognized action '~a'."
-msgstr "Action ~s inconnue."
+msgstr "Action \"~a\" inconnue."
#: gnucash/import-export/qif-imp/qif-parse.scm:254
-#, fuzzy, scheme-format
+#, scheme-format
msgid "Unrecognized status '~a'. Defaulting to uncleared."
-msgstr "Statut ~s non-catégorisé. Par défaut, devient non-pointé. "
+msgstr "Statut \"~a\" non reconnu. Par défaut, devient non pointé."
#: gnucash/import-export/qif-imp/qif-to-gnc.scm:213
msgid "QIF import: Name conflict with another account."
@@ -24711,10 +24789,9 @@ msgstr ""
#. used to estimate widths.
#: gnucash/register/ledger-core/split-register-layout.c:644
#: gnucash/register/ledger-core/split-register-layout.c:652
-#, fuzzy
msgctxt "sample"
msgid "22/02/2000"
-msgstr "sample:12/12/2000"
+msgstr "22/02/2000"
#. Translators: The 'sample' items are
#. strings which are not displayed, but only
@@ -24812,9 +24889,8 @@ msgstr ""
# messages-i18n.c:180
#: gnucash/register/ledger-core/split-register-model.c:404
-#, fuzzy
msgid "Exch. Rate"
-msgstr "Taux de change :"
+msgstr "Taux de change"
#: gnucash/register/ledger-core/split-register-model.c:421
msgid "Oth. Curr."
@@ -24845,9 +24921,9 @@ msgstr "Tot titres"
# messages-i18n.c:322
#: gnucash/register/ledger-core/split-register-model.c:536
-#, fuzzy, c-format
+#, c-format
msgid "Reconciled on %s"
-msgstr "Rapproché"
+msgstr "Rapproché sur %s"
#: gnucash/register/ledger-core/split-register-model.c:1013
msgid "Scheduled"
@@ -24954,7 +25030,7 @@ msgid "Change transaction containing a reconciled split?"
msgstr "Modifier la répartition associée à une répartition rapprochée ?"
#: gnucash/register/ledger-core/split-register-model.c:2217
-#, fuzzy, c-format
+#, c-format
msgid ""
"The transaction you are about to change contains reconciled splits in the "
"following accounts:\n"
@@ -24962,8 +25038,10 @@ msgid ""
"\n"
"Are you sure you want to continue with this change?"
msgstr ""
-"Vous êtes sur le point de modifier une répartition qui est liée à une "
-"répartition rapprochée. Cela peut rendre difficile un futur rapprochement ! "
+"Vous êtes sur le point de modifier une transaction qui contient des "
+"répartitions rapprochées dans les comptes suivants :\n"
+"%s\n"
+"\n"
"Ãtes-vous sûr de vouloir faire cela ?"
#: gnucash/register/ledger-core/split-register-model.c:2228
@@ -25003,7 +25081,7 @@ msgstr "Liste"
#: gnucash/report/eguile.scm:150
#, scheme-format
msgid "Template file \"~a\" can not be read"
-msgstr "Le fichier modèle ~s ne peut pas être lu"
+msgstr "Le fichier modèle ~a ne peut pas être lu"
#: gnucash/report/html-chart.scm:455
msgid "Load"
@@ -25112,8 +25190,6 @@ msgstr "Impossible d'enregistrer la feuille de style"
# messages-i18n.c:180
#: gnucash/report/html-utilities.scm:274 gnucash/report/html-utilities.scm:291
-#, fuzzy
-#| msgid "Exchange rate"
msgid "Exchange rate"
msgid_plural "Exchange rates"
msgstr[0] "Taux de change"
@@ -25786,12 +25862,12 @@ msgid "Address Email"
msgstr "Adresse courriel"
#: gnucash/report/reports/aging.scm:205
-#, fuzzy, scheme-format
+#, scheme-format
msgid ""
"Transactions relating to '~a' contain more than one currency. This report is "
"not designed to cope with this possibility."
msgstr ""
-"Les transactions concernant ~s contiennent plus d'une devise. Ce rapport "
+"Les transactions concernant \"~a\" contiennent plus d'une devise. Ce rapport "
"n'est pas conçu pour cette éventualité."
#: gnucash/report/reports/aging.scm:345
@@ -26154,7 +26230,7 @@ msgstr "Pertes et gains"
# po/guile_strings.txt:186
#: gnucash/report/reports/example/average-balance.scm:149
msgid "Period start"
-msgstr "Début de période :"
+msgstr "Début de période"
# po/guile_strings.txt:203
#: gnucash/report/reports/example/average-balance.scm:149
@@ -26507,13 +26583,13 @@ msgstr ""
# po/guile_strings.txt:292
#: gnucash/report/reports/example/hello-world.scm:348
-#, fuzzy, scheme-format
+#, scheme-format
msgid ""
"For help on writing reports, or to contribute your brand new, totally cool "
"report, consult the mailing list ~a."
msgstr ""
-"Pour l'aide sur l'écriture de rapports, ou pour nous faire partager\n"
-"votre nouveau-top-cool rapport, consultez la liste de diffusion %s."
+"Pour l'aide sur l'écriture de rapports, ou pour partager votre nouveau-top-"
+"cool rapport, consultez la liste de diffusion ~a."
#: gnucash/report/reports/example/hello-world.scm:353
#, fuzzy
@@ -26535,15 +26611,15 @@ msgstr ""
# po/guile_strings.txt:18
#: gnucash/report/reports/example/hello-world.scm:358
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The current time is ~a."
-msgstr "L'heure actuelle est %s."
+msgstr "L'heure actuelle est ~a."
# po/guile_strings.txt:84
#: gnucash/report/reports/example/hello-world.scm:363
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The boolean option is ~a."
-msgstr "L'option booléenne est %s."
+msgstr "L'option booléenne est ~a."
# po/guile_strings.txt:202
#: gnucash/report/reports/example/hello-world.scm:364
@@ -26557,57 +26633,57 @@ msgstr "faux"
# po/guile_strings.txt:178
#: gnucash/report/reports/example/hello-world.scm:368
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The radio button option is ~a."
-msgstr "L'option de chaîne de caractères est %s."
+msgstr "L'option du bouton radio est ~a."
# po/guile_strings.txt:158
#: gnucash/report/reports/example/hello-world.scm:373
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The multi-choice option is ~a."
-msgstr "L'option à choix multiple est %s."
+msgstr "L'option à choix multiple est ~a."
# po/guile_strings.txt:178
#: gnucash/report/reports/example/hello-world.scm:378
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The string option is ~a."
-msgstr "L'option de chaîne de caractères est %s."
+msgstr "L'option de chaîne de caractères est ~a."
# po/guile_strings.txt:34
#: gnucash/report/reports/example/hello-world.scm:383
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The date option is ~a."
-msgstr "L'option de date est %s."
+msgstr "L'option de date est ~a."
# po/guile_strings.txt:164
#: gnucash/report/reports/example/hello-world.scm:388
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The date and time option is ~a."
-msgstr "L'option de date et d'heure est %s."
+msgstr "L'option de date et d'heure est ~a."
# po/guile_strings.txt:34
#: gnucash/report/reports/example/hello-world.scm:393
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The relative date option is ~a."
-msgstr "L'option de date relative est %s."
+msgstr "L'option de date relative est ~a."
# po/guile_strings.txt:34
#: gnucash/report/reports/example/hello-world.scm:398
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The combination date option is ~a."
-msgstr "La combinaison de l'option de date est %s."
+msgstr "L'option de date de transaction est ~a."
# po/guile_strings.txt:177
#: gnucash/report/reports/example/hello-world.scm:403
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The number option is ~a."
-msgstr "L'option de numérotation est %s."
+msgstr "L'option de nombres est ~a."
# po/guile_strings.txt:71
#: gnucash/report/reports/example/hello-world.scm:414
-#, fuzzy, scheme-format
+#, scheme-format
msgid "The number option formatted as currency is ~a."
-msgstr "L'option de mise en forme des montants monétaires est %s."
+msgstr "L'option de mise en forme des montants monétaires est ~a."
#: gnucash/report/reports/example/hello-world.scm:426
msgid "Items you selected:"
@@ -26684,13 +26760,12 @@ msgstr "Formulaire d'impôt / export TXF"
#: gnucash/report/reports/locale-specific/de_DE/taxtxf.scm:151
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:181
msgid "Alternate Period"
-msgstr "Période alternée :"
+msgstr "Période alternée"
#: gnucash/report/reports/locale-specific/de_DE/taxtxf.scm:152
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:182
-#, fuzzy
msgid "Override or modify From: & To:."
-msgstr "Passer outre ou modifier De: & Ã:"
+msgstr "Remplacer ou modifier De : & à: ."
#: gnucash/report/reports/locale-specific/de_DE/taxtxf.scm:154
#: gnucash/report/reports/locale-specific/us/taxtxf.scm:184
@@ -27758,7 +27833,7 @@ msgstr "Inclure les comptes ayant une balance des parts nulle."
#: gnucash/report/reports/standard/advanced-portfolio.scm:1068
#: gnucash/report/reports/standard/portfolio.scm:255
msgid "Listing"
-msgstr "Listing"
+msgstr "Liste"
# po/guile_strings.txt:213
#: gnucash/report/reports/standard/advanced-portfolio.scm:1080
@@ -28290,9 +28365,8 @@ msgstr ""
# po/guile_strings.txt:186
#: gnucash/report/reports/standard/balsheet-pnl.scm:62
-#, fuzzy
msgid "Period duration"
-msgstr "Début de période :"
+msgstr "Durée de la période"
#: gnucash/report/reports/standard/balsheet-pnl.scm:63
msgid "Duration between time periods"
@@ -28489,9 +28563,8 @@ msgstr "_Passif/capitaux propres"
# messages-i18n.c:180
#: gnucash/report/reports/standard/balsheet-pnl.scm:1154
#: gnucash/report/reports/standard/balsheet-pnl.scm:1297
-#, fuzzy
msgid "Exchange Rates"
-msgstr "Taux de change :"
+msgstr "Taux de change"
#: gnucash/report/reports/standard/balsheet-pnl.scm:1164
#: gnucash/report/reports/standard/budget-barchart.scm:157
@@ -28500,9 +28573,8 @@ msgid "Barchart"
msgstr "Histogramme de l'actif"
#: gnucash/report/reports/standard/balsheet-pnl.scm:1227
-#, fuzzy
msgid " to "
-msgstr " du %s au %s "
+msgstr " Ã "
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
@@ -28727,9 +28799,8 @@ msgstr ""
# po/guile_strings.txt:186
#: gnucash/report/reports/standard/budget-barchart.scm:79
#: gnucash/report/reports/standard/budget.scm:125
-#, fuzzy
msgid "Last budget period"
-msgstr "Fréquence du budget :"
+msgstr "Dernière période du budget"
#: gnucash/report/reports/standard/budget-barchart.scm:81
#: gnucash/report/reports/standard/budget.scm:127
@@ -28904,21 +28975,21 @@ msgid "Total Expenses"
msgstr "Total des dépenses"
#: gnucash/report/reports/standard/budget-income-statement.scm:527
-#, fuzzy, scheme-format
+#, scheme-format
msgid "for Budget ~a"
-msgstr "du budget %s"
+msgstr "du budget ~a"
# po/guile_strings.txt:186
#: gnucash/report/reports/standard/budget-income-statement.scm:529
-#, fuzzy, scheme-format
+#, scheme-format
msgid "for Budget ~a Period ~d"
-msgstr "du budget %s période %u"
+msgstr "du budget ~a période ~d"
# po/guile_strings.txt:186
#: gnucash/report/reports/standard/budget-income-statement.scm:532
-#, fuzzy, scheme-format
+#, scheme-format
msgid "for Budget ~a Periods ~d - ~d"
-msgstr "du budget %s période %u - %u"
+msgstr "du budget ~a périodes ~d - ~d"
#: gnucash/report/reports/standard/budget-income-statement.scm:560
#: gnucash/report/reports/standard/equity-statement.scm:455
@@ -29150,9 +29221,8 @@ msgstr "Perte nette"
# src/gnome/glade-gnc-dialogs.c:979
#: gnucash/report/reports/standard/cashflow-barchart.scm:342
-#, fuzzy
msgid "Overview:"
-msgstr "Vue d'ensemble"
+msgstr "Vue d'ensemble :"
#: gnucash/report/reports/standard/cashflow-barchart.scm:368
#, fuzzy
@@ -29177,15 +29247,15 @@ msgstr "Afficher le nom complet du compte (incluant ses parents)"
# po/guile_strings.txt:100
#: gnucash/report/reports/standard/cash-flow.scm:205
-#, fuzzy, scheme-format
+#, scheme-format
msgid "~a and subaccounts"
-msgstr "et sous-comptes"
+msgstr "~a et sous-comptes"
# src/gnome/glade-gnc-dialogs.c:564
#: gnucash/report/reports/standard/cash-flow.scm:206
-#, fuzzy, scheme-format
+#, scheme-format
msgid "~a and selected subaccounts"
-msgstr "%s et sous-comptes sélectionnés"
+msgstr "~a et sous-comptes sélectionnés"
# messages-i18n.c:101
#: gnucash/report/reports/standard/cash-flow.scm:270
@@ -29335,9 +29405,9 @@ msgstr "Moyenne journalière"
# po/guile_strings.txt:171
#: gnucash/report/reports/standard/category-barchart.scm:520
-#, fuzzy, scheme-format
+#, scheme-format
msgid "Balances ~a to ~a"
-msgstr "Balance %s vers %s"
+msgstr "Solde ~a vers ~a"
# messages-i18n.c:312
#: gnucash/report/reports/standard/category-barchart.scm:641
@@ -29729,9 +29799,8 @@ msgstr "Ordre de tri secondaire"
# messages-i18n.c:190
#: gnucash/report/reports/standard/income-gst-statement.scm:39
-#, fuzzy
msgid "Income and GST Statement"
-msgstr "Relevé des taxes sur la valeur ajoutée"
+msgstr "Revenus et relevé de TVA"
# po/guile_strings.txt:227
#: gnucash/report/reports/standard/income-gst-statement.scm:41
@@ -29740,7 +29809,6 @@ msgid "Filter"
msgstr "Type de filtre"
#: gnucash/report/reports/standard/income-gst-statement.scm:48
-#, fuzzy
msgid ""
"This report is useful to calculate periodic business tax payable/receivable "
"from authorities. From 'Edit report options', choose your business sales and "
@@ -29748,11 +29816,11 @@ msgid ""
"liability, A/Payable or A/Receivable accounts, a split to a tax account, e."
"g. Income:Sales -$1000, A/Receivable $1100, Liability:GST on Sales -$100."
msgstr ""
-"Ce rapport est utilisé pour créer les rapports périodiques de TVA.\n"
-"Cliquez \"Ãditer les options du rapport\", et choisissez vos comptes revenus "
+"Ce rapport est utilisé pour créer les rapports périodiques de TVA. Cliquez "
+"sur \"Ãditer les options du rapport\" et choisissez vos comptes de revenus "
"et dépenses d'affaires. Chaque transaction peut comprendre, optionnellement, "
-"des répartitions dans un compte TVA.\n"
-"Exemple: Revenus:Soldes -$1000, Passif:TVA Soldes -$100, Banque: $1100."
+"des répartitions dans un compte TVA. Exemple : Revenus:Soldes -$1000, Passif:"
+"TVA Soldes -$100, Banque : $1100."
#: gnucash/report/reports/standard/income-gst-statement.scm:56
#, fuzzy
@@ -29872,6 +29940,12 @@ msgid ""
"These accounts must be of type ASSET for taxes paid on expenses, and type "
"LIABILITY for taxes collected on sales."
msgstr ""
+"Veuillez trouver et sélectionner les comptes qui contiendront la taxe "
+"collectée ou payée. Ces comptes doivent contenir des répartitions qui "
+"documentent les sommes qui sont entièrement envoyées ou réclamées aux "
+"autorités fiscales lors des déclarations périodiques de TVA. Ces comptes "
+"doivent être de type ACTIF pour les taxes payées sur les dépenses et de type "
+"PASSIF pour les taxes collectées sur les ventes."
# po/guile_strings.txt:242
#: gnucash/report/reports/standard/income-gst-statement.scm:157
@@ -30008,7 +30082,7 @@ msgstr ""
#: gnucash/report/reports/standard/invoice.scm:114
msgid "Client or vendor name, address and ID"
-msgstr ""
+msgstr "Nom du client ou fournisseur, adresse et numéro d'identification"
#. Translators: "Our details" refer to the book owner's details i.e. name/address/tax-ID
#: gnucash/report/reports/standard/invoice.scm:117
@@ -30158,7 +30232,7 @@ msgstr "Afficher la quantité des éléments ?"
# po/guile_strings.txt:219
#: gnucash/report/reports/standard/invoice.scm:233
msgid "Display the price per item?"
-msgstr "Afficher les prix unitaires?"
+msgstr "Afficher les prix unitaires ?"
# messages-i18n.c:96
#: gnucash/report/reports/standard/invoice.scm:238
@@ -30295,9 +30369,8 @@ msgstr "Destinataire de la facture"
# messages-i18n.c:96
#: gnucash/report/reports/standard/invoice.scm:323
-#, fuzzy
msgid "Display the customer/vendor id?"
-msgstr "Afficher l'action ?"
+msgstr "Afficher le numéro d'identification du client/fournisseur ?"
# messages-i18n.c:96
#: gnucash/report/reports/standard/invoice.scm:328
@@ -30409,21 +30482,21 @@ msgstr "Facture en cours..."
# messages-i18n.c:315
#: gnucash/report/reports/standard/invoice.scm:623
msgid "Reference:"
-msgstr "Référence"
+msgstr "Référence :"
#: gnucash/report/reports/standard/invoice.scm:635
msgid "Terms:"
-msgstr "Conditions : "
+msgstr "Conditions :"
# po/guile_strings.txt:173
#: gnucash/report/reports/standard/invoice.scm:645
msgid "Job number:"
-msgstr "N° de la prestation"
+msgstr "N° de la prestation :"
# po/guile_strings.txt:188
#: gnucash/report/reports/standard/invoice.scm:650
msgid "Job name:"
-msgstr "Nom de la prestation"
+msgstr "Nom de la prestation :"
#: gnucash/report/reports/standard/invoice.scm:696
msgid "REF"
@@ -30527,9 +30600,8 @@ msgstr "Aucune société valide détecté."
#: gnucash/report/reports/standard/job-report.scm:584
#: gnucash/report/reports/standard/new-owner-report.scm:105
-#, fuzzy
msgid "No valid vendor selected."
-msgstr "Aucun client valide sélectionné."
+msgstr "Aucun fournisseur valide sélectionné."
#: gnucash/report/reports/standard/job-report.scm:586
#: gnucash/report/reports/standard/new-owner-report.scm:95
@@ -30662,9 +30734,8 @@ msgstr "Inverser lâordre"
#: gnucash/report/reports/standard/new-aging.scm:341
#: gnucash/report/reports/standard/new-owner-report.scm:546
-#, fuzzy
msgid "Please note some transactions were not processed"
-msgstr "Plage de dates des transactions à rapatrier :"
+msgstr "Veuillez noter que certaines transactions n'ont pas été traitées"
#: gnucash/report/reports/standard/new-aging.scm:374
#, scheme-format
@@ -30764,9 +30835,8 @@ msgid "This report requires a job to be selected."
msgstr "Ce rapport nécessite de sélectionner une société."
#: gnucash/report/reports/standard/new-owner-report.scm:106
-#, fuzzy
msgid "This report requires a vendor to be selected."
-msgstr "Ce rapport nécessite de sélectionner un client."
+msgstr "Ce rapport nécessite de sélectionner un fournisseur."
# messages-i18n.c:199
#: gnucash/report/reports/standard/new-owner-report.scm:246
@@ -30796,7 +30866,7 @@ msgstr "Détails du prêt"
#: gnucash/report/reports/standard/new-owner-report.scm:510
#: gnucash/report/reports/standard/owner-report.scm:463
msgid "Period Totals"
-msgstr "Totaux de période :"
+msgstr "Totaux de période"
#: gnucash/report/reports/standard/new-owner-report.scm:882
#: gnucash/report/reports/standard/owner-report.scm:535
@@ -30848,9 +30918,8 @@ msgid "Linked transactions are hidden."
msgstr "Trouve des transactions avec une recherche."
#: gnucash/report/reports/standard/new-owner-report.scm:952
-#, fuzzy
msgid "Simple"
-msgstr "Exemple :"
+msgstr "Simple"
#: gnucash/report/reports/standard/new-owner-report.scm:953
msgid "Invoices show if paid, payments show invoice numbers."
@@ -31048,9 +31117,8 @@ msgid ""
"All the prices found are equal. This would result in a plot with one "
"straight line. Unfortunately, the plotting tool can't handle that."
msgstr ""
-"Tous les cours trouvés sont égaux. Cela entraînerait l'affichage d'une ligne "
-"droite.\n"
-"Hélas, l'outil de dessin ne le permet pas : ,-("
+"Tous les cours trouvés sont égaux. Cela entraînerait l'affichage d'un "
+"graphique avec une ligne droite. Hélas, l'outil de dessin ne le permet pas."
#: gnucash/report/reports/standard/price-scatter.scm:287
msgid "All Prices at the same date"
@@ -31061,9 +31129,8 @@ msgid ""
"All the prices found are from the same date. This would result in a plot "
"with one straight line. Unfortunately, the plotting tool can't handle that."
msgstr ""
-"Tous les cours sont à la même date. Cela entraînerait l'affichage d'une "
-"ligne droite.\n"
-"Hélas, l'outil ne le permet pas : ,-("
+"Tous les cours sont à la même date. Cela entraînerait l'affichage d'un "
+"graphique avec une ligne droite. Hélas, l'outil ne le permet pas."
#: gnucash/report/reports/standard/price-scatter.scm:320
msgid "Price Scatterplot"
@@ -31672,21 +31739,18 @@ msgstr "Unités"
# messages-i18n.c:211
#: gnucash/report/reports/standard/taxinvoice.scm:311
-#, fuzzy
msgid "GST Rate"
-msgstr "Taux d'imposition"
+msgstr "Taux de TVA"
# messages-i18n.c:242 po/guile_strings.txt:50
#: gnucash/report/reports/standard/taxinvoice.scm:312
-#, fuzzy
msgid "GST Amount"
-msgstr "Montant brut vers :"
+msgstr "Montant de la TVA"
# messages-i18n.c:242 po/guile_strings.txt:50
#: gnucash/report/reports/standard/taxinvoice.scm:313
-#, fuzzy
msgid "Amount Due (inc GST)"
-msgstr "Montant brut dû"
+msgstr "Montant dû (TVAC)"
# messages-i18n.c:294 po/guile_strings.txt:205
# src/gnome/glade-gnc-dialogs.c:644
@@ -32019,12 +32083,12 @@ msgstr "Lignes de crédit"
#: gnucash/report/report-utilities.scm:712
#, scheme-format
msgid "Building '~a' report ..."
-msgstr "Compilation du rapport ~s en cours..."
+msgstr "Création du rapport ~a en cours..."
#: gnucash/report/report-utilities.scm:718
#, scheme-format
msgid "Rendering '~a' report ..."
-msgstr "Affichage du rapport ~s en cours..."
+msgstr "Affichage du rapport \"~a\" en cours..."
# src/gnome/glade-gnc-dialogs.c:1372
#: gnucash/report/report-utilities.scm:720
@@ -32753,7 +32817,7 @@ msgstr "_Non rapproché"
# messages-i18n.c:260
#: gnucash/report/trep-engine.scm:426
msgid "Cleared only"
-msgstr "Pointé"
+msgstr "Pointé uniquement"
# messages-i18n.c:322
#: gnucash/report/trep-engine.scm:431
@@ -33327,15 +33391,15 @@ msgid ""
"style format string."
msgstr ""
"Le format de la chaîne pour générer les numéros de fournisseur. C'est un "
-"format d'impression."
+"chaîne au format printf."
#: libgnucash/app-utils/business-prefs.scm:71
msgid ""
"The previous vendor number generated. This number will be incremented to "
"generate the next vendor number."
msgstr ""
-"Précédent numéro de fournisseur généré. Ce numéro sera augmenté pour obtenir "
-"le prochain numéro de fournisseur."
+"Précédent numéro de fournisseur généré. Ce numéro sera incrémenté pour "
+"obtenir le prochain numéro de fournisseur."
#: libgnucash/app-utils/business-prefs.scm:81
msgid "The name of your business."
@@ -33415,10 +33479,10 @@ msgid ""
"imports/exports."
msgstr ""
"Cochez pour que le champ « action » des répartitions soit utilisé dans les "
-"registres comme champ « Num » à la place du numéro de transaction; le numéro "
-"de transaction sera alors affiché comme « T-Num » sur la deuxième ligne du "
-"registre. Cette option a des effets similaires sur les fonctionnalités "
-"affaires, rapports et importation/exportation."
+"registres comme champ « Num » à la place du numéro de transaction ; le "
+"numéro de transaction sera alors affiché comme « T-Num » sur la deuxième "
+"ligne du registre. Cette option a des effets similaires sur les "
+"fonctionnalités affaires, rapports et importation/exportation."
#: libgnucash/app-utils/business-prefs.scm:159
msgid ""
@@ -33729,11 +33793,11 @@ msgstr ""
#: libgnucash/app-utils/gnc-ui-balances.c:455
msgid "Too many uncleared splits"
-msgstr ""
+msgstr "Trop de répartitions non pointées"
#: libgnucash/app-utils/gnc-ui-balances.c:471
msgid "The selected amount cannot be cleared."
-msgstr "Le montant sélectionné ne peut pas être effacé."
+msgstr "Le montant sélectionné ne peut pas être pointé."
#: libgnucash/app-utils/gnc-ui-balances.c:477
msgid "Cannot uniquely clear splits. Found multiple possibilities."
@@ -33765,7 +33829,7 @@ msgstr "Type de taxe %s : code invalide %s pour ce type de compte"
#, c-format
msgid "Not tax-related; tax type %s: invalid code %s for account type"
msgstr ""
-"Non lié à la taxe; type de taxe %s : code invalide %s pour ce type de compte"
+"Non lié à la taxe ; type de taxe %s : code invalide %s pour ce type de compte"
#: libgnucash/app-utils/gnc-ui-util.c:719
#, c-format
@@ -33775,7 +33839,7 @@ msgstr "Code invalide %s pour ce type de taxe %s"
#: libgnucash/app-utils/gnc-ui-util.c:723
#, c-format
msgid "Not tax-related; invalid code %s for tax type %s"
-msgstr "Nom lié à la taxe; code invalide %s pour ce type de taxe %s"
+msgstr "Nom lié à la taxe ; code invalide %s pour ce type de taxe %s"
#: libgnucash/app-utils/gnc-ui-util.c:741
#, c-format
@@ -33785,7 +33849,7 @@ msgstr "Pas de formulaire : code %s, type de taxe %s"
#: libgnucash/app-utils/gnc-ui-util.c:745
#, c-format
msgid "Not tax-related; no form: code %s, tax type %s"
-msgstr "Non lié à la taxe; aucun formulaire : code %s, type de taxe %s"
+msgstr "Non lié à la taxe ; aucun formulaire : code %s, type de taxe %s"
#: libgnucash/app-utils/gnc-ui-util.c:762
#: libgnucash/app-utils/gnc-ui-util.c:777
@@ -33798,13 +33862,13 @@ msgstr "Pas de description : formulaire %s, code %s, type de taxe %s"
#, c-format
msgid "Not tax-related; no description: form %s, code %s, tax type %s"
msgstr ""
-"Non lié à la taxe; pas de description : formulaire %s, code %s, type de taxe "
-"%s"
+"Non lié à la taxeâ¯; pas de descriptionâ¯: formulaire %s, code %s, type de "
+"taxe %s"
#: libgnucash/app-utils/gnc-ui-util.c:804
#, c-format
msgid "Not tax-related; %s%s: %s (code %s, tax type %s)"
-msgstr "Non lié aux taxes ; %s%s: %s (code %s, type de taxe %s)"
+msgstr "Non lié aux taxesâ¯; %s%sâ¯: %s (code %s, type de taxe %s)"
# src/gnome/glade-gnc-dialogs.c:564
#: libgnucash/app-utils/gnc-ui-util.c:851
@@ -33815,12 +33879,12 @@ msgstr "(Taxes liées aux sous-comptes : %d)"
#: libgnucash/app-utils/gnc-ui-util.c:871
msgctxt "Reconciled flag 'not cleared'"
msgid "n"
-msgstr ""
+msgstr "n"
#: libgnucash/app-utils/gnc-ui-util.c:873
msgctxt "Reconciled flag 'cleared'"
msgid "c"
-msgstr ""
+msgstr "p"
# src/gnome/glade-gnc-dialogs.c:1478
#: libgnucash/app-utils/gnc-ui-util.c:875
@@ -33880,9 +33944,8 @@ msgstr "Encodage invalide détecté"
#. Translators: this string refers to a file name that gets renamed
#: libgnucash/core-utils/gnc-filepath-utils.cpp:648
-#, fuzzy
msgid "Renamed to:"
-msgstr "Renommer la _page"
+msgstr "Renommer en :"
#: libgnucash/core-utils/gnc-filepath-utils.cpp:673
msgid "Notice"
@@ -33894,16 +33957,14 @@ msgstr ""
#. Translators: this refers to a directory name.
#: libgnucash/core-utils/gnc-filepath-utils.cpp:680
-#, fuzzy
msgid "Old location:"
-msgstr "Ouvrir le fichier ou lâemplacement"
+msgstr "Ancien emplacement :"
# messages-i18n.c:231
#. Translators: this refers to a directory name.
#: libgnucash/core-utils/gnc-filepath-utils.cpp:682
-#, fuzzy
msgid "New location:"
-msgstr "Information sur la nouvelle répartition"
+msgstr "Nouvel emplacement :"
#. Translators {1} will be replaced with the package name (typically Gnucash) at runtime
#: libgnucash/core-utils/gnc-filepath-utils.cpp:684
@@ -33917,11 +33978,10 @@ msgid "In addition:"
msgstr ""
#: libgnucash/core-utils/gnc-filepath-utils.cpp:697
-#, fuzzy
msgid "The following file has been copied to {1} instead:"
msgid_plural "The following files have been copied to {1} instead:"
-msgstr[0] "Ce codage a déjà été ajouté à la liste."
-msgstr[1] "Ce codage a déjà été ajouté à la liste."
+msgstr[0] "Le fichier suivant a été copié vers {1} à la place :"
+msgstr[1] "Les fichiers suivants ont été copiés vers {1} à la place :"
#: libgnucash/core-utils/gnc-filepath-utils.cpp:701
msgid "The following file in {1} has been renamed:"
@@ -33935,11 +33995,10 @@ msgstr[1] ""
# messages-i18n.c:37
#: libgnucash/core-utils/gnc-filepath-utils.cpp:721
-#, fuzzy
msgid "The following file could not be moved to {1}:"
msgid_plural "The following files could not be moved to {1}:"
-msgstr[0] "Le fichier n'a pas pu être réouvert."
-msgstr[1] "Le fichier n'a pas pu être réouvert."
+msgstr[0] "Le fichier suivant n'a pas pu être déplacé vers {1} :"
+msgstr[1] "Les fichiers suivants n'ont pas pu être déplacés vers {1} :"
#: libgnucash/engine/Account.cpp:256
#, c-format
commit 92521c8623da4721ab3fd5ef40bc934d6a66e2d1
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sat Apr 24 19:32:04 2021 +0200
Translation update by Christopher Lam <christopher.lck at gmail.com> using Weblate
po/fr.po: 73.8% (4046 of 5479 strings; 985 fuzzy)
485 failing checks (8.8%)
Translation: GnuCash/Program (French)
Translate-URL: https://hosted.weblate.org/projects/gnucash/gnucash/fr/
Co-authored-by: Christopher Lam <christopher.lck at gmail.com>
diff --git a/po/fr.po b/po/fr.po
index b58646904..ee54192e3 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -30,8 +30,8 @@ msgstr ""
"Report-Msgid-Bugs-To: https://bugs.gnucash.org/enter_bug."
"cgi?product=GnuCash&component=Translations\n"
"POT-Creation-Date: 2021-04-16 23:36+0200\n"
-"PO-Revision-Date: 2021-04-23 19:32+0000\n"
-"Last-Translator: Thomas Jungers <thomasjungers at gmail.com>\n"
+"PO-Revision-Date: 2021-04-24 06:10+0000\n"
+"Last-Translator: Christopher Lam <christopher.lck at gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/gnucash/gnucash/"
"fr/>\n"
"Language: fr\n"
@@ -8903,9 +8903,9 @@ msgid "_Rename"
msgstr "_Renuméroter"
#: gnucash/gnome-utils/dialog-tax-table.c:641
-#, fuzzy, c-format
+#, c-format
msgid "Tax table name \"%s\" already exists."
-msgstr "Ce produit existe déjà ."
+msgstr "Le nom de la table de taxation \"%s\" existe déjà ."
#: gnucash/gnome-utils/dialog-tax-table.c:665
#, c-format
commit ed486a58a45adcb90e6f1e5232b6d348bed83a4c
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Apr 24 15:44:08 2021 -0700
Fix duplicate trading accounts.
In many cases GnuCash would create a new trading account hierarchy
when one already existed because gnc_account_lookup_by_type_and_commodity
didn't check the account presented and didn't recurse down the
account hierarchy correctly.
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index b82180d07..d4b6b8215 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -3127,16 +3127,34 @@ gnc_account_lookup_by_type_and_commodity (Account* root,
gnc_commodity* commodity)
{
auto rpriv{GET_PRIVATE(root)};
+ if (rpriv->type == acctype &&
+ gnc_commodity_equiv(rpriv->commodity, commodity))
+ {
+ if (name)
+ {
+ if (strcmp(name, rpriv->accountName) == 0)
+ return root;
+ }
+ else
+ {
+ return root;
+ }
+ }
+
+ /* Nope. Make sure the types are compatible */
+ if (!xaccAccountTypesCompatible(rpriv->type, acctype))
+ return nullptr;
+
+ /* Recurse */
for (auto node = rpriv->children; node; node = node->next)
{
auto account{static_cast<Account*>(node->data)};
- if (xaccAccountGetType (account) == acctype &&
- gnc_commodity_equiv(xaccAccountGetCommodity (account), commodity))
{
- if (name && strcmp(name, xaccAccountGetName(account)))
- continue; //name doesn't match so skip this one
-
- return account;
+ auto child{gnc_account_lookup_by_type_and_commodity(account, name,
+ acctype,
+ commodity)};
+ if (child)
+ return child;
}
}
return nullptr;
commit 2258e7a44ea550c709d9c429a973d66add31e5ec
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Apr 24 15:42:01 2021 -0700
xaccAccountTypes was backwards
vs. the documentation. The unit tests and dialog-account were similarly
backwards, but the use in gnucash/import-export/ofx followed the docs.
diff --git a/gnucash/gnome-utils/dialog-account.c b/gnucash/gnome-utils/dialog-account.c
index 43f66a78a..508e191db 100644
--- a/gnucash/gnome-utils/dialog-account.c
+++ b/gnucash/gnome-utils/dialog-account.c
@@ -589,7 +589,7 @@ make_children_compatible (AccountWindow *aw)
account = aw_get_account (aw);
g_return_if_fail (account);
- if (xaccAccountTypesCompatible (xaccAccountGetType (account), aw->type))
+ if (xaccAccountTypesCompatible (aw->type, xaccAccountGetType (account)))
return;
set_children_types (account, aw->type);
@@ -709,7 +709,7 @@ verify_children_compatible (AccountWindow *aw)
if (!account)
return FALSE;
- if (xaccAccountTypesCompatible (xaccAccountGetType (account), aw->type))
+ if (xaccAccountTypesCompatible (aw->type, xaccAccountGetType (account)))
return TRUE;
if (gnc_account_n_children(account) == 0)
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index f820cbdba..b82180d07 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -4509,8 +4509,17 @@ gboolean
xaccAccountTypesCompatible (GNCAccountType parent_type,
GNCAccountType child_type)
{
- return ((xaccParentAccountTypesCompatibleWith (parent_type) &
- (1 << child_type))
+ /* ACCT_TYPE_NONE isn't compatible with anything, even ACCT_TYPE_NONE. */
+ if (parent_type == ACCT_TYPE_NONE || child_type == ACCT_TYPE_NONE)
+ return FALSE;
+
+ /* ACCT_TYPE_ROOT can't have a parent account, and asking will raise
+ * an error. */
+ if (child_type == ACCT_TYPE_ROOT)
+ return FALSE;
+
+ return ((xaccParentAccountTypesCompatibleWith (child_type) &
+ (1 << parent_type))
!= 0);
}
diff --git a/libgnucash/engine/test/utest-Account.cpp b/libgnucash/engine/test/utest-Account.cpp
index 30cb13723..35f411322 100644
--- a/libgnucash/engine/test/utest-Account.cpp
+++ b/libgnucash/engine/test/utest-Account.cpp
@@ -2251,9 +2251,8 @@ test_xaccAccountType_Compatibility (void)
auto check2 = test_error_struct_new(logdomain, loglevel, msg2);
gint loghandler;
- for (type = ACCT_TYPE_BANK; type < NUM_ACCOUNT_TYPES; type = ++type)
+ for (type = ACCT_TYPE_BANK; type < NUM_ACCOUNT_TYPES; ++type)
{
- GNCAccountType child;
if (type == ACCT_TYPE_ROOT)
{
loghandler = g_log_set_handler (logdomain, loglevel,
@@ -2278,11 +2277,11 @@ test_xaccAccountType_Compatibility (void)
g_assert_cmpint (compat, == , equity_compat);
else if (type == ACCT_TYPE_TRADING)
g_assert_cmpint (compat, == , trading_compat);
- for (child = ACCT_TYPE_NONE; child < ACCT_TYPE_LAST; child = ++child)
- if (1 << child & compat)
- g_assert (xaccAccountTypesCompatible (type, child));
+ for (auto parent = ACCT_TYPE_NONE; parent < ACCT_TYPE_LAST; ++parent)
+ if (1 << parent & compat)
+ g_assert (xaccAccountTypesCompatible (parent, type));
else
- g_assert (!xaccAccountTypesCompatible (type, child));
+ g_assert (!xaccAccountTypesCompatible (parent, type));
compat = xaccAccountTypesCompatibleWith (type);
if (type <= ACCT_TYPE_LIABILITY ||
Summary of changes:
.gitignore | 1 +
bindings/guile/test/test-engine-extras.scm | 20 +-
borrowed/chartjs/Chart.bundle.js | 7432 ++++++++++++--------
borrowed/chartjs/Chart.bundle.min.js | 6 +-
borrowed/chartjs/Chart.css | 0
borrowed/chartjs/Chart.js | 7382 +++++++++++--------
borrowed/chartjs/Chart.min.css | 0
borrowed/chartjs/Chart.min.js | 6 +-
borrowed/chartjs/LICENSE.md | 0
borrowed/chartjs/README.md | 32 +
.../chartjs/samples/scales/time/financial.html | 125 +-
borrowed/chartjs/samples/scriptable/line.html | 20 +-
borrowed/chartjs/samples/scriptable/radar.html | 26 +-
gnucash/gnome-utils/dialog-account.c | 6 +-
gnucash/gnome-utils/dialog-doclink-utils.c | 2 +-
gnucash/gnome-utils/gnc-splash.c | 13 +-
gnucash/gnome-utils/gnc-window.c | 15 +-
gnucash/gnome/gnc-plugin-page-register.c | 52 +-
gnucash/gnome/gnc-split-reg.c | 4 +-
gnucash/gtkbuilder/dialog-sx.glade | 2 +-
gnucash/register/ledger-core/split-register.c | 2 +
gnucash/register/register-gnome/combocell-gnome.c | 16 +-
gnucash/report/options-utilities.scm | 14 +-
gnucash/report/report-core.scm | 10 +-
gnucash/report/report-utilities.scm | 5 +-
gnucash/report/reports/CMakeLists.txt | 1 +
gnucash/report/reports/standard/balsheet-pnl.scm | 10 +-
.../report/reports/standard/ifrs-cost-basis.scm | 436 ++
.../reports/standard/income-gst-statement.scm | 18 +-
.../report/reports/standard/test/CMakeLists.txt | 1 +
.../reports/standard/test/test-ifrs-cost-basis.scm | 357 +
.../report/reports/standard/test/test-register.scm | 20 +-
gnucash/report/test/test-report.scm | 16 +
libgnucash/engine/Account.cpp | 30 +-
libgnucash/engine/Account.h | 24 +-
libgnucash/engine/Scrub.c | 310 +-
libgnucash/engine/gnc-pricedb.c | 77 +-
libgnucash/engine/test/utest-Account.cpp | 11 +-
po/POTFILES.in | 1 +
po/el.po | 53 +-
po/es.po | 76 +-
po/fr.po | 1157 +--
po/glossary/el.po | 35 +-
po/glossary/fr.po | 15 +-
po/glossary/sv.po | 99 +-
po/glossary/tr.po | 21 +-
po/glossary/zh_CN.po | 8 +-
po/he.po | 16 +-
po/hr.po | 191 +-
po/it.po | 242 +-
po/tr.po | 61 +-
po/zh_CN.po | 1405 ++--
util/ci/actions/archlinux-test/Dockerfile | 8 +-
53 files changed, 11766 insertions(+), 8124 deletions(-)
mode change 100644 => 100755 borrowed/chartjs/Chart.bundle.js
mode change 100644 => 100755 borrowed/chartjs/Chart.bundle.min.js
mode change 100644 => 100755 borrowed/chartjs/Chart.css
mode change 100644 => 100755 borrowed/chartjs/Chart.js
mode change 100644 => 100755 borrowed/chartjs/Chart.min.css
mode change 100644 => 100755 borrowed/chartjs/Chart.min.js
mode change 100644 => 100755 borrowed/chartjs/LICENSE.md
create mode 100755 borrowed/chartjs/README.md
create mode 100644 gnucash/report/reports/standard/ifrs-cost-basis.scm
create mode 100644 gnucash/report/reports/standard/test/test-ifrs-cost-basis.scm
More information about the gnucash-changes
mailing list