l*r?l/i:u/r:u*r0}_computeGridLineItems(t){const e=this.axis,i=this.chart,r=this.options,{grid:a,position:o,border:l}=r,u=a.offset,d=this.isHorizontal(),p=this.ticks.length+(u?1:0),_=getTickMarkLength(a),y=[],w=l.setContext(this.getContext()),v=w.display?w.width:0,E=v/2,x=function(N){return _alignPixel(i,N,v)};let S,$,k,A,I,C,R,W,K,Y,q,J;if(o==="top")S=x(this.bottom),C=this.bottom-_,W=S-E,Y=x(t.top)+E,J=t.bottom;else if(o==="bottom")S=x(this.top),Y=t.top,J=x(t.bottom)-E,C=S+E,W=this.top+_;else if(o==="left")S=x(this.right),I=this.right-_,R=S-E,K=x(t.left)+E,q=t.right;else if(o==="right")S=x(this.left),K=t.left,q=x(t.right)-E,I=S+E,R=this.left+_;else if(e==="x"){if(o==="center")S=x((t.top+t.bottom)/2+.5);else if(isObject(o)){const N=Object.keys(o)[0],V=o[N];S=x(this.chart.scales[N].getPixelForValue(V))}Y=t.top,J=t.bottom,C=S+E,W=C+_}else if(e==="y"){if(o==="center")S=x((t.left+t.right)/2);else if(isObject(o)){const N=Object.keys(o)[0],V=o[N];S=x(this.chart.scales[N].getPixelForValue(V))}I=S-E,R=I-_,K=t.left,q=t.right}const nt=valueOrDefault(r.ticks.maxTicksLimit,p),M=Math.max(1,Math.ceil(p/nt));for($=0;$0&&(Q-=rt/2);break}lt={left:Q,top:tt,width:rt+dt.width,height:st+dt.height,color:M.backdropColor}}E.push({label:k,font:W,textOffset:q,options:{rotation:v,color:V,strokeColor:H,strokeWidth:X,textAlign:B,textBaseline:J,translation:[A,I],backdrop:lt}})}return E}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-toRadians(this.labelRotation))return t==="top"?"left":"right";let r="center";return e.align==="start"?r="left":e.align==="end"?r="right":e.align==="inner"&&(r="inner"),r}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:r,padding:a}}=this.options,o=this._getLabelSizes(),l=t+a,u=o.widest.width;let d,m;return e==="left"?r?(m=this.right+a,i==="near"?d="left":i==="center"?(d="center",m+=u/2):(d="right",m+=u)):(m=this.right-l,i==="near"?d="right":i==="center"?(d="center",m-=u/2):(d="left",m=this.left)):e==="right"?r?(m=this.left+a,i==="near"?d="right":i==="center"?(d="center",m-=u/2):(d="left",m-=u)):(m=this.left+l,i==="near"?d="left":i==="center"?(d="center",m+=u/2):(d="right",m=this.right)):d="right",{textAlign:d,x:m}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;if(e==="left"||e==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(e==="top"||e==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:r,width:a,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,r,a,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const r=this.ticks.findIndex(a=>a.value===t);return r>=0?e.setContext(this.getContext(r)).lineWidth:0}drawGrid(t){const e=this.options.grid,i=this.ctx,r=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let a,o;const l=(u,d,m)=>{!m.width||!m.color||(i.save(),i.lineWidth=m.width,i.strokeStyle=m.color,i.setLineDash(m.borderDash||[]),i.lineDashOffset=m.borderDashOffset,i.beginPath(),i.moveTo(u.x,u.y),i.lineTo(d.x,d.y),i.stroke(),i.restore())};if(e.display)for(a=0,o=r.length;a{this.draw(a)}}]:[{z:i,draw:a=>{this.drawBackground(),this.drawGrid(a),this.drawTitle()}},{z:r,draw:()=>{this.drawBorder()}},{z:e,draw:a=>{this.drawLabels(a)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",r=[];let a,o;for(a=0,o=e.length;a{const i=e.split("."),r=i.pop(),a=[n].concat(i).join("."),o=t[e].split("."),l=o.pop(),u=o.join(".");defaults.route(a,r,u,l)})}function isIChartComponent(n){return"id"in n&&"defaults"in n}class Registry{constructor(){this.controllers=new TypedRegistry(DatasetController,"datasets",!0),this.elements=new TypedRegistry(Element$1,"elements"),this.plugins=new TypedRegistry(Object,"plugins"),this.scales=new TypedRegistry(Scale,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(r=>{const a=i||this._getRegistryForType(r);i||a.isForType(r)||a===this.plugins&&r.id?this._exec(t,a,r):each(r,o=>{const l=i||this._getRegistryForType(o);this._exec(t,l,o)})})}_exec(t,e,i){const r=_capitalize(t);callback(i["before"+r],[],i),e[t](i),callback(i["after"+r],[],i)}_getRegistryForType(t){for(let e=0;ea.filter(l=>!o.some(u=>l.plugin.id===u.plugin.id));this._notify(r(e,i),t,"stop"),this._notify(r(i,e),t,"start")}}function allPlugins(n){const t={},e=[],i=Object.keys(registry.plugins.items);for(let a=0;a1&&idMatchesAxis(n[0].toLowerCase());if(i)return i}throw new Error(`Cannot determine type of '${n}' axis. Please provide 'axis' or 'position' option.`)}function getAxisFromDataset(n,t,e){if(e[t+"AxisID"]===n)return{axis:t}}function retrieveAxisFromDatasets(n,t){if(t.data&&t.data.datasets){const e=t.data.datasets.filter(i=>i.xAxisID===n||i.yAxisID===n);if(e.length)return getAxisFromDataset(n,"x",e[0])||getAxisFromDataset(n,"y",e[0])}return{}}function mergeScaleConfig(n,t){const e=overrides[n.type]||{scales:{}},i=t.scales||{},r=getIndexAxis(n.type,t),a=Object.create(null);return Object.keys(i).forEach(o=>{const l=i[o];if(!isObject(l))return console.error(`Invalid scale configuration for scale: ${o}`);if(l._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${o}`);const u=determineAxis(o,l,retrieveAxisFromDatasets(o,n),defaults.scales[l.type]),d=getDefaultScaleIDFromAxis(u,r),m=e.scales||{};a[o]=mergeIf(Object.create(null),[{axis:u},l,m[u],m[d]])}),n.data.datasets.forEach(o=>{const l=o.type||n.type,u=o.indexAxis||getIndexAxis(l,t),m=(overrides[l]||{}).scales||{};Object.keys(m).forEach(p=>{const _=getAxisFromDefaultScaleID(p,u),y=o[_+"AxisID"]||_;a[y]=a[y]||Object.create(null),mergeIf(a[y],[{axis:_},i[y],m[p]])})}),Object.keys(a).forEach(o=>{const l=a[o];mergeIf(l,[defaults.scales[l.type],defaults.scale])}),a}function initOptions(n){const t=n.options||(n.options={});t.plugins=valueOrDefault(t.plugins,{}),t.scales=mergeScaleConfig(n,t)}function initData(n){return n=n||{},n.datasets=n.datasets||[],n.labels=n.labels||[],n}function initConfig(n){return n=n||{},n.data=initData(n.data),initOptions(n),n}const keyCache=new Map,keysCached=new Set;function cachedKeys(n,t){let e=keyCache.get(n);return e||(e=t(),keyCache.set(n,e),keysCached.add(e)),e}const addIfFound=(n,t,e)=>{const i=resolveObjectKey(t,e);i!==void 0&&n.add(i)};class Config{constructor(t){this._config=initConfig(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=initData(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),initOptions(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return cachedKeys(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return cachedKeys(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return cachedKeys(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return cachedKeys(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const i=this._scopeCache;let r=i.get(t);return(!r||e)&&(r=new Map,i.set(t,r)),r}getOptionScopes(t,e,i){const{options:r,type:a}=this,o=this._cachedScopes(t,i),l=o.get(e);if(l)return l;const u=new Set;e.forEach(m=>{t&&(u.add(t),m.forEach(p=>addIfFound(u,t,p))),m.forEach(p=>addIfFound(u,r,p)),m.forEach(p=>addIfFound(u,overrides[a]||{},p)),m.forEach(p=>addIfFound(u,defaults,p)),m.forEach(p=>addIfFound(u,descriptors,p))});const d=Array.from(u);return d.length===0&&d.push(Object.create(null)),keysCached.has(e)&&o.set(e,d),d}chartOptionScopes(){const{options:t,type:e}=this;return[t,overrides[e]||{},defaults.datasets[e]||{},{type:e},defaults,descriptors]}resolveNamedOptions(t,e,i,r=[""]){const a={$shared:!0},{resolver:o,subPrefixes:l}=getResolver(this._resolverCache,t,r);let u=o;if(needContext(o,e)){a.$shared=!1,i=isFunction(i)?i():i;const d=this.createResolver(t,i,l);u=_attachContext(o,i,d)}for(const d of e)a[d]=u[d];return a}createResolver(t,e,i=[""],r){const{resolver:a}=getResolver(this._resolverCache,t,i);return isObject(e)?_attachContext(a,e,void 0,r):a}}function getResolver(n,t,e){let i=n.get(t);i||(i=new Map,n.set(t,i));const r=e.join();let a=i.get(r);return a||(a={resolver:_createResolver(t,e),subPrefixes:e.filter(l=>!l.toLowerCase().includes("hover"))},i.set(r,a)),a}const hasFunction=n=>isObject(n)&&Object.getOwnPropertyNames(n).some(t=>isFunction(n[t]));function needContext(n,t){const{isScriptable:e,isIndexable:i}=_descriptors(n);for(const r of t){const a=e(r),o=i(r),l=(o||a)&&n[r];if(a&&(isFunction(l)||hasFunction(l))||o&&isArray(l))return!0}return!1}var version="4.4.1";const KNOWN_POSITIONS=["top","bottom","left","right","chartArea"];function positionIsHorizontal(n,t){return n==="top"||n==="bottom"||KNOWN_POSITIONS.indexOf(n)===-1&&t==="x"}function compare2Level(n,t){return function(e,i){return e[n]===i[n]?e[t]-i[t]:e[n]-i[n]}}function onAnimationsComplete(n){const t=n.chart,e=t.options.animation;t.notifyPlugins("afterRender"),callback(e&&e.onComplete,[n],t)}function onAnimationProgress(n){const t=n.chart,e=t.options.animation;callback(e&&e.onProgress,[n],t)}function getCanvas(n){return _isDomSupported()&&typeof n=="string"?n=document.getElementById(n):n&&n.length&&(n=n[0]),n&&n.canvas&&(n=n.canvas),n}const instances={},getChart=n=>{const t=getCanvas(n);return Object.values(instances).filter(e=>e.canvas===t).pop()};function moveNumericKeys(n,t,e){const i=Object.keys(n);for(const r of i){const a=+r;if(a>=t){const o=n[r];delete n[r],(e>0||a>t)&&(n[a+e]=o)}}}function determineLastEvent(n,t,e,i){return!e||n.type==="mouseout"?null:i?t:n}function getSizeForArea(n,t,e){return n.options.clip?n[e]:t[e]}function getDatasetArea(n,t){const{xScale:e,yScale:i}=n;return e&&i?{left:getSizeForArea(e,t,"left"),right:getSizeForArea(e,t,"right"),top:getSizeForArea(i,t,"top"),bottom:getSizeForArea(i,t,"bottom")}:t}class Chart{static register(...t){registry.add(...t),invalidatePlugins()}static unregister(...t){registry.remove(...t),invalidatePlugins()}constructor(t,e){const i=this.config=new Config(e),r=getCanvas(t),a=getChart(r);if(a)throw new Error("Canvas is already in use. Chart with ID '"+a.id+"' must be destroyed before the canvas with ID '"+a.canvas.id+"' can be reused.");const o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||_detectPlatform(r)),this.platform.updateConfig(i);const l=this.platform.acquireContext(r,o.aspectRatio),u=l&&l.canvas,d=u&&u.height,m=u&&u.width;if(this.id=uid(),this.ctx=l,this.canvas=u,this.width=m,this.height=d,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new PluginService,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=debounce$2(p=>this.update(p),o.resizeDelay||0),this._dataChanges=[],instances[this.id]=this,!l||!u){console.error("Failed to create chart: can't acquire context from the given item");return}animator.listen(this,"complete",onAnimationsComplete),animator.listen(this,"progress",onAnimationProgress),this._initialize(),this.attached&&this.update()}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:r,_aspectRatio:a}=this;return isNullOrUndef(t)?e&&a?a:r?i/r:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return registry}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():retinaScale(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return clearCanvas(this.canvas,this.ctx),this}stop(){return animator.stop(this),this}resize(t,e){animator.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,r=this.canvas,a=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(r,t,e,a),l=i.devicePixelRatio||this.platform.getDevicePixelRatio(),u=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,retinaScale(this,l,!0)&&(this.notifyPlugins("resize",{size:o}),callback(i.onResize,[this,o],this),this.attached&&this._doResize(u)&&this.render())}ensureScalesHaveIDs(){const e=this.options.scales||{};each(e,(i,r)=>{i.id=r})}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,r=Object.keys(i).reduce((o,l)=>(o[l]=!1,o),{});let a=[];e&&(a=a.concat(Object.keys(e).map(o=>{const l=e[o],u=determineAxis(o,l),d=u==="r",m=u==="x";return{options:l,dposition:d?"chartArea":m?"bottom":"left",dtype:d?"radialLinear":m?"category":"linear"}}))),each(a,o=>{const l=o.options,u=l.id,d=determineAxis(u,l),m=valueOrDefault(l.type,o.dtype);(l.position===void 0||positionIsHorizontal(l.position,d)!==positionIsHorizontal(o.dposition))&&(l.position=o.dposition),r[u]=!0;let p=null;if(u in i&&i[u].type===m)p=i[u];else{const _=registry.getScale(m);p=new _({id:u,type:m,ctx:this.ctx,chart:this}),i[p.id]=p}p.init(l,t)}),each(r,(o,l)=>{o||delete i[l]}),each(i,o=>{layouts.configure(this,o,o.options),layouts.addBox(this,o)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((r,a)=>r.index-a.index),i>e){for(let r=e;re.length&&delete this._stacks,t.forEach((i,r)=>{e.filter(a=>a===i._dataset).length===0&&this._destroyDatasetMeta(r)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,r;for(this._removeUnreferencedMetasets(),i=0,r=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;const a=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let d=0,m=this.data.datasets.length;d{d.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(compare2Level("z","_idx"));const{_active:l,_lastEvent:u}=this;u?this._eventHandler(u,!0):l.length&&this._updateHoverStyles(l,l,!0),this.render()}_updateScales(){each(this.scales,t=>{layouts.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);(!setsEqual(e,i)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:r,count:a}of e){const o=i==="_removeElements"?-a:a;moveNumericKeys(t,r,o)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=a=>new Set(t.filter(o=>o[0]===a).map((o,l)=>l+","+o.splice(1).join(","))),r=i(0);for(let a=1;aa.split(",")).map(a=>({method:a[1],start:+a[2],count:+a[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;layouts.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],each(this.boxes,r=>{i&&r.position==="chartArea"||(r.configure&&r.configure(),this._layers.push(...r._layers()))},this),this._layers.forEach((r,a)=>{r._idx=a}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,i=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,r=!i.disabled,a=getDatasetArea(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};this.notifyPlugins("beforeDatasetDraw",o)!==!1&&(r&&clipArea(e,{left:i.left===!1?0:a.left-i.left,right:i.right===!1?this.width:a.right+i.right,top:i.top===!1?0:a.top-i.top,bottom:i.bottom===!1?this.height:a.bottom+i.bottom}),t.controller.draw(),r&&unclipArea(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return _isPointInArea(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,r){const a=Interaction.modes[e];return typeof a=="function"?a(this,t,i,r):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let r=i.filter(a=>a&&a._dataset===e).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(r)),r}getContext(){return this.$context||(this.$context=createContext(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return typeof i.hidden=="boolean"?!i.hidden:!e.hidden}setDatasetVisibility(t,e){const i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const r=i?"show":"hide",a=this.getDatasetMeta(t),o=a.controller._resolveAnimations(void 0,r);defined$1(e)?(a.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(a,{visible:i}),this.update(l=>l.datasetIndex===t?r:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),animator.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,a,o),t[a]=o},r=(a,o,l)=>{a.offsetX=o,a.offsetY=l,this._eventHandler(a)};each(this.options.events,a=>i(a,r))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(u,d)=>{e.addEventListener(this,u,d),t[u]=d},r=(u,d)=>{t[u]&&(e.removeEventListener(this,u,d),delete t[u])},a=(u,d)=>{this.canvas&&this.resize(u,d)};let o;const l=()=>{r("attach",l),this.attached=!0,this.resize(),i("resize",a),i("detach",o)};o=()=>{this.attached=!1,r("resize",a),this._stop(),this._resize(0,0),i("attach",l)},e.isAttached(this.canvas)?l():o()}unbindEvents(){each(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},each(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const r=i?"set":"remove";let a,o,l,u;for(e==="dataset"&&(a=this.getDatasetMeta(t[0].datasetIndex),a.controller["_"+r+"DatasetHoverStyle"]()),l=0,u=t.length;l{const l=this.getDatasetMeta(a);if(!l)throw new Error("No dataset found at index "+a);return{datasetIndex:a,element:l.data[o],index:o}});!_elementsEqual(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,i){const r=this.options.hover,a=(u,d)=>u.filter(m=>!d.some(p=>m.datasetIndex===p.datasetIndex&&m.index===p.index)),o=a(e,t),l=i?t:a(t,e);o.length&&this.updateHoverStyle(o,r.mode,!1),l.length&&r.mode&&this.updateHoverStyle(l,r.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},r=o=>(o.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",i,r)===!1)return;const a=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,r),(a||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:r=[],options:a}=this,o=e,l=this._getActiveElements(t,r,i,o),u=_isClickEvent(t),d=determineLastEvent(t,this._lastEvent,i,u);i&&(this._lastEvent=null,callback(a.onHover,[t,l,this],this),u&&callback(a.onClick,[t,l,this],this));const m=!_elementsEqual(l,r);return(m||e)&&(this._active=l,this._updateHoverStyles(l,r,e)),this._lastEvent=d,m}_getActiveElements(t,e,i,r){if(t.type==="mouseout")return[];if(!i)return e;const a=this.options.hover;return this.getElementsAtEventForMode(t,a.mode,a,r)}}F(Chart,"defaults",defaults),F(Chart,"instances",instances),F(Chart,"overrides",overrides),F(Chart,"registry",registry),F(Chart,"version",version),F(Chart,"getChart",getChart);function invalidatePlugins(){return each(Chart.instances,n=>n._plugins.invalidate())}function clipArc(n,t,e){const{startAngle:i,pixelMargin:r,x:a,y:o,outerRadius:l,innerRadius:u}=t;let d=r/l;n.beginPath(),n.arc(a,o,l,i-d,e+d),u>r?(d=r/u,n.arc(a,o,u,e+d,i-d,!0)):n.arc(a,o,r,e+HALF_PI,i-HALF_PI),n.closePath(),n.clip()}function toRadiusCorners(n){return _readValueToProps(n,["outerStart","outerEnd","innerStart","innerEnd"])}function parseBorderRadius$1(n,t,e,i){const r=toRadiusCorners(n.options.borderRadius),a=(e-t)/2,o=Math.min(a,i*t/2),l=u=>{const d=(e-Math.min(a,u))*i/2;return _limitValue(u,0,Math.min(a,d))};return{outerStart:l(r.outerStart),outerEnd:l(r.outerEnd),innerStart:_limitValue(r.innerStart,0,o),innerEnd:_limitValue(r.innerEnd,0,o)}}function rThetaToXY(n,t,e,i){return{x:e+n*Math.cos(t),y:i+n*Math.sin(t)}}function pathArc(n,t,e,i,r,a){const{x:o,y:l,startAngle:u,pixelMargin:d,innerRadius:m}=t,p=Math.max(t.outerRadius+i+e-d,0),_=m>0?m+i+e+d:0;let y=0;const w=r-u;if(i){const M=m>0?m-i:0,N=p>0?p-i:0,V=(M+N)/2,H=V!==0?w*V/(V+i):w;y=(w-H)/2}const v=Math.max(.001,w*p-e/PI)/p,E=(w-v)/2,x=u+E+y,S=r-E-y,{outerStart:$,outerEnd:k,innerStart:A,innerEnd:I}=parseBorderRadius$1(t,_,p,S-x),C=p-$,R=p-k,W=x+$/C,K=S-k/R,Y=_+A,q=_+I,J=x+A/Y,nt=S-I/q;if(n.beginPath(),a){const M=(W+K)/2;if(n.arc(o,l,p,W,M),n.arc(o,l,p,M,K),k>0){const X=rThetaToXY(R,K,o,l);n.arc(X.x,X.y,k,K,S+HALF_PI)}const N=rThetaToXY(q,S,o,l);if(n.lineTo(N.x,N.y),I>0){const X=rThetaToXY(q,nt,o,l);n.arc(X.x,X.y,I,S+HALF_PI,nt+Math.PI)}const V=(S-I/_+(x+A/_))/2;if(n.arc(o,l,_,S-I/_,V,!0),n.arc(o,l,_,V,x+A/_,!0),A>0){const X=rThetaToXY(Y,J,o,l);n.arc(X.x,X.y,A,J+Math.PI,x-HALF_PI)}const H=rThetaToXY(C,x,o,l);if(n.lineTo(H.x,H.y),$>0){const X=rThetaToXY(C,W,o,l);n.arc(X.x,X.y,$,x-HALF_PI,W)}}else{n.moveTo(o,l);const M=Math.cos(W)*p+o,N=Math.sin(W)*p+l;n.lineTo(M,N);const V=Math.cos(K)*p+o,H=Math.sin(K)*p+l;n.lineTo(V,H)}n.closePath()}function drawArc(n,t,e,i,r){const{fullCircles:a,startAngle:o,circumference:l}=t;let u=t.endAngle;if(a){pathArc(n,t,e,i,u,r);for(let d=0;d=TAU||_angleBetween(o,u,d),E=_isBetween(l,m+y,p+y);return v&&E}getCenterPoint(e){const{x:i,y:r,startAngle:a,endAngle:o,innerRadius:l,outerRadius:u}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:d,spacing:m}=this.options,p=(a+o)/2,_=(l+u+m+d)/2;return{x:i+Math.cos(p)*_,y:r+Math.sin(p)*_}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){const{options:i,circumference:r}=this,a=(i.offset||0)/4,o=(i.spacing||0)/2,l=i.circular;if(this.pixelMargin=i.borderAlign==="inner"?.33:0,this.fullCircles=r>TAU?Math.floor(r/TAU):0,r===0||this.innerRadius<0||this.outerRadius<0)return;e.save();const u=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(u)*a,Math.sin(u)*a);const d=1-Math.sin(Math.min(PI,r||0)),m=a*d;e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,drawArc(e,this,m,o,l),drawBorder(e,this,m,o,l),e.restore()}}F(ArcElement,"id","arc"),F(ArcElement,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0}),F(ArcElement,"defaultRoutes",{backgroundColor:"backgroundColor"}),F(ArcElement,"descriptors",{_scriptable:!0,_indexable:e=>e!=="borderDash"});function setStyle$1(n,t,e=t){n.lineCap=valueOrDefault(e.borderCapStyle,t.borderCapStyle),n.setLineDash(valueOrDefault(e.borderDash,t.borderDash)),n.lineDashOffset=valueOrDefault(e.borderDashOffset,t.borderDashOffset),n.lineJoin=valueOrDefault(e.borderJoinStyle,t.borderJoinStyle),n.lineWidth=valueOrDefault(e.borderWidth,t.borderWidth),n.strokeStyle=valueOrDefault(e.borderColor,t.borderColor)}function lineTo(n,t,e){n.lineTo(e.x,e.y)}function getLineMethod(n){return n.stepped?_steppedLineTo:n.tension||n.cubicInterpolationMode==="monotone"?_bezierCurveTo:lineTo}function pathVars(n,t,e={}){const i=n.length,{start:r=0,end:a=i-1}=e,{start:o,end:l}=t,u=Math.max(r,o),d=Math.min(a,l),m=rl&&a>l;return{count:i,start:u,loop:t.loop,ilen:d(o+(d?l-k:k))%a,$=()=>{v!==E&&(n.lineTo(m,E),n.lineTo(m,v),n.lineTo(m,x))};for(u&&(y=r[S(0)],n.moveTo(y.x,y.y)),_=0;_<=l;++_){if(y=r[S(_)],y.skip)continue;const k=y.x,A=y.y,I=k|0;I===w?(AE&&(E=A),m=(p*m+k)/++p):($(),n.lineTo(k,A),w=I,p=0,v=E=A),x=A}$()}function _getSegmentMethod(n){const t=n.options,e=t.borderDash&&t.borderDash.length;return!n._decimated&&!n._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?fastPathSegment:pathSegment}function _getInterpolationMethod(n){return n.stepped?_steppedInterpolation:n.tension||n.cubicInterpolationMode==="monotone"?_bezierInterpolation:_pointInLine}function strokePathWithCache(n,t,e,i){let r=t._path;r||(r=t._path=new Path2D,t.path(r,e,i)&&r.closePath()),setStyle$1(n,t.options),n.stroke(r)}function strokePathDirect(n,t,e,i){const{segments:r,options:a}=t,o=_getSegmentMethod(t);for(const l of r)setStyle$1(n,a,l.style),n.beginPath(),o(n,t,l,{start:e,end:e+i-1})&&n.closePath(),n.stroke()}const usePath2D=typeof Path2D=="function";function draw(n,t,e,i){usePath2D&&!t.options.segment?strokePathWithCache(n,t,e,i):strokePathDirect(n,t,e,i)}class LineElement extends Element$1{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||i.cubicInterpolationMode==="monotone")&&!i.stepped&&!this._pointsUpdated){const r=i.spanGaps?this._loop:this._fullLoop;_updateBezierControlPoints(this._points,i,t,r,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=_computeSegments(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,r=t[e],a=this.points,o=_boundSegments(this,{property:e,start:r,end:r});if(!o.length)return;const l=[],u=_getInterpolationMethod(i);let d,m;for(d=0,m=o.length;dt!=="borderDash"&&t!=="fill"});function inRange$1(n,t,e,i){const r=n.options,{[e]:a}=n.getProps([e],i);return Math.abs(t-a)n.replace("rgb(","rgba(").replace(")",", 0.5)"));function getBorderColor(n){return BORDER_COLORS[n%BORDER_COLORS.length]}function getBackgroundColor(n){return BACKGROUND_COLORS[n%BACKGROUND_COLORS.length]}function colorizeDefaultDataset(n,t){return n.borderColor=getBorderColor(t),n.backgroundColor=getBackgroundColor(t),++t}function colorizeDoughnutDataset(n,t){return n.backgroundColor=n.data.map(()=>getBorderColor(t++)),t}function colorizePolarAreaDataset(n,t){return n.backgroundColor=n.data.map(()=>getBackgroundColor(t++)),t}function getColorizer(n){let t=0;return(e,i)=>{const r=n.getDatasetMeta(i).controller;r instanceof DoughnutController?t=colorizeDoughnutDataset(e,t):r instanceof PolarAreaController?t=colorizePolarAreaDataset(e,t):r&&(t=colorizeDefaultDataset(e,t))}}function containsColorsDefinitions(n){let t;for(t in n)if(n[t].borderColor||n[t].backgroundColor)return!0;return!1}function containsColorsDefinition(n){return n&&(n.borderColor||n.backgroundColor)}var plugin_colors={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(n,t,e){if(!e.enabled)return;const{data:{datasets:i},options:r}=n.config,{elements:a}=r;if(!e.forceOverride&&(containsColorsDefinitions(i)||containsColorsDefinition(r)||a&&containsColorsDefinitions(a)))return;const o=getColorizer(n);i.forEach(o)}};function _segments(n,t,e){const i=n.segments,r=n.points,a=t.points,o=[];for(const l of i){let{start:u,end:d}=l;d=_findSegmentEnd(u,d,r);const m=_getBounds(e,r[u],r[d],l.loop);if(!t.segments){o.push({source:l,target:m,start:r[u],end:r[d]});continue}const p=_boundSegments(t,m);for(const _ of p){const y=_getBounds(e,a[_.start],a[_.end],_.loop),w=_boundSegment(l,r,y);for(const v of w)o.push({source:v,target:_,start:{[e]:_getEdge(m,y,"start",Math.max)},end:{[e]:_getEdge(m,y,"end",Math.min)}})}}return o}function _getBounds(n,t,e,i){if(i)return;let r=t[n],a=e[n];return n==="angle"&&(r=_normalizeAngle(r),a=_normalizeAngle(a)),{property:n,start:r,end:a}}function _pointsFromSegments(n,t){const{x:e=null,y:i=null}=n||{},r=t.points,a=[];return t.segments.forEach(({start:o,end:l})=>{l=_findSegmentEnd(o,l,r);const u=r[o],d=r[l];i!==null?(a.push({x:u.x,y:i}),a.push({x:d.x,y:i})):e!==null&&(a.push({x:e,y:u.y}),a.push({x:e,y:d.y}))}),a}function _findSegmentEnd(n,t,e){for(;t>n;t--){const i=e[t];if(!isNaN(i.x)&&!isNaN(i.y))break}return t}function _getEdge(n,t,e,i){return n&&t?i(n[e],t[e]):n?n[e]:t?t[e]:0}function _createBoundaryLine(n,t){let e=[],i=!1;return isArray(n)?(i=!0,e=n):e=_pointsFromSegments(n,t),e.length?new LineElement({points:e,options:{tension:0},_loop:i,_fullLoop:i}):null}function _shouldApplyFill(n){return n&&n.fill!==!1}function _resolveTarget(n,t,e){let r=n[t].fill;const a=[t];let o;if(!e)return r;for(;r!==!1&&a.indexOf(r)===-1;){if(!isNumberFinite(r))return r;if(o=n[r],!o)return!1;if(o.visible)return r;a.push(r),r=o.fill}return!1}function _decodeFill(n,t,e){const i=parseFillOption(n);if(isObject(i))return isNaN(i.value)?!1:i;let r=parseFloat(i);return isNumberFinite(r)&&Math.floor(r)===r?decodeTargetIndex(i[0],t,r,e):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function decodeTargetIndex(n,t,e,i){return(n==="-"||n==="+")&&(e=t+e),e===t||e<0||e>=i?!1:e}function _getTargetPixel(n,t){let e=null;return n==="start"?e=t.bottom:n==="end"?e=t.top:isObject(n)?e=t.getPixelForValue(n.value):t.getBasePixel&&(e=t.getBasePixel()),e}function _getTargetValue(n,t,e){let i;return n==="start"?i=e:n==="end"?i=t.options.reverse?t.min:t.max:isObject(n)?i=n.value:i=t.getBaseValue(),i}function parseFillOption(n){const t=n.options,e=t.fill;let i=valueOrDefault(e&&e.target,e);return i===void 0&&(i=!!t.backgroundColor),i===!1||i===null?!1:i===!0?"origin":i}function _buildStackLine(n){const{scale:t,index:e,line:i}=n,r=[],a=i.segments,o=i.points,l=getLinesBelow(t,e);l.push(_createBoundaryLine({x:null,y:t.bottom},i));for(let u=0;u=0;--o){const l=r[o].$filler;l&&(l.line.updateControlPoints(a,l.axis),i&&l.fill&&_drawfill(n.ctx,l,a))}},beforeDatasetsDraw(n,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;const i=n.getSortedVisibleDatasetMetas();for(let r=i.length-1;r>=0;--r){const a=i[r].$filler;_shouldApplyFill(a)&&_drawfill(n.ctx,a,n.chartArea)}},beforeDatasetDraw(n,t,e){const i=t.meta.$filler;!_shouldApplyFill(i)||e.drawTime!=="beforeDatasetDraw"||_drawfill(n.ctx,i,n.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const getBoxSize=(n,t)=>{let{boxHeight:e=t,boxWidth:i=t}=n;return n.usePointStyle&&(e=Math.min(e,t),i=n.pointStyleWidth||Math.min(i,t)),{boxWidth:i,boxHeight:e,itemHeight:Math.max(t,e)}},itemsEqual=(n,t)=>n!==null&&t!==null&&n.datasetIndex===t.datasetIndex&&n.index===t.index;class Legend extends Element$1{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=callback(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(i=>t.filter(i,this.chart.data))),t.sort&&(e=e.sort((i,r)=>t.sort(i,r,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}const i=t.labels,r=toFont(i.font),a=r.size,o=this._computeTitleHeight(),{boxWidth:l,itemHeight:u}=getBoxSize(i,a);let d,m;e.font=r.string,this.isHorizontal()?(d=this.maxWidth,m=this._fitRows(o,a,l,u)+10):(m=this.maxHeight,d=this._fitCols(o,r,l,u)+10),this.width=Math.min(d,t.maxWidth||this.maxWidth),this.height=Math.min(m,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,r){const{ctx:a,maxWidth:o,options:{labels:{padding:l}}}=this,u=this.legendHitBoxes=[],d=this.lineWidths=[0],m=r+l;let p=t;a.textAlign="left",a.textBaseline="middle";let _=-1,y=-m;return this.legendItems.forEach((w,v)=>{const E=i+e/2+a.measureText(w.text).width;(v===0||d[d.length-1]+E+2*l>o)&&(p+=m,d[d.length-(v>0?0:1)]=0,y+=m,_++),u[v]={left:0,top:y,row:_,width:E,height:r},d[d.length-1]+=E+l}),p}_fitCols(t,e,i,r){const{ctx:a,maxHeight:o,options:{labels:{padding:l}}}=this,u=this.legendHitBoxes=[],d=this.columnSizes=[],m=o-t;let p=l,_=0,y=0,w=0,v=0;return this.legendItems.forEach((E,x)=>{const{itemWidth:S,itemHeight:$}=calculateItemSize(i,e,a,E,r);x>0&&y+$+2*l>m&&(p+=_+l,d.push({width:_,height:y}),w+=_+l,v++,_=y=0),u[x]={left:w,top:y,col:v,width:S,height:$},_=Math.max(_,S),y+=$+l}),p+=_,d.push({width:_,height:y}),p}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:r},rtl:a}}=this,o=getRtlAdapter(a,this.left,this.width);if(this.isHorizontal()){let l=0,u=_alignStartEnd(i,this.left+r,this.right-this.lineWidths[l]);for(const d of e)l!==d.row&&(l=d.row,u=_alignStartEnd(i,this.left+r,this.right-this.lineWidths[l])),d.top+=this.top+t+r,d.left=o.leftForLtr(o.x(u),d.width),u+=d.width+r}else{let l=0,u=_alignStartEnd(i,this.top+t+r,this.bottom-this.columnSizes[l].height);for(const d of e)d.col!==l&&(l=d.col,u=_alignStartEnd(i,this.top+t+r,this.bottom-this.columnSizes[l].height)),d.top=u,d.left+=this.left+r,d.left=o.leftForLtr(o.x(d.left),d.width),u+=d.height+r}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){const t=this.ctx;clipArea(t,this),this._draw(),unclipArea(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:r}=this,{align:a,labels:o}=t,l=defaults.color,u=getRtlAdapter(t.rtl,this.left,this.width),d=toFont(o.font),{padding:m}=o,p=d.size,_=p/2;let y;this.drawTitle(),r.textAlign=u.textAlign("left"),r.textBaseline="middle",r.lineWidth=.5,r.font=d.string;const{boxWidth:w,boxHeight:v,itemHeight:E}=getBoxSize(o,p),x=function(I,C,R){if(isNaN(w)||w<=0||isNaN(v)||v<0)return;r.save();const W=valueOrDefault(R.lineWidth,1);if(r.fillStyle=valueOrDefault(R.fillStyle,l),r.lineCap=valueOrDefault(R.lineCap,"butt"),r.lineDashOffset=valueOrDefault(R.lineDashOffset,0),r.lineJoin=valueOrDefault(R.lineJoin,"miter"),r.lineWidth=W,r.strokeStyle=valueOrDefault(R.strokeStyle,l),r.setLineDash(valueOrDefault(R.lineDash,[])),o.usePointStyle){const K={radius:v*Math.SQRT2/2,pointStyle:R.pointStyle,rotation:R.rotation,borderWidth:W},Y=u.xPlus(I,w/2),q=C+_;drawPointLegend(r,K,Y,q,o.pointStyleWidth&&w)}else{const K=C+Math.max((p-v)/2,0),Y=u.leftForLtr(I,w),q=toTRBLCorners(R.borderRadius);r.beginPath(),Object.values(q).some(J=>J!==0)?addRoundedRectPath(r,{x:Y,y:K,w,h:v,radius:q}):r.rect(Y,K,w,v),r.fill(),W!==0&&r.stroke()}r.restore()},S=function(I,C,R){renderText(r,R.text,I,C+E/2,d,{strikethrough:R.hidden,textAlign:u.textAlign(R.textAlign)})},$=this.isHorizontal(),k=this._computeTitleHeight();$?y={x:_alignStartEnd(a,this.left+m,this.right-i[0]),y:this.top+m+k,line:0}:y={x:this.left+m,y:_alignStartEnd(a,this.top+k+m,this.bottom-e[0].height),line:0},overrideTextDirection(this.ctx,t.textDirection);const A=E+m;this.legendItems.forEach((I,C)=>{r.strokeStyle=I.fontColor,r.fillStyle=I.fontColor;const R=r.measureText(I.text).width,W=u.textAlign(I.textAlign||(I.textAlign=o.textAlign)),K=w+_+R;let Y=y.x,q=y.y;u.setWidth(this.width),$?C>0&&Y+K+m>this.right&&(q=y.y+=A,y.line++,Y=y.x=_alignStartEnd(a,this.left+m,this.right-i[y.line])):C>0&&q+A>this.bottom&&(Y=y.x=Y+e[y.line].width+m,y.line++,q=y.y=_alignStartEnd(a,this.top+k+m,this.bottom-e[y.line].height));const J=u.x(Y);if(x(J,q,I),Y=_textX(W,Y+w+_,$?Y+K:this.right,t.rtl),S(u.x(Y),q,I),$)y.x+=K+m;else if(typeof I.text!="string"){const nt=d.lineHeight;y.y+=calculateLegendItemHeight(I,nt)+m}else y.y+=A}),restoreTextDirection(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=toFont(e.font),r=toPadding(e.padding);if(!e.display)return;const a=getRtlAdapter(t.rtl,this.left,this.width),o=this.ctx,l=e.position,u=i.size/2,d=r.top+u;let m,p=this.left,_=this.width;if(this.isHorizontal())_=Math.max(...this.lineWidths),m=this.top+d,p=_alignStartEnd(t.align,p,this.right-_);else{const w=this.columnSizes.reduce((v,E)=>Math.max(v,E.height),0);m=d+_alignStartEnd(t.align,this.top,this.bottom-w-t.labels.padding-this._computeTitleHeight())}const y=_alignStartEnd(l,p,p+_);o.textAlign=a.textAlign(_toLeftRightCenter(l)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,renderText(o,e.text,y,m,i)}_computeTitleHeight(){const t=this.options.title,e=toFont(t.font),i=toPadding(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,r,a;if(_isBetween(t,this.left,this.right)&&_isBetween(e,this.top,this.bottom)){for(a=this.legendHitBoxes,i=0;ia.length>o.length?a:o)),t+e.size/2+i.measureText(r).width}function calculateItemHeight(n,t,e){let i=n;return typeof t.text!="string"&&(i=calculateLegendItemHeight(t,e)),i}function calculateLegendItemHeight(n,t){const e=n.text?n.text.length:0;return t*e}function isListened(n,t){return!!((n==="mousemove"||n==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(n==="click"||n==="mouseup"))}var plugin_legend={id:"legend",_element:Legend,start(n,t,e){const i=n.legend=new Legend({ctx:n.ctx,options:e,chart:n});layouts.configure(n,i,e),layouts.addBox(n,i)},stop(n){layouts.removeBox(n,n.legend),delete n.legend},beforeUpdate(n,t,e){const i=n.legend;layouts.configure(n,i,e),i.options=e},afterUpdate(n){const t=n.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(n,t){t.replay||n.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(n,t,e){const i=t.datasetIndex,r=e.chart;r.isDatasetVisible(i)?(r.hide(i),t.hidden=!0):(r.show(i),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:n=>n.chart.options.color,boxWidth:40,padding:10,generateLabels(n){const t=n.data.datasets,{labels:{usePointStyle:e,pointStyle:i,textAlign:r,color:a,useBorderRadius:o,borderRadius:l}}=n.legend.options;return n._getSortedDatasetMetas().map(u=>{const d=u.controller.getStyle(e?0:void 0),m=toPadding(d.borderWidth);return{text:t[u.index].label,fillStyle:d.backgroundColor,fontColor:a,hidden:!u.visible,lineCap:d.borderCapStyle,lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:(m.width+m.height)/4,strokeStyle:d.borderColor,pointStyle:i||d.pointStyle,rotation:d.rotation,textAlign:r||d.textAlign,borderRadius:o&&(l||d.borderRadius),datasetIndex:u.index}},this)}},title:{color:n=>n.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:n=>!n.startsWith("on"),labels:{_scriptable:n=>!["generateLabels","filter","sort"].includes(n)}}};const positioners={average(n){if(!n.length)return!1;let t,e,i=0,r=0,a=0;for(t=0,e=n.length;t-1?n.split(`
-`):n}function createTooltipItem(n,t){const{element:e,datasetIndex:i,index:r}=t,a=n.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(r);return{chart:n,label:o,parsed:a.getParsed(r),raw:n.data.datasets[i].data[r],formattedValue:l,dataset:a.getDataset(),dataIndex:r,datasetIndex:i,element:e}}function getTooltipSize(n,t){const e=n.chart.ctx,{body:i,footer:r,title:a}=n,{boxWidth:o,boxHeight:l}=t,u=toFont(t.bodyFont),d=toFont(t.titleFont),m=toFont(t.footerFont),p=a.length,_=r.length,y=i.length,w=toPadding(t.padding);let v=w.height,E=0,x=i.reduce((k,A)=>k+A.before.length+A.lines.length+A.after.length,0);if(x+=n.beforeBody.length+n.afterBody.length,p&&(v+=p*d.lineHeight+(p-1)*t.titleSpacing+t.titleMarginBottom),x){const k=t.displayColors?Math.max(l,u.lineHeight):u.lineHeight;v+=y*k+(x-y)*u.lineHeight+(x-1)*t.bodySpacing}_&&(v+=t.footerMarginTop+_*m.lineHeight+(_-1)*t.footerSpacing);let S=0;const M=function(k){E=Math.max(E,e.measureText(k).width+S)};return e.save(),e.font=d.string,each(n.title,M),e.font=u.string,each(n.beforeBody.concat(n.afterBody),M),S=t.displayColors?o+2+t.boxPadding:0,each(i,k=>{each(k.before,M),each(k.lines,M),each(k.after,M)}),S=0,e.font=m.string,each(n.footer,M),e.restore(),E+=w.width,{width:E,height:v}}function determineYAlign(n,t){const{y:e,height:i}=t;return en.height-i/2?"bottom":"center"}function doesNotFitWithAlign(n,t,e,i){const{x:r,width:a}=i,o=e.caretSize+e.caretPadding;if(n==="left"&&r+a+o>t.width||n==="right"&&r-a-o<0)return!0}function determineXAlign(n,t,e,i){const{x:r,width:a}=e,{width:o,chartArea:{left:l,right:u}}=n;let d="center";return i==="center"?d=r<=(l+u)/2?"left":"right":r<=a/2?d="left":r>=o-a/2&&(d="right"),doesNotFitWithAlign(d,n,t,e)&&(d="center"),d}function determineAlignment(n,t,e){const i=e.yAlign||t.yAlign||determineYAlign(n,e);return{xAlign:e.xAlign||t.xAlign||determineXAlign(n,t,e,i),yAlign:i}}function alignX(n,t){let{x:e,width:i}=n;return t==="right"?e-=i:t==="center"&&(e-=i/2),e}function alignY(n,t,e){let{y:i,height:r}=n;return t==="top"?i+=e:t==="bottom"?i-=r+e:i-=r/2,i}function getBackgroundPoint(n,t,e,i){const{caretSize:r,caretPadding:a,cornerRadius:o}=n,{xAlign:l,yAlign:u}=e,d=r+a,{topLeft:m,topRight:p,bottomLeft:_,bottomRight:y}=toTRBLCorners(o);let w=alignX(t,l);const v=alignY(t,u,d);return u==="center"?l==="left"?w+=d:l==="right"&&(w-=d):l==="left"?w-=Math.max(m,_)+r:l==="right"&&(w+=Math.max(p,y)+r),{x:_limitValue(w,0,i.width-t.width),y:_limitValue(v,0,i.height-t.height)}}function getAlignedX(n,t,e){const i=toPadding(e.padding);return t==="center"?n.x+n.width/2:t==="right"?n.x+n.width-i.right:n.x+i.left}function getBeforeAfterBodyLines(n){return pushOrConcat([],splitNewlines(n))}function createTooltipContext(n,t,e){return createContext(n,{tooltip:t,tooltipItems:e,type:"tooltip"})}function overrideCallbacks(n,t){const e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?n.override(e):n}const defaultCallbacks={beforeTitle:noop,title(n){if(n.length>0){const t=n[0],e=t.chart.data.labels,i=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(i>0&&t.dataIndex"u"?defaultCallbacks[t].call(e,i):r}class Tooltip extends Element$1{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),r=i.enabled&&e.options.animation&&i.animations,a=new Animations(this.chart,r);return r._cacheable&&(this._cachedAnimations=Object.freeze(a)),a}getContext(){return this.$context||(this.$context=createTooltipContext(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){const{callbacks:i}=e,r=invokeCallbackWithFallback(i,"beforeTitle",this,t),a=invokeCallbackWithFallback(i,"title",this,t),o=invokeCallbackWithFallback(i,"afterTitle",this,t);let l=[];return l=pushOrConcat(l,splitNewlines(r)),l=pushOrConcat(l,splitNewlines(a)),l=pushOrConcat(l,splitNewlines(o)),l}getBeforeBody(t,e){return getBeforeAfterBodyLines(invokeCallbackWithFallback(e.callbacks,"beforeBody",this,t))}getBody(t,e){const{callbacks:i}=e,r=[];return each(t,a=>{const o={before:[],lines:[],after:[]},l=overrideCallbacks(i,a);pushOrConcat(o.before,splitNewlines(invokeCallbackWithFallback(l,"beforeLabel",this,a))),pushOrConcat(o.lines,invokeCallbackWithFallback(l,"label",this,a)),pushOrConcat(o.after,splitNewlines(invokeCallbackWithFallback(l,"afterLabel",this,a))),r.push(o)}),r}getAfterBody(t,e){return getBeforeAfterBodyLines(invokeCallbackWithFallback(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,r=invokeCallbackWithFallback(i,"beforeFooter",this,t),a=invokeCallbackWithFallback(i,"footer",this,t),o=invokeCallbackWithFallback(i,"afterFooter",this,t);let l=[];return l=pushOrConcat(l,splitNewlines(r)),l=pushOrConcat(l,splitNewlines(a)),l=pushOrConcat(l,splitNewlines(o)),l}_createItems(t){const e=this._active,i=this.chart.data,r=[],a=[],o=[];let l=[],u,d;for(u=0,d=e.length;ut.filter(m,p,_,i))),t.itemSort&&(l=l.sort((m,p)=>t.itemSort(m,p,i))),each(l,m=>{const p=overrideCallbacks(t.callbacks,m);r.push(invokeCallbackWithFallback(p,"labelColor",this,m)),a.push(invokeCallbackWithFallback(p,"labelPointStyle",this,m)),o.push(invokeCallbackWithFallback(p,"labelTextColor",this,m))}),this.labelColors=r,this.labelPointStyles=a,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),r=this._active;let a,o=[];if(!r.length)this.opacity!==0&&(a={opacity:0});else{const l=positioners[i.position].call(this,r,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const u=this._size=getTooltipSize(this,i),d=Object.assign({},l,u),m=determineAlignment(this.chart,i,d),p=getBackgroundPoint(i,d,m,this.chart);this.xAlign=m.xAlign,this.yAlign=m.yAlign,a={opacity:1,x:p.x,y:p.y,width:u.width,height:u.height,caretX:l.x,caretY:l.y}}this._tooltipItems=o,this.$context=void 0,a&&this._resolveAnimations().update(this,a),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,r){const a=this.getCaretPosition(t,i,r);e.lineTo(a.x1,a.y1),e.lineTo(a.x2,a.y2),e.lineTo(a.x3,a.y3)}getCaretPosition(t,e,i){const{xAlign:r,yAlign:a}=this,{caretSize:o,cornerRadius:l}=i,{topLeft:u,topRight:d,bottomLeft:m,bottomRight:p}=toTRBLCorners(l),{x:_,y}=t,{width:w,height:v}=e;let E,x,S,M,k,A;return a==="center"?(k=y+v/2,r==="left"?(E=_,x=E-o,M=k+o,A=k-o):(E=_+w,x=E+o,M=k-o,A=k+o),S=E):(r==="left"?x=_+Math.max(u,m)+o:r==="right"?x=_+w-Math.max(d,p)-o:x=this.caretX,a==="top"?(M=y,k=M-o,E=x-o,S=x+o):(M=y+v,k=M+o,E=x+o,S=x-o),A=M),{x1:E,x2:x,x3:S,y1:M,y2:k,y3:A}}drawTitle(t,e,i){const r=this.title,a=r.length;let o,l,u;if(a){const d=getRtlAdapter(i.rtl,this.x,this.width);for(t.x=getAlignedX(this,i.titleAlign,i),e.textAlign=d.textAlign(i.titleAlign),e.textBaseline="middle",o=toFont(i.titleFont),l=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,u=0;uS!==0)?(t.beginPath(),t.fillStyle=a.multiKeyBackground,addRoundedRectPath(t,{x:v,y:w,w:d,h:u,radius:x}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),addRoundedRectPath(t,{x:E,y:w+1,w:d-2,h:u-2,radius:x}),t.fill()):(t.fillStyle=a.multiKeyBackground,t.fillRect(v,w,d,u),t.strokeRect(v,w,d,u),t.fillStyle=o.backgroundColor,t.fillRect(E,w+1,d-2,u-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:r}=this,{bodySpacing:a,bodyAlign:o,displayColors:l,boxHeight:u,boxWidth:d,boxPadding:m}=i,p=toFont(i.bodyFont);let _=p.lineHeight,y=0;const w=getRtlAdapter(i.rtl,this.x,this.width),v=function(R){e.fillText(R,w.x(t.x+y),t.y+_/2),t.y+=_+a},E=w.textAlign(o);let x,S,M,k,A,I,C;for(e.textAlign=o,e.textBaseline="middle",e.font=p.string,t.x=getAlignedX(this,E,i),e.fillStyle=i.bodyColor,each(this.beforeBody,v),y=l&&E!=="right"?o==="center"?d/2+m:d+2+m:0,k=0,I=r.length;k0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,r=i&&i.x,a=i&&i.y;if(r||a){const o=positioners[t.position].call(this,this._active,this._eventPosition);if(!o)return;const l=this._size=getTooltipSize(this,t),u=Object.assign({},o,this._size),d=determineAlignment(e,t,u),m=getBackgroundPoint(t,u,d,e);(r._to!==m.x||a._to!==m.y)&&(this.xAlign=d.xAlign,this.yAlign=d.yAlign,this.width=l.width,this.height=l.height,this.caretX=o.x,this.caretY=o.y,this._resolveAnimations().update(this,m))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const r={width:this.width,height:this.height},a={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=toPadding(e.padding),l=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&l&&(t.save(),t.globalAlpha=i,this.drawBackground(a,t,r,e),overrideTextDirection(t,e.textDirection),a.y+=o.top,this.drawTitle(a,t,e),this.drawBody(a,t,e),this.drawFooter(a,t,e),restoreTextDirection(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,r=t.map(({datasetIndex:l,index:u})=>{const d=this.chart.getDatasetMeta(l);if(!d)throw new Error("Cannot find a dataset at index "+l);return{datasetIndex:l,element:d.data[u],index:u}}),a=!_elementsEqual(i,r),o=this._positionChanged(r,e);(a||o)&&(this._active=r,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const r=this.options,a=this._active||[],o=this._getActiveElements(t,a,e,i),l=this._positionChanged(o,t),u=e||!_elementsEqual(o,a)||l;return u&&(this._active=o,(r.enabled||r.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),u}_getActiveElements(t,e,i,r){const a=this.options;if(t.type==="mouseout")return[];if(!r)return e.filter(l=>this.chart.data.datasets[l.datasetIndex]&&this.chart.getDatasetMeta(l.datasetIndex).controller.getParsed(l.index)!==void 0);const o=this.chart.getElementsAtEventForMode(t,a.mode,a,i);return a.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:r,options:a}=this,o=positioners[a.position].call(this,t,e);return o!==!1&&(i!==o.x||r!==o.y)}}F(Tooltip,"positioners",positioners);var plugin_tooltip={id:"tooltip",_element:Tooltip,positioners,afterInit(n,t,e){e&&(n.tooltip=new Tooltip({chart:n,options:e}))},beforeUpdate(n,t,e){n.tooltip&&n.tooltip.initialize(e)},reset(n,t,e){n.tooltip&&n.tooltip.initialize(e)},afterDraw(n){const t=n.tooltip;if(t&&t._willRender()){const e={tooltip:t};if(n.notifyPlugins("beforeTooltipDraw",{...e,cancelable:!0})===!1)return;t.draw(n.ctx),n.notifyPlugins("afterTooltipDraw",e)}},afterEvent(n,t){if(n.tooltip){const e=t.replay;n.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(n,t)=>t.bodyFont.size,boxWidth:(n,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:defaultCallbacks},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:n=>n!=="filter"&&n!=="itemSort"&&n!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const addIfString=(n,t,e,i)=>(typeof t=="string"?(e=n.push(t)-1,i.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function findOrAddLabel(n,t,e,i){const r=n.indexOf(t);if(r===-1)return addIfString(n,t,e,i);const a=n.lastIndexOf(t);return r!==a?e:r}const validIndex=(n,t)=>n===null?null:_limitValue(Math.round(n),0,t);function _getLabelForValue(n){const t=this.getLabels();return n>=0&&ne.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}F(CategoryScale,"id","category"),F(CategoryScale,"defaults",{ticks:{callback:_getLabelForValue}});function generateTicks$1(n,t){const e=[],{bounds:r,step:a,min:o,max:l,precision:u,count:d,maxTicks:m,maxDigits:p,includeBounds:_}=n,y=a||1,w=m-1,{min:v,max:E}=t,x=!isNullOrUndef(o),S=!isNullOrUndef(l),M=!isNullOrUndef(d),k=(E-v)/(p+1);let A=niceNum((E-v)/w/y)*y,I,C,R,W;if(A<1e-14&&!x&&!S)return[{value:v},{value:E}];W=Math.ceil(E/A)-Math.floor(v/A),W>w&&(A=niceNum(W*A/w/y)*y),isNullOrUndef(u)||(I=Math.pow(10,u),A=Math.ceil(A*I)/I),r==="ticks"?(C=Math.floor(v/A)*A,R=Math.ceil(E/A)*A):(C=v,R=E),x&&S&&a&&almostWhole((l-o)/a,A/1e3)?(W=Math.round(Math.min((l-o)/A,m)),A=(l-o)/W,C=o,R=l):M?(C=x?o:C,R=S?l:R,W=d-1,A=(R-C)/W):(W=(R-C)/A,almostEquals(W,Math.round(W),A/1e3)?W=Math.round(W):W=Math.ceil(W));const K=Math.max(_decimalPlaces(A),_decimalPlaces(C));I=Math.pow(10,isNullOrUndef(u)?K:u),C=Math.round(C*I)/I,R=Math.round(R*I)/I;let Y=0;for(x&&(_&&C!==o?(e.push({value:o}),Cl)break;e.push({value:q})}return S&&_&&R!==l?e.length&&almostEquals(e[e.length-1].value,l,relativeLabelSize(l,k,n))?e[e.length-1].value=l:e.push({value:l}):(!S||R===l)&&e.push({value:R}),e}function relativeLabelSize(n,t,{horizontal:e,minRotation:i}){const r=toRadians(i),a=(e?Math.sin(r):Math.cos(r))||.001,o=.75*t*(""+n).length;return Math.min(t/a,o)}class LinearScaleBase extends Scale{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return isNullOrUndef(t)||(typeof t=="number"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:r,max:a}=this;const o=u=>r=e?r:u,l=u=>a=i?a:u;if(t){const u=sign(r),d=sign(a);u<0&&d<0?l(0):u>0&&d>0&&o(0)}if(r===a){let u=a===0?1:Math.abs(a*.05);l(a+u),t||o(r-u)}this.min=r,this.max=a}getTickLimit(){const t=this.options.ticks;let{maxTicksLimit:e,stepSize:i}=t,r;return i?(r=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,r>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${r} ticks. Limiting to 1000.`),r=1e3)):(r=this.computeTickLimit(),e=e||11),e&&(r=Math.min(e,r)),r}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const r={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},a=this._range||this,o=generateTicks$1(r,a);return t.bounds==="ticks"&&_setMinAndMaxByKey(o,this,"value"),t.reverse?(o.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),o}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const r=(i-e)/Math.max(t.length-1,1)/2;e-=r,i+=r}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return formatNumber(t,this.chart.options.locale,this.options.ticks.format)}}class LinearScale extends LinearScaleBase{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=isNumberFinite(t)?t:0,this.max=isNumberFinite(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=toRadians(this.options.ticks.minRotation),r=(t?Math.sin(i):Math.cos(i))||.001,a=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,a.lineHeight/r))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}F(LinearScale,"id","linear"),F(LinearScale,"defaults",{ticks:{callback:Ticks.formatters.numeric}});const log10Floor=n=>Math.floor(log10(n)),changeExponent=(n,t)=>Math.pow(10,log10Floor(n)+t);function isMajor(n){return n/Math.pow(10,log10Floor(n))===1}function steps(n,t,e){const i=Math.pow(10,e),r=Math.floor(n/i);return Math.ceil(t/i)-r}function startExp(n,t){const e=t-n;let i=log10Floor(e);for(;steps(n,t,i)>10;)i++;for(;steps(n,t,i)<10;)i--;return Math.min(i,log10Floor(n))}function generateTicks(n,{min:t,max:e}){t=finiteOrDefault(n.min,t);const i=[],r=log10Floor(t);let a=startExp(t,e),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),u=r>a?Math.pow(10,r):0,d=Math.round((t-u)*o)/o,m=Math.floor((t-u)/l/10)*l*10;let p=Math.floor((d-m)/Math.pow(10,a)),_=finiteOrDefault(n.min,Math.round((u+m+p*Math.pow(10,a))*o)/o);for(;_=10?p=p<15?15:20:p++,p>=20&&(a++,p=2,o=a>=0?1:o),_=Math.round((u+m+p*Math.pow(10,a))*o)/o;const y=finiteOrDefault(n.max,_);return i.push({value:y,major:isMajor(y),significand:p}),i}class LogarithmicScale extends Scale{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=LinearScaleBase.prototype.parse.apply(this,[t,e]);if(i===0){this._zero=!0;return}return isNumberFinite(i)&&i>0?i:null}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=isNumberFinite(t)?Math.max(0,t):null,this.max=isNumberFinite(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!isNumberFinite(this._userMin)&&(this.min=t===changeExponent(this.min,0)?changeExponent(this.min,-1):changeExponent(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,r=this.max;const a=l=>i=t?i:l,o=l=>r=e?r:l;i===r&&(i<=0?(a(1),o(10)):(a(changeExponent(i,-1)),o(changeExponent(r,1)))),i<=0&&a(changeExponent(r,-1)),r<=0&&o(changeExponent(i,1)),this.min=i,this.max=r}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=generateTicks(e,this);return t.bounds==="ticks"&&_setMinAndMaxByKey(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return t===void 0?"0":formatNumber(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=log10(t),this._valueRange=log10(this.max)-log10(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(log10(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}F(LogarithmicScale,"id","logarithmic"),F(LogarithmicScale,"defaults",{ticks:{callback:Ticks.formatters.logarithmic,major:{enabled:!0}}});function getTickBackdropHeight(n){const t=n.ticks;if(t.display&&n.display){const e=toPadding(t.backdropPadding);return valueOrDefault(t.font&&t.font.size,defaults.font.size)+e.height}return 0}function measureLabelSize(n,t,e){return e=isArray(e)?e:[e],{w:_longestText(n,t.string,e),h:e.length*t.lineHeight}}function determineLimits(n,t,e,i,r){return n===i||n===r?{start:t-e/2,end:t+e/2}:nr?{start:t-e,end:t}:{start:t,end:t+e}}function fitWithPointLabels(n){const t={l:n.left+n._padding.left,r:n.right-n._padding.right,t:n.top+n._padding.top,b:n.bottom-n._padding.bottom},e=Object.assign({},t),i=[],r=[],a=n._pointLabels.length,o=n.options.pointLabels,l=o.centerPointLabels?PI/a:0;for(let u=0;ut.r&&(l=(i.end-t.r)/a,n.r=Math.max(n.r,t.r+l)),r.startt.b&&(u=(r.end-t.b)/o,n.b=Math.max(n.b,t.b+u))}function createPointLabelItem(n,t,e){const i=n.drawingArea,{extra:r,additionalAngle:a,padding:o,size:l}=e,u=n.getPointPosition(t,i+r+o,a),d=Math.round(toDegrees(_normalizeAngle(u.angle+HALF_PI))),m=yForAngle(u.y,l.h,d),p=getTextAlignForAngle(d),_=leftForTextAlign(u.x,l.w,p);return{visible:!0,x:u.x,y:m,textAlign:p,left:_,top:m,right:_+l.w,bottom:m+l.h}}function isNotOverlapped(n,t){if(!t)return!0;const{left:e,top:i,right:r,bottom:a}=n;return!(_isPointInArea({x:e,y:i},t)||_isPointInArea({x:e,y:a},t)||_isPointInArea({x:r,y:i},t)||_isPointInArea({x:r,y:a},t))}function buildPointLabelItems(n,t,e){const i=[],r=n._pointLabels.length,a=n.options,{centerPointLabels:o,display:l}=a.pointLabels,u={extra:getTickBackdropHeight(a)/2,additionalAngle:o?PI/r:0};let d;for(let m=0;m270||e<90)&&(n-=t),n}function drawPointLabelBox(n,t,e){const{left:i,top:r,right:a,bottom:o}=e,{backdropColor:l}=t;if(!isNullOrUndef(l)){const u=toTRBLCorners(t.borderRadius),d=toPadding(t.backdropPadding);n.fillStyle=l;const m=i-d.left,p=r-d.top,_=a-i+d.width,y=o-r+d.height;Object.values(u).some(w=>w!==0)?(n.beginPath(),addRoundedRectPath(n,{x:m,y:p,w:_,h:y,radius:u}),n.fill()):n.fillRect(m,p,_,y)}}function drawPointLabels(n,t){const{ctx:e,options:{pointLabels:i}}=n;for(let r=t-1;r>=0;r--){const a=n._pointLabelItems[r];if(!a.visible)continue;const o=i.setContext(n.getPointLabelContext(r));drawPointLabelBox(e,o,a);const l=toFont(o.font),{x:u,y:d,textAlign:m}=a;renderText(e,n._pointLabels[r],u,d+l.lineHeight/2,l,{color:o.color,textAlign:m,textBaseline:"middle"})}}function pathRadiusLine(n,t,e,i){const{ctx:r}=n;if(e)r.arc(n.xCenter,n.yCenter,t,0,TAU);else{let a=n.getPointPosition(0,t);r.moveTo(a.x,a.y);for(let o=1;o{const r=callback(this.options.pointLabels.callback,[e,i],this);return r||r===0?r:""}).filter((e,i)=>this.chart.getDataVisibility(i))}fit(){const t=this.options;t.display&&t.pointLabels.display?fitWithPointLabels(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,r){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,r))}getIndexAngle(t){const e=TAU/(this._pointLabels.length||1),i=this.options.startAngle||0;return _normalizeAngle(t*e+toRadians(i))}getDistanceFromCenterForValue(t){if(isNullOrUndef(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(isNullOrUndef(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(p!==0){u=this.getDistanceFromCenterForValue(m.value);const _=this.getContext(p),y=r.setContext(_),w=a.setContext(_);drawRadiusLine(this,y,u,o,w)}}),i.display){for(t.save(),l=o-1;l>=0;l--){const m=i.setContext(this.getPointLabelContext(l)),{color:p,lineWidth:_}=m;!_||!p||(t.lineWidth=_,t.strokeStyle=p,t.setLineDash(m.borderDash),t.lineDashOffset=m.borderDashOffset,u=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),d=this.getPointPosition(l,u),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(d.x,d.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const r=this.getIndexAngle(0);let a,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(r),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((l,u)=>{if(u===0&&!e.reverse)return;const d=i.setContext(this.getContext(u)),m=toFont(d.font);if(a=this.getDistanceFromCenterForValue(this.ticks[u].value),d.showLabelBackdrop){t.font=m.string,o=t.measureText(l.label).width,t.fillStyle=d.backdropColor;const p=toPadding(d.backdropPadding);t.fillRect(-o/2-p.left,-a-m.size/2-p.top,o+p.width,m.size+p.height)}renderText(t,l.label,0,-a,m,{color:d.color,strokeColor:d.textStrokeColor,strokeWidth:d.textStrokeWidth})}),t.restore()}drawTitle(){}}F(RadialLinearScale,"id","radialLinear"),F(RadialLinearScale,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Ticks.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),F(RadialLinearScale,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),F(RadialLinearScale,"descriptors",{angleLines:{_fallback:"grid"}});const INTERVALS={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}},UNITS=Object.keys(INTERVALS);function sorter(n,t){return n-t}function parse(n,t){if(isNullOrUndef(t))return null;const e=n._adapter,{parser:i,round:r,isoWeekday:a}=n._parseOpts;let o=t;return typeof i=="function"&&(o=i(o)),isNumberFinite(o)||(o=typeof i=="string"?e.parse(o,i):e.parse(o)),o===null?null:(r&&(o=r==="week"&&(isNumber(a)||a===!0)?e.startOf(o,"isoWeek",a):e.startOf(o,r)),+o)}function determineUnitForAutoTicks(n,t,e,i){const r=UNITS.length;for(let a=UNITS.indexOf(n);a=UNITS.indexOf(e);a--){const o=UNITS[a];if(INTERVALS[o].common&&n._adapter.diff(r,i,o)>=t-1)return o}return UNITS[e?UNITS.indexOf(e):0]}function determineMajorUnit(n){for(let t=UNITS.indexOf(n)+1,e=UNITS.length;t=t?e[i]:e[r];n[a]=!0}}function setMajorTicks(n,t,e,i){const r=n._adapter,a=+r.startOf(t[0].value,i),o=t[t.length-1].value;let l,u;for(l=a;l<=o;l=+r.add(l,1,i))u=e[l],u>=0&&(t[u].major=!0);return t}function ticksFromTimestamps(n,t,e){const i=[],r={},a=t.length;let o,l;for(o=0;o+t.value))}initOffsets(t=[]){let e=0,i=0,r,a;this.options.offset&&t.length&&(r=this.getDecimalForValue(t[0]),t.length===1?e=1-r:e=(this.getDecimalForValue(t[1])-r)/2,a=this.getDecimalForValue(t[t.length-1]),t.length===1?i=a:i=(a-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;e=_limitValue(e,0,o),i=_limitValue(i,0,o),this._offsets={start:e,end:i,factor:1/(e+1+i)}}_generate(){const t=this._adapter,e=this.min,i=this.max,r=this.options,a=r.time,o=a.unit||determineUnitForAutoTicks(a.minUnit,e,i,this._getLabelCapacity(e)),l=valueOrDefault(r.ticks.stepSize,1),u=o==="week"?a.isoWeekday:!1,d=isNumber(u)||u===!0,m={};let p=e,_,y;if(d&&(p=+t.startOf(p,"isoWeek",u)),p=+t.startOf(p,d?"day":o),t.diff(i,e,o)>1e5*l)throw new Error(e+" and "+i+" are too far apart with stepSize of "+l+" "+o);const w=r.ticks.source==="data"&&this.getDataTimestamps();for(_=p,y=0;_+v)}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const r=this.options.time.displayFormats,a=this._unit,o=e||r[a];return this._adapter.format(t,o)}_tickFormatFunction(t,e,i,r){const a=this.options,o=a.ticks.callback;if(o)return callback(o,[t,e,i],this);const l=a.time.displayFormats,u=this._unit,d=this._majorUnit,m=u&&l[u],p=d&&l[d],_=i[e],y=d&&p&&_&&_.major;return this._adapter.format(t,r||(y?p:m))}generateTickLabels(t){let e,i,r;for(e=0,i=t.length;e0?l:1}getDataTimestamps(){let t=this._cache.data||[],e,i;if(t.length)return t;const r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(e=0,i=r.length;e