/*! * chartjs-plugin-datalabels v2.0.0 * https://chartjs-plugin-datalabels.netlify.app * (c) 2017-2021 chartjs-plugin-datalabels contributors * Released under the MIT license */ ! function (t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("chart.js/helpers"), require("chart.js")) : "function" == typeof define && define.amd ? define(["chart.js/helpers", "chart.js"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).ChartDataLabels = e(t.Chart.helpers, t.Chart) }(this, (function (t, e) { "use strict"; var r = function () { if ("undefined" != typeof window) { if (window.devicePixelRatio) return window.devicePixelRatio; var t = window.screen; if (t) return (t.deviceXDPI || 1) / (t.logicalXDPI || 1) } return 1 }(), a = function (e) { var r, a = []; for (e = [].concat(e); e.length;) "string" == typeof (r = e.pop()) ? a.unshift.apply(a, r.split("\n")) : Array.isArray(r) ? e.push.apply(e, r) : t.isNullOrUndef(e) || a.unshift("" + r); return a }, o = function (t, e, r) { var a, o = [].concat(e), n = o.length, i = t.font, l = 0; for (t.font = r.string, a = 0; a < n; ++a) l = Math.max(t.measureText(o[a]).width, l); return t.font = i, { height: n * r.lineHeight, width: l } }, n = function (t, e, r) { return Math.max(t, Math.min(e, r)) }, i = function (t, e) { var r, a, o, n, i = t.slice(), l = []; for (r = 0, o = e.length; r < o; ++r) n = e[r], -1 === (a = i.indexOf(n)) ? l.push([n, 1]) : i.splice(a, 1); for (r = 0, o = i.length; r < o; ++r) l.push([i[r], -1]); return l }; function l(t, e) { var r = e.x, a = e.y; if (null === r) return { x: 0, y: -1 }; if (null === a) return { x: 1, y: 0 }; var o = t.x - r, n = t.y - a, i = Math.sqrt(o * o + n * n); return { x: i ? o / i : 0, y: i ? n / i : -1 } } function s(t, e, r) { var a = 0; return t < r.left ? a |= 1 : t > r.right && (a |= 2), e < r.top ? a |= 8 : e > r.bottom && (a |= 4), a } function u(t, e) { var r, a, o = e.anchor, n = t; return e.clamp && (n = function (t, e) { for (var r, a, o, n = t.x0, i = t.y0, l = t.x1, u = t.y1, d = s(n, i, e), c = s(l, u, e); d | c && !(d & c);) 8 & (r = d || c) ? (a = n + (l - n) * (e.top - i) / (u - i), o = e.top) : 4 & r ? (a = n + (l - n) * (e.bottom - i) / (u - i), o = e.bottom) : 2 & r ? (o = i + (u - i) * (e.right - n) / (l - n), a = e.right) : 1 & r && (o = i + (u - i) * (e.left - n) / (l - n), a = e.left), r === d ? d = s(n = a, i = o, e) : c = s(l = a, u = o, e); return { x0: n, x1: l, y0: i, y1: u } }(n, e.area)), "start" === o ? (r = n.x0, a = n.y0) : "end" === o ? (r = n.x1, a = n.y1) : (r = (n.x0 + n.x1) / 2, a = (n.y0 + n.y1) / 2), function (t, e, r, a, o) { switch (o) { case "center": r = a = 0; break; case "bottom": r = 0, a = 1; break; case "right": r = 1, a = 0; break; case "left": r = -1, a = 0; break; case "top": r = 0, a = -1; break; case "start": r = -r, a = -a; break; case "end": break; default: o *= Math.PI / 180, r = Math.cos(o), a = Math.sin(o) } return { x: t, y: e, vx: r, vy: a } }(r, a, t.vx, t.vy, e.align) } var d = function (t, e) { var r = (t.startAngle + t.endAngle) / 2, a = Math.cos(r), o = Math.sin(r), n = t.innerRadius, i = t.outerRadius; return u({ x0: t.x + a * n, y0: t.y + o * n, x1: t.x + a * i, y1: t.y + o * i, vx: a, vy: o }, e) }, c = function (t, e) { var r = l(t, e.origin), a = r.x * t.options.radius, o = r.y * t.options.radius; return u({ x0: t.x - a, y0: t.y - o, x1: t.x + a, y1: t.y + o, vx: r.x, vy: r.y }, e) }, h = function (t, e) { var r = l(t, e.origin), a = t.x, o = t.y, n = 0, i = 0; return t.horizontal ? (a = Math.min(t.x, t.base), n = Math.abs(t.base - t.x)) : (o = Math.min(t.y, t.base), i = Math.abs(t.base - t.y)), u({ x0: a, y0: o + i, x1: a + n, y1: o, vx: r.x, vy: r.y }, e) }, f = function (t, e) { var r = l(t, e.origin); return u({ x0: t.x, y0: t.y, x1: t.x, y1: t.y, vx: r.x, vy: r.y }, e) }, x = function (t) { return Math.round(t * r) / r }; function y(t, e) { var r = e.chart.getDatasetMeta(e.datasetIndex).vScale; if (!r) return null; if (void 0 !== r.xCenter && void 0 !== r.yCenter) return { x: r.xCenter, y: r.yCenter }; var a = r.getBasePixel(); return t.horizontal ? { x: a, y: null } : { x: null, y: a } } function v(t, e, r) { var a = r.backgroundColor, o = r.borderColor, n = r.borderWidth; (a || o && n) && (t.beginPath(), function (t, e, r, a, o, n) { var i = Math.PI / 2; if (n) { var l = Math.min(n, o / 2, a / 2), s = e + l, u = r + l, d = e + a - l, c = r + o - l; t.moveTo(e, u), s < d && u < c ? (t.arc(s, u, l, -Math.PI, -i), t.arc(d, u, l, -i, 0), t.arc(d, c, l, 0, i), t.arc(s, c, l, i, Math.PI)) : s < d ? (t.moveTo(s, r), t.arc(d, u, l, -i, i), t.arc(s, u, l, i, Math.PI + i)) : u < c ? (t.arc(s, u, l, -Math.PI, 0), t.arc(s, c, l, 0, Math.PI)) : t.arc(s, u, l, -Math.PI, Math.PI), t.closePath(), t.moveTo(e, r) } else t.rect(e, r, a, o) }(t, x(e.x) + n / 2, x(e.y) + n / 2, x(e.w) - n, x(e.h) - n, r.borderRadius), t.closePath(), a && (t.fillStyle = a, t.fill()), o && n && (t.strokeStyle = o, t.lineWidth = n, t.lineJoin = "miter", t.stroke())) } function b(t, e, r) { var a = t.shadowBlur, o = r.stroked, n = x(r.x), i = x(r.y), l = x(r.w); o && t.strokeText(e, n, i, l), r.filled && (a && o && (t.shadowBlur = 0), t.fillText(e, n, i, l), a && o && (t.shadowBlur = a)) } var _ = function (t, e, r, a) { var o = this; o._config = t, o._index = a, o._model = null, o._rects = null, o._ctx = e, o._el = r }; t.merge(_.prototype, { _modelize: function (r, a, n, i) { var l, s = this, u = s._index, x = t.toFont(t.resolve([n.font, {}], i, u)), v = t.resolve([n.color, e.defaults.color], i, u); return { align: t.resolve([n.align, "center"], i, u), anchor: t.resolve([n.anchor, "center"], i, u), area: i.chart.chartArea, backgroundColor: t.resolve([n.backgroundColor, null], i, u), borderColor: t.resolve([n.borderColor, null], i, u), borderRadius: t.resolve([n.borderRadius, 0], i, u), borderWidth: t.resolve([n.borderWidth, 0], i, u), clamp: t.resolve([n.clamp, !1], i, u), clip: t.resolve([n.clip, !1], i, u), color: v, display: r, font: x, lines: a, offset: t.resolve([n.offset, 0], i, u), opacity: t.resolve([n.opacity, 1], i, u), origin: y(s._el, i), padding: t.toPadding(t.resolve([n.padding, 0], i, u)), positioner: (l = s._el, l instanceof e.ArcElement ? d : l instanceof e.PointElement ? c : l instanceof e.BarElement ? h : f), rotation: t.resolve([n.rotation, 0], i, u) * (Math.PI / 180), size: o(s._ctx, a, x), textAlign: t.resolve([n.textAlign, "start"], i, u), textShadowBlur: t.resolve([n.textShadowBlur, 0], i, u), textShadowColor: t.resolve([n.textShadowColor, v], i, u), textStrokeColor: t.resolve([n.textStrokeColor, v], i, u), textStrokeWidth: t.resolve([n.textStrokeWidth, 0], i, u) } }, update: function (e) { var r, o, n, i = this, l = null, s = null, u = i._index, d = i._config, c = t.resolve([d.display, !0], e, u); c && (r = e.dataset.data[u], o = t.valueOrDefault(t.callback(d.formatter, [r, e]), r), (n = t.isNullOrUndef(o) ? [] : a(o)).length && (s = function (t) { var e = t.borderWidth || 0, r = t.padding, a = t.size.height, o = t.size.width, n = -o / 2, i = -a / 2; return { frame: { x: n - r.left - e, y: i - r.top - e, w: o + r.width + 2 * e, h: a + r.height + 2 * e }, text: { x: n, y: i, w: o, h: a } } }(l = i._modelize(c, n, d, e)))), i._model = l, i._rects = s }, geometry: function () { return this._rects ? this._rects.frame : {} }, rotation: function () { return this._model ? this._model.rotation : 0 }, visible: function () { return this._model && this._model.opacity }, model: function () { return this._model }, draw: function (t, e) { var r, a = t.ctx, o = this._model, i = this._rects; this.visible() && (a.save(), o.clip && (r = o.area, a.beginPath(), a.rect(r.left, r.top, r.right - r.left, r.bottom - r.top), a.clip()), a.globalAlpha = n(0, o.opacity, 1), a.translate(x(e.x), x(e.y)), a.rotate(o.rotation), v(a, i.frame, o), function (t, e, r, a) { var o, n = a.textAlign, i = a.color, l = !!i, s = a.font, u = e.length, d = a.textStrokeColor, c = a.textStrokeWidth, h = d && c; if (u && (l || h)) for (r = function (t, e, r) { var a = r.lineHeight, o = t.w, n = t.x; return "center" === e ? n += o / 2 : "end" !== e && "right" !== e || (n += o), { h: a, w: o, x: n, y: t.y + a / 2 } }(r, n, s), t.font = s.string, t.textAlign = n, t.textBaseline = "middle", t.shadowBlur = a.textShadowBlur, t.shadowColor = a.textShadowColor, l && (t.fillStyle = i), h && (t.lineJoin = "round", t.lineWidth = c, t.strokeStyle = d), o = 0, u = e.length; o < u; ++o) b(t, e[o], { stroked: h, filled: l, w: r.w, x: r.x, y: r.y + r.h * o }) }(a, o.lines, i.text, o), a.restore()) } }); var p = Number.MIN_SAFE_INTEGER || -9007199254740991, g = Number.MAX_SAFE_INTEGER || 9007199254740991; function m(t, e, r) { var a = Math.cos(r), o = Math.sin(r), n = e.x, i = e.y; return { x: n + a * (t.x - n) - o * (t.y - i), y: i + o * (t.x - n) + a * (t.y - i) } } function w(t, e) { var r, a, o, n, i, l = g, s = p, u = e.origin; for (r = 0; r < t.length; ++r) o = (a = t[r]).x - u.x, n = a.y - u.y, i = e.vx * o + e.vy * n, l = Math.min(l, i), s = Math.max(s, i); return { min: l, max: s } } function M(t, e) { var r = e.x - t.x, a = e.y - t.y, o = Math.sqrt(r * r + a * a); return { vx: (e.x - t.x) / o, vy: (e.y - t.y) / o, origin: t, ln: o } } var k = function () { this._rotation = 0, this._rect = { x: 0, y: 0, w: 0, h: 0 } }; function $(t, e, r) { var a = e.positioner(t, e), o = a.vx, n = a.vy; if (!o && !n) return { x: a.x, y: a.y }; var i = r.w, l = r.h, s = e.rotation, u = Math.abs(i / 2 * Math.cos(s)) + Math.abs(l / 2 * Math.sin(s)), d = Math.abs(i / 2 * Math.sin(s)) + Math.abs(l / 2 * Math.cos(s)), c = 1 / Math.max(Math.abs(o), Math.abs(n)); return u *= o * c, d *= n * c, u += e.offset * o, d += e.offset * n, { x: a.x + u, y: a.y + d } } t.merge(k.prototype, { center: function () { var t = this._rect; return { x: t.x + t.w / 2, y: t.y + t.h / 2 } }, update: function (t, e, r) { this._rotation = r, this._rect = { x: e.x + t.x, y: e.y + t.y, w: e.w, h: e.h } }, contains: function (t) { var e = this, r = e._rect; return !((t = m(t, e.center(), -e._rotation)).x < r.x - 1 || t.y < r.y - 1 || t.x > r.x + r.w + 2 || t.y > r.y + r.h + 2) }, intersects: function (t) { var e, r, a, o = this._points(), n = t._points(), i = [M(o[0], o[1]), M(o[0], o[3])]; for (this._rotation !== t._rotation && i.push(M(n[0], n[1]), M(n[0], n[3])), e = 0; e < i.length; ++e) if (r = w(o, i[e]), a = w(n, i[e]), r.max < a.min || a.max < r.min) return !1; return !0 }, _points: function () { var t = this, e = t._rect, r = t._rotation, a = t.center(); return [m({ x: e.x, y: e.y }, a, r), m({ x: e.x + e.w, y: e.y }, a, r), m({ x: e.x + e.w, y: e.y + e.h }, a, r), m({ x: e.x, y: e.y + e.h }, a, r)] } }); var C = { prepare: function (t) { var e, r, a, o, n, i = []; for (e = 0, a = t.length; e < a; ++e) for (r = 0, o = t[e].length; r < o; ++r) n = t[e][r], i.push(n), n.$layout = { _box: new k, _hidable: !1, _visible: !0, _set: e, _idx: r }; return i.sort((function (t, e) { var r = t.$layout, a = e.$layout; return r._idx === a._idx ? a._set - r._set : a._idx - r._idx })), this.update(i), i }, update: function (t) { var e, r, a, o, n, i = !1; for (e = 0, r = t.length; e < r; ++e) o = (a = t[e]).model(), (n = a.$layout)._hidable = o && "auto" === o.display, n._visible = a.visible(), i |= n._hidable; i && function (t) { var e, r, a, o, n, i, l; for (e = 0, r = t.length; e < r; ++e)(o = (a = t[e]).$layout)._visible && (l = new Proxy(a._el, { get: (t, e) => t.getProps([e], !0)[e] }), n = a.geometry(), i = $(l, a.model(), n), o._box.update(i, n, a.rotation())); (function (t, e) { var r, a, o, n; for (r = t.length - 1; r >= 0; --r) for (o = t[r].$layout, a = r - 1; a >= 0 && o._visible; --a)(n = t[a].$layout)._visible && o._box.intersects(n._box) && e(o, n) })(t, (function (t, e) { var r = t._hidable, a = e._hidable; r && a || a ? e._visible = !1 : r && (t._visible = !1) })) }(t) }, lookup: function (t, e) { var r, a; for (r = t.length - 1; r >= 0; --r) if ((a = t[r].$layout) && a._visible && a._box.contains(e)) return t[r]; return null }, draw: function (t, e) { var r, a, o, n, i, l; for (r = 0, a = e.length; r < a; ++r)(n = (o = e[r]).$layout)._visible && (i = o.geometry(), l = $(o._el, o.model(), i), n._box.update(l, i, o.rotation()), o.draw(t, l)) } }, P = "$default"; function S(e, r, a) { if (r) { var o, n = a.$context, i = a.$groups; r[i._set] && (o = r[i._set][i._key]) && !0 === t.callback(o, [n]) && (e.$datalabels._dirty = !0, a.update(n)) } } function I(t, e) { var r, a, o = t.$datalabels, n = o._listeners; if (n.enter || n.leave) { if ("mousemove" === e.type) a = C.lookup(o._labels, e); else if ("mouseout" !== e.type) return; r = o._hovered, o._hovered = a, function (t, e, r, a) { var o, n; (r || a) && (r ? a ? r !== a && (n = o = !0) : n = !0 : o = !0, n && S(t, e.leave, r), o && S(t, e.enter, a)) }(t, n, r, a) } } return { id: "datalabels", defaults: { align: "center", anchor: "center", backgroundColor: null, borderColor: null, borderRadius: 0, borderWidth: 0, clamp: !1, clip: !1, color: void 0, display: !0, font: { family: void 0, lineHeight: 1.2, size: void 0, style: void 0, weight: null }, formatter: function (e) { if (t.isNullOrUndef(e)) return null; var r, a, o, n = e; if (t.isObject(e)) if (t.isNullOrUndef(e.label)) if (t.isNullOrUndef(e.r)) for (n = "", o = 0, a = (r = Object.keys(e)).length; o < a; ++o) n += (0 !== o ? ", " : "") + r[o] + ": " + e[r[o]]; else n = e.r; else n = e.label; return "" + n }, labels: void 0, listeners: {}, offset: 4, opacity: 1, padding: { top: 4, right: 4, bottom: 4, left: 4 }, rotation: 0, textAlign: "start", textStrokeColor: void 0, textStrokeWidth: 0, textShadowBlur: 0, textShadowColor: void 0 }, beforeInit: function (t) { t.$datalabels = { _actives: [] } }, beforeUpdate: function (t) { var e = t.$datalabels; e._listened = !1, e._listeners = {}, e._datasets = [], e._labels = [] }, afterDatasetUpdate: function (e, r, a) { var o, n, i, l, s, u, d, c, h = r.index, f = e.$datalabels, x = f._datasets[h] = [], y = e.isDatasetVisible(h), v = e.data.datasets[h], b = function (e, r) { var a, o, n, i = e.datalabels, l = []; return !1 === i ? null : (!0 === i && (i = {}), r = t.merge({}, [r, i]), o = r.labels || {}, n = Object.keys(o), delete r.labels, n.length ? n.forEach((function (e) { o[e] && l.push(t.merge({}, [r, o[e], { _key: e }])) })) : l.push(r), a = l.reduce((function (e, r) { return t.each(r.listeners || {}, (function (t, a) { e[a] = e[a] || {}, e[a][r._key || P] = t })), delete r.listeners, e }), {}), { labels: l, listeners: a }) }(v, a), p = r.meta.data || [], g = e.ctx; for (g.save(), o = 0, i = p.length; o < i; ++o) if ((d = p[o]).$datalabels = [], y && d && e.getDataVisibility(o) && !d.skip) for (n = 0, l = b.labels.length; n < l; ++n) u = (s = b.labels[n])._key, (c = new _(s, g, d, o)).$groups = { _set: h, _key: u || P }, c.$context = { active: !1, chart: e, dataIndex: o, dataset: v, datasetIndex: h }, c.update(c.$context), d.$datalabels.push(c), x.push(c); g.restore(), t.merge(f._listeners, b.listeners, { merger: function (t, e, a) { e[t] = e[t] || {}, e[t][r.index] = a[t], f._listened = !0 } }) }, afterUpdate: function (t, e) { t.$datalabels._labels = C.prepare(t.$datalabels._datasets, e) }, afterDatasetsDraw: function (t) { C.draw(t, t.$datalabels._labels) }, beforeEvent: function (t, e) { if (t.$datalabels._listened) { var r = e.event; switch (r.type) { case "mousemove": case "mouseout": I(t, r); break; case "click": ! function (t, e) { var r = t.$datalabels, a = r._listeners.click, o = a && C.lookup(r._labels, e); o && S(t, a, o) }(t, r) } } }, afterEvent: function (t) { var e, r, a, o, n, l, s, u = t.$datalabels, d = u._actives, c = u._actives = t.getActiveElements(), h = i(d, c); for (e = 0, r = h.length; e < r; ++e) if ((n = h[e])[1]) for (a = 0, o = (s = n[0].element.$datalabels || []).length; a < o; ++a)(l = s[a]).$context.active = 1 === n[1], l.update(l.$context); (u._dirty || h.length) && (C.update(u._labels), t.render()), delete u._dirty } } }));