{ "version": 3, "sources": ["../../src/js/navigation.js", "../../src/js/banner.js", "../../src/js/form-thank-you.js", "../../src/js/calendar-tab.js", "../../src/js/accordion/common.ts", "../../src/js/accordion/simple.ts", "../../src/js/accordion/complex.ts", "../../src/js/accordion/faqs.ts", "../../src/js/accordion/cards-accordion.ts", "../../src/js/calendar-messaging.ts", "../../node_modules/keen-slider/keen-slider.es.js", "../../src/js/slider.js", "../../src/js/video.js", "../../src/js/video-w-chapters.js", "../../src/js/inspections.ts", "../../src/js/comm-data-reports-archive.ts", "../../src/js/latest-news-slider.js", "../../src/js/one-whitman-slider.js", "../../src/js/card-game-popup.js", "../../src/js/conversation-starters.js", "../../src/js/tooltip.js", "../../src/js/public-archive.js", "../../src/js/thrive-locally.js", "../../src/js/thrive-locally-lotties.js", "../../node_modules/@kurkle/color/dist/color.esm.js", "../../node_modules/chart.js/src/helpers/helpers.core.ts", "../../node_modules/chart.js/src/helpers/helpers.math.ts", "../../node_modules/chart.js/src/helpers/helpers.collection.ts", "../../node_modules/chart.js/src/helpers/helpers.extras.ts", "../../node_modules/chart.js/src/helpers/helpers.easing.ts", "../../node_modules/chart.js/src/helpers/helpers.color.ts", "../../node_modules/chart.js/src/core/core.animations.defaults.js", "../../node_modules/chart.js/src/core/core.layouts.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.intl.ts", "../../node_modules/chart.js/src/core/core.ticks.js", "../../node_modules/chart.js/src/core/core.scale.defaults.js", "../../node_modules/chart.js/src/core/core.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.canvas.ts", "../../node_modules/chart.js/src/helpers/helpers.options.ts", "../../node_modules/chart.js/src/helpers/helpers.config.ts", "../../node_modules/chart.js/src/helpers/helpers.curve.ts", "../../node_modules/chart.js/src/helpers/helpers.dom.ts", "../../node_modules/chart.js/src/helpers/helpers.interpolation.ts", "../../node_modules/chart.js/src/helpers/helpers.rtl.ts", "../../node_modules/chart.js/src/helpers/helpers.segment.js", "../../node_modules/chart.js/src/core/core.animator.js", "../../node_modules/chart.js/src/core/core.animation.js", "../../node_modules/chart.js/src/core/core.animations.js", "../../node_modules/chart.js/src/core/core.datasetController.js", "../../node_modules/chart.js/src/controllers/controller.bar.js", "../../node_modules/chart.js/src/controllers/controller.bubble.js", "../../node_modules/chart.js/src/controllers/controller.doughnut.js", "../../node_modules/chart.js/src/controllers/controller.line.js", "../../node_modules/chart.js/src/controllers/controller.polarArea.js", "../../node_modules/chart.js/src/controllers/controller.pie.js", "../../node_modules/chart.js/src/controllers/controller.radar.js", "../../node_modules/chart.js/src/controllers/controller.scatter.js", "../../node_modules/chart.js/src/core/core.adapters.ts", "../../node_modules/chart.js/src/core/core.interaction.js", "../../node_modules/chart.js/src/core/core.layouts.js", "../../node_modules/chart.js/src/platform/platform.base.js", "../../node_modules/chart.js/src/platform/platform.basic.js", "../../node_modules/chart.js/src/platform/platform.dom.js", "../../node_modules/chart.js/src/platform/index.js", "../../node_modules/chart.js/src/core/core.element.ts", "../../node_modules/chart.js/src/core/core.scale.autoskip.js", "../../node_modules/chart.js/src/core/core.scale.js", "../../node_modules/chart.js/src/core/core.typedRegistry.js", "../../node_modules/chart.js/src/core/core.registry.js", "../../node_modules/chart.js/src/core/core.plugins.js", "../../node_modules/chart.js/src/core/core.config.js", "../../node_modules/chart.js/src/core/core.controller.js", "../../node_modules/chart.js/src/elements/element.arc.ts", "../../node_modules/chart.js/src/elements/element.line.js", "../../node_modules/chart.js/src/elements/element.point.ts", "../../node_modules/chart.js/src/elements/element.bar.js", "../../node_modules/chart.js/src/plugins/plugin.colors.ts", "../../node_modules/chart.js/src/plugins/plugin.decimation.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.segment.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.helper.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.options.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.stack.js", "../../node_modules/chart.js/src/plugins/plugin.filler/simpleArc.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.drawing.js", "../../node_modules/chart.js/src/plugins/plugin.filler/index.js", "../../node_modules/chart.js/src/plugins/plugin.legend.js", "../../node_modules/chart.js/src/plugins/plugin.title.js", "../../node_modules/chart.js/src/plugins/plugin.subtitle.js", "../../node_modules/chart.js/src/plugins/plugin.tooltip.js", "../../node_modules/chart.js/src/scales/scale.category.js", "../../node_modules/chart.js/src/scales/scale.linearbase.js", "../../node_modules/chart.js/src/scales/scale.linear.js", "../../node_modules/chart.js/src/scales/scale.logarithmic.js", "../../node_modules/chart.js/src/scales/scale.radialLinear.js", "../../node_modules/chart.js/src/scales/scale.time.js", "../../node_modules/chart.js/src/scales/scale.timeseries.js", "../../node_modules/chart.js/src/index.ts", "../../node_modules/chart.js/auto/auto.js", "../../node_modules/chartjs-plugin-datalabels/dist/chartjs-plugin-datalabels.esm.js", "../../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js", "../../src/js/data-dashboard.js", "../../src/js/index.js"], "sourcesContent": ["window.addEventListener('DOMContentLoaded', function (e) {\n\twindow.addEventListener('load', function () {\n\t\tif (window.innerWidth < 1200) {\n\t\t\tdocument.querySelectorAll('li.parent').forEach(toggleMenu)\n\t\t\tfunction toggleMenu(el) {\n\t\t\t\t// let link = el.querySelector('.mobile-arrow-down')\n\t\t\t\tlet link = el\n\n\t\t\t\tlink.onclick = function () {\n\t\t\t\t\tconst isExpanded = el.classList.contains('expanded')\n\n\t\t\t\t\tdocument.querySelectorAll('li.parent').forEach(li => {\n\t\t\t\t\t\tli.classList.remove('expanded')\n\t\t\t\t\t})\n\n\t\t\t\t\tel.classList.toggle('expanded', !isExpanded)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Restructure the Google translate widget so we can style it better\n\t\tlet gtWidgetSelect = null\n\n\t\tlet getGtWidgetSelect = setInterval(() => {\n\t\t\tgtWidgetSelect = document.querySelector('.goog-te-gadget > div')\n\t\t\tif (gtWidgetSelect) {\n\t\t\t\tclearInterval(getGtWidgetSelect)\n\t\t\t\tgtWidgetSelect.classList.add('gt-widget-select-wrapper')\n\t\t\t\tgtWidgetSelect.parentElement.parentElement.appendChild(gtWidgetSelect)\n\t\t\t}\n\t\t}, 100)\n\t})\n\n\twindow.addEventListener('resize', e => {\n\t\tif (window.innerWidth < 1200) {\n\t\t\tdocument.querySelectorAll('li.parent').forEach(toggleMenu)\n\t\t\tfunction toggleMenu(el) {\n\t\t\t\tlet link = el.querySelector('.mobile-arrow-down')\n\n\t\t\t\tlink.onclick = function () {\n\t\t\t\t\tconst isExpanded = el.classList.contains('expanded')\n\n\t\t\t\t\tdocument.querySelectorAll('li.parent').forEach(li => {\n\t\t\t\t\t\tli.classList.remove('expanded')\n\t\t\t\t\t})\n\n\t\t\t\t\tel.classList.toggle('expanded', !isExpanded)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\t// Hamburger functionality\n\tlet hamburger = document.querySelector('header .hamburger-wrapper')\n\tif (hamburger) {\n\t\tlet startY\n\n\t\thamburger.addEventListener('click', function (e) {\n\t\t\thamburger.classList.toggle('active')\n\t\t\tstartY = window.scrollY\n\t\t})\n\t\twindow.addEventListener('click', function (e) {\n\t\t\tif (!e.target.closest('nav') && !e.target.closest('.hamburger')) {\n\t\t\t\thamburger.classList.remove('active')\n\t\t\t}\n\t\t})\n\t\twindow.addEventListener('scroll', function (e) {\n\t\t\tif (Math.abs(window.scrollY - startY) >= 500) {\n\t\t\t\thamburger.classList.remove('active')\n\t\t\t}\n\t\t})\n\t}\n\n\t// Helpful links functionality\n\tlet helpfulLinks = document.querySelectorAll('.helpful-links')\n\thelpfulLinks.forEach(group => {\n\t\tgroup.addEventListener('click', e => {\n\t\t\te.stopImmediatePropagation()\n\t\t\tgroup.classList.toggle('active')\n\t\t})\n\t})\n})\n", "window.addEventListener('DOMContentLoaded', e => {\n\tconst banner = document.querySelector('.banner')\n\n\tif (banner) {\n\t\t// Check if banner has already been seen and closed\n\t\tlet seenContent = window.localStorage.getItem('banner-content-seen')\n\n\t\tlet contentHash = hashCode(banner.innerHTML)\n\t\tlet contentArr = []\n\n\t\tif (!checkSeenContent()) {\n\t\t\tbanner.classList.add('show')\n\t\t}\n\n\t\t// Handle banner close\n\t\tconst closeBtn = banner.querySelector('.close-btn')\n\t\tif (closeBtn) {\n\t\t\tcloseBtn.addEventListener('click', () => {\n\t\t\t\tbanner.classList.remove('show')\n\t\t\t\tif (!checkSeenContent()) {\n\t\t\t\t\tcontentArr.push(contentHash)\n\t\t\t\t}\n\t\t\t\twindow.localStorage.setItem(\n\t\t\t\t\t'banner-content-seen',\n\t\t\t\t\tJSON.stringify(contentArr)\n\t\t\t\t)\n\t\t\t})\n\t\t}\n\n\t\tfunction checkSeenContent() {\n\t\t\t// Checks if there is any value for seen content in local storage\n\t\t\t// If not, return false\n\t\t\t// If yes, but current content has not been seen, return false\n\t\t\t// If yes, but current content has been seen, return true\n\n\t\t\tif (!seenContent) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tcontentArr = JSON.parse(seenContent)\n\t\t\tif (!contentArr.includes(contentHash)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t}\n\t}\n\n\tfunction hashCode(str) {\n\t\tlet hash = 0\n\t\tfor (let i = 0, len = str.length; i < len; i++) {\n\t\t\tlet chr = str.charCodeAt(i)\n\t\t\thash = (hash << 5) - hash + chr\n\t\t\thash |= 0 // Convert to 32bit integer\n\t\t}\n\t\treturn hash\n\t}\n})\n", "document.addEventListener('DOMContentLoaded', function (e) {\n\tlet forms = document.querySelectorAll('form#contact-form')\n\tif (forms.length > 0) {\n\t\tforms.forEach(form => {\n\t\t\tvar status = form.querySelector('.form-status')\n\t\t\tasync function handleSubmit(event) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlet statusHead = status.querySelector('h6')\n\t\t\t\tlet statusBody = status.querySelector('p')\n\t\t\t\tlet button = form.querySelector('input[type=submit]')\n\t\t\t\tvar data = new FormData(event.target)\n\t\t\t\tbutton.value = 'Submitting...'\n\t\t\t\tfetch(event.target.action, {\n\t\t\t\t\tmethod: form.method,\n\t\t\t\t\tbody: data,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tstatus.classList.add('open')\n\t\t\t\t\t\tstatusHead.innerText = 'Thank you!'\n\t\t\t\t\t\tstatusBody.innerText =\n\t\t\t\t\t\t\t'We will be in touch soon regarding your submission.'\n\t\t\t\t\t\tform.reset()\n\t\t\t\t\t\tbutton.value = 'Submitted!'\n\t\t\t\t\t\tbutton.disabled = true\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tstatus.classList.add('open')\n\t\t\t\t\t\tstatusHead.innerText = 'Oops!'\n\t\t\t\t\t\tstatusBody.innerText =\n\t\t\t\t\t\t\t'There was a problem submitting your form. Please try again, or reach out to us for assistance if the problem persists.'\n\t\t\t\t\t\tbutton.value = 'Submit'\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\tform.addEventListener('submit', handleSubmit)\n\n\t\t\tstatus.addEventListener('click', function (e) {\n\t\t\t\tif (e.target.closest('.card') == null || e.target.closest('.close')) {\n\t\t\t\t\tstatus.classList.remove('open')\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n})\n", "window.addEventListener('DOMContentLoaded', function (e) {\n\tconst calendarTab = document.querySelector('.calendar-tab')\n\tif (calendarTab) {\n\t\tconst calendarTabMenu = calendarTab.querySelector('.calendar-tab-menu')\n\t\tif (calendarTabMenu) {\n\t\t\tcalendarTabMenu.addEventListener('click', () => {\n\t\t\t\tcalendarTab.classList.toggle('active')\n\t\t\t})\n\t\t}\n\t\twindow.addEventListener('click', function (e) {\n\t\t\tif (\n\t\t\t\t!e.target.closest('.calendar-tab') &&\n\t\t\t\t!e.target.closest('.calendar-tab-menu')\n\t\t\t) {\n\t\t\t\tcalendarTab.classList.remove('active')\n\t\t\t}\n\t\t})\n\t}\n})\n", "export function createItemToggleHandler(item: HTMLElement): () => void {\n\tconst copy = item.querySelector('.copy')\n\tif (!copy) return noop\n\n\tconst cl = item.classList\n\n\treturn () => {\n\t\tif (cl.contains('active')) {\n\t\t\tcl.remove('active')\n\t\t\tcl.add('inactive')\n\t\t} else {\n\t\t\tcl.remove('active')\n\t\t\tcl.add('inactive')\n\t\t\tcopy.setAttribute('style', `--height: ${copy.scrollHeight}px;`)\n\t\t\tcl.add('active')\n\t\t\tcl.remove('inactive')\n\t\t}\n\t}\n}\n\nfunction noop() {}\n", "import { createItemToggleHandler } from './common'\n\ndocument\n\t.querySelectorAll('section.simpleAccordion')\n\t.forEach(accordion => {\n\t\taccordion.querySelectorAll('.accordion-item').forEach(item => {\n\t\t\tconst heading = item.querySelector('h5')\n\t\t\theading?.addEventListener('click', createItemToggleHandler(item))\n\t\t})\n\t})\n", "document\n\t.querySelectorAll('section.complexAccordion')\n\t.forEach(accordion => {\n\t\taccordion.querySelectorAll('.accordion-item').forEach(item => {\n\t\t\tconst heading = item.querySelector('section.titleBlock')\n\t\t\tconst copy = item.querySelector('.content-section')\n\t\t\tif (!heading || !copy) return\n\n\t\t\tcopy.setAttribute('style', `--height: ${copy.scrollHeight}px;`)\n\n\t\t\theading.addEventListener('click', () => {\n\t\t\t\tconst cl = item.classList\n\n\t\t\t\tif (cl.contains('active')) {\n\t\t\t\t\tcl.remove('active')\n\t\t\t\t\tcl.add('inactive')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcl.remove('active')\n\t\t\t\tcl.add('inactive')\n\t\t\t\tcopy.setAttribute('style', `--height: ${copy.scrollHeight}px;`)\n\t\t\t\tcl.add('active')\n\t\t\t\tcl.remove('inactive')\n\n\t\t\t\tupdateURLFragment(item)\n\t\t\t})\n\t\t})\n\t})\n\nactivateAccordionsByHash()\naddEventListener('hashchange', () => activateAccordionsByHash())\n\nfunction updateURLFragment(item: HTMLElement) {\n\tconst itemHash = item.getAttribute('id')\n\tconst hashValue = window.location.hash\n\n\t//update hashvalue to accordion active id\n\tif (!hashValue || hashValue.substring(1) !== itemHash) {\n\t\thistory.pushState(null, '', `#${itemHash}`)\n\t\tactivateAccordionsByHash()\n\t}\n}\n\nfunction activateAccordionsByHash() {\n\tconst hashValue = window.location.hash.replace(/^#/, '')\n\tif (!hashValue) {\n\t\tactivateFirstAccordion()\n\t\treturn\n\t}\n\tconst fragmentAccordion = getAccordionItemById(hashValue)\n\n\tif (!fragmentAccordion) {\n\t\tactivateFirstAccordion()\n\t\treturn\n\t}\n\n\tdeactivateAllNavItems()\n\n\tfragmentAccordion.classList.add('active')\n\tfragmentAccordion.classList.remove('inactive')\n\n\tconst navItem = document.querySelector(`[data-slug=\"${hashValue}\"]`)\n\tnavItem?.classList.add('active')\n\tnavItem?.classList.remove('inactive')\n}\n\nfunction activateFirstAccordion() {\n\tconst activeNav = document.querySelector(\n\t\t'.sidebar .sidebar-link'\n\t)\n\n\tif (activeNav) {\n\t\tif (activeNav.dataset.slug) {\n\t\t\tconst accordion = getAccordionItemById(activeNav.dataset.slug)\n\t\t\tif (accordion) {\n\t\t\t\taccordion.classList.add('active')\n\t\t\t\taccordion.classList.remove('inactive')\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction getAccordionItemById(id: string) {\n\tlet fragmentAccordion = document.querySelector('#' + id)\n\t// If the targeted id is on a child of an accordion item, find the parent accordion item\n\tif (!fragmentAccordion?.classList.contains('accordion-item')) {\n\t\tfragmentAccordion =\n\t\t\tfragmentAccordion?.closest('.accordion-item') ?? null\n\t}\n\n\treturn fragmentAccordion\n}\n\nfunction deactivateAllNavItems() {\n\tconst activeNavItems = document.querySelectorAll(\n\t\t'.accordion-item.active'\n\t)\n\n\tactiveNavItems.forEach(item => {\n\t\titem.classList.remove('active')\n\t\titem.classList.add('inactive')\n\t})\n}\n", "import { createItemToggleHandler } from './common'\n\ndocument.querySelectorAll('section.faqs').forEach(accordion => {\n\taccordion\n\t\t.querySelectorAll('.accordion-item')\n\t\t.forEach(setupFaqsItem)\n})\n\nfunction setupFaqsItem(item: HTMLElement) {\n\tconst heading = item.querySelector('h5')\n\theading?.addEventListener('click', createItemToggleHandler(item))\n}\n", "import { createItemToggleHandler } from './common'\n\ndocument.querySelectorAll('div.cardsAccordion').forEach(item => {\n\tconst heading = item.querySelector('h4')\n\theading?.addEventListener('click', createItemToggleHandler(item))\n})\n", "const iframe = document.querySelector('#calendar-iframe')\n\n// Wait for the iframe to load\nif (iframe) {\n\tiframe.addEventListener('load', () => {\n\t\tconst channel = new MessageChannel()\n\t\tchannel.port1.onmessage = e => {\n\t\t\tiframe.setAttribute('style', `height: ${e.data + 2}px;`)\n\t\t}\n\t\tiframe.contentWindow?.postMessage('init', '*', [channel.port2])\n\t})\n}\n", "var n=function(){return n=Object.assign||function(n){for(var t,i=1,e=arguments.length;i0?1:0)-(n<0?1:0)||+n}function f(n){var t=n.getBoundingClientRect();return{height:e(t.height,n.offsetHeight),width:e(t.width,n.offsetWidth)}}function p(n,t,i,e){var r=n&&n[t];return null==r?i:e&&\"function\"==typeof r?r():r}function v(n){return Math.round(1e6*n)/1e6}function h(n){var t,i,e,r,a,o;function u(t){o||(o=t),s(!0);var a=t-o;a>e&&(a=e);var l=r[i];if(l[3]0?1:-1),{abs:u+i*s*a,origin:o,rel:u}}function I(n,t,i){var e;if(t||!S())return A(n,i);if(!D(n))return null;var r=z(null!=i?i:T),a=r.abs,o=n-r.rel,u=a+o;e=A(u);var c=A(u-s*l(o));return(null!==c&&Math.abs(c)6&&(w=w.slice(-6)),T=v(t);var e=H().abs;if(e!==M){var a=null!==M;M=e,a&&n.emit(\"slideChanged\")}}function H(t){var r=t?null:function(){if(s){var n=S(),t=n?(T%e+e)%e:T,i=(n?T%e:T)-u[0][2],r=0-(i<0&&n?e-Math.abs(i):i),c=0,d=z(T),f=d.abs,p=d.rel,v=u[p][2],y=u.map((function(t,i){var a=r+c;(a<0-t[0]||a>1)&&(a+=(Math.abs(a)>e-1&&n?e:0)*l(-a));var u=i-p,d=l(u),h=u+f;n&&(-1===d&&a>v&&(h+=s),1===d&&ab&&(a-=e));var m=a+t[0]+t[1],x=Math.max(a>=0&&m<=1?1:m<0||a>1?0:a<0?Math.min(1,(t[0]+a)/t[0]):(1-a)/t[0],0);return c+=t[0]+t[1],{abs:h,distance:o.rtl?-1*a+1-t[0]:a,portion:x,size:t[0]}}));return f=L(f),p=O(f),{abs:L(f),length:a,max:k,maxIdx:m,min:x,minIdx:h,position:T,progress:n?t/e:T/a,rel:p,slides:y,slidesLength:e}}}();return i.details=r,n.emit(\"detailsChanged\"),r}return i={absToRel:O,add:C,details:null,distToIdx:E,idxToDist:I,init:function(t){if(function(){if(o=n.options,u=(o.trackConfig||[]).map((function(n){return[p(n,\"size\",1),p(n,\"spacing\",0),p(n,\"origin\",0)]})),s=u.length){e=v(u.reduce((function(n,t){return n+t[0]+t[1]}),0));var t,i=s-1;a=v(e+u[0][2]-u[i][0]-u[i][2]-u[i][1]),c=u.reduce((function(n,i){if(!n)return[0];var e=u[n.length-1],r=n[n.length-1]+(e[0]+e[2])+e[1];return r-=i[2],n[n.length-1]>r&&(r=n[n.length-1]),r=v(r),n.push(r),(!t||t200||(l(e)!==l(t.distance)&&t.distance&&(t={distance:0,lastTimestamp:0,time:0}),t.time&&(t.distance+=e),t.lastTimestamp&&(t.time+=r-t.lastTimestamp),t.lastTimestamp=r),t}),{distance:0,lastTimestamp:0,time:0});return t.distance/t.time||0}}}function g(n){var t,i,e,r,a,o,u,s;function c(n){return 2*n}function f(n){return d(n,u,s)}function p(n){return 1-Math.pow(1-n,3)}function v(){return e?n.track.velocity():0}function h(){b();var t=\"free-snap\"===n.options.mode,i=n.track,e=v();r=l(e);var u=n.track.details,s=[];if(e||!t){var d=m(e),h=d.dist,g=d.dur;if(g=c(g),h*=r,t){var x=i.idxToDist(i.distToIdx(h),!0);x&&(h=x)}s.push({distance:h,duration:g,easing:p});var k=u.position,y=k+h;if(yo){var w=yo||u=M)return t;if(u0||u>T&&i<0)return t;var c=(uM&&x0||x===T&&i<0)&&s(t),g+=c,!b&&Math.abs(g*r)>5&&(b=!0),n.track.add(c),m=o,n.emit(\"dragged\")}}function z(t){!f&&n.track.details&&n.track.details.length&&(g=0,f=!0,b=!1,h=!0,v=t.id,A(t),m=D(t),n.emit(\"dragStarted\"))}function I(t){f&&v===t.idChanged&&(f=!1,n.emit(\"dragEnded\"))}function A(n){var t=L(),i=t?n.y:n.x,e=t?n.x:n.y,r=void 0!==x&&void 0!==k&&Math.abs(k-e)<=Math.abs(x-i);return x=i,k=e,r}function D(n){return L()?n.y:n.x}function L(){return n.options.vertical}function S(){r=n.size,a=L()?window.innerHeight:window.innerWidth;var t=n.track.details;t&&(M=t.min,T=t.max)}function O(n){b&&(s(n),u(n))}function _(){if(C.purge(),n.options.drag&&!n.options.disabled){var i;i=n.options.dragSpeed||1,p=\"function\"==typeof i?i:function(n){return n*i},e=n.options.rtl?-1:1,S(),t=n.container,function(){var n=\"data-keen-slider-clickable\";o(\"[\".concat(n,\"]:not([\").concat(n,\"=false])\"),t).map((function(n){C.add(n,\"dragstart\",s),C.add(n,\"mousedown\",s),C.add(n,\"touchstart\",s)}))}(),C.add(t,\"dragstart\",(function(n){u(n)})),C.add(t,\"click\",O,{capture:!0}),C.input(t,\"ksDragStart\",z),C.input(t,\"ksDrag\",E),C.input(t,\"ksDragEnd\",I),C.input(t,\"mousedown\",z),C.input(t,\"mousemove\",E),C.input(t,\"mouseleave\",I),C.input(t,\"mouseup\",I),C.input(t,\"touchstart\",z,{passive:!0}),C.input(t,\"touchmove\",E,{passive:!1}),C.input(t,\"touchend\",I),C.input(t,\"touchcancel\",I),C.add(window,\"wheel\",(function(n){f&&u(n)}));var r=\"data-keen-slider-scrollable\";o(\"[\".concat(r,\"]:not([\").concat(r,\"=false])\"),n.container).map((function(n){return function(n){var t;C.input(n,\"touchstart\",(function(n){t=D(n),w=!0,y=!0}),{passive:!0}),C.input(n,\"touchmove\",(function(i){var e=L(),r=e?n.scrollHeight-n.clientHeight:n.scrollWidth-n.clientWidth,a=t-D(i),o=e?n.scrollTop:n.scrollLeft,s=e&&\"scroll\"===n.style.overflowY||!e&&\"scroll\"===n.style.overflowX;if(t=D(i),(a<0&&o>0||a>0&&o=1||(n.origin=1-t-(d>1?0:1-d)),n}))}e.options.trackConfig=a}function E(){I();var n=e.size;e.options.disabled||n===u||(u=n,T())}function z(){E(),setTimeout(E,500),setTimeout(E,2e3)}function I(){var n=f(e.container);e.size=(e.options.vertical?n.height:n.width)||1}function A(){e.slides=o(e.options.selector,e.container)}e.container=(v=o(t,l||document)).length?v[0]:null,e.destroy=function(){h.purge(),e.emit(\"destroyed\"),m(!0)},e.prev=function(){e.moveToIdx(e.track.details.abs-1,!0)},e.next=function(){e.moveToIdx(e.track.details.abs+1,!0)},e.update=T,y(e.options)}}var y=function(n,i,e){try{return function(n,t){var i,e={};return i={emit:function(n){e[n]&&e[n].forEach((function(n){n(i)}));var t=i.options&&i.options[n];t&&t(i)},moveToIdx:function(n,t,e){var r=i.track.idxToDist(n,t);if(r){var a=i.options.defaultAnimation;i.animator.start([{distance:r,duration:p(e||a,\"duration\",500),easing:p(e||a,\"easing\",(function(n){return 1+--n*n*n*n*n}))}])}},on:function(n,t,i){void 0===i&&(i=!1),e[n]||(e[n]=[]);var r=e[n].indexOf(t);r>-1?i&&delete e[n][r]:i||e[n].push(t)},options:n},function(){if(i.track=m(i),i.animator=h(i),t)for(var n=0,e=t;n div.classList.add(name))\n\t\t\treturn div\n\t\t}\n\n\t\tfunction arrowMarkup(remove) {\n\t\t\tif (remove) {\n\t\t\t\tremoveElement(arrowLeft)\n\t\t\t\tremoveElement(arrowRight)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tarrowLeft = createDiv('arrow arrow--left')\n\t\t\tarrowLeft.innerHTML = ``\n\t\t\tarrowLeft.addEventListener('click', () => slider.prev())\n\t\t\tarrowRight = createDiv('arrow arrow--right')\n\t\t\tarrowRight.innerHTML = ``\n\t\t\tarrowRight.addEventListener('click', () => slider.next())\n\n\t\t\twrapper.appendChild(arrowLeft)\n\t\t\twrapper.appendChild(arrowRight)\n\t\t}\n\n\t\tfunction wrapperMarkup(remove) {\n\t\t\tif (remove) {\n\t\t\t\tvar parent = wrapper.parentNode\n\t\t\t\twhile (wrapper.firstChild)\n\t\t\t\t\tparent.insertBefore(wrapper.firstChild, wrapper)\n\t\t\t\tremoveElement(wrapper)\n\t\t\t\treturn\n\t\t\t}\n\t\t\twrapper = createDiv('slider-wrapper')\n\t\t\tslider.container.parentNode.appendChild(wrapper)\n\t\t\twrapper.appendChild(slider.container)\n\t\t}\n\n\t\tfunction dotMarkup(remove) {\n\t\t\tif (remove) {\n\t\t\t\tremoveElement(dots)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdots = createDiv('dots')\n\t\t\tslider.track.details.slides.forEach((_e, idx) => {\n\t\t\t\tvar dot = createDiv('dot')\n\t\t\t\tdot.addEventListener('click', () => slider.moveToIdx(idx))\n\t\t\t\tdots.appendChild(dot)\n\t\t\t})\n\t\t\twrapper.appendChild(dots)\n\t\t}\n\n\t\tfunction updateClasses() {\n\t\t\tvar slide = slider.track.details.rel\n\t\t\tArray.from(dots.children).forEach(function (dot, idx) {\n\t\t\t\tidx === slide\n\t\t\t\t\t? dot.classList.add('dot--active')\n\t\t\t\t\t: dot.classList.remove('dot--active')\n\t\t\t})\n\t\t}\n\n\t\tslider.on('created', () => {\n\t\t\tmarkup()\n\t\t\tupdateClasses()\n\t\t})\n\t\tslider.on('optionsChanged', () => {\n\t\t\tmarkup(true)\n\t\t\tmarkup()\n\t\t\tupdateClasses()\n\t\t})\n\t\tslider.on('slideChanged', () => {\n\t\t\tupdateClasses()\n\t\t})\n\t\tslider.on('destroyed', () => {\n\t\t\tmarkup(true)\n\t\t})\n\t}\n\n\tvar slider = new KeenSlider(\n\t\t'.slider',\n\t\t{\n\t\t\tloop: true,\n\t\t\tslides: {\n\t\t\t\torigin: 'center',\n\t\t\t\tperView: 'auto',\n\t\t\t\tspacing: 16,\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t'(min-width: 500px)': {\n\t\t\t\t\tslides: {\n\t\t\t\t\t\torigin: 'center',\n\t\t\t\t\t\tperView: 'auto',\n\t\t\t\t\t\tspacing: 32,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t[navigation]\n\t)\n\n\tsetTimeout(() => {\n\t\tslider.update()\n\t}, 1000)\n}\n", "window.addEventListener('DOMContentLoaded', () => {\n\tlet video = document.getElementById('video')\n\tlet plyBtn = document.getElementById('vidBtn')\n\tlet vidWrapper = document.getElementById('playVid')\n\n\tfunction videoPausePlayHandler(e) {\n\t\tif (e.type == 'playing') {\n\t\t\tvideo.setAttribute('controls', 'controls')\n\t\t\tplyBtn.style.display = 'none'\n\t\t\tvidWrapper.classList.toggle('paused')\n\t\t} else if (e.type == 'pause') {\n\t\t\tvideo.removeAttribute('controls')\n\t\t\tplyBtn.style.display = 'block'\n\t\t\tvidWrapper.classList.toggle('paused')\n\t\t}\n\t}\n\n\tif (vidWrapper && video) {\n\t\tvidWrapper.onclick = function () {\n\t\t\tvideo.play()\n\t\t}\n\n\t\tvideo.addEventListener('playing', videoPausePlayHandler, false)\n\t\tvideo.addEventListener('pause', videoPausePlayHandler, false)\n\t}\n})\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\t// This is specifically for the service pages video blocks\n\tconst videos = document.querySelectorAll(\n\t\t'section.video video, section.cards .card .video video'\n\t)\n\tvideos.forEach(video => {\n\t\tlet vidWrapper = video.closest('.playVid')\n\t\tlet plyBtn = vidWrapper?.querySelector('.video-play')\n\n\t\tfunction videoPausePlayHandler(e) {\n\t\t\tif (e.type == 'playing') {\n\t\t\t\tvideo.setAttribute('controls', 'controls')\n\t\t\t\tplyBtn.style.display = 'none'\n\t\t\t\tvidWrapper.classList.toggle('paused')\n\t\t\t} else if (e.type == 'pause') {\n\t\t\t\tvideo.removeAttribute('controls')\n\t\t\t\tplyBtn.style.display = 'block'\n\t\t\t\tvidWrapper.classList.toggle('paused')\n\t\t\t}\n\t\t}\n\n\t\tif (vidWrapper && video) {\n\t\t\tvidWrapper.onclick = function () {\n\t\t\t\tvideo.play()\n\t\t\t}\n\n\t\t\tvideo.addEventListener('playing', videoPausePlayHandler, false)\n\t\t\tvideo.addEventListener('pause', videoPausePlayHandler, false)\n\t\t}\n\t})\n})\n", "import KeenSlider from 'keen-slider'\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\t// This is specifically for videos with chapters (harm reduction page)\n\tconst videoSections = document.querySelectorAll('.video.has-chapters')\n\n\tvideoSections.forEach(videoSection => {\n\t\tlet vidWrapper = videoSection.querySelector('.playVid')\n\t\tlet plyBtn = videoSection.querySelector('.video-play')\n\t\tlet chapters = videoSection.querySelectorAll('.chapters .chapter')\n\t\tlet video = videoSection.querySelector('video')\n\n\t\tfunction videoPausePlayHandler(e) {\n\t\t\tif (e.type == 'playing') {\n\t\t\t\tvideo.setAttribute('controls', 'controls')\n\t\t\t\tplyBtn.style.display = 'none'\n\t\t\t\tvidWrapper.classList.remove('paused')\n\t\t\t} else if (e.type == 'pause') {\n\t\t\t\tif (!video.seeking) {\n\t\t\t\t\tvideo.removeAttribute('controls')\n\t\t\t\t\tplyBtn.style.display = 'block'\n\t\t\t\t\tvidWrapper.classList.add('paused')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (vidWrapper && video) {\n\t\t\tvidWrapper.addEventListener('click', () => {\n\t\t\t\tvideo.play()\n\t\t\t})\n\n\t\t\tvideo.addEventListener('playing', videoPausePlayHandler, false)\n\t\t\tvideo.addEventListener('pause', videoPausePlayHandler, false)\n\t\t}\n\n\t\tchapters.forEach(chapter => {\n\t\t\tchapter.addEventListener('click', () => {\n\t\t\t\tlet time = chapter.dataset.timestamp.split(':')\n\t\t\t\tlet mins = parseInt(time[0])\n\t\t\t\tlet secs = parseInt(time[1])\n\t\t\t\tvideo.currentTime = mins * 60 + secs\n\t\t\t\tvideo.play()\n\t\t\t})\n\t\t})\n\n\t\tlet chaptersWrapper = videoSection.querySelector('.chapters')\n\t\tlet chaptersSlider = videoSection.querySelector('.keen-slider')\n\t\tvar slider = new KeenSlider(\n\t\t\tchaptersSlider,\n\t\t\t{\n\t\t\t\tslides: {\n\t\t\t\t\tperView: 2,\n\t\t\t\t\tspacing: 8,\n\t\t\t\t},\n\t\t\t\tbreakpoints: {\n\t\t\t\t\t'(min-width: 500px)': {\n\t\t\t\t\t\tslides: {\n\t\t\t\t\t\t\tperView: 3,\n\t\t\t\t\t\t\tspacing: 8,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'(min-width: 767px)': {\n\t\t\t\t\t\tslides: {\n\t\t\t\t\t\t\tperView: 4,\n\t\t\t\t\t\t\tspacing: 8,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'(min-width: 1500px)': {\n\t\t\t\t\t\tslides: {\n\t\t\t\t\t\t\tperView: 5,\n\t\t\t\t\t\t\tspacing: 8,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'(min-width: 1900px)': {\n\t\t\t\t\t\tslides: {\n\t\t\t\t\t\t\tperView: 6,\n\t\t\t\t\t\t\tspacing: 8,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t[\n\t\t\t\tslider => {\n\t\t\t\t\tlet prevBtn = chaptersWrapper.querySelector('button.prev')\n\t\t\t\t\tlet nextBtn = chaptersWrapper.querySelector('button.next')\n\n\t\t\t\t\tprevBtn?.addEventListener('click', () => {\n\t\t\t\t\t\tslider.prev()\n\t\t\t\t\t})\n\n\t\t\t\t\tnextBtn?.addEventListener('click', () => {\n\t\t\t\t\t\tslider.next()\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t]\n\t\t)\n\t})\n})\n", "window.toggleEst = function (est: Element) {\n\tlet currActive = document.querySelector(\n\t\t'.inspections-table .establishment.active'\n\t)\n\n\tif (est != currActive) {\n\t\tcurrActive?.classList.remove('active')\n\n\t\test.setAttribute(\n\t\t\t'style',\n\t\t\t`--height: ${est.querySelector('.details')?.scrollHeight}px;`\n\t\t)\n\t\test.classList.toggle('active')\n\t}\n}\n\n// Handles active establishment for both mobile and desktop\nconst establishments = document.querySelectorAll(\n\t'.inspections-table .establishment'\n)\nwindow.addEventListener('resize', e => {\n\testablishments.forEach(est => {\n\t\test.setAttribute(\n\t\t\t'style',\n\t\t\t`--height: ${est.querySelector('.details')?.scrollHeight}px;`\n\t\t)\n\t})\n})\n\n// Handles sortby\nconst sortby = document.querySelector('.sortby-wrapper')\nsortby?.addEventListener('click', e => {\n\tsortby.classList.toggle('active')\n})\nwindow.addEventListener('click', e => {\n\tif (!e.target.closest('.sortby-wrapper')) {\n\t\tsortby?.classList.remove('active')\n\t}\n})\n\n// Handles form\nconst form = document.querySelector('.actions form')\nform?.addEventListener('submit', e => {\n\te.preventDefault()\n})\n", "const yearFilter = document.querySelector('select[name=\"year\"]')\nconst typeFilter = document.querySelector('select[name=\"report-type\"]')\n\nconst years = document.querySelectorAll('.reports .year')\nconst reports = document.querySelectorAll('.reports .report')\n\nyearFilter?.addEventListener('change', () => {\n\tif (yearFilter.value == 'all') {\n\t\tyears.forEach(year => {\n\t\t\tyear.classList.remove('hide')\n\t\t})\n\t} else {\n\t\tyears.forEach(year => {\n\t\t\tif (year.dataset.year != yearFilter.value) {\n\t\t\t\tyear.classList.add('hide')\n\t\t\t} else {\n\t\t\t\tyear.classList.remove('hide')\n\t\t\t}\n\t\t})\n\t}\n})\n\ntypeFilter?.addEventListener('change', () => {\n\tif (typeFilter.value == 'all') {\n\t\treports.forEach(report => {\n\t\t\treport.classList.remove('hide')\n\t\t})\n\t} else {\n\t\treports.forEach(report => {\n\t\t\tif (report.dataset.type != typeFilter.value) {\n\t\t\t\treport.classList.add('hide')\n\t\t\t} else {\n\t\t\t\treport.classList.remove('hide')\n\t\t\t}\n\t\t})\n\t}\n})\n", "import KeenSlider from 'keen-slider'\n\nif (document.querySelector('.latest-news .posts-slider')) {\n\tlet navWrapper = document.querySelector(\n\t\t'.latest-news .posts .keen-slider-nav'\n\t)\n\tlet dots = navWrapper.querySelectorAll('.dots .dot')\n\tlet prevArrow = navWrapper.querySelector('.arrows button.prev')\n\tlet nextArrow = navWrapper.querySelector('.arrows button.next')\n\n\tvar slider = new KeenSlider(\n\t\t'.latest-news .posts-slider',\n\t\t{\n\t\t\tloop: false,\n\t\t\tslides: {\n\t\t\t\tperView: 1,\n\t\t\t\tspacing: 16,\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t'(min-width: 767px)': {\n\t\t\t\t\tslides: {\n\t\t\t\t\t\tperView: 1.2,\n\t\t\t\t\t\tspacing: 24,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'(min-width: 1500px)': {\n\t\t\t\t\tslides: {\n\t\t\t\t\t\tperView: 1.6,\n\t\t\t\t\t\tspacing: 24,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'(min-width: 1900px)': {\n\t\t\t\t\tslides: {\n\t\t\t\t\t\tperView: 2,\n\t\t\t\t\t\tspacing: 24,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t[\n\t\t\tslider => {\n\t\t\t\tfunction updateClasses() {\n\t\t\t\t\tvar slide = slider.track.details.rel\n\t\t\t\t\tslide === 0\n\t\t\t\t\t\t? prevArrow.classList.add('arrow--disabled')\n\t\t\t\t\t\t: prevArrow.classList.remove('arrow--disabled')\n\t\t\t\t\tslide === slider.track.details.slides.length - 1\n\t\t\t\t\t\t? nextArrow.classList.add('arrow--disabled')\n\t\t\t\t\t\t: nextArrow.classList.remove('arrow--disabled')\n\t\t\t\t\tdots.forEach(dot => {\n\t\t\t\t\t\tlet idx = parseInt(dot.dataset.index)\n\t\t\t\t\t\tidx === slide ||\n\t\t\t\t\t\t(slider.options.slides.perView >= 2 && idx === slide + 1)\n\t\t\t\t\t\t\t? dot.classList.add('dot--active')\n\t\t\t\t\t\t\t: dot.classList.remove('dot--active')\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tdots.forEach(dot => {\n\t\t\t\t\tdot.addEventListener('click', () => {\n\t\t\t\t\t\tlet idx = parseInt(dot.dataset.index)\n\t\t\t\t\t\tidx =\n\t\t\t\t\t\t\tidx > slider.track.details.maxIdx\n\t\t\t\t\t\t\t\t? slider.track.details.maxIdx\n\t\t\t\t\t\t\t\t: idx\n\t\t\t\t\t\tslider.moveToIdx(idx)\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\tprevArrow.addEventListener('click', () => {\n\t\t\t\t\tslider.prev()\n\t\t\t\t})\n\n\t\t\t\tnextArrow.addEventListener('click', () => {\n\t\t\t\t\tslider.next()\n\t\t\t\t})\n\n\t\t\t\tslider.on('created', () => {\n\t\t\t\t\tupdateClasses()\n\t\t\t\t})\n\t\t\t\tslider.on('slideChanged', () => {\n\t\t\t\t\tupdateClasses()\n\t\t\t\t})\n\t\t\t\tslider.on('optionsChanged', () => {\n\t\t\t\t\tupdateClasses()\n\t\t\t\t})\n\t\t\t},\n\t\t]\n\t)\n\n\tsetTimeout(() => {\n\t\tslider.update()\n\t}, 1000)\n}\n", "import KeenSlider from 'keen-slider'\n\nif (document.querySelector('.sliderSection .keen-slider')) {\n\tlet navWrapper = document.querySelector('.sliderSection .keen-slider-nav')\n\tlet prevArrow = navWrapper.querySelector('.arrows button.prev')\n\tlet nextArrow = navWrapper.querySelector('.arrows button.next')\n\n\tvar slider = new KeenSlider(\n\t\t'.sliderSection .keen-slider',\n\t\t{\n\t\t\tloop: false,\n\t\t\tslides: {\n\t\t\t\tperView: 1,\n\t\t\t\tspacing: 16,\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t'(min-width: 767px)': {\n\t\t\t\t\tslides: {\n\t\t\t\t\t\tperView: 1.2,\n\t\t\t\t\t\tspacing: 24,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'(min-width: 1500px)': {\n\t\t\t\t\tslides: {\n\t\t\t\t\t\tperView: 1.2,\n\t\t\t\t\t\tspacing: 40,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t[\n\t\t\tslider => {\n\t\t\t\tfunction updateClasses() {\n\t\t\t\t\tvar slide = slider.track.details.rel\n\t\t\t\t\tslide === 0\n\t\t\t\t\t\t? prevArrow.classList.add('arrow--disabled')\n\t\t\t\t\t\t: prevArrow.classList.remove('arrow--disabled')\n\t\t\t\t\tslide === slider.track.details.slides.length - 1\n\t\t\t\t\t\t? nextArrow.classList.add('arrow--disabled')\n\t\t\t\t\t\t: nextArrow.classList.remove('arrow--disabled')\n\t\t\t\t}\n\n\t\t\t\tprevArrow.addEventListener('click', () => {\n\t\t\t\t\tslider.prev()\n\t\t\t\t})\n\n\t\t\t\tnextArrow.addEventListener('click', () => {\n\t\t\t\t\tslider.next()\n\t\t\t\t})\n\n\t\t\t\tslider.on('created', () => {\n\t\t\t\t\tupdateClasses()\n\t\t\t\t})\n\t\t\t\tslider.on('slideChanged', () => {\n\t\t\t\t\tupdateClasses()\n\t\t\t\t})\n\t\t\t\tslider.on('optionsChanged', () => {\n\t\t\t\t\tupdateClasses()\n\t\t\t\t})\n\t\t\t},\n\t\t]\n\t)\n\n\tsetTimeout(() => {\n\t\tslider.update()\n\t}, 1000)\n}\n", "document.addEventListener('DOMContentLoaded', () => {\n\tconst shipButtons = document.querySelectorAll('.ship-button')\n\tconst shipPopup = document.querySelector('.shippingPopup')\n\tconst shipClose = shipPopup?.querySelector('button.close')\n\n\tshipButtons.forEach(btn => {\n\t\tbtn.addEventListener('click', () => {\n\t\t\tshipPopup.classList.add('open')\n\t\t})\n\t})\n\n\tshipClose?.addEventListener('click', () => {\n\t\tshipPopup.classList.remove('open')\n\t})\n})\n", "document.addEventListener('DOMContentLoaded', () => {\n\tconst decks = document.querySelectorAll('.deck')\n\n\tfunction nextCard(deck, e) {\n\t\tdeck.classList.add('fwd')\n\t\tdeck.classList.remove('bck')\n\t\tvar index = parseInt(deck.dataset.activeCard)\n\t\tindex++\n\t\tif (index > deck.children.length) {\n\t\t\tindex = 1\n\t\t}\n\t\tdeck.dataset.activeCard = index\n\t}\n\n\tfunction previousCard(deck, e) {\n\t\tdeck.classList.remove('fwd')\n\t\tdeck.classList.add('bck')\n\t\tvar index = parseInt(deck.dataset.activeCard)\n\t\tindex--\n\t\tif (index < 1) {\n\t\t\tindex = deck.children.length\n\t\t}\n\t\tdeck.dataset.activeCard = index\n\t}\n\n\tdecks.forEach(deck => {\n\t\tdeck.addEventListener('click', e => {\n\t\t\tnextCard(deck, e)\n\t\t})\n\t\tdeck.addEventListener('mousedown', e => {\n\t\t\tif (e.button == 2) {\n\t\t\t\tpreviousCard(deck, e)\n\t\t\t}\n\t\t})\n\t\tdeck.addEventListener('contextmenu', e => {\n\t\t\te.preventDefault()\n\t\t\treturn false\n\t\t})\n\t\tdeck.addEventListener('keydown', e => {\n\t\t\tif (e.key === 'ArrowRight') {\n\t\t\t\tnextCard(deck, e)\n\t\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\t\tpreviousCard(deck, e)\n\t\t\t}\n\t\t})\n\t})\n})\n", "window.addEventListener('DOMContentLoaded', () => {\n\tconst infos = document.querySelectorAll('.optionalInfo')\n\n\tinfos.forEach(info => {\n\t\tconst btn = info.querySelector('img.trigger')\n\t\tconst tooltip = info.querySelector('.tooltip')\n\n\t\tbtn?.addEventListener('click', e => {\n\t\t\ttooltip?.classList.toggle('open')\n\t\t})\n\t})\n})\n", "document.addEventListener('DOMContentLoaded', () => {\n\t// Filter files by folder (category)\n\tconst folderFilters = document.querySelectorAll('button[data-folder-id]')\n\tconst filesList = document.querySelector('ul.files')\n\tconst files = document.querySelectorAll('li[data-folder-id]')\n\n\tfolderFilters?.forEach(filter => {\n\t\tfilter.addEventListener('click', e => {\n\t\t\tfolderFilters.forEach(filter => {\n\t\t\t\tfilter.classList.remove('selected')\n\t\t\t})\n\t\t\tfilter.classList.add('selected')\n\n\t\t\tfiles.forEach(file => {\n\t\t\t\tlet folderIds = file.dataset.folderId.split(',')\n\t\t\t\tif (\n\t\t\t\t\te.target.dataset.folderId === '0' ||\n\t\t\t\t\tfolderIds.includes(e.target.dataset.folderId)\n\t\t\t\t) {\n\t\t\t\t\tfile.classList.remove('hidden')\n\t\t\t\t} else {\n\t\t\t\t\tfile.classList.add('hidden')\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t})\n\n\t// Sort files by year or name\n\tconst sortYearButton = document.querySelector('button[data-sort=\"year\"]')\n\tconst sortNameButton = document.querySelector('button[data-sort=\"name\"]')\n\tconst sortSelect = document.querySelector('select#sort')\n\n\t// Set up possible sort options as arrays so we don't have to re-do the work if they end up re-selecting a previous sort option\n\tlet sortedYearDesc = Array.from(files)\n\tlet sortedYearAsc = sortedYearDesc.toReversed()\n\tlet sortedNameDesc = Array.from(files).sort((a, b) =>\n\t\tb.dataset.name.localeCompare(a.dataset.name)\n\t)\n\tlet sortedNameAsc = sortedNameDesc.toReversed()\n\n\tsortYearButton?.addEventListener('click', () => {\n\t\tsortYearButton.classList.add('selected')\n\t\tsortNameButton.classList.remove('selected')\n\n\t\tif (sortYearButton.classList.contains('desc')) {\n\t\t\tsortYearButton.classList.remove('desc')\n\t\t\tsortYearButton.classList.add('asc')\n\n\t\t\tsortSelect.value = 'yearAsc'\n\n\t\t\tfilesList.replaceChildren(...sortedYearAsc)\n\t\t} else {\n\t\t\tsortYearButton.classList.add('desc')\n\t\t\tsortYearButton.classList.remove('asc')\n\n\t\t\tsortSelect.value = 'yearDesc'\n\n\t\t\tfilesList.replaceChildren(...sortedYearDesc)\n\t\t}\n\t})\n\n\tsortNameButton?.addEventListener('click', () => {\n\t\tsortNameButton.classList.add('selected')\n\t\tsortYearButton.classList.remove('selected')\n\n\t\tif (sortNameButton.classList.contains('desc')) {\n\t\t\tsortNameButton.classList.remove('desc')\n\t\t\tsortNameButton.classList.add('asc')\n\n\t\t\tsortSelect.value = 'nameAsc'\n\n\t\t\tfilesList.replaceChildren(...sortedNameAsc)\n\t\t} else {\n\t\t\tsortNameButton.classList.add('desc')\n\t\t\tsortNameButton.classList.remove('asc')\n\n\t\t\tsortSelect.value = 'nameDesc'\n\n\t\t\tfilesList.replaceChildren(...sortedNameDesc)\n\t\t}\n\t})\n\n\tsortSelect?.addEventListener('change', () => {\n\t\tconst selectedValue = sortSelect.value\n\n\t\tswitch (selectedValue) {\n\t\t\tcase 'nameAsc':\n\t\t\t\tsortNameButton.classList.add('selected')\n\t\t\t\tsortYearButton.classList.remove('selected')\n\t\t\t\tsortNameButton.classList.add('asc')\n\t\t\t\tsortNameButton.classList.remove('desc')\n\t\t\t\tfilesList.replaceChildren(...sortedNameAsc)\n\t\t\t\tbreak\n\t\t\tcase 'nameDesc':\n\t\t\t\tsortNameButton.classList.add('selected')\n\t\t\t\tsortYearButton.classList.remove('selected')\n\t\t\t\tsortNameButton.classList.add('desc')\n\t\t\t\tsortNameButton.classList.remove('asc')\n\t\t\t\tfilesList.replaceChildren(...sortedNameDesc)\n\t\t\t\tbreak\n\t\t\tcase 'yearAsc':\n\t\t\t\tsortYearButton.classList.add('selected')\n\t\t\t\tsortNameButton.classList.remove('selected')\n\t\t\t\tsortYearButton.classList.add('asc')\n\t\t\t\tsortYearButton.classList.remove('desc')\n\t\t\t\tfilesList.replaceChildren(...sortedYearAsc)\n\t\t\t\tbreak\n\t\t\tcase 'yearDesc':\n\t\t\t\tsortYearButton.classList.add('selected')\n\t\t\t\tsortNameButton.classList.remove('selected')\n\t\t\t\tsortYearButton.classList.add('desc')\n\t\t\t\tsortYearButton.classList.remove('asc')\n\t\t\t\tfilesList.replaceChildren(...sortedYearDesc)\n\t\t\t\tbreak\n\t\t}\n\t})\n\n\t// Open/close details depending on screen size\n\tconst details = document.querySelector('.subfolders-wrapper details')\n\t// Do it once on page load\n\tif (details) {\n\t\tif (window.innerWidth >= 992) {\n\t\t\tdetails.open = true\n\t\t} else {\n\t\t\tdetails.open = false\n\t\t}\n\t\t// Update it on resize\n\t\twindow.addEventListener('resize', () => {\n\t\t\tif (window.innerWidth >= 992) {\n\t\t\t\tdetails.open = true\n\t\t\t} else {\n\t\t\t\tdetails.open = false\n\t\t\t}\n\t\t})\n\t}\n})\n", "import KeenSlider from 'keen-slider'\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\t// Measure childPagesText elements to get height for expand on hover CSS\n\tconst childPagesText = document.querySelectorAll(\n\t\t'.thriveLocallyParent .childPages .child p'\n\t)\n\n\t// Need to give a pause because I think layout shift is causing this measurement to be incorrect in the beginning\n\tsetTimeout(() => {\n\t\tchildPagesText.forEach(childPageText => {\n\t\t\tchildPageText.setAttribute(\n\t\t\t\t'style',\n\t\t\t\t`--height: ${childPageText.scrollHeight}px`\n\t\t\t)\n\t\t})\n\n\t\twindow.addEventListener('resize', () => {\n\t\t\tchildPagesText.forEach(childPageText => {\n\t\t\t\tchildPageText.setAttribute('style', `--height: auto`)\n\t\t\t\tchildPageText.setAttribute(\n\t\t\t\t\t'style',\n\t\t\t\t\t`--height: ${childPageText.scrollHeight}px`\n\t\t\t\t)\n\t\t\t})\n\t\t})\n\t}, 100)\n\n\t// Slider on child pages\n\tconst sliderWrappers = document.querySelectorAll(\n\t\t'.thriveLocallyChild .cardWithSlider .slider-wrapper'\n\t)\n\tsliderWrappers.forEach(sliderWrapper => {\n\t\tconst dots = sliderWrapper.querySelectorAll('.dots .dot')\n\t\tconst prevArrow = sliderWrapper.querySelector('button.slider-control.prev')\n\t\tconst nextArrow = sliderWrapper.querySelector('button.slider-control.next')\n\t\tconst sliderEl = sliderWrapper.querySelector('.keen-slider')\n\t\tconst numSlides = sliderEl.querySelectorAll('.keen-slider__slide').length\n\n\t\tvar slider = new KeenSlider(\n\t\t\tsliderEl,\n\t\t\t{\n\t\t\t\tloop: true,\n\t\t\t\tslides: {\n\t\t\t\t\tperView: 1,\n\t\t\t\t},\n\t\t\t\tbreakpoints: {\n\t\t\t\t\t'(min-width: 640px)': {\n\t\t\t\t\t\tloop: false,\n\t\t\t\t\t\tslides: {\n\t\t\t\t\t\t\tperView: numSlides >= 2 ? 2 : 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'(min-width: 1900px)': {\n\t\t\t\t\t\tloop: false,\n\t\t\t\t\t\tslides: {\n\t\t\t\t\t\t\tperView: numSlides >= 3 ? 3 : numSlides >= 2 ? 2 : 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t[\n\t\t\t\tslider => {\n\t\t\t\t\tfunction updateClasses() {\n\t\t\t\t\t\tvar slide = slider.track.details.rel\n\t\t\t\t\t\tslide === 0\n\t\t\t\t\t\t\t? prevArrow.classList.add('arrow--disabled')\n\t\t\t\t\t\t\t: prevArrow.classList.remove('arrow--disabled')\n\t\t\t\t\t\tslide === slider.track.details.slides.length - 1\n\t\t\t\t\t\t\t? nextArrow.classList.add('arrow--disabled')\n\t\t\t\t\t\t\t: nextArrow.classList.remove('arrow--disabled')\n\t\t\t\t\t\tdots.forEach(dot => {\n\t\t\t\t\t\t\tlet idx = parseInt(dot.dataset.index)\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tslider.options.slides.perView >= 3 &&\n\t\t\t\t\t\t\t\t(idx === slide + 1 || idx === slide + 2)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tdot.classList.add('dot--active')\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\tslider.options.slides.perView >= 2 &&\n\t\t\t\t\t\t\t\tidx === slide + 1\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tdot.classList.add('dot--active')\n\t\t\t\t\t\t\t} else if (idx === slide) {\n\t\t\t\t\t\t\t\tdot.classList.add('dot--active')\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdot.classList.remove('dot--active')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tdots.forEach(dot => {\n\t\t\t\t\t\tdot.addEventListener('click', () => {\n\t\t\t\t\t\t\tlet idx = parseInt(dot.dataset.index)\n\t\t\t\t\t\t\tidx =\n\t\t\t\t\t\t\t\tidx > slider.track.details.maxIdx\n\t\t\t\t\t\t\t\t\t? slider.track.details.maxIdx\n\t\t\t\t\t\t\t\t\t: idx\n\t\t\t\t\t\t\tslider.moveToIdx(idx)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t\tprevArrow.addEventListener('click', () => {\n\t\t\t\t\t\tslider.prev()\n\t\t\t\t\t})\n\t\t\t\t\tnextArrow.addEventListener('click', () => {\n\t\t\t\t\t\tslider.next()\n\t\t\t\t\t})\n\t\t\t\t\tslider.on('created', () => {\n\t\t\t\t\t\tupdateClasses()\n\t\t\t\t\t})\n\t\t\t\t\tslider.on('slideChanged', () => {\n\t\t\t\t\t\tupdateClasses()\n\t\t\t\t\t})\n\t\t\t\t\tslider.on('optionsChanged', () => {\n\t\t\t\t\t\tupdateClasses()\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t]\n\t\t)\n\n\t\tsetTimeout(() => {\n\t\t\tslider.update()\n\t\t}, 1000)\n\t})\n})\n", "document.addEventListener('DOMContentLoaded', async () => {\n\tconst canvas = document.querySelector('#dotlottie-canvas-hero')\n\n\tif (canvas) {\n\t\t// Start loading the hero animation\n\t\tconst dotLottieHero = new DotLottie({\n\t\t\tloop: true,\n\t\t\tcanvas: canvas,\n\t\t\tsrc: '/assets/lottie/thrive-locally-hero-' + window.season + '.json',\n\t\t\trenderConfig: {\n\t\t\t\tdevicePixelRatio: 1,\n\t\t\t\tfreezeOnOffscreen: true,\n\t\t\t\tautoResize: true,\n\t\t\t},\n\t\t\tlayout: {\n\t\t\t\tfit: 'cover',\n\t\t\t\talign: [0.5, 0.5],\n\t\t\t},\n\t\t})\n\n\t\t// Once the hero animation has loaded, wait for the loader to complete a loop\n\t\tdotLottieHero.addEventListener('load', e => {\n\t\t\twindow.controller.abort()\n\t\t})\n\n\t\t// If the hero fails to load for some reason, fade out the loader anyway once the loop is complete\n\t\tdotLottieHero.addEventListener('loadError', e => {\n\t\t\twindow.controller.abort()\n\t\t})\n\n\t\t// Once a loop has been completed, fade the loader out and stop the animation\n\t\tawait window.loaderAnimation\n\t\tdotLottieHero.play()\n\t\t// This is necessary because in Chrome on mobile, the freezeOnOffscreen option causes the animation to be frozen on page load\n\t\t// This ensures it unfreezes on page load to get started, but allows us to still use the freezeOnOffscreen option for better performance\n\t\tdotLottieHero.unfreeze()\n\t}\n})\n", "/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n", "/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n", "import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n", "import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n", "import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = _limitValue(Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n", "import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n", "import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n", "const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n", "export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n", "\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n", "import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n", "import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n", "import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n", "import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n", "import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n", "/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n", "import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n", "import type {ChartArea, Scale} from '../types/index.js';\nimport type Chart from '../core/core.controller.js';\nimport type {ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n", "import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n", "export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n", "import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n", "import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n", "import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n", "import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n", "import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n", "import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n", "/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: TimeUnit): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: TimeUnit): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek'): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase\n};\n", "import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n", "import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n", "\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n", "/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n", "/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n", "import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n", "import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n", "import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n", "import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n", "import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n", "import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n", "import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = [];\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n", "import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n", "import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {retinaScale, _isDomSupported} from '../helpers/helpers.dom.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta, chartArea) {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n\n meta.controller.draw();\n\n if (useClip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n", "import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n", "import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n", "import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n", "import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n", "import {DoughnutController, PolarAreaController, defaults} from '../index.js';\nimport type {Chart, ChartDataset} from '../types.js';\n\nexport interface ColorsPluginOptions {\n enabled?: boolean;\n forceOverride?: boolean;\n}\n\ninterface ColorsDescriptor {\n backgroundColor?: unknown;\n borderColor?: unknown;\n}\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)', // blue\n 'rgb(255, 99, 132)', // red\n 'rgb(255, 159, 64)', // orange\n 'rgb(255, 205, 86)', // yellow\n 'rgb(75, 192, 192)', // green\n 'rgb(153, 102, 255)', // purple\n 'rgb(201, 203, 207)' // grey\n];\n\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map(color => color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\n\nfunction getBorderColor(i: number) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\n\nfunction getBackgroundColor(i: number) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\n\nfunction colorizeDefaultDataset(dataset: ChartDataset, i: number) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n\n return ++i;\n}\n\nfunction colorizeDoughnutDataset(dataset: ChartDataset, i: number) {\n dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));\n\n return i;\n}\n\nfunction colorizePolarAreaDataset(dataset: ChartDataset, i: number) {\n dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));\n\n return i;\n}\n\nfunction getColorizer(chart: Chart) {\n let i = 0;\n\n return (dataset: ChartDataset, datasetIndex: number) => {\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\n\nfunction containsColorsDefinitions(\n descriptors: ColorsDescriptor[] | Record\n) {\n let k: number | string;\n\n for (k in descriptors) {\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction containsColorsDefinition(\n descriptor: ColorsDescriptor\n) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\n\nfunction containsDefaultColorsDefenitions() {\n return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\n\nexport default {\n id: 'colors',\n\n defaults: {\n enabled: true,\n forceOverride: false\n } as ColorsPluginOptions,\n\n beforeLayout(chart: Chart, _args, options: ColorsPluginOptions) {\n if (!options.enabled) {\n return;\n }\n\n const {\n data: {datasets},\n options: chartOptions\n } = chart.config;\n const {elements} = chartOptions;\n\n const containsColorDefenition = (\n containsColorsDefinitions(datasets) ||\n containsColorsDefinition(chartOptions) ||\n (elements && containsColorsDefinitions(elements)) ||\n containsDefaultColorsDefenitions());\n\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n\n const colorizer = getColorizer(chart);\n\n datasets.forEach(colorizer);\n }\n};\n", "import {_limitValue, _lookupByKey, isNullOrUndef, resolve} from '../helpers/index.js';\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n /**\n * Implementation of the Largest Triangle Three Buckets algorithm.\n *\n * This implementation is based on the original implementation by Sveinn Steinarsson\n * in https://github.com/sveinn-steinarsson/flot-downsample/blob/master/jquery.flot.downsample.js\n *\n * The original implementation is MIT licensed.\n */\n const samples = options.samples || availableWidth;\n // There are less points than the threshold, returning the whole array\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n\n const decimated = [];\n\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n // Starting from offset\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n\n decimated[sampledIndex++] = data[a];\n\n for (i = 0; i < samples - 2; i++) {\n let avgX = 0;\n let avgY = 0;\n let j;\n\n // Adding offset\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n\n for (j = avgRangeStart; j < avgRangeEnd; j++) {\n avgX += data[j].x;\n avgY += data[j].y;\n }\n\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n\n // Adding offset\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const {x: pointAx, y: pointAy} = data[a];\n\n // Note that this is changed from the original algorithm which initializes these\n // values to 1. The reason for this change is that if the area is small, nextA\n // would never be set and thus a crash would occur in the next loop as `a` would become\n // `undefined`. Since the area is always positive, but could be 0 in the case of a flat trace,\n // initializing with a negative number is the correct solution.\n maxArea = area = -1;\n\n for (j = rangeOffs; j < rangeTo; j++) {\n area = 0.5 * Math.abs(\n (pointAx - avgX) * (data[j].y - pointAy) -\n (pointAx - data[j].x) * (avgY - pointAy)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n\n // Include the last point\n decimated[sampledIndex++] = data[endIndex];\n\n return decimated;\n}\n\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n\n for (i = start; i < start + count; ++i) {\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n // Use point.x here because we're computing the average data `x` value\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n // Push up to 4 points, 3 for the last interval and the first point for this interval\n const lastIndex = i - 1;\n\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n // The interval is defined by 4 points: start, min, max, end.\n // The starting point is already considered at this point, so we need to determine which\n // of the other points to add. We need to sort these points to ensure the decimated data\n // is still sorted and then ensure there are no duplicates.\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX,\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n\n // lastIndex === startIndex will occur when a range has only 1 point which could\n // happen with very uneven data\n if (i > 0 && lastIndex !== startIndex) {\n // Last point in the previous interval\n decimated.push(data[lastIndex]);\n }\n\n // Start of the new interval\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n\n return decimated;\n}\n\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data,\n });\n }\n}\n\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset) => {\n cleanDecimatedDataset(dataset);\n });\n}\n\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n\n let start = 0;\n let count;\n\n const {iScale} = meta;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n\n return {start, count};\n}\n\nexport default {\n id: 'decimation',\n\n defaults: {\n algorithm: 'min-max',\n enabled: false,\n },\n\n beforeElementsUpdate: (chart, args, options) => {\n if (!options.enabled) {\n // The decimation plugin may have been previously enabled. Need to remove old `dataset._data` handlers\n cleanDecimatedData(chart);\n return;\n }\n\n // Assume the entire chart is available to show a few more points than needed\n const availableWidth = chart.width;\n\n chart.data.datasets.forEach((dataset, datasetIndex) => {\n const {_data, indexAxis} = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n\n if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n // Decimation is only supported for lines that have an X indexAxis\n return;\n }\n\n if (!meta.controller.supportsDecimation) {\n // Only line datasets are supported\n return;\n }\n\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n // Only linear interpolation is supported\n return;\n }\n\n if (chart.options.parsing) {\n // Plugin only supports data that does not need parsing\n return;\n }\n\n let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n // No decimation is required until we are above this threshold\n cleanDecimatedDataset(dataset);\n return;\n }\n\n if (isNullOrUndef(_data)) {\n // First time we are seeing this dataset\n // We override the 'data' property with a setter that stores the\n // raw data in _data, but reads the decimated data from _decimated\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n\n // Point the chart to the decimated data\n let decimated;\n switch (options.algorithm) {\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n\n dataset._decimated = decimated;\n });\n },\n\n destroy(chart) {\n cleanDecimatedData(chart);\n }\n};\n", "import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n", "/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n", "import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n", "/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of an segment -> need to add another point before this,\n // from next line below.\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of an segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n", "import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n", "import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n", "import {clipArea, unclipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n if (property === 'x' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {line, target, color: below, scale, property});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, bounds) {\n const {top, bottom} = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n", "/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n", "import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n", "import Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {PI, isArray, toPadding, toFont} from '../helpers/index.js';\nimport {_toLeftRightCenter, _alignStartEnd} from '../helpers/helpers.extras.js';\nimport {renderText} from '../helpers/helpers.canvas.js';\n\nexport class Title extends Element {\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight) {\n const opts = this.options;\n\n this.left = 0;\n this.top = 0;\n\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n\n _drawArgs(offset) {\n const {top, left, bottom, right, options} = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {titleX, titleY, maxWidth, rotation};\n }\n\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n\n if (!opts.display) {\n return;\n }\n\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n}\n\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\n\nexport default {\n id: 'title',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Title,\n\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold',\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000 // by default greater than legend (1000) to be above\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n", "import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n", "import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n", "import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n", "import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n", "import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n", "import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n", "import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n", "import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, /** @type {Unit} */ (parser))\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n", "import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n", "export * from './controllers/index.js';\nexport * from './core/index.js';\nexport * from './elements/index.js';\nexport * from './platform/index.js';\nexport * from './plugins/index.js';\nexport * from './scales/index.js';\n\nimport * as controllers from './controllers/index.js';\nimport * as elements from './elements/index.js';\nimport * as plugins from './plugins/index.js';\nimport * as scales from './scales/index.js';\n\nexport {\n controllers,\n elements,\n plugins,\n scales,\n};\n\nexport const registerables = [\n controllers,\n elements,\n plugins,\n scales,\n];\n", "import {Chart, registerables} from '../dist/chart.js';\n\nChart.register(...registerables);\n\nexport * from '../dist/chart.js';\nexport default Chart;\n", "/*!\n * chartjs-plugin-datalabels v2.2.0\n * https://chartjs-plugin-datalabels.netlify.app\n * (c) 2017-2022 chartjs-plugin-datalabels contributors\n * Released under the MIT license\n */\nimport { isNullOrUndef, merge, toFont, resolve, toPadding, valueOrDefault, callback, isObject, each } from 'chart.js/helpers';\nimport { defaults as defaults$1, ArcElement, PointElement, BarElement } from 'chart.js';\n\nvar devicePixelRatio = (function() {\n if (typeof window !== 'undefined') {\n if (window.devicePixelRatio) {\n return window.devicePixelRatio;\n }\n\n // devicePixelRatio is undefined on IE10\n // https://stackoverflow.com/a/20204180/8837887\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/85\n var screen = window.screen;\n if (screen) {\n return (screen.deviceXDPI || 1) / (screen.logicalXDPI || 1);\n }\n }\n\n return 1;\n}());\n\nvar utils = {\n // @todo move this in Chart.helpers.toTextLines\n toTextLines: function(inputs) {\n var lines = [];\n var input;\n\n inputs = [].concat(inputs);\n while (inputs.length) {\n input = inputs.pop();\n if (typeof input === 'string') {\n lines.unshift.apply(lines, input.split('\\n'));\n } else if (Array.isArray(input)) {\n inputs.push.apply(inputs, input);\n } else if (!isNullOrUndef(inputs)) {\n lines.unshift('' + input);\n }\n }\n\n return lines;\n },\n\n // @todo move this in Chart.helpers.canvas.textSize\n // @todo cache calls of measureText if font doesn't change?!\n textSize: function(ctx, lines, font) {\n var items = [].concat(lines);\n var ilen = items.length;\n var prev = ctx.font;\n var width = 0;\n var i;\n\n ctx.font = font.string;\n\n for (i = 0; i < ilen; ++i) {\n width = Math.max(ctx.measureText(items[i]).width, width);\n }\n\n ctx.font = prev;\n\n return {\n height: ilen * font.lineHeight,\n width: width\n };\n },\n\n /**\n * Returns value bounded by min and max. This is equivalent to max(min, min(value, max)).\n * @todo move this method in Chart.helpers.bound\n * https://doc.qt.io/qt-5/qtglobal.html#qBound\n */\n bound: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Returns an array of pair [value, state] where state is:\n * * -1: value is only in a0 (removed)\n * * 1: value is only in a1 (added)\n */\n arrayDiff: function(a0, a1) {\n var prev = a0.slice();\n var updates = [];\n var i, j, ilen, v;\n\n for (i = 0, ilen = a1.length; i < ilen; ++i) {\n v = a1[i];\n j = prev.indexOf(v);\n\n if (j === -1) {\n updates.push([v, 1]);\n } else {\n prev.splice(j, 1);\n }\n }\n\n for (i = 0, ilen = prev.length; i < ilen; ++i) {\n updates.push([prev[i], -1]);\n }\n\n return updates;\n },\n\n /**\n * https://github.com/chartjs/chartjs-plugin-datalabels/issues/70\n */\n rasterize: function(v) {\n return Math.round(v * devicePixelRatio) / devicePixelRatio;\n }\n};\n\nfunction orient(point, origin) {\n var x0 = origin.x;\n var y0 = origin.y;\n\n if (x0 === null) {\n return {x: 0, y: -1};\n }\n if (y0 === null) {\n return {x: 1, y: 0};\n }\n\n var dx = point.x - x0;\n var dy = point.y - y0;\n var ln = Math.sqrt(dx * dx + dy * dy);\n\n return {\n x: ln ? dx / ln : 0,\n y: ln ? dy / ln : -1\n };\n}\n\nfunction aligned(x, y, vx, vy, align) {\n switch (align) {\n case 'center':\n vx = vy = 0;\n break;\n case 'bottom':\n vx = 0;\n vy = 1;\n break;\n case 'right':\n vx = 1;\n vy = 0;\n break;\n case 'left':\n vx = -1;\n vy = 0;\n break;\n case 'top':\n vx = 0;\n vy = -1;\n break;\n case 'start':\n vx = -vx;\n vy = -vy;\n break;\n case 'end':\n // keep natural orientation\n break;\n default:\n // clockwise rotation (in degree)\n align *= (Math.PI / 180);\n vx = Math.cos(align);\n vy = Math.sin(align);\n break;\n }\n\n return {\n x: x,\n y: y,\n vx: vx,\n vy: vy\n };\n}\n\n// Line clipping (Cohen\u2013Sutherland algorithm)\n// https://en.wikipedia.org/wiki/Cohen\u2013Sutherland_algorithm\n\nvar R_INSIDE = 0;\nvar R_LEFT = 1;\nvar R_RIGHT = 2;\nvar R_BOTTOM = 4;\nvar R_TOP = 8;\n\nfunction region(x, y, rect) {\n var res = R_INSIDE;\n\n if (x < rect.left) {\n res |= R_LEFT;\n } else if (x > rect.right) {\n res |= R_RIGHT;\n }\n if (y < rect.top) {\n res |= R_TOP;\n } else if (y > rect.bottom) {\n res |= R_BOTTOM;\n }\n\n return res;\n}\n\nfunction clipped(segment, area) {\n var x0 = segment.x0;\n var y0 = segment.y0;\n var x1 = segment.x1;\n var y1 = segment.y1;\n var r0 = region(x0, y0, area);\n var r1 = region(x1, y1, area);\n var r, x, y;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (!(r0 | r1) || (r0 & r1)) {\n // both points inside or on the same side: no clipping\n break;\n }\n\n // at least one point is outside\n r = r0 || r1;\n\n if (r & R_TOP) {\n x = x0 + (x1 - x0) * (area.top - y0) / (y1 - y0);\n y = area.top;\n } else if (r & R_BOTTOM) {\n x = x0 + (x1 - x0) * (area.bottom - y0) / (y1 - y0);\n y = area.bottom;\n } else if (r & R_RIGHT) {\n y = y0 + (y1 - y0) * (area.right - x0) / (x1 - x0);\n x = area.right;\n } else if (r & R_LEFT) {\n y = y0 + (y1 - y0) * (area.left - x0) / (x1 - x0);\n x = area.left;\n }\n\n if (r === r0) {\n x0 = x;\n y0 = y;\n r0 = region(x0, y0, area);\n } else {\n x1 = x;\n y1 = y;\n r1 = region(x1, y1, area);\n }\n }\n\n return {\n x0: x0,\n x1: x1,\n y0: y0,\n y1: y1\n };\n}\n\nfunction compute$1(range, config) {\n var anchor = config.anchor;\n var segment = range;\n var x, y;\n\n if (config.clamp) {\n segment = clipped(segment, config.area);\n }\n\n if (anchor === 'start') {\n x = segment.x0;\n y = segment.y0;\n } else if (anchor === 'end') {\n x = segment.x1;\n y = segment.y1;\n } else {\n x = (segment.x0 + segment.x1) / 2;\n y = (segment.y0 + segment.y1) / 2;\n }\n\n return aligned(x, y, range.vx, range.vy, config.align);\n}\n\nvar positioners = {\n arc: function(el, config) {\n var angle = (el.startAngle + el.endAngle) / 2;\n var vx = Math.cos(angle);\n var vy = Math.sin(angle);\n var r0 = el.innerRadius;\n var r1 = el.outerRadius;\n\n return compute$1({\n x0: el.x + vx * r0,\n y0: el.y + vy * r0,\n x1: el.x + vx * r1,\n y1: el.y + vy * r1,\n vx: vx,\n vy: vy\n }, config);\n },\n\n point: function(el, config) {\n var v = orient(el, config.origin);\n var rx = v.x * el.options.radius;\n var ry = v.y * el.options.radius;\n\n return compute$1({\n x0: el.x - rx,\n y0: el.y - ry,\n x1: el.x + rx,\n y1: el.y + ry,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n bar: function(el, config) {\n var v = orient(el, config.origin);\n var x = el.x;\n var y = el.y;\n var sx = 0;\n var sy = 0;\n\n if (el.horizontal) {\n x = Math.min(el.x, el.base);\n sx = Math.abs(el.base - el.x);\n } else {\n y = Math.min(el.y, el.base);\n sy = Math.abs(el.base - el.y);\n }\n\n return compute$1({\n x0: x,\n y0: y + sy,\n x1: x + sx,\n y1: y,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n fallback: function(el, config) {\n var v = orient(el, config.origin);\n\n return compute$1({\n x0: el.x,\n y0: el.y,\n x1: el.x + (el.width || 0),\n y1: el.y + (el.height || 0),\n vx: v.x,\n vy: v.y\n }, config);\n }\n};\n\nvar rasterize = utils.rasterize;\n\nfunction boundingRects(model) {\n var borderWidth = model.borderWidth || 0;\n var padding = model.padding;\n var th = model.size.height;\n var tw = model.size.width;\n var tx = -tw / 2;\n var ty = -th / 2;\n\n return {\n frame: {\n x: tx - padding.left - borderWidth,\n y: ty - padding.top - borderWidth,\n w: tw + padding.width + borderWidth * 2,\n h: th + padding.height + borderWidth * 2\n },\n text: {\n x: tx,\n y: ty,\n w: tw,\n h: th\n }\n };\n}\n\nfunction getScaleOrigin(el, context) {\n var scale = context.chart.getDatasetMeta(context.datasetIndex).vScale;\n\n if (!scale) {\n return null;\n }\n\n if (scale.xCenter !== undefined && scale.yCenter !== undefined) {\n return {x: scale.xCenter, y: scale.yCenter};\n }\n\n var pixel = scale.getBasePixel();\n return el.horizontal ?\n {x: pixel, y: null} :\n {x: null, y: pixel};\n}\n\nfunction getPositioner(el) {\n if (el instanceof ArcElement) {\n return positioners.arc;\n }\n if (el instanceof PointElement) {\n return positioners.point;\n }\n if (el instanceof BarElement) {\n return positioners.bar;\n }\n return positioners.fallback;\n}\n\nfunction drawRoundedRect(ctx, x, y, w, h, radius) {\n var HALF_PI = Math.PI / 2;\n\n if (radius) {\n var r = Math.min(radius, h / 2, w / 2);\n var left = x + r;\n var top = y + r;\n var right = x + w - r;\n var bottom = y + h - r;\n\n ctx.moveTo(x, top);\n if (left < right && top < bottom) {\n ctx.arc(left, top, r, -Math.PI, -HALF_PI);\n ctx.arc(right, top, r, -HALF_PI, 0);\n ctx.arc(right, bottom, r, 0, HALF_PI);\n ctx.arc(left, bottom, r, HALF_PI, Math.PI);\n } else if (left < right) {\n ctx.moveTo(left, y);\n ctx.arc(right, top, r, -HALF_PI, HALF_PI);\n ctx.arc(left, top, r, HALF_PI, Math.PI + HALF_PI);\n } else if (top < bottom) {\n ctx.arc(left, top, r, -Math.PI, 0);\n ctx.arc(left, bottom, r, 0, Math.PI);\n } else {\n ctx.arc(left, top, r, -Math.PI, Math.PI);\n }\n ctx.closePath();\n ctx.moveTo(x, y);\n } else {\n ctx.rect(x, y, w, h);\n }\n}\n\nfunction drawFrame(ctx, rect, model) {\n var bgColor = model.backgroundColor;\n var borderColor = model.borderColor;\n var borderWidth = model.borderWidth;\n\n if (!bgColor && (!borderColor || !borderWidth)) {\n return;\n }\n\n ctx.beginPath();\n\n drawRoundedRect(\n ctx,\n rasterize(rect.x) + borderWidth / 2,\n rasterize(rect.y) + borderWidth / 2,\n rasterize(rect.w) - borderWidth,\n rasterize(rect.h) - borderWidth,\n model.borderRadius);\n\n ctx.closePath();\n\n if (bgColor) {\n ctx.fillStyle = bgColor;\n ctx.fill();\n }\n\n if (borderColor && borderWidth) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = 'miter';\n ctx.stroke();\n }\n}\n\nfunction textGeometry(rect, align, font) {\n var h = font.lineHeight;\n var w = rect.w;\n var x = rect.x;\n var y = rect.y + h / 2;\n\n if (align === 'center') {\n x += w / 2;\n } else if (align === 'end' || align === 'right') {\n x += w;\n }\n\n return {\n h: h,\n w: w,\n x: x,\n y: y\n };\n}\n\nfunction drawTextLine(ctx, text, cfg) {\n var shadow = ctx.shadowBlur;\n var stroked = cfg.stroked;\n var x = rasterize(cfg.x);\n var y = rasterize(cfg.y);\n var w = rasterize(cfg.w);\n\n if (stroked) {\n ctx.strokeText(text, x, y, w);\n }\n\n if (cfg.filled) {\n if (shadow && stroked) {\n // Prevent drawing shadow on both the text stroke and fill, so\n // if the text is stroked, remove the shadow for the text fill.\n ctx.shadowBlur = 0;\n }\n\n ctx.fillText(text, x, y, w);\n\n if (shadow && stroked) {\n ctx.shadowBlur = shadow;\n }\n }\n}\n\nfunction drawText(ctx, lines, rect, model) {\n var align = model.textAlign;\n var color = model.color;\n var filled = !!color;\n var font = model.font;\n var ilen = lines.length;\n var strokeColor = model.textStrokeColor;\n var strokeWidth = model.textStrokeWidth;\n var stroked = strokeColor && strokeWidth;\n var i;\n\n if (!ilen || (!filled && !stroked)) {\n return;\n }\n\n // Adjust coordinates based on text alignment and line height\n rect = textGeometry(rect, align, font);\n\n ctx.font = font.string;\n ctx.textAlign = align;\n ctx.textBaseline = 'middle';\n ctx.shadowBlur = model.textShadowBlur;\n ctx.shadowColor = model.textShadowColor;\n\n if (filled) {\n ctx.fillStyle = color;\n }\n if (stroked) {\n ctx.lineJoin = 'round';\n ctx.lineWidth = strokeWidth;\n ctx.strokeStyle = strokeColor;\n }\n\n for (i = 0, ilen = lines.length; i < ilen; ++i) {\n drawTextLine(ctx, lines[i], {\n stroked: stroked,\n filled: filled,\n w: rect.w,\n x: rect.x,\n y: rect.y + rect.h * i\n });\n }\n}\n\nvar Label = function(config, ctx, el, index) {\n var me = this;\n\n me._config = config;\n me._index = index;\n me._model = null;\n me._rects = null;\n me._ctx = ctx;\n me._el = el;\n};\n\nmerge(Label.prototype, {\n /**\n * @private\n */\n _modelize: function(display, lines, config, context) {\n var me = this;\n var index = me._index;\n var font = toFont(resolve([config.font, {}], context, index));\n var color = resolve([config.color, defaults$1.color], context, index);\n\n return {\n align: resolve([config.align, 'center'], context, index),\n anchor: resolve([config.anchor, 'center'], context, index),\n area: context.chart.chartArea,\n backgroundColor: resolve([config.backgroundColor, null], context, index),\n borderColor: resolve([config.borderColor, null], context, index),\n borderRadius: resolve([config.borderRadius, 0], context, index),\n borderWidth: resolve([config.borderWidth, 0], context, index),\n clamp: resolve([config.clamp, false], context, index),\n clip: resolve([config.clip, false], context, index),\n color: color,\n display: display,\n font: font,\n lines: lines,\n offset: resolve([config.offset, 4], context, index),\n opacity: resolve([config.opacity, 1], context, index),\n origin: getScaleOrigin(me._el, context),\n padding: toPadding(resolve([config.padding, 4], context, index)),\n positioner: getPositioner(me._el),\n rotation: resolve([config.rotation, 0], context, index) * (Math.PI / 180),\n size: utils.textSize(me._ctx, lines, font),\n textAlign: resolve([config.textAlign, 'start'], context, index),\n textShadowBlur: resolve([config.textShadowBlur, 0], context, index),\n textShadowColor: resolve([config.textShadowColor, color], context, index),\n textStrokeColor: resolve([config.textStrokeColor, color], context, index),\n textStrokeWidth: resolve([config.textStrokeWidth, 0], context, index)\n };\n },\n\n update: function(context) {\n var me = this;\n var model = null;\n var rects = null;\n var index = me._index;\n var config = me._config;\n var value, label, lines;\n\n // We first resolve the display option (separately) to avoid computing\n // other options in case the label is hidden (i.e. display: false).\n var display = resolve([config.display, true], context, index);\n\n if (display) {\n value = context.dataset.data[index];\n label = valueOrDefault(callback(config.formatter, [value, context]), value);\n lines = isNullOrUndef(label) ? [] : utils.toTextLines(label);\n\n if (lines.length) {\n model = me._modelize(display, lines, config, context);\n rects = boundingRects(model);\n }\n }\n\n me._model = model;\n me._rects = rects;\n },\n\n geometry: function() {\n return this._rects ? this._rects.frame : {};\n },\n\n rotation: function() {\n return this._model ? this._model.rotation : 0;\n },\n\n visible: function() {\n return this._model && this._model.opacity;\n },\n\n model: function() {\n return this._model;\n },\n\n draw: function(chart, center) {\n var me = this;\n var ctx = chart.ctx;\n var model = me._model;\n var rects = me._rects;\n var area;\n\n if (!this.visible()) {\n return;\n }\n\n ctx.save();\n\n if (model.clip) {\n area = model.area;\n ctx.beginPath();\n ctx.rect(\n area.left,\n area.top,\n area.right - area.left,\n area.bottom - area.top);\n ctx.clip();\n }\n\n ctx.globalAlpha = utils.bound(0, model.opacity, 1);\n ctx.translate(rasterize(center.x), rasterize(center.y));\n ctx.rotate(model.rotation);\n\n drawFrame(ctx, rects.frame, model);\n drawText(ctx, model.lines, rects.text, model);\n\n ctx.restore();\n }\n});\n\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; // eslint-disable-line es/no-number-minsafeinteger\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line es/no-number-maxsafeinteger\n\nfunction rotated(point, center, angle) {\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var cx = center.x;\n var cy = center.y;\n\n return {\n x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n };\n}\n\nfunction projected(points, axis) {\n var min = MAX_INTEGER;\n var max = MIN_INTEGER;\n var origin = axis.origin;\n var i, pt, vx, vy, dp;\n\n for (i = 0; i < points.length; ++i) {\n pt = points[i];\n vx = pt.x - origin.x;\n vy = pt.y - origin.y;\n dp = axis.vx * vx + axis.vy * vy;\n min = Math.min(min, dp);\n max = Math.max(max, dp);\n }\n\n return {\n min: min,\n max: max\n };\n}\n\nfunction toAxis(p0, p1) {\n var vx = p1.x - p0.x;\n var vy = p1.y - p0.y;\n var ln = Math.sqrt(vx * vx + vy * vy);\n\n return {\n vx: (p1.x - p0.x) / ln,\n vy: (p1.y - p0.y) / ln,\n origin: p0,\n ln: ln\n };\n}\n\nvar HitBox = function() {\n this._rotation = 0;\n this._rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n};\n\nmerge(HitBox.prototype, {\n center: function() {\n var r = this._rect;\n return {\n x: r.x + r.w / 2,\n y: r.y + r.h / 2\n };\n },\n\n update: function(center, rect, rotation) {\n this._rotation = rotation;\n this._rect = {\n x: rect.x + center.x,\n y: rect.y + center.y,\n w: rect.w,\n h: rect.h\n };\n },\n\n contains: function(point) {\n var me = this;\n var margin = 1;\n var rect = me._rect;\n\n point = rotated(point, me.center(), -me._rotation);\n\n return !(point.x < rect.x - margin\n || point.y < rect.y - margin\n || point.x > rect.x + rect.w + margin * 2\n || point.y > rect.y + rect.h + margin * 2);\n },\n\n // Separating Axis Theorem\n // https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169\n intersects: function(other) {\n var r0 = this._points();\n var r1 = other._points();\n var axes = [\n toAxis(r0[0], r0[1]),\n toAxis(r0[0], r0[3])\n ];\n var i, pr0, pr1;\n\n if (this._rotation !== other._rotation) {\n // Only separate with r1 axis if the rotation is different,\n // else it's enough to separate r0 and r1 with r0 axis only!\n axes.push(\n toAxis(r1[0], r1[1]),\n toAxis(r1[0], r1[3])\n );\n }\n\n for (i = 0; i < axes.length; ++i) {\n pr0 = projected(r0, axes[i]);\n pr1 = projected(r1, axes[i]);\n\n if (pr0.max < pr1.min || pr1.max < pr0.min) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * @private\n */\n _points: function() {\n var me = this;\n var rect = me._rect;\n var angle = me._rotation;\n var center = me.center();\n\n return [\n rotated({x: rect.x, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y + rect.h}, center, angle),\n rotated({x: rect.x, y: rect.y + rect.h}, center, angle)\n ];\n }\n});\n\nfunction coordinates(el, model, geometry) {\n var point = model.positioner(el, model);\n var vx = point.vx;\n var vy = point.vy;\n\n if (!vx && !vy) {\n // if aligned center, we don't want to offset the center point\n return {x: point.x, y: point.y};\n }\n\n var w = geometry.w;\n var h = geometry.h;\n\n // take in account the label rotation\n var rotation = model.rotation;\n var dx = Math.abs(w / 2 * Math.cos(rotation)) + Math.abs(h / 2 * Math.sin(rotation));\n var dy = Math.abs(w / 2 * Math.sin(rotation)) + Math.abs(h / 2 * Math.cos(rotation));\n\n // scale the unit vector (vx, vy) to get at least dx or dy equal to\n // w or h respectively (else we would calculate the distance to the\n // ellipse inscribed in the bounding rect)\n var vs = 1 / Math.max(Math.abs(vx), Math.abs(vy));\n dx *= vx * vs;\n dy *= vy * vs;\n\n // finally, include the explicit offset\n dx += model.offset * vx;\n dy += model.offset * vy;\n\n return {\n x: point.x + dx,\n y: point.y + dy\n };\n}\n\nfunction collide(labels, collider) {\n var i, j, s0, s1;\n\n // IMPORTANT Iterate in the reverse order since items at the end of the\n // list have an higher weight/priority and thus should be less impacted\n // by the overlapping strategy.\n\n for (i = labels.length - 1; i >= 0; --i) {\n s0 = labels[i].$layout;\n\n for (j = i - 1; j >= 0 && s0._visible; --j) {\n s1 = labels[j].$layout;\n\n if (s1._visible && s0._box.intersects(s1._box)) {\n collider(s0, s1);\n }\n }\n }\n\n return labels;\n}\n\nfunction compute(labels) {\n var i, ilen, label, state, geometry, center, proxy;\n\n // Initialize labels for overlap detection\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n // Chart.js 3 removed el._model in favor of getProps(), making harder to\n // abstract reading values in positioners. Also, using string arrays to\n // read values (i.e. var {a,b,c} = el.getProps([\"a\",\"b\",\"c\"])) would make\n // positioners inefficient in the normal case (i.e. not the final values)\n // and the code a bit ugly, so let's use a Proxy instead.\n proxy = new Proxy(label._el, {get: (el, p) => el.getProps([p], true)[p]});\n\n geometry = label.geometry();\n center = coordinates(proxy, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n }\n }\n\n // Auto hide overlapping labels\n return collide(labels, function(s0, s1) {\n var h0 = s0._hidable;\n var h1 = s1._hidable;\n\n if ((h0 && h1) || h1) {\n s1._visible = false;\n } else if (h0) {\n s0._visible = false;\n }\n });\n}\n\nvar layout = {\n prepare: function(datasets) {\n var labels = [];\n var i, j, ilen, jlen, label;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n for (j = 0, jlen = datasets[i].length; j < jlen; ++j) {\n label = datasets[i][j];\n labels.push(label);\n label.$layout = {\n _box: new HitBox(),\n _hidable: false,\n _visible: true,\n _set: i,\n _idx: label._index\n };\n }\n }\n\n // TODO New `z` option: labels with a higher z-index are drawn\n // of top of the ones with a lower index. Lowest z-index labels\n // are also discarded first when hiding overlapping labels.\n labels.sort(function(a, b) {\n var sa = a.$layout;\n var sb = b.$layout;\n\n return sa._idx === sb._idx\n ? sb._set - sa._set\n : sb._idx - sa._idx;\n });\n\n this.update(labels);\n\n return labels;\n },\n\n update: function(labels) {\n var dirty = false;\n var i, ilen, label, model, state;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n model = label.model();\n state = label.$layout;\n state._hidable = model && model.display === 'auto';\n state._visible = label.visible();\n dirty |= state._hidable;\n }\n\n if (dirty) {\n compute(labels);\n }\n },\n\n lookup: function(labels, point) {\n var i, state;\n\n // IMPORTANT Iterate in the reverse order since items at the end of\n // the list have an higher z-index, thus should be picked first.\n\n for (i = labels.length - 1; i >= 0; --i) {\n state = labels[i].$layout;\n\n if (state && state._visible && state._box.contains(point)) {\n return labels[i];\n }\n }\n\n return null;\n },\n\n draw: function(chart, labels) {\n var i, ilen, label, state, geometry, center;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n geometry = label.geometry();\n center = coordinates(label._el, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n label.draw(chart, center);\n }\n }\n }\n};\n\nvar formatter = function(value) {\n if (isNullOrUndef(value)) {\n return null;\n }\n\n var label = value;\n var keys, klen, k;\n if (isObject(value)) {\n if (!isNullOrUndef(value.label)) {\n label = value.label;\n } else if (!isNullOrUndef(value.r)) {\n label = value.r;\n } else {\n label = '';\n keys = Object.keys(value);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n label += (k !== 0 ? ', ' : '') + keys[k] + ': ' + value[keys[k]];\n }\n }\n }\n\n return '' + label;\n};\n\n/**\n * IMPORTANT: make sure to also update tests and TypeScript definition\n * files (`/test/specs/defaults.spec.js` and `/types/options.d.ts`)\n */\n\nvar defaults = {\n align: 'center',\n anchor: 'center',\n backgroundColor: null,\n borderColor: null,\n borderRadius: 0,\n borderWidth: 0,\n clamp: false,\n clip: false,\n color: undefined,\n display: true,\n font: {\n family: undefined,\n lineHeight: 1.2,\n size: undefined,\n style: undefined,\n weight: null\n },\n formatter: formatter,\n labels: undefined,\n listeners: {},\n offset: 4,\n opacity: 1,\n padding: {\n top: 4,\n right: 4,\n bottom: 4,\n left: 4\n },\n rotation: 0,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n textShadowBlur: 0,\n textShadowColor: undefined\n};\n\n/**\n * @see https://github.com/chartjs/Chart.js/issues/4176\n */\n\nvar EXPANDO_KEY = '$datalabels';\nvar DEFAULT_KEY = '$default';\n\nfunction configure(dataset, options) {\n var override = dataset.datalabels;\n var listeners = {};\n var configs = [];\n var labels, keys;\n\n if (override === false) {\n return null;\n }\n if (override === true) {\n override = {};\n }\n\n options = merge({}, [options, override]);\n labels = options.labels || {};\n keys = Object.keys(labels);\n delete options.labels;\n\n if (keys.length) {\n keys.forEach(function(key) {\n if (labels[key]) {\n configs.push(merge({}, [\n options,\n labels[key],\n {_key: key}\n ]));\n }\n });\n } else {\n // Default label if no \"named\" label defined.\n configs.push(options);\n }\n\n // listeners: {: {: }}\n listeners = configs.reduce(function(target, config) {\n each(config.listeners || {}, function(fn, event) {\n target[event] = target[event] || {};\n target[event][config._key || DEFAULT_KEY] = fn;\n });\n\n delete config.listeners;\n return target;\n }, {});\n\n return {\n labels: configs,\n listeners: listeners\n };\n}\n\nfunction dispatchEvent(chart, listeners, label, event) {\n if (!listeners) {\n return;\n }\n\n var context = label.$context;\n var groups = label.$groups;\n var callback$1;\n\n if (!listeners[groups._set]) {\n return;\n }\n\n callback$1 = listeners[groups._set][groups._key];\n if (!callback$1) {\n return;\n }\n\n if (callback(callback$1, [context, event]) === true) {\n // Users are allowed to tweak the given context by injecting values that can be\n // used in scriptable options to display labels differently based on the current\n // event (e.g. highlight an hovered label). That's why we update the label with\n // the output context and schedule a new chart render by setting it dirty.\n chart[EXPANDO_KEY]._dirty = true;\n label.update(context);\n }\n}\n\nfunction dispatchMoveEvents(chart, listeners, previous, label, event) {\n var enter, leave;\n\n if (!previous && !label) {\n return;\n }\n\n if (!previous) {\n enter = true;\n } else if (!label) {\n leave = true;\n } else if (previous !== label) {\n leave = enter = true;\n }\n\n if (leave) {\n dispatchEvent(chart, listeners.leave, previous, event);\n }\n if (enter) {\n dispatchEvent(chart, listeners.enter, label, event);\n }\n}\n\nfunction handleMoveEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var listeners = expando._listeners;\n var previous, label;\n\n if (!listeners.enter && !listeners.leave) {\n return;\n }\n\n if (event.type === 'mousemove') {\n label = layout.lookup(expando._labels, event);\n } else if (event.type !== 'mouseout') {\n return;\n }\n\n previous = expando._hovered;\n expando._hovered = label;\n dispatchMoveEvents(chart, listeners, previous, label, event);\n}\n\nfunction handleClickEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var handlers = expando._listeners.click;\n var label = handlers && layout.lookup(expando._labels, event);\n if (label) {\n dispatchEvent(chart, handlers, label, event);\n }\n}\n\nvar plugin = {\n id: 'datalabels',\n\n defaults: defaults,\n\n beforeInit: function(chart) {\n chart[EXPANDO_KEY] = {\n _actives: []\n };\n },\n\n beforeUpdate: function(chart) {\n var expando = chart[EXPANDO_KEY];\n expando._listened = false;\n expando._listeners = {}; // {: {: {: }}}\n expando._datasets = []; // per dataset labels: [Label[]]\n expando._labels = []; // layouted labels: Label[]\n },\n\n afterDatasetUpdate: function(chart, args, options) {\n var datasetIndex = args.index;\n var expando = chart[EXPANDO_KEY];\n var labels = expando._datasets[datasetIndex] = [];\n var visible = chart.isDatasetVisible(datasetIndex);\n var dataset = chart.data.datasets[datasetIndex];\n var config = configure(dataset, options);\n var elements = args.meta.data || [];\n var ctx = chart.ctx;\n var i, j, ilen, jlen, cfg, key, el, label;\n\n ctx.save();\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n el = elements[i];\n el[EXPANDO_KEY] = [];\n\n if (visible && el && chart.getDataVisibility(i) && !el.skip) {\n for (j = 0, jlen = config.labels.length; j < jlen; ++j) {\n cfg = config.labels[j];\n key = cfg._key;\n\n label = new Label(cfg, ctx, el, i);\n label.$groups = {\n _set: datasetIndex,\n _key: key || DEFAULT_KEY\n };\n label.$context = {\n active: false,\n chart: chart,\n dataIndex: i,\n dataset: dataset,\n datasetIndex: datasetIndex\n };\n\n label.update(label.$context);\n el[EXPANDO_KEY].push(label);\n labels.push(label);\n }\n }\n }\n\n ctx.restore();\n\n // Store listeners at the chart level and per event type to optimize\n // cases where no listeners are registered for a specific event.\n merge(expando._listeners, config.listeners, {\n merger: function(event, target, source) {\n target[event] = target[event] || {};\n target[event][args.index] = source[event];\n expando._listened = true;\n }\n });\n },\n\n afterUpdate: function(chart) {\n chart[EXPANDO_KEY]._labels = layout.prepare(chart[EXPANDO_KEY]._datasets);\n },\n\n // Draw labels on top of all dataset elements\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/29\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/32\n afterDatasetsDraw: function(chart) {\n layout.draw(chart, chart[EXPANDO_KEY]._labels);\n },\n\n beforeEvent: function(chart, args) {\n // If there is no listener registered for this chart, `listened` will be false,\n // meaning we can immediately ignore the incoming event and avoid useless extra\n // computation for users who don't implement label interactions.\n if (chart[EXPANDO_KEY]._listened) {\n var event = args.event;\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n handleMoveEvents(chart, event);\n break;\n case 'click':\n handleClickEvents(chart, event);\n break;\n }\n }\n },\n\n afterEvent: function(chart) {\n var expando = chart[EXPANDO_KEY];\n var previous = expando._actives;\n var actives = expando._actives = chart.getActiveElements();\n var updates = utils.arrayDiff(previous, actives);\n var i, ilen, j, jlen, update, label, labels;\n\n for (i = 0, ilen = updates.length; i < ilen; ++i) {\n update = updates[i];\n if (update[1]) {\n labels = update[0].element[EXPANDO_KEY] || [];\n for (j = 0, jlen = labels.length; j < jlen; ++j) {\n label = labels[j];\n label.$context.active = (update[1] === 1);\n label.update(label.$context);\n }\n }\n }\n\n if (expando._dirty || updates.length) {\n layout.update(expando._labels);\n chart.render();\n }\n\n delete expando._dirty;\n }\n};\n\nexport { plugin as default };\n", "/*!\n* chartjs-plugin-annotation v3.1.0\n* https://www.chartjs.org/chartjs-plugin-annotation/index\n * (c) 2024 chartjs-plugin-annotation Contributors\n * Released under the MIT License\n */\nimport { Element, DoughnutController, defaults, Animations, Chart } from 'chart.js';\nimport { distanceBetweenPoints, toRadians, isObject, valueOrDefault, defined, isFunction, callback, isArray, toFont, addRoundedRectPath, toTRBLCorners, QUARTER_PI, PI, HALF_PI, TWO_THIRDS_PI, TAU, isNumber, RAD_PER_DEG, toPadding, isFinite, getAngleFromPoint, toDegrees, clipArea, unclipArea } from 'chart.js/helpers';\n\n/**\n * @typedef { import(\"chart.js\").ChartEvent } ChartEvent\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst interaction = {\n modes: {\n /**\n * Point mode returns all elements that hit test based on the event position\n * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n * @param {ChartEvent} event - the event we are find things at\n * @return {AnnotationElement[]} - elements that are found\n */\n point(visibleElements, event) {\n return filterElements(visibleElements, event, {intersect: true});\n },\n\n /**\n * Nearest mode returns the element closest to the event position\n * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found (only 1 element)\n */\n nearest(visibleElements, event, options) {\n return getNearestItem(visibleElements, event, options);\n },\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\n x(visibleElements, event, options) {\n return filterElements(visibleElements, event, {intersect: options.intersect, axis: 'x'});\n },\n\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\n y(visibleElements, event, options) {\n return filterElements(visibleElements, event, {intersect: options.intersect, axis: 'y'});\n }\n }\n};\n\n/**\n * Returns all elements that hit test based on the event position\n * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\nfunction getElements(visibleElements, event, options) {\n const mode = interaction.modes[options.mode] || interaction.modes.nearest;\n return mode(visibleElements, event, options);\n}\n\nfunction inRangeByAxis(element, event, axis) {\n if (axis !== 'x' && axis !== 'y') {\n return element.inRange(event.x, event.y, 'x', true) || element.inRange(event.x, event.y, 'y', true);\n }\n return element.inRange(event.x, event.y, axis, true);\n}\n\nfunction getPointByAxis(event, center, axis) {\n if (axis === 'x') {\n return {x: event.x, y: center.y};\n } else if (axis === 'y') {\n return {x: center.x, y: event.y};\n }\n return center;\n}\n\nfunction filterElements(visibleElements, event, options) {\n return visibleElements.filter((element) => options.intersect ? element.inRange(event.x, event.y) : inRangeByAxis(element, event, options.axis));\n}\n\nfunction getNearestItem(visibleElements, event, options) {\n let minDistance = Number.POSITIVE_INFINITY;\n\n return filterElements(visibleElements, event, options)\n .reduce((nearestItems, element) => {\n const center = element.getCenterPoint();\n const evenPoint = getPointByAxis(event, center, options.axis);\n const distance = distanceBetweenPoints(event, evenPoint);\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n\n return nearestItems;\n }, [])\n .sort((a, b) => a._index - b._index)\n .slice(0, 1); // return only the top item;\n}\n\n/**\n * @typedef {import('chart.js').Point} Point\n */\n\n/**\n * Rotate a `point` relative to `center` point by `angle`\n * @param {Point} point - the point to rotate\n * @param {Point} center - center point for rotation\n * @param {number} angle - angle for rotation, in radians\n * @returns {Point} rotated point\n */\nfunction rotated(point, center, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const cx = center.x;\n const cy = center.y;\n\n return {\n x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n };\n}\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.slice(0, req.length) === req);\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('chart.js').InteractionAxis } InteractionAxis\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst EPSILON = 0.001;\nconst clamp = (x, from, to) => Math.min(to, Math.max(from, x));\n\n/**\n * @param {{value: number, start: number, end: number}} limit\n * @param {number} hitSize\n * @returns {boolean}\n */\nconst inLimit = (limit, hitSize) => limit.value >= limit.start - hitSize && limit.value <= limit.end + hitSize;\n\n/**\n * @param {Object} obj\n * @param {number} from\n * @param {number} to\n * @returns {Object}\n */\nfunction clampAll(obj, from, to) {\n for (const key of Object.keys(obj)) {\n obj[key] = clamp(obj[key], from, to);\n }\n return obj;\n}\n\n/**\n * @param {Point} point\n * @param {Point} center\n * @param {number} radius\n * @param {number} hitSize\n * @returns {boolean}\n */\nfunction inPointRange(point, center, radius, hitSize) {\n if (!point || !center || radius <= 0) {\n return false;\n }\n return (Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2)) <= Math.pow(radius + hitSize, 2);\n}\n\n/**\n * @param {Point} point\n * @param {{x: number, y: number, x2: number, y2: number}} rect\n * @param {InteractionAxis} axis\n * @param {{borderWidth: number, hitTolerance: number}} hitsize\n * @returns {boolean}\n */\nfunction inBoxRange(point, {x, y, x2, y2}, axis, {borderWidth, hitTolerance}) {\n const hitSize = (borderWidth + hitTolerance) / 2;\n const inRangeX = point.x >= x - hitSize - EPSILON && point.x <= x2 + hitSize + EPSILON;\n const inRangeY = point.y >= y - hitSize - EPSILON && point.y <= y2 + hitSize + EPSILON;\n if (axis === 'x') {\n return inRangeX;\n } else if (axis === 'y') {\n return inRangeY;\n }\n return inRangeX && inRangeY;\n}\n\n/**\n * @param {Point} point\n * @param {rect: {x: number, y: number, x2: number, y2: number}, center: {x: number, y: number}} element\n * @param {InteractionAxis} axis\n * @param {{rotation: number, borderWidth: number, hitTolerance: number}}\n * @returns {boolean}\n */\nfunction inLabelRange(point, {rect, center}, axis, {rotation, borderWidth, hitTolerance}) {\n const rotPoint = rotated(point, center, toRadians(-rotation));\n return inBoxRange(rotPoint, rect, axis, {borderWidth, hitTolerance});\n}\n\n/**\n * @param {AnnotationElement} element\n * @param {boolean} useFinalPosition\n * @returns {Point}\n */\nfunction getElementCenterPoint(element, useFinalPosition) {\n const {centerX, centerY} = element.getProps(['centerX', 'centerY'], useFinalPosition);\n return {x: centerX, y: centerY};\n}\n\n/**\n * @param {string} pkg\n * @param {string} min\n * @param {string} ver\n * @param {boolean} [strict=true]\n * @returns {boolean}\n */\nfunction requireVersion(pkg, min, ver, strict = true) {\n const parts = ver.split('.');\n let i = 0;\n for (const req of min.split('.')) {\n const act = parts[i++];\n if (parseInt(req, 10) < parseInt(act, 10)) {\n break;\n }\n if (isOlderPart(act, req)) {\n if (strict) {\n throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n } else {\n return false;\n }\n }\n }\n return true;\n}\n\nconst isPercentString = (s) => typeof s === 'string' && s.endsWith('%');\nconst toPercent = (s) => parseFloat(s) / 100;\nconst toPositivePercent = (s) => clamp(toPercent(s), 0, 1);\n\nconst boxAppering = (x, y) => ({x, y, x2: x, y2: y, width: 0, height: 0});\nconst defaultInitAnimation = {\n box: (properties) => boxAppering(properties.centerX, properties.centerY),\n doughnutLabel: (properties) => boxAppering(properties.centerX, properties.centerY),\n ellipse: (properties) => ({centerX: properties.centerX, centerY: properties.centerX, radius: 0, width: 0, height: 0}),\n label: (properties) => boxAppering(properties.centerX, properties.centerY),\n line: (properties) => boxAppering(properties.x, properties.y),\n point: (properties) => ({centerX: properties.centerX, centerY: properties.centerY, radius: 0, width: 0, height: 0}),\n polygon: (properties) => boxAppering(properties.centerX, properties.centerY)\n};\n\n/**\n * @typedef { import('chart.js').FontSpec } FontSpec\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('chart.js').Padding } Padding\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n * @typedef { import('../../types/options').AnnotationPointCoordinates } AnnotationPointCoordinates\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/label').LabelPositionObject } LabelPositionObject\n */\n\n/**\n * @param {number} size\n * @param {number|string} position\n * @returns {number}\n */\nfunction getRelativePosition(size, position) {\n if (position === 'start') {\n return 0;\n }\n if (position === 'end') {\n return size;\n }\n if (isPercentString(position)) {\n return toPositivePercent(position) * size;\n }\n return size / 2;\n}\n\n/**\n * @param {number} size\n * @param {number|string} value\n * @param {boolean} [positivePercent=true]\n * @returns {number}\n */\nfunction getSize(size, value, positivePercent = true) {\n if (typeof value === 'number') {\n return value;\n } else if (isPercentString(value)) {\n return (positivePercent ? toPositivePercent(value) : toPercent(value)) * size;\n }\n return size;\n}\n\n/**\n * @param {{x: number, width: number}} size\n * @param {CoreLabelOptions} options\n * @returns {number}\n */\nfunction calculateTextAlignment(size, options) {\n const {x, width} = size;\n const textAlign = options.textAlign;\n if (textAlign === 'center') {\n return x + width / 2;\n } else if (textAlign === 'end' || textAlign === 'right') {\n return x + width;\n }\n return x;\n}\n\n/**\n * @param {Point} point\n * @param {{height: number, width: number}} labelSize\n * @param {{borderWidth: number, position: {LabelPositionObject|string}, xAdjust: number, yAdjust: number}} options\n * @param {Padding|undefined} padding\n * @returns {{x: number, y: number, x2: number, y2: number, height: number, width: number, centerX: number, centerY: number}}\n */\nfunction measureLabelRectangle(point, labelSize, {borderWidth, position, xAdjust, yAdjust}, padding) {\n const hasPadding = isObject(padding);\n const width = labelSize.width + (hasPadding ? padding.width : 0) + borderWidth;\n const height = labelSize.height + (hasPadding ? padding.height : 0) + borderWidth;\n const positionObj = toPosition(position);\n const x = calculateLabelPosition$1(point.x, width, xAdjust, positionObj.x);\n const y = calculateLabelPosition$1(point.y, height, yAdjust, positionObj.y);\n\n return {\n x,\n y,\n x2: x + width,\n y2: y + height,\n width,\n height,\n centerX: x + width / 2,\n centerY: y + height / 2\n };\n}\n\n/**\n * @param {LabelPositionObject|string} value\n * @param {string|number} defaultValue\n * @returns {LabelPositionObject}\n */\nfunction toPosition(value, defaultValue = 'center') {\n if (isObject(value)) {\n return {\n x: valueOrDefault(value.x, defaultValue),\n y: valueOrDefault(value.y, defaultValue),\n };\n }\n value = valueOrDefault(value, defaultValue);\n return {\n x: value,\n y: value\n };\n}\n\n/**\n * @param {CoreLabelOptions} options\n * @param {number} fitRatio\n * @returns {boolean}\n */\nconst shouldFit = (options, fitRatio) => options && options.autoFit && fitRatio < 1;\n\n/**\n * @param {CoreLabelOptions} options\n * @param {number} fitRatio\n * @returns {FontSpec[]}\n */\nfunction toFonts(options, fitRatio) {\n const optFont = options.font;\n const fonts = isArray(optFont) ? optFont : [optFont];\n if (shouldFit(options, fitRatio)) {\n return fonts.map(function(f) {\n const font = toFont(f);\n font.size = Math.floor(f.size * fitRatio);\n font.lineHeight = f.lineHeight;\n return toFont(font);\n });\n }\n return fonts.map(f => toFont(f));\n}\n\n/**\n * @param {AnnotationPointCoordinates} options\n * @returns {boolean}\n */\nfunction isBoundToPoint(options) {\n return options && (defined(options.xValue) || defined(options.yValue));\n}\n\nfunction calculateLabelPosition$1(start, size, adjust = 0, position) {\n return start - getRelativePosition(size, position) + adjust;\n}\n\n/**\n * @param {Chart} chart\n * @param {AnnotationBoxModel} properties\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationElement}\n */\nfunction initAnimationProperties(chart, properties, options) {\n const initAnim = options.init;\n if (!initAnim) {\n return;\n } else if (initAnim === true) {\n return applyDefault(properties, options);\n }\n return execCallback(chart, properties, options);\n}\n\n/**\n * @param {Object} options\n * @param {Array} hooks\n * @param {Object} hooksContainer\n * @returns {boolean}\n */\nfunction loadHooks(options, hooks, hooksContainer) {\n let activated = false;\n hooks.forEach(hook => {\n if (isFunction(options[hook])) {\n activated = true;\n hooksContainer[hook] = options[hook];\n } else if (defined(hooksContainer[hook])) {\n delete hooksContainer[hook];\n }\n });\n return activated;\n}\n\nfunction applyDefault(properties, options) {\n const type = options.type || 'line';\n return defaultInitAnimation[type](properties);\n}\n\nfunction execCallback(chart, properties, options) {\n const result = callback(options.init, [{chart, properties, options}]);\n if (result === true) {\n return applyDefault(properties, options);\n } else if (isObject(result)) {\n return result;\n }\n}\n\nconst widthCache = new Map();\nconst notRadius = (radius) => isNaN(radius) || radius <= 0;\nconst fontsKey = (fonts) => fonts.reduce(function(prev, item) {\n prev += item.string;\n return prev;\n}, '');\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n */\n\n/**\n * Determine if content is an image or a canvas.\n * @param {*} content\n * @returns boolean|undefined\n * @todo move this function to chart.js helpers\n */\nfunction isImageOrCanvas(content) {\n if (content && typeof content === 'object') {\n const type = content.toString();\n return (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]');\n }\n}\n\n/**\n * Set the translation on the canvas if the rotation must be applied.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Point} point - the point of translation\n * @param {number} rotation - rotation (in degrees) to apply\n */\nfunction translate(ctx, {x, y}, rotation) {\n if (rotation) {\n ctx.translate(x, y);\n ctx.rotate(toRadians(rotation));\n ctx.translate(-x, -y);\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n * @returns {boolean|undefined}\n */\nfunction setBorderStyle(ctx, options) {\n if (options && options.borderWidth) {\n ctx.lineCap = options.borderCapStyle || 'butt';\n ctx.setLineDash(options.borderDash);\n ctx.lineDashOffset = options.borderDashOffset;\n ctx.lineJoin = options.borderJoinStyle || 'miter';\n ctx.lineWidth = options.borderWidth;\n ctx.strokeStyle = options.borderColor;\n return true;\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n */\nfunction setShadowStyle(ctx, options) {\n ctx.shadowColor = options.backgroundShadowColor;\n ctx.shadowBlur = options.shadowBlur;\n ctx.shadowOffsetX = options.shadowOffsetX;\n ctx.shadowOffsetY = options.shadowOffsetY;\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {CoreLabelOptions} options\n * @returns {{width: number, height: number}}\n */\nfunction measureLabelSize(ctx, options) {\n const content = options.content;\n if (isImageOrCanvas(content)) {\n const size = {\n width: getSize(content.width, options.width),\n height: getSize(content.height, options.height)\n };\n return size;\n }\n const fonts = toFonts(options);\n const strokeWidth = options.textStrokeWidth;\n const lines = isArray(content) ? content : [content];\n const mapKey = lines.join() + fontsKey(fonts) + strokeWidth + (ctx._measureText ? '-spriting' : '');\n if (!widthCache.has(mapKey)) {\n widthCache.set(mapKey, calculateLabelSize(ctx, lines, fonts, strokeWidth));\n }\n return widthCache.get(mapKey);\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {Object} options\n */\nfunction drawBox(ctx, rect, options) {\n const {x, y, width, height} = rect;\n ctx.save();\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n ctx.fillStyle = options.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x, y, w: width, h: height,\n radius: clampAll(toTRBLCorners(options.borderRadius), 0, Math.min(width, height) / 2)\n });\n ctx.closePath();\n ctx.fill();\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {CoreLabelOptions} options\n * @param {number} fitRatio\n */\nfunction drawLabel(ctx, rect, options, fitRatio) {\n const content = options.content;\n if (isImageOrCanvas(content)) {\n ctx.save();\n ctx.globalAlpha = getOpacity(options.opacity, content.style.opacity);\n ctx.drawImage(content, rect.x, rect.y, rect.width, rect.height);\n ctx.restore();\n return;\n }\n const labels = isArray(content) ? content : [content];\n const fonts = toFonts(options, fitRatio);\n const optColor = options.color;\n const colors = isArray(optColor) ? optColor : [optColor];\n const x = calculateTextAlignment(rect, options);\n const y = rect.y + options.textStrokeWidth / 2;\n ctx.save();\n ctx.textBaseline = 'middle';\n ctx.textAlign = options.textAlign;\n if (setTextStrokeStyle(ctx, options)) {\n applyLabelDecoration(ctx, {x, y}, labels, fonts);\n }\n applyLabelContent(ctx, {x, y}, labels, {fonts, colors});\n ctx.restore();\n}\n\nfunction setTextStrokeStyle(ctx, options) {\n if (options.textStrokeWidth > 0) {\n // https://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas\n ctx.lineJoin = 'round';\n ctx.miterLimit = 2;\n ctx.lineWidth = options.textStrokeWidth;\n ctx.strokeStyle = options.textStrokeColor;\n return true;\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{radius: number, options: PointAnnotationOptions}} element\n * @param {number} x\n * @param {number} y\n */\nfunction drawPoint(ctx, element, x, y) {\n const {radius, options} = element;\n const style = options.pointStyle;\n const rotation = options.rotation;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (isImageOrCanvas(style)) {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n if (notRadius(radius)) {\n return;\n }\n drawPointStyle(ctx, {x, y, radius, rotation, style, rad});\n}\n\nfunction drawPointStyle(ctx, {x, y, radius, rotation, style, rad}) {\n let xOffset, yOffset, size, cornerRadius;\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n ctx.arc(x, y, radius, 0, TAU);\n ctx.closePath();\n break;\n case 'triangle':\n ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n ctx.rect(x - size, y - size, 2 * size, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + yOffset, y - xOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'star':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n rad += QUARTER_PI;\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'line':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n break;\n }\n\n ctx.fill();\n}\n\nfunction calculateLabelSize(ctx, lines, fonts, strokeWidth) {\n ctx.save();\n const count = lines.length;\n let width = 0;\n let height = strokeWidth;\n for (let i = 0; i < count; i++) {\n const font = fonts[Math.min(i, fonts.length - 1)];\n ctx.font = font.string;\n const text = lines[i];\n width = Math.max(width, ctx.measureText(text).width + strokeWidth);\n height += font.lineHeight;\n }\n ctx.restore();\n return {width, height};\n}\n\nfunction applyLabelDecoration(ctx, {x, y}, labels, fonts) {\n ctx.beginPath();\n let lhs = 0;\n labels.forEach(function(l, i) {\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.font = f.string;\n ctx.strokeText(l, x, y + lh / 2 + lhs);\n lhs += lh;\n });\n ctx.stroke();\n}\n\nfunction applyLabelContent(ctx, {x, y}, labels, {fonts, colors}) {\n let lhs = 0;\n labels.forEach(function(l, i) {\n const c = colors[Math.min(i, colors.length - 1)];\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.beginPath();\n ctx.font = f.string;\n ctx.fillStyle = c;\n ctx.fillText(l, x, y + lh / 2 + lhs);\n lhs += lh;\n ctx.fill();\n });\n}\n\nfunction getOpacity(value, elementValue) {\n const opacity = isNumber(value) ? value : elementValue;\n return isNumber(opacity) ? clamp(opacity, 0, 1) : 1;\n}\n\nconst positions = ['left', 'bottom', 'top', 'right'];\n\n/**\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\n/**\n * Drawa the callout component for labels.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {AnnotationElement} element - the label element\n */\nfunction drawCallout(ctx, element) {\n const {pointX, pointY, options} = element;\n const callout = options.callout;\n const calloutPosition = callout && callout.display && resolveCalloutPosition(element, callout);\n if (!calloutPosition || isPointInRange(element, callout, calloutPosition)) {\n return;\n }\n\n ctx.save();\n ctx.beginPath();\n const stroke = setBorderStyle(ctx, callout);\n if (!stroke) {\n return ctx.restore();\n }\n const {separatorStart, separatorEnd} = getCalloutSeparatorCoord(element, calloutPosition);\n const {sideStart, sideEnd} = getCalloutSideCoord(element, calloutPosition, separatorStart);\n if (callout.margin > 0 || options.borderWidth === 0) {\n ctx.moveTo(separatorStart.x, separatorStart.y);\n ctx.lineTo(separatorEnd.x, separatorEnd.y);\n }\n ctx.moveTo(sideStart.x, sideStart.y);\n ctx.lineTo(sideEnd.x, sideEnd.y);\n const rotatedPoint = rotated({x: pointX, y: pointY}, element.getCenterPoint(), toRadians(-element.rotation));\n ctx.lineTo(rotatedPoint.x, rotatedPoint.y);\n ctx.stroke();\n ctx.restore();\n}\n\nfunction getCalloutSeparatorCoord(element, position) {\n const {x, y, x2, y2} = element;\n const adjust = getCalloutSeparatorAdjust(element, position);\n let separatorStart, separatorEnd;\n if (position === 'left' || position === 'right') {\n separatorStart = {x: x + adjust, y};\n separatorEnd = {x: separatorStart.x, y: y2};\n } else {\n // position 'top' or 'bottom'\n separatorStart = {x, y: y + adjust};\n separatorEnd = {x: x2, y: separatorStart.y};\n }\n return {separatorStart, separatorEnd};\n}\n\nfunction getCalloutSeparatorAdjust(element, position) {\n const {width, height, options} = element;\n const adjust = options.callout.margin + options.borderWidth / 2;\n if (position === 'right') {\n return width + adjust;\n } else if (position === 'bottom') {\n return height + adjust;\n }\n return -adjust;\n}\n\nfunction getCalloutSideCoord(element, position, separatorStart) {\n const {y, width, height, options} = element;\n const start = options.callout.start;\n const side = getCalloutSideAdjust(position, options.callout);\n let sideStart, sideEnd;\n if (position === 'left' || position === 'right') {\n sideStart = {x: separatorStart.x, y: y + getSize(height, start)};\n sideEnd = {x: sideStart.x + side, y: sideStart.y};\n } else {\n // position 'top' or 'bottom'\n sideStart = {x: separatorStart.x + getSize(width, start), y: separatorStart.y};\n sideEnd = {x: sideStart.x, y: sideStart.y + side};\n }\n return {sideStart, sideEnd};\n}\n\nfunction getCalloutSideAdjust(position, options) {\n const side = options.side;\n if (position === 'left' || position === 'top') {\n return -side;\n }\n return side;\n}\n\nfunction resolveCalloutPosition(element, options) {\n const position = options.position;\n if (positions.includes(position)) {\n return position;\n }\n return resolveCalloutAutoPosition(element, options);\n}\n\nfunction resolveCalloutAutoPosition(element, options) {\n const {x, y, x2, y2, width, height, pointX, pointY, centerX, centerY, rotation} = element;\n const center = {x: centerX, y: centerY};\n const start = options.start;\n const xAdjust = getSize(width, start);\n const yAdjust = getSize(height, start);\n const xPoints = [x, x + xAdjust, x + xAdjust, x2];\n const yPoints = [y + yAdjust, y2, y, y2];\n const result = [];\n for (let index = 0; index < 4; index++) {\n const rotatedPoint = rotated({x: xPoints[index], y: yPoints[index]}, center, toRadians(rotation));\n result.push({\n position: positions[index],\n distance: distanceBetweenPoints(rotatedPoint, {x: pointX, y: pointY})\n });\n }\n return result.sort((a, b) => a.distance - b.distance)[0].position;\n}\n\nfunction isPointInRange(element, callout, position) {\n const {pointX, pointY} = element;\n const margin = callout.margin;\n let x = pointX;\n let y = pointY;\n if (position === 'left') {\n x += margin;\n } else if (position === 'right') {\n x -= margin;\n } else if (position === 'top') {\n y += margin;\n } else if (position === 'bottom') {\n y -= margin;\n }\n return element.inRange(x, y);\n}\n\nconst limitedLineScale = {\n xScaleID: {min: 'xMin', max: 'xMax', start: 'left', end: 'right', startProp: 'x', endProp: 'x2'},\n yScaleID: {min: 'yMin', max: 'yMax', start: 'bottom', end: 'top', startProp: 'y', endProp: 'y2'}\n};\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import(\"chart.js\").Point } Point\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n * @typedef { import('../../types/options').LineAnnotationOptions } LineAnnotationOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n * @typedef { import('../../types/options').PolygonAnnotationOptions } PolygonAnnotationOptions\n */\n\n/**\n * @param {Scale} scale\n * @param {number|string} value\n * @param {number} fallback\n * @returns {number}\n */\nfunction scaleValue(scale, value, fallback) {\n value = typeof value === 'number' ? value : scale.parse(value);\n return isFinite(value) ? scale.getPixelForValue(value) : fallback;\n}\n\n/**\n * Search the scale defined in chartjs by the axis related to the annotation options key.\n * @param {{ [key: string]: Scale }} scales\n * @param {CoreAnnotationOptions} options\n * @param {string} key\n * @returns {string}\n */\nfunction retrieveScaleID(scales, options, key) {\n const scaleID = options[key];\n if (scaleID || key === 'scaleID') {\n return scaleID;\n }\n const axis = key.charAt(0);\n const axes = Object.values(scales).filter((scale) => scale.axis && scale.axis === axis);\n if (axes.length) {\n return axes[0].id;\n }\n return axis;\n}\n\n/**\n * @param {Scale} scale\n * @param {{min: number, max: number, start: number, end: number}} options\n * @returns {{start: number, end: number}|undefined}\n */\nfunction getDimensionByScale(scale, options) {\n if (scale) {\n const reverse = scale.options.reverse;\n const start = scaleValue(scale, options.min, reverse ? options.end : options.start);\n const end = scaleValue(scale, options.max, reverse ? options.start : options.end);\n return {\n start,\n end\n };\n }\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {Point}\n */\nfunction getChartPoint(chart, options) {\n const {chartArea, scales} = chart;\n const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n let x = chartArea.width / 2;\n let y = chartArea.height / 2;\n\n if (xScale) {\n x = scaleValue(xScale, options.xValue, xScale.left + xScale.width / 2);\n }\n\n if (yScale) {\n y = scaleValue(yScale, options.yValue, yScale.top + yScale.height / 2);\n }\n return {x, y};\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxProperties(chart, options) {\n const scales = chart.scales;\n const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n\n if (!xScale && !yScale) {\n return {};\n }\n\n let {left: x, right: x2} = xScale || chart.chartArea;\n let {top: y, bottom: y2} = yScale || chart.chartArea;\n const xDim = getChartDimensionByScale(xScale, {min: options.xMin, max: options.xMax, start: x, end: x2});\n x = xDim.start;\n x2 = xDim.end;\n const yDim = getChartDimensionByScale(yScale, {min: options.yMin, max: options.yMax, start: y2, end: y});\n y = yDim.start;\n y2 = yDim.end;\n\n return {\n x,\n y,\n x2,\n y2,\n width: x2 - x,\n height: y2 - y,\n centerX: x + (x2 - x) / 2,\n centerY: y + (y2 - y) / 2\n };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions|PolygonAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolvePointProperties(chart, options) {\n if (!isBoundToPoint(options)) {\n const box = resolveBoxProperties(chart, options);\n let radius = options.radius;\n if (!radius || isNaN(radius)) {\n radius = Math.min(box.width, box.height) / 2;\n options.radius = radius;\n }\n const size = radius * 2;\n const adjustCenterX = box.centerX + options.xAdjust;\n const adjustCenterY = box.centerY + options.yAdjust;\n return {\n x: adjustCenterX - radius,\n y: adjustCenterY - radius,\n x2: adjustCenterX + radius,\n y2: adjustCenterY + radius,\n centerX: adjustCenterX,\n centerY: adjustCenterY,\n width: size,\n height: size,\n radius\n };\n }\n return getChartCircle(chart, options);\n}\n/**\n * @param {Chart} chart\n * @param {LineAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveLineProperties(chart, options) {\n const {scales, chartArea} = chart;\n const scale = scales[options.scaleID];\n const area = {x: chartArea.left, y: chartArea.top, x2: chartArea.right, y2: chartArea.bottom};\n\n if (scale) {\n resolveFullLineProperties(scale, area, options);\n } else {\n resolveLimitedLineProperties(scales, area, options);\n }\n return area;\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @param {boolean} [centerBased=false]\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxAndLabelProperties(chart, options) {\n const properties = resolveBoxProperties(chart, options);\n properties.initProperties = initAnimationProperties(chart, properties, options);\n properties.elements = [{\n type: 'label',\n optionScope: 'label',\n properties: resolveLabelElementProperties$1(chart, properties, options),\n initProperties: properties.initProperties\n }];\n return properties;\n}\n\nfunction getChartCircle(chart, options) {\n const point = getChartPoint(chart, options);\n const size = options.radius * 2;\n return {\n x: point.x - options.radius + options.xAdjust,\n y: point.y - options.radius + options.yAdjust,\n x2: point.x + options.radius + options.xAdjust,\n y2: point.y + options.radius + options.yAdjust,\n centerX: point.x + options.xAdjust,\n centerY: point.y + options.yAdjust,\n radius: options.radius,\n width: size,\n height: size\n };\n}\n\nfunction getChartDimensionByScale(scale, options) {\n const result = getDimensionByScale(scale, options) || options;\n return {\n start: Math.min(result.start, result.end),\n end: Math.max(result.start, result.end)\n };\n}\n\nfunction resolveFullLineProperties(scale, area, options) {\n const min = scaleValue(scale, options.value, NaN);\n const max = scaleValue(scale, options.endValue, min);\n if (scale.isHorizontal()) {\n area.x = min;\n area.x2 = max;\n } else {\n area.y = min;\n area.y2 = max;\n }\n}\n\nfunction resolveLimitedLineProperties(scales, area, options) {\n for (const scaleId of Object.keys(limitedLineScale)) {\n const scale = scales[retrieveScaleID(scales, options, scaleId)];\n if (scale) {\n const {min, max, start, end, startProp, endProp} = limitedLineScale[scaleId];\n const dim = getDimensionByScale(scale, {min: options[min], max: options[max], start: scale[start], end: scale[end]});\n area[startProp] = dim.start;\n area[endProp] = dim.end;\n }\n }\n}\n\nfunction calculateX({properties, options}, labelSize, position, padding) {\n const {x: start, x2: end, width: size} = properties;\n return calculatePosition({start, end, size, borderWidth: options.borderWidth}, {\n position: position.x,\n padding: {start: padding.left, end: padding.right},\n adjust: options.label.xAdjust,\n size: labelSize.width\n });\n}\n\nfunction calculateY({properties, options}, labelSize, position, padding) {\n const {y: start, y2: end, height: size} = properties;\n return calculatePosition({start, end, size, borderWidth: options.borderWidth}, {\n position: position.y,\n padding: {start: padding.top, end: padding.bottom},\n adjust: options.label.yAdjust,\n size: labelSize.height\n });\n}\n\nfunction calculatePosition(boxOpts, labelOpts) {\n const {start, end, borderWidth} = boxOpts;\n const {position, padding: {start: padStart, end: padEnd}, adjust} = labelOpts;\n const availableSize = end - borderWidth - start - padStart - padEnd - labelOpts.size;\n return start + borderWidth / 2 + adjust + getRelativePosition(availableSize, position);\n}\n\nfunction resolveLabelElementProperties$1(chart, properties, options) {\n const label = options.label;\n label.backgroundColor = 'transparent';\n label.callout.display = false;\n const position = toPosition(label.position);\n const padding = toPadding(label.padding);\n const labelSize = measureLabelSize(chart.ctx, label);\n const x = calculateX({properties, options}, labelSize, position, padding);\n const y = calculateY({properties, options}, labelSize, position, padding);\n const width = labelSize.width + padding.width;\n const height = labelSize.height + padding.height;\n return {\n x,\n y,\n x2: x + width,\n y2: y + height,\n width,\n height,\n centerX: x + width / 2,\n centerY: y + height / 2,\n rotation: label.rotation\n };\n\n}\n\nconst moveHooks = ['enter', 'leave'];\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\nconst eventHooks = moveHooks.concat('click');\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateListeners(chart, state, options) {\n state.listened = loadHooks(options, eventHooks, state.listeners);\n state.moveListened = false;\n\n moveHooks.forEach(hook => {\n if (isFunction(options[hook])) {\n state.moveListened = true;\n }\n });\n\n if (!state.listened || !state.moveListened) {\n state.annotations.forEach(scope => {\n if (!state.listened && isFunction(scope.click)) {\n state.listened = true;\n }\n if (!state.moveListened) {\n moveHooks.forEach(hook => {\n if (isFunction(scope[hook])) {\n state.listened = true;\n state.moveListened = true;\n }\n });\n }\n });\n }\n}\n\n/**\n * @param {Object} state\n * @param {ChartEvent} event\n * @param {AnnotationPluginOptions} options\n * @return {boolean|undefined}\n */\nfunction handleEvent(state, event, options) {\n if (state.listened) {\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n return handleMoveEvents(state, event, options);\n case 'click':\n return handleClickEvents(state, event, options);\n }\n }\n}\n\nfunction handleMoveEvents(state, event, options) {\n if (!state.moveListened) {\n return;\n }\n\n let elements;\n\n if (event.type === 'mousemove') {\n elements = getElements(state.visibleElements, event, options.interaction);\n } else {\n elements = [];\n }\n\n const previous = state.hovered;\n state.hovered = elements;\n\n const context = {state, event};\n let changed = dispatchMoveEvents(context, 'leave', previous, elements);\n return dispatchMoveEvents(context, 'enter', elements, previous) || changed;\n}\n\nfunction dispatchMoveEvents({state, event}, hook, elements, checkElements) {\n let changed;\n for (const element of elements) {\n if (checkElements.indexOf(element) < 0) {\n changed = dispatchEvent(element.options[hook] || state.listeners[hook], element, event) || changed;\n }\n }\n return changed;\n}\n\nfunction handleClickEvents(state, event, options) {\n const listeners = state.listeners;\n const elements = getElements(state.visibleElements, event, options.interaction);\n let changed;\n for (const element of elements) {\n changed = dispatchEvent(element.options.click || listeners.click, element, event) || changed;\n }\n return changed;\n}\n\nfunction dispatchEvent(handler, element, event) {\n return callback(handler, [element.$context, event]) === true;\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst elementHooks = ['afterDraw', 'beforeDraw'];\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateHooks(chart, state, options) {\n const visibleElements = state.visibleElements;\n state.hooked = loadHooks(options, elementHooks, state.hooks);\n\n if (!state.hooked) {\n visibleElements.forEach(scope => {\n if (!state.hooked) {\n elementHooks.forEach(hook => {\n if (isFunction(scope.options[hook])) {\n state.hooked = true;\n }\n });\n }\n });\n }\n}\n\n/**\n * @param {Object} state\n * @param {AnnotationElement} element\n * @param {string} hook\n */\nfunction invokeHook(state, element, hook) {\n if (state.hooked) {\n const callbackHook = element.options[hook] || state.hooks[hook];\n return callback(callbackHook, [element.$context]);\n }\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n */\n\n/**\n * @param {Chart} chart\n * @param {Scale} scale\n * @param {CoreAnnotationOptions[]} annotations\n */\nfunction adjustScaleRange(chart, scale, annotations) {\n const range = getScaleLimits(chart.scales, scale, annotations);\n let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin');\n changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed;\n if (changed && isFunction(scale.handleTickRangeOptions)) {\n scale.handleTickRangeOptions();\n }\n}\n\n/**\n * @param {CoreAnnotationOptions[]} annotations\n * @param {{ [key: string]: Scale }} scales\n */\nfunction verifyScaleOptions(annotations, scales) {\n for (const annotation of annotations) {\n verifyScaleIDs(annotation, scales);\n }\n}\n\nfunction changeScaleLimit(scale, range, limit, suggestedLimit) {\n if (isFinite(range[limit]) && !scaleLimitDefined(scale.options, limit, suggestedLimit)) {\n const changed = scale[limit] !== range[limit];\n scale[limit] = range[limit];\n return changed;\n }\n}\n\nfunction scaleLimitDefined(scaleOptions, limit, suggestedLimit) {\n return defined(scaleOptions[limit]) || defined(scaleOptions[suggestedLimit]);\n}\n\nfunction verifyScaleIDs(annotation, scales) {\n for (const key of ['scaleID', 'xScaleID', 'yScaleID']) {\n const scaleID = retrieveScaleID(scales, annotation, key);\n if (scaleID && !scales[scaleID] && verifyProperties(annotation, key)) {\n console.warn(`No scale found with id '${scaleID}' for annotation '${annotation.id}'`);\n }\n }\n}\n\nfunction verifyProperties(annotation, key) {\n if (key === 'scaleID') {\n return true;\n }\n const axis = key.charAt(0);\n for (const prop of ['Min', 'Max', 'Value']) {\n if (defined(annotation[axis + prop])) {\n return true;\n }\n }\n return false;\n}\n\nfunction getScaleLimits(scales, scale, annotations) {\n const axis = scale.axis;\n const scaleID = scale.id;\n const scaleIDOption = axis + 'ScaleID';\n const limits = {\n min: valueOrDefault(scale.min, Number.NEGATIVE_INFINITY),\n max: valueOrDefault(scale.max, Number.POSITIVE_INFINITY)\n };\n for (const annotation of annotations) {\n if (annotation.scaleID === scaleID) {\n updateLimits(annotation, scale, ['value', 'endValue'], limits);\n } else if (retrieveScaleID(scales, annotation, scaleIDOption) === scaleID) {\n updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits);\n }\n }\n return limits;\n}\n\nfunction updateLimits(annotation, scale, props, limits) {\n for (const prop of props) {\n const raw = annotation[prop];\n if (defined(raw)) {\n const value = scale.parse(raw);\n limits.min = Math.min(limits.min, value);\n limits.max = Math.max(limits.max, value);\n }\n }\n}\n\nclass BoxAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n return inBoxRange({x, y}, this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis, this.options);\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.options.rotation);\n drawBox(ctx, this, this.options);\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n return resolveBoxAndLabelProperties(chart, options);\n }\n}\n\nBoxAnnotation.id = 'boxAnnotation';\n\nBoxAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n hitTolerance: 0,\n label: {\n backgroundColor: 'transparent',\n borderWidth: 0,\n callout: {\n display: false\n },\n color: 'black',\n content: null,\n display: false,\n drawTime: undefined,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: 'bold'\n },\n height: undefined,\n hitTolerance: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: undefined,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0,\n z: undefined\n },\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nBoxAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nBoxAnnotation.descriptors = {\n label: {\n _fallback: true\n }\n};\n\nclass DoughnutLabelAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n return inLabelRange(\n {x: mouseX, y: mouseY},\n {rect: this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), center: this.getCenterPoint(useFinalPosition)},\n axis,\n {rotation: this.rotation, borderWidth: 0, hitTolerance: this.options.hitTolerance}\n );\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n if (!options.display || !options.content) {\n return;\n }\n drawBackground(ctx, this);\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.rotation);\n drawLabel(ctx, this, options, this._fitRatio);\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n const meta = getDatasetMeta(chart, options);\n if (!meta) {\n return {};\n }\n const {controllerMeta, point, radius} = getControllerMeta(chart, options, meta);\n let labelSize = measureLabelSize(chart.ctx, options);\n const _fitRatio = getFitRatio(labelSize, radius);\n if (shouldFit(options, _fitRatio)) {\n labelSize = {width: labelSize.width * _fitRatio, height: labelSize.height * _fitRatio};\n }\n const {position, xAdjust, yAdjust} = options;\n const boxSize = measureLabelRectangle(point, labelSize, {borderWidth: 0, position, xAdjust, yAdjust});\n return {\n initProperties: initAnimationProperties(chart, boxSize, options),\n ...boxSize,\n ...controllerMeta,\n rotation: options.rotation,\n _fitRatio\n };\n }\n}\n\nDoughnutLabelAnnotation.id = 'doughnutLabelAnnotation';\n\nDoughnutLabelAnnotation.defaults = {\n autoFit: true,\n autoHide: true,\n backgroundColor: 'transparent',\n backgroundShadowColor: 'transparent',\n borderColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderShadowColor: 'transparent',\n borderWidth: 0,\n color: 'black',\n content: null,\n display: true,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: undefined\n },\n height: undefined,\n hitTolerance: 0,\n init: undefined,\n opacity: undefined,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n spacing: 1,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0\n};\n\nDoughnutLabelAnnotation.defaultRoutes = {\n};\n\nfunction getDatasetMeta(chart, options) {\n return chart.getSortedVisibleDatasetMetas().reduce(function(result, value) {\n const controller = value.controller;\n if (controller instanceof DoughnutController &&\n isControllerVisible(chart, options, value.data) &&\n (!result || controller.innerRadius < result.controller.innerRadius) &&\n controller.options.circumference >= 90) {\n return value;\n }\n return result;\n }, undefined);\n}\n\nfunction isControllerVisible(chart, options, elements) {\n if (!options.autoHide) {\n return true;\n }\n for (let i = 0; i < elements.length; i++) {\n if (!elements[i].hidden && chart.getDataVisibility(i)) {\n return true;\n }\n }\n}\n\nfunction getControllerMeta({chartArea}, options, meta) {\n const {left, top, right, bottom} = chartArea;\n const {innerRadius, offsetX, offsetY} = meta.controller;\n const x = (left + right) / 2 + offsetX;\n const y = (top + bottom) / 2 + offsetY;\n const square = {\n left: Math.max(x - innerRadius, left),\n right: Math.min(x + innerRadius, right),\n top: Math.max(y - innerRadius, top),\n bottom: Math.min(y + innerRadius, bottom)\n };\n const point = {\n x: (square.left + square.right) / 2,\n y: (square.top + square.bottom) / 2\n };\n const space = options.spacing + options.borderWidth / 2;\n const _radius = innerRadius - space;\n const _counterclockwise = point.y > y;\n const side = _counterclockwise ? top + space : bottom - space;\n const angles = getAngles(side, x, y, _radius);\n const controllerMeta = {\n _centerX: x,\n _centerY: y,\n _radius,\n _counterclockwise,\n ...angles\n };\n return {\n controllerMeta,\n point,\n radius: Math.min(innerRadius, Math.min(square.right - square.left, square.bottom - square.top) / 2)\n };\n}\n\nfunction getFitRatio({width, height}, radius) {\n const hypo = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n return (radius * 2) / hypo;\n}\n\nfunction getAngles(y, centerX, centerY, radius) {\n const yk2 = Math.pow(centerY - y, 2);\n const r2 = Math.pow(radius, 2);\n const b = centerX * -2;\n const c = Math.pow(centerX, 2) + yk2 - r2;\n const delta = Math.pow(b, 2) - (4 * c);\n if (delta <= 0) {\n return {\n _startAngle: 0,\n _endAngle: TAU\n };\n }\n const start = (-b - Math.sqrt(delta)) / 2;\n const end = (-b + Math.sqrt(delta)) / 2;\n return {\n _startAngle: getAngleFromPoint({x: centerX, y: centerY}, {x: start, y}).angle,\n _endAngle: getAngleFromPoint({x: centerX, y: centerY}, {x: end, y}).angle\n };\n}\n\nfunction drawBackground(ctx, element) {\n const {_centerX, _centerY, _radius, _startAngle, _endAngle, _counterclockwise, options} = element;\n ctx.save();\n const stroke = setBorderStyle(ctx, options);\n ctx.fillStyle = options.backgroundColor;\n ctx.beginPath();\n ctx.arc(_centerX, _centerY, _radius, _startAngle, _endAngle, _counterclockwise);\n ctx.closePath();\n ctx.fill();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n}\n\nclass LabelAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n return inLabelRange(\n {x: mouseX, y: mouseY},\n {rect: this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), center: this.getCenterPoint(useFinalPosition)},\n axis,\n {rotation: this.rotation, borderWidth: this.options.borderWidth, hitTolerance: this.options.hitTolerance}\n );\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n const visible = !defined(this._visible) || this._visible;\n if (!options.display || !options.content || !visible) {\n return;\n }\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.rotation);\n drawCallout(ctx, this);\n drawBox(ctx, this, options);\n drawLabel(ctx, getLabelSize(this), options);\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n let point;\n if (!isBoundToPoint(options)) {\n const {centerX, centerY} = resolveBoxProperties(chart, options);\n point = {x: centerX, y: centerY};\n } else {\n point = getChartPoint(chart, options);\n }\n const padding = toPadding(options.padding);\n const labelSize = measureLabelSize(chart.ctx, options);\n const boxSize = measureLabelRectangle(point, labelSize, options, padding);\n return {\n initProperties: initAnimationProperties(chart, boxSize, options),\n pointX: point.x,\n pointY: point.y,\n ...boxSize,\n rotation: options.rotation\n };\n }\n}\n\nLabelAnnotation.id = 'labelAnnotation';\n\nLabelAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundColor: 'transparent',\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 0,\n borderShadowColor: 'transparent',\n borderWidth: 0,\n callout: {\n borderCapStyle: 'butt',\n borderColor: undefined,\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 1,\n display: false,\n margin: 5,\n position: 'auto',\n side: 5,\n start: '50%',\n },\n color: 'black',\n content: null,\n display: true,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: undefined\n },\n height: undefined,\n hitTolerance: 0,\n init: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nLabelAnnotation.defaultRoutes = {\n borderColor: 'color'\n};\n\nfunction getLabelSize({x, y, width, height, options}) {\n const hBorderWidth = options.borderWidth / 2;\n const padding = toPadding(options.padding);\n return {\n x: x + padding.left + hBorderWidth,\n y: y + padding.top + hBorderWidth,\n width: width - padding.left - padding.right - options.borderWidth,\n height: height - padding.top - padding.bottom - options.borderWidth\n };\n}\n\nconst pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)});\nconst interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x;\nconst interpolateY = (x, p1, p2) => pointInLine(p1, p2, Math.abs((x - p1.x) / (p2.x - p1.x))).y;\nconst sqr = v => v * v;\nconst rangeLimit = (mouseX, mouseY, {x, y, x2, y2}, axis) => axis === 'y' ? {start: Math.min(y, y2), end: Math.max(y, y2), value: mouseY} : {start: Math.min(x, x2), end: Math.max(x, x2), value: mouseX};\n// http://www.independent-software.com/determining-coordinates-on-a-html-canvas-bezier-curve.html\nconst coordInCurve = (start, cp, end, t) => (1 - t) * (1 - t) * start + 2 * (1 - t) * t * cp + t * t * end;\nconst pointInCurve = (start, cp, end, t) => ({x: coordInCurve(start.x, cp.x, end.x, t), y: coordInCurve(start.y, cp.y, end.y, t)});\nconst coordAngleInCurve = (start, cp, end, t) => 2 * (1 - t) * (cp - start) + 2 * t * (end - cp);\nconst angleInCurve = (start, cp, end, t) => -Math.atan2(coordAngleInCurve(start.x, cp.x, end.x, t), coordAngleInCurve(start.y, cp.y, end.y, t)) + 0.5 * PI;\n\nclass LineAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const hitSize = (this.options.borderWidth + this.options.hitTolerance) / 2;\n if (axis !== 'x' && axis !== 'y') {\n const point = {mouseX, mouseY};\n const {path, ctx} = this;\n if (path) {\n setBorderStyle(ctx, this.options);\n ctx.lineWidth += this.options.hitTolerance;\n const {chart} = this.$context;\n const mx = mouseX * chart.currentDevicePixelRatio;\n const my = mouseY * chart.currentDevicePixelRatio;\n const result = ctx.isPointInStroke(path, mx, my) || isOnLabel(this, point, useFinalPosition);\n ctx.restore();\n return result;\n }\n const epsilon = sqr(hitSize);\n return intersects(this, point, epsilon, useFinalPosition) || isOnLabel(this, point, useFinalPosition);\n }\n return inAxisRange(this, {mouseX, mouseY}, axis, {hitSize, useFinalPosition});\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {x, y, x2, y2, cp, options} = this;\n\n ctx.save();\n if (!setBorderStyle(ctx, options)) {\n // no border width, then line is not drawn\n return ctx.restore();\n }\n setShadowStyle(ctx, options);\n\n const length = Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2));\n if (options.curve && cp) {\n drawCurve(ctx, this, cp, length);\n return ctx.restore();\n }\n const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(this);\n const angle = Math.atan2(y2 - y, x2 - x);\n ctx.translate(x, y);\n ctx.rotate(angle);\n ctx.beginPath();\n ctx.moveTo(0 + startAdjust, 0);\n ctx.lineTo(length - endAdjust, 0);\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n drawArrowHead(ctx, 0, startAdjust, startOpts);\n drawArrowHead(ctx, length, -endAdjust, endOpts);\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n const area = resolveLineProperties(chart, options);\n const {x, y, x2, y2} = area;\n const inside = isLineInArea(area, chart.chartArea);\n const properties = inside\n ? limitLineToArea({x, y}, {x: x2, y: y2}, chart.chartArea)\n : {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n properties.centerX = (x2 + x) / 2;\n properties.centerY = (y2 + y) / 2;\n properties.initProperties = initAnimationProperties(chart, properties, options);\n if (options.curve) {\n const p1 = {x: properties.x, y: properties.y};\n const p2 = {x: properties.x2, y: properties.y2};\n properties.cp = getControlPoint(properties, options, distanceBetweenPoints(p1, p2));\n }\n const labelProperties = resolveLabelElementProperties(chart, properties, options.label);\n // additonal prop to manage zoom/pan\n labelProperties._visible = inside;\n\n properties.elements = [{\n type: 'label',\n optionScope: 'label',\n properties: labelProperties,\n initProperties: properties.initProperties\n }];\n return properties;\n }\n}\n\nLineAnnotation.id = 'lineAnnotation';\n\nconst arrowHeadsDefaults = {\n backgroundColor: undefined,\n backgroundShadowColor: undefined,\n borderColor: undefined,\n borderDash: undefined,\n borderDashOffset: undefined,\n borderShadowColor: undefined,\n borderWidth: undefined,\n display: undefined,\n fill: undefined,\n length: undefined,\n shadowBlur: undefined,\n shadowOffsetX: undefined,\n shadowOffsetY: undefined,\n width: undefined\n};\n\nLineAnnotation.defaults = {\n adjustScaleRange: true,\n arrowHeads: {\n display: false,\n end: Object.assign({}, arrowHeadsDefaults),\n fill: false,\n length: 12,\n start: Object.assign({}, arrowHeadsDefaults),\n width: 6\n },\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 2,\n curve: false,\n controlPoint: {\n y: '-50%'\n },\n display: true,\n endValue: undefined,\n init: undefined,\n hitTolerance: 0,\n label: {\n backgroundColor: 'rgba(0,0,0,0.8)',\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderColor: 'black',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 6,\n borderShadowColor: 'transparent',\n borderWidth: 0,\n callout: Object.assign({}, LabelAnnotation.defaults.callout),\n color: '#fff',\n content: null,\n display: false,\n drawTime: undefined,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: 'bold'\n },\n height: undefined,\n hitTolerance: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0,\n z: undefined\n },\n scaleID: undefined,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n value: undefined,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nLineAnnotation.descriptors = {\n arrowHeads: {\n start: {\n _fallback: true\n },\n end: {\n _fallback: true\n },\n _fallback: true\n }\n};\n\nLineAnnotation.defaultRoutes = {\n borderColor: 'color'\n};\n\nfunction inAxisRange(element, {mouseX, mouseY}, axis, {hitSize, useFinalPosition}) {\n const limit = rangeLimit(mouseX, mouseY, element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis);\n return inLimit(limit, hitSize) || isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis);\n}\n\nfunction isLineInArea({x, y, x2, y2}, {top, right, bottom, left}) {\n return !(\n (x < left && x2 < left) ||\n (x > right && x2 > right) ||\n (y < top && y2 < top) ||\n (y > bottom && y2 > bottom)\n );\n}\n\nfunction limitPointToArea({x, y}, p2, {top, right, bottom, left}) {\n if (x < left) {\n y = interpolateY(left, {x, y}, p2);\n x = left;\n }\n if (x > right) {\n y = interpolateY(right, {x, y}, p2);\n x = right;\n }\n if (y < top) {\n x = interpolateX(top, {x, y}, p2);\n y = top;\n }\n if (y > bottom) {\n x = interpolateX(bottom, {x, y}, p2);\n y = bottom;\n }\n return {x, y};\n}\n\nfunction limitLineToArea(p1, p2, area) {\n const {x, y} = limitPointToArea(p1, p2, area);\n const {x: x2, y: y2} = limitPointToArea(p2, p1, area);\n return {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n}\n\nfunction intersects(element, {mouseX, mouseY}, epsilon = EPSILON, useFinalPosition) {\n // Adapted from https://stackoverflow.com/a/6853926/25507\n const {x: x1, y: y1, x2, y2} = element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = sqr(dx) + sqr(dy);\n const t = lenSq === 0 ? -1 : ((mouseX - x1) * dx + (mouseY - y1) * dy) / lenSq;\n\n let xx, yy;\n if (t < 0) {\n xx = x1;\n yy = y1;\n } else if (t > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + t * dx;\n yy = y1 + t * dy;\n }\n return (sqr(mouseX - xx) + sqr(mouseY - yy)) <= epsilon;\n}\n\nfunction isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis) {\n const label = element.label;\n return label.options.display && label.inRange(mouseX, mouseY, axis, useFinalPosition);\n}\n\nfunction resolveLabelElementProperties(chart, properties, options) {\n const borderWidth = options.borderWidth;\n const padding = toPadding(options.padding);\n const textSize = measureLabelSize(chart.ctx, options);\n const width = textSize.width + padding.width + borderWidth;\n const height = textSize.height + padding.height + borderWidth;\n return calculateLabelPosition(properties, options, {width, height, padding}, chart.chartArea);\n}\n\nfunction calculateAutoRotation(properties) {\n const {x, y, x2, y2} = properties;\n const rotation = Math.atan2(y2 - y, x2 - x);\n // Flip the rotation if it goes > PI/2 or < -PI/2, so label stays upright\n return rotation > PI / 2 ? rotation - PI : rotation < PI / -2 ? rotation + PI : rotation;\n}\n\nfunction calculateLabelPosition(properties, label, sizes, chartArea) {\n const {width, height, padding} = sizes;\n const {xAdjust, yAdjust} = label;\n const p1 = {x: properties.x, y: properties.y};\n const p2 = {x: properties.x2, y: properties.y2};\n const rotation = label.rotation === 'auto' ? calculateAutoRotation(properties) : toRadians(label.rotation);\n const size = rotatedSize(width, height, rotation);\n const t = calculateT(properties, label, {labelSize: size, padding}, chartArea);\n const pt = properties.cp ? pointInCurve(p1, properties.cp, p2, t) : pointInLine(p1, p2, t);\n const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left};\n const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top};\n const centerX = adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust;\n const centerY = adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust;\n return {\n x: centerX - (width / 2),\n y: centerY - (height / 2),\n x2: centerX + (width / 2),\n y2: centerY + (height / 2),\n centerX,\n centerY,\n pointX: pt.x,\n pointY: pt.y,\n width,\n height,\n rotation: toDegrees(rotation)\n };\n}\n\nfunction rotatedSize(width, height, rotation) {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n return {\n w: Math.abs(width * cos) + Math.abs(height * sin),\n h: Math.abs(width * sin) + Math.abs(height * cos)\n };\n}\n\nfunction calculateT(properties, label, sizes, chartArea) {\n let t;\n const space = spaceAround(properties, chartArea);\n if (label.position === 'start') {\n t = calculateTAdjust({w: properties.x2 - properties.x, h: properties.y2 - properties.y}, sizes, label, space);\n } else if (label.position === 'end') {\n t = 1 - calculateTAdjust({w: properties.x - properties.x2, h: properties.y - properties.y2}, sizes, label, space);\n } else {\n t = getRelativePosition(1, label.position);\n }\n return t;\n}\n\nfunction calculateTAdjust(lineSize, sizes, label, space) {\n const {labelSize, padding} = sizes;\n const lineW = lineSize.w * space.dx;\n const lineH = lineSize.h * space.dy;\n const x = (lineW > 0) && ((labelSize.w / 2 + padding.left - space.x) / lineW);\n const y = (lineH > 0) && ((labelSize.h / 2 + padding.top - space.y) / lineH);\n return clamp(Math.max(x, y), 0, 0.25);\n}\n\nfunction spaceAround(properties, chartArea) {\n const {x, x2, y, y2} = properties;\n const t = Math.min(y, y2) - chartArea.top;\n const l = Math.min(x, x2) - chartArea.left;\n const b = chartArea.bottom - Math.max(y, y2);\n const r = chartArea.right - Math.max(x, x2);\n return {\n x: Math.min(l, r),\n y: Math.min(t, b),\n dx: l <= r ? 1 : -1,\n dy: t <= b ? 1 : -1\n };\n}\n\nfunction adjustLabelCoordinate(coordinate, labelSizes) {\n const {size, min, max, padding} = labelSizes;\n const halfSize = size / 2;\n if (size > max - min) {\n // if it does not fit, display as much as possible\n return (max + min) / 2;\n }\n if (min >= (coordinate - padding - halfSize)) {\n coordinate = min + padding + halfSize;\n }\n if (max <= (coordinate + padding + halfSize)) {\n coordinate = max - padding - halfSize;\n }\n return coordinate;\n}\n\nfunction getArrowHeads(line) {\n const options = line.options;\n const arrowStartOpts = options.arrowHeads && options.arrowHeads.start;\n const arrowEndOpts = options.arrowHeads && options.arrowHeads.end;\n return {\n startOpts: arrowStartOpts,\n endOpts: arrowEndOpts,\n startAdjust: getLineAdjust(line, arrowStartOpts),\n endAdjust: getLineAdjust(line, arrowEndOpts)\n };\n}\n\nfunction getLineAdjust(line, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return 0;\n }\n const {length, width} = arrowOpts;\n const adjust = line.options.borderWidth / 2;\n const p1 = {x: length, y: width + adjust};\n const p2 = {x: 0, y: adjust};\n return Math.abs(interpolateX(0, p1, p2));\n}\n\nfunction drawArrowHead(ctx, offset, adjust, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return;\n }\n const {length, width, fill, backgroundColor, borderColor} = arrowOpts;\n const arrowOffsetX = Math.abs(offset - length) + adjust;\n ctx.beginPath();\n setShadowStyle(ctx, arrowOpts);\n setBorderStyle(ctx, arrowOpts);\n ctx.moveTo(arrowOffsetX, -width);\n ctx.lineTo(offset + adjust, 0);\n ctx.lineTo(arrowOffsetX, width);\n if (fill === true) {\n ctx.fillStyle = backgroundColor || borderColor;\n ctx.closePath();\n ctx.fill();\n ctx.shadowColor = 'transparent';\n } else {\n ctx.shadowColor = arrowOpts.borderShadowColor;\n }\n ctx.stroke();\n}\n\nfunction getControlPoint(properties, options, distance) {\n const {x, y, x2, y2, centerX, centerY} = properties;\n const angle = Math.atan2(y2 - y, x2 - x);\n const cp = toPosition(options.controlPoint, 0);\n const point = {\n x: centerX + getSize(distance, cp.x, false),\n y: centerY + getSize(distance, cp.y, false)\n };\n return rotated(point, {x: centerX, y: centerY}, angle);\n}\n\nfunction drawArrowHeadOnCurve(ctx, {x, y}, {angle, adjust}, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return;\n }\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(angle);\n drawArrowHead(ctx, 0, -adjust, arrowOpts);\n ctx.restore();\n}\n\nfunction drawCurve(ctx, element, cp, length) {\n const {x, y, x2, y2, options} = element;\n const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(element);\n const p1 = {x, y};\n const p2 = {x: x2, y: y2};\n const startAngle = angleInCurve(p1, cp, p2, 0);\n const endAngle = angleInCurve(p1, cp, p2, 1) - PI;\n const ps = pointInCurve(p1, cp, p2, startAdjust / length);\n const pe = pointInCurve(p1, cp, p2, 1 - endAdjust / length);\n\n const path = new Path2D();\n ctx.beginPath();\n path.moveTo(ps.x, ps.y);\n path.quadraticCurveTo(cp.x, cp.y, pe.x, pe.y);\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke(path);\n element.path = path;\n element.ctx = ctx;\n drawArrowHeadOnCurve(ctx, ps, {angle: startAngle, adjust: startAdjust}, startOpts);\n drawArrowHeadOnCurve(ctx, pe, {angle: endAngle, adjust: endAdjust}, endOpts);\n}\n\nclass EllipseAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const rotation = this.options.rotation;\n const hitSize = (this.options.borderWidth + this.options.hitTolerance) / 2;\n if (axis !== 'x' && axis !== 'y') {\n return pointInEllipse({x: mouseX, y: mouseY}, this.getProps(['width', 'height', 'centerX', 'centerY'], useFinalPosition), rotation, hitSize);\n }\n const {x, y, x2, y2} = this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n const limit = axis === 'y' ? {start: y, end: y2} : {start: x, end: x2};\n const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-rotation));\n return rotatedPoint[axis] >= limit.start - hitSize - EPSILON && rotatedPoint[axis] <= limit.end + hitSize + EPSILON;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {width, height, centerX, centerY, options} = this;\n ctx.save();\n translate(ctx, this.getCenterPoint(), options.rotation);\n setShadowStyle(ctx, this.options);\n ctx.beginPath();\n ctx.fillStyle = options.backgroundColor;\n const stroke = setBorderStyle(ctx, options);\n ctx.ellipse(centerX, centerY, height / 2, width / 2, PI / 2, 0, 2 * PI);\n ctx.fill();\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n return resolveBoxAndLabelProperties(chart, options);\n }\n\n}\n\nEllipseAnnotation.id = 'ellipseAnnotation';\n\nEllipseAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n hitTolerance: 0,\n init: undefined,\n label: Object.assign({}, BoxAnnotation.defaults.label),\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nEllipseAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nEllipseAnnotation.descriptors = {\n label: {\n _fallback: true\n }\n};\n\nfunction pointInEllipse(p, ellipse, rotation, hitSize) {\n const {width, height, centerX, centerY} = ellipse;\n const xRadius = width / 2;\n const yRadius = height / 2;\n\n if (xRadius <= 0 || yRadius <= 0) {\n return false;\n }\n // https://stackoverflow.com/questions/7946187/point-and-ellipse-rotated-position-test-algorithm\n const angle = toRadians(rotation || 0);\n const cosAngle = Math.cos(angle);\n const sinAngle = Math.sin(angle);\n const a = Math.pow(cosAngle * (p.x - centerX) + sinAngle * (p.y - centerY), 2);\n const b = Math.pow(sinAngle * (p.x - centerX) - cosAngle * (p.y - centerY), 2);\n return (a / Math.pow(xRadius + hitSize, 2)) + (b / Math.pow(yRadius + hitSize, 2)) <= 1.0001;\n}\n\nclass PointAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y, x2, y2, width} = this.getProps(['x', 'y', 'x2', 'y2', 'width'], useFinalPosition);\n const hitSize = (this.options.borderWidth + this.options.hitTolerance) / 2;\n if (axis !== 'x' && axis !== 'y') {\n return inPointRange({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), width / 2, hitSize);\n }\n const limit = axis === 'y' ? {start: y, end: y2, value: mouseY} : {start: x, end: x2, value: mouseX};\n return inLimit(limit, hitSize);\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n const borderWidth = options.borderWidth;\n if (options.radius < 0.1) {\n return;\n }\n ctx.save();\n ctx.fillStyle = options.backgroundColor;\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n drawPoint(ctx, this, this.centerX, this.centerY);\n if (stroke && !isImageOrCanvas(options.pointStyle)) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n options.borderWidth = borderWidth;\n }\n\n resolveElementProperties(chart, options) {\n const properties = resolvePointProperties(chart, options);\n properties.initProperties = initAnimationProperties(chart, properties, options);\n return properties;\n }\n}\n\nPointAnnotation.id = 'pointAnnotation';\n\nPointAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n hitTolerance: 0,\n init: undefined,\n pointStyle: 'circle',\n radius: 10,\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nPointAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nclass PolygonAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n if (axis !== 'x' && axis !== 'y') {\n return this.options.radius >= 0.1 && this.elements.length > 1 && pointIsInPolygon(this.elements, mouseX, mouseY, useFinalPosition);\n }\n const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n const axisPoints = this.elements.map((point) => axis === 'y' ? point.bY : point.bX);\n const start = Math.min(...axisPoints);\n const end = Math.max(...axisPoints);\n return rotatedPoint[axis] >= start && rotatedPoint[axis] <= end;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {elements, options} = this;\n ctx.save();\n ctx.beginPath();\n ctx.fillStyle = options.backgroundColor;\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n let first = true;\n for (const el of elements) {\n if (first) {\n ctx.moveTo(el.x, el.y);\n first = false;\n } else {\n ctx.lineTo(el.x, el.y);\n }\n }\n ctx.closePath();\n ctx.fill();\n // If no border, don't draw it\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n const properties = resolvePointProperties(chart, options);\n const {sides, rotation} = options;\n const elements = [];\n const angle = (2 * PI) / sides;\n let rad = rotation * RAD_PER_DEG;\n for (let i = 0; i < sides; i++, rad += angle) {\n const elProps = buildPointElement(properties, options, rad);\n elProps.initProperties = initAnimationProperties(chart, properties, options);\n elements.push(elProps);\n }\n properties.elements = elements;\n return properties;\n }\n}\n\nPolygonAnnotation.id = 'polygonAnnotation';\n\nPolygonAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n hitTolerance: 0,\n init: undefined,\n point: {\n radius: 0\n },\n radius: 10,\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n sides: 3,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nPolygonAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nfunction buildPointElement({centerX, centerY}, {radius, borderWidth, hitTolerance}, rad) {\n const hitSize = (borderWidth + hitTolerance) / 2;\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n const point = {x: centerX + sin * radius, y: centerY - cos * radius};\n return {\n type: 'point',\n optionScope: 'point',\n properties: {\n x: point.x,\n y: point.y,\n centerX: point.x,\n centerY: point.y,\n bX: centerX + sin * (radius + hitSize),\n bY: centerY - cos * (radius + hitSize)\n }\n };\n}\n\nfunction pointIsInPolygon(points, x, y, useFinalPosition) {\n let isInside = false;\n let A = points[points.length - 1].getProps(['bX', 'bY'], useFinalPosition);\n for (const point of points) {\n const B = point.getProps(['bX', 'bY'], useFinalPosition);\n if ((B.bY > y) !== (A.bY > y) && x < (A.bX - B.bX) * (y - B.bY) / (A.bY - B.bY) + B.bX) {\n isInside = !isInside;\n }\n A = B;\n }\n return isInside;\n}\n\nconst annotationTypes = {\n box: BoxAnnotation,\n doughnutLabel: DoughnutLabelAnnotation,\n ellipse: EllipseAnnotation,\n label: LabelAnnotation,\n line: LineAnnotation,\n point: PointAnnotation,\n polygon: PolygonAnnotation\n};\n\n/**\n * Register fallback for annotation elements\n * For example lineAnnotation options would be looked through:\n * - the annotation object (options.plugins.annotation.annotations[id])\n * - element options (options.elements.lineAnnotation)\n * - element defaults (defaults.elements.lineAnnotation)\n * - annotation plugin defaults (defaults.plugins.annotation, this is what we are registering here)\n */\nObject.keys(annotationTypes).forEach(key => {\n defaults.describe(`elements.${annotationTypes[key].id}`, {\n _fallback: 'plugins.annotation.common'\n });\n});\n\nconst directUpdater = {\n update: Object.assign\n};\n\nconst hooks$1 = eventHooks.concat(elementHooks);\nconst resolve = (value, optDefs) => isObject(optDefs) ? resolveObj(value, optDefs) : value;\n\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").UpdateMode } UpdateMode\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\n/**\n * @param {string} prop\n * @returns {boolean}\n */\nconst isIndexable = (prop) => prop === 'color' || prop === 'font';\n\n/**\n * Resolve the annotation type, checking if is supported.\n * @param {string} [type=line] - annotation type\n * @returns {string} resolved annotation type\n */\nfunction resolveType(type = 'line') {\n if (annotationTypes[type]) {\n return type;\n }\n console.warn(`Unknown annotation type: '${type}', defaulting to 'line'`);\n return 'line';\n}\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n * @param {UpdateMode} mode\n */\nfunction updateElements(chart, state, options, mode) {\n const animations = resolveAnimations(chart, options.animations, mode);\n\n const annotations = state.annotations;\n const elements = resyncElements(state.elements, annotations);\n\n for (let i = 0; i < annotations.length; i++) {\n const annotationOptions = annotations[i];\n const element = getOrCreateElement(elements, i, annotationOptions.type);\n const resolver = annotationOptions.setContext(getContext(chart, element, elements, annotationOptions));\n const properties = element.resolveElementProperties(chart, resolver);\n\n properties.skip = toSkip(properties);\n\n if ('elements' in properties) {\n updateSubElements(element, properties.elements, resolver, animations);\n // Remove the sub-element definitions from properties, so the actual elements\n // are not overwritten by their definitions\n delete properties.elements;\n }\n\n if (!defined(element.x)) {\n // If the element is newly created, assing the properties directly - to\n // make them readily awailable to any scriptable options. If we do not do this,\n // the properties retruned by `resolveElementProperties` are available only\n // after options resolution.\n Object.assign(element, properties);\n }\n\n Object.assign(element, properties.initProperties);\n properties.options = resolveAnnotationOptions(resolver);\n\n animations.update(element, properties);\n }\n}\n\nfunction toSkip(properties) {\n return isNaN(properties.x) || isNaN(properties.y);\n}\n\nfunction resolveAnimations(chart, animOpts, mode) {\n if (mode === 'reset' || mode === 'none' || mode === 'resize') {\n return directUpdater;\n }\n return new Animations(chart, animOpts);\n}\n\nfunction updateSubElements(mainElement, elements, resolver, animations) {\n const subElements = mainElement.elements || (mainElement.elements = []);\n subElements.length = elements.length;\n for (let i = 0; i < elements.length; i++) {\n const definition = elements[i];\n const properties = definition.properties;\n const subElement = getOrCreateElement(subElements, i, definition.type, definition.initProperties);\n const subResolver = resolver[definition.optionScope].override(definition);\n properties.options = resolveAnnotationOptions(subResolver);\n animations.update(subElement, properties);\n }\n}\n\nfunction getOrCreateElement(elements, index, type, initProperties) {\n const elementClass = annotationTypes[resolveType(type)];\n let element = elements[index];\n if (!element || !(element instanceof elementClass)) {\n element = elements[index] = new elementClass();\n Object.assign(element, initProperties);\n }\n return element;\n}\n\nfunction resolveAnnotationOptions(resolver) {\n const elementClass = annotationTypes[resolveType(resolver.type)];\n const result = {};\n result.id = resolver.id;\n result.type = resolver.type;\n result.drawTime = resolver.drawTime;\n Object.assign(result,\n resolveObj(resolver, elementClass.defaults),\n resolveObj(resolver, elementClass.defaultRoutes));\n for (const hook of hooks$1) {\n result[hook] = resolver[hook];\n }\n return result;\n}\n\nfunction resolveObj(resolver, defs) {\n const result = {};\n for (const prop of Object.keys(defs)) {\n const optDefs = defs[prop];\n const value = resolver[prop];\n if (isIndexable(prop) && isArray(value)) {\n result[prop] = value.map((item) => resolve(item, optDefs));\n } else {\n result[prop] = resolve(value, optDefs);\n }\n }\n return result;\n}\n\nfunction getContext(chart, element, elements, annotation) {\n return element.$context || (element.$context = Object.assign(Object.create(chart.getContext()), {\n element,\n get elements() {\n return elements.filter((el) => el && el.options);\n },\n id: annotation.id,\n type: 'annotation'\n }));\n}\n\nfunction resyncElements(elements, annotations) {\n const count = annotations.length;\n const start = elements.length;\n\n if (start < count) {\n const add = count - start;\n elements.splice(start, 0, ...new Array(add));\n } else if (start > count) {\n elements.splice(count, start - count);\n }\n return elements;\n}\n\nvar version = \"3.1.0\";\n\nconst chartStates = new Map();\nconst isNotDoughnutLabel = annotation => annotation.type !== 'doughnutLabel';\nconst hooks = eventHooks.concat(elementHooks);\n\nvar annotation = {\n id: 'annotation',\n\n version,\n\n beforeRegister() {\n requireVersion('chart.js', '4.0', Chart.version);\n },\n\n afterRegister() {\n Chart.register(annotationTypes);\n },\n\n afterUnregister() {\n Chart.unregister(annotationTypes);\n },\n\n beforeInit(chart) {\n chartStates.set(chart, {\n annotations: [],\n elements: [],\n visibleElements: [],\n listeners: {},\n listened: false,\n moveListened: false,\n hooks: {},\n hooked: false,\n hovered: []\n });\n },\n\n beforeUpdate(chart, args, options) {\n const state = chartStates.get(chart);\n const annotations = state.annotations = [];\n\n let annotationOptions = options.annotations;\n if (isObject(annotationOptions)) {\n Object.keys(annotationOptions).forEach(key => {\n const value = annotationOptions[key];\n if (isObject(value)) {\n value.id = key;\n annotations.push(value);\n }\n });\n } else if (isArray(annotationOptions)) {\n annotations.push(...annotationOptions);\n }\n verifyScaleOptions(annotations.filter(isNotDoughnutLabel), chart.scales);\n },\n\n afterDataLimits(chart, args) {\n const state = chartStates.get(chart);\n adjustScaleRange(chart, args.scale, state.annotations.filter(isNotDoughnutLabel).filter(a => a.display && a.adjustScaleRange));\n },\n\n afterUpdate(chart, args, options) {\n const state = chartStates.get(chart);\n updateListeners(chart, state, options);\n updateElements(chart, state, options, args.mode);\n state.visibleElements = state.elements.filter(el => !el.skip && el.options.display);\n updateHooks(chart, state, options);\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n draw(chart, 'beforeDatasetsDraw', options.clip);\n },\n\n afterDatasetsDraw(chart, _args, options) {\n draw(chart, 'afterDatasetsDraw', options.clip);\n },\n\n beforeDatasetDraw(chart, _args, options) {\n draw(chart, _args.index, options.clip);\n },\n\n beforeDraw(chart, _args, options) {\n draw(chart, 'beforeDraw', options.clip);\n },\n\n afterDraw(chart, _args, options) {\n draw(chart, 'afterDraw', options.clip);\n },\n\n beforeEvent(chart, args, options) {\n const state = chartStates.get(chart);\n if (handleEvent(state, args.event, options)) {\n args.changed = true;\n }\n },\n\n afterDestroy(chart) {\n chartStates.delete(chart);\n },\n\n getAnnotations(chart) {\n const state = chartStates.get(chart);\n return state ? state.elements : [];\n },\n\n // only for testing\n _getAnnotationElementsAtEventForMode(visibleElements, event, options) {\n return getElements(visibleElements, event, options);\n },\n\n defaults: {\n animations: {\n numbers: {\n properties: ['x', 'y', 'x2', 'y2', 'width', 'height', 'centerX', 'centerY', 'pointX', 'pointY', 'radius'],\n type: 'number'\n },\n colors: {\n properties: ['backgroundColor', 'borderColor'],\n type: 'color'\n }\n },\n clip: true,\n interaction: {\n mode: undefined,\n axis: undefined,\n intersect: undefined\n },\n common: {\n drawTime: 'afterDatasetsDraw',\n init: false,\n label: {\n }\n }\n },\n\n descriptors: {\n _indexable: false,\n _scriptable: (prop) => !hooks.includes(prop) && prop !== 'init',\n annotations: {\n _allKeys: false,\n _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}`\n },\n interaction: {\n _fallback: true\n },\n common: {\n label: {\n _indexable: isIndexable,\n _fallback: true\n },\n _indexable: isIndexable\n }\n },\n\n additionalOptionScopes: ['']\n};\n\nfunction draw(chart, caller, clip) {\n const {ctx, chartArea} = chart;\n const state = chartStates.get(chart);\n\n if (clip) {\n clipArea(ctx, chartArea);\n }\n\n const drawableElements = getDrawableElements(state.visibleElements, caller).sort((a, b) => a.element.options.z - b.element.options.z);\n for (const item of drawableElements) {\n drawElement(ctx, chartArea, state, item);\n }\n\n if (clip) {\n unclipArea(ctx);\n }\n}\n\nfunction getDrawableElements(elements, caller) {\n const drawableElements = [];\n for (const el of elements) {\n if (el.options.drawTime === caller) {\n drawableElements.push({element: el, main: true});\n }\n if (el.elements && el.elements.length) {\n for (const sub of el.elements) {\n if (sub.options.display && sub.options.drawTime === caller) {\n drawableElements.push({element: sub});\n }\n }\n }\n }\n return drawableElements;\n}\n\nfunction drawElement(ctx, chartArea, state, item) {\n const el = item.element;\n if (item.main) {\n invokeHook(state, el, 'beforeDraw');\n el.draw(ctx, chartArea);\n invokeHook(state, el, 'afterDraw');\n } else {\n el.draw(ctx, chartArea);\n }\n}\n\nexport { annotation as default };\n", "import Chart from 'chart.js/auto'\nimport ChartDataLabels from 'chartjs-plugin-datalabels'\nimport annotationPlugin from 'chartjs-plugin-annotation'\n\nChart.register(annotationPlugin)\n\ndocument.addEventListener('DOMContentLoaded', function () {\n\tvar healthSnapshots = document.querySelectorAll('.healthSnapshot .data-set')\n\tvar healthPriorityDatas = document.querySelectorAll(\n\t\t'.healthPriorityData .data-set'\n\t)\n\n\tconst COLORS = {\n\t\tblack: '#000000',\n\t\twhite: '#FFFFFF',\n\t\tquartz: '#FFF4EF',\n\t\tred: '#D87A85',\n\t\tgreen: '#5A954C',\n\t\tgold: '#ECB31F',\n\t\tponderosa: '#01341F',\n\t\tgreen90: '#5A954CE6',\n\t\tred90: '#D87A85E6',\n\t\tponderosa40: '#01341F66',\n\t}\n\n\tconst skipped = (ctx, value) =>\n\t\tctx.p0.skip || ctx.p1.skip ? value : undefined\n\n\tconst getOrCreateTooltip = chart => {\n\t\tlet tooltipEl = chart.canvas.parentNode.querySelector('div')\n\n\t\tif (!tooltipEl) {\n\t\t\ttooltipEl = document.createElement('div')\n\t\t\ttooltipEl.classList.add('chart-tooltip')\n\n\t\t\tconst table = document.createElement('table')\n\t\t\ttable.style.margin = '0px'\n\n\t\t\ttooltipEl.appendChild(table)\n\t\t\tchart.canvas.parentNode.appendChild(tooltipEl)\n\t\t}\n\n\t\treturn tooltipEl\n\t}\n\n\thealthSnapshots.forEach(details => {\n\t\tvar summary = details.querySelector('.summary')\n\t\tsummary.addEventListener('click', () => {\n\t\t\tdetails.classList.toggle('open')\n\t\t\tif (details.classList.contains('open')) {\n\t\t\t\tsummary.setAttribute('aria-expanded', 'true')\n\t\t\t} else {\n\t\t\t\tsummary.setAttribute('aria-expanded', 'false')\n\t\t\t}\n\t\t})\n\t\tdetails.addEventListener('click', () => {\n\t\t\tif (details.dataset.beenOpened === 'false') {\n\t\t\t\tconst redLines = new Image()\n\t\t\t\tredLines.src = '/assets/images/red_lines.png'\n\t\t\t\tredLines.onload = () => {\n\t\t\t\t\tdetails.dataset.beenOpened = 'true'\n\t\t\t\t\tlet chartElement = details.querySelector('.chart-wrapper canvas')\n\t\t\t\t\tlet chartData = JSON.parse(chartElement.dataset.chartData)\n\n\t\t\t\t\tconst ctx = chartElement.getContext('2d')\n\t\t\t\t\tconst fillPattern = ctx.createPattern(redLines, 'repeat')\n\n\t\t\t\t\tlet keys = Object.keys(chartData)\n\t\t\t\t\tlet labels = keys.map(key => key.replace('year', ''))\n\t\t\t\t\tlet values = keys.map(\n\t\t\t\t\t\tkey => Math.round(parseFloat(chartData[key]) * 10) / 10\n\t\t\t\t\t)\n\n\t\t\t\t\tlet targetVal =\n\t\t\t\t\t\tMath.round(parseFloat(chartElement.dataset.chartTargetValue) * 10) /\n\t\t\t\t\t\t10\n\t\t\t\t\tlet maxValue = Math.max(...values.filter(value => !isNaN(value)))\n\t\t\t\t\tlet maxY = maxValue > targetVal ? maxValue : targetVal\n\t\t\t\t\tmaxY = maxY * 1.25\n\t\t\t\t\tmaxY = Math.ceil(maxY)\n\n\t\t\t\t\tlet targetVals = []\n\t\t\t\t\tlet maxVals = []\n\t\t\t\t\tfor (let i = 0; i < values.length; i++) {\n\t\t\t\t\t\ttargetVals.push(targetVal)\n\t\t\t\t\t\tmaxVals.push(maxY - targetVal)\n\t\t\t\t\t}\n\t\t\t\t\tlet targetType = chartElement.dataset.chartTargetType\n\n\t\t\t\t\tlet valueType = chartElement.dataset.chartValueType\n\t\t\t\t\tlet populationParameter =\n\t\t\t\t\t\tchartElement.dataset.chartPopulationParameter\n\n\t\t\t\t\t// Build annotations\n\t\t\t\t\tlet targetAnnotation = {\n\t\t\t\t\t\ttype: 'label',\n\t\t\t\t\t\txValue: -0.5,\n\t\t\t\t\t\tyValue: targetVal,\n\t\t\t\t\t\tcontent: function (value) {\n\t\t\t\t\t\t\tlet content = 'Target - ' + targetVal\n\t\t\t\t\t\t\tif (valueType == 'percent') {\n\t\t\t\t\t\t\t\tcontent = content + '%'\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontent = content + ' per ' + populationParameter\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontent = content + ' or ' + targetType\n\t\t\t\t\t\t\tif (targetType == 'lower') {\n\t\t\t\t\t\t\t\tcontent = content + ' \u2193'\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontent = content + ' \u2191'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn content\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcolor: COLORS.white,\n\t\t\t\t\t\tposition: 'start',\n\t\t\t\t\t\tpadding: 10,\n\t\t\t\t\t\tfont: {\n\t\t\t\t\t\t\tfamily: 'Arboria, sans-serif',\n\t\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t\twindow.innerWidth >= 1536\n\t\t\t\t\t\t\t\t\t? 18\n\t\t\t\t\t\t\t\t\t: window.innerWidth >= 1200\n\t\t\t\t\t\t\t\t\t? 14\n\t\t\t\t\t\t\t\t\t: 12,\n\t\t\t\t\t\t\tweight: 500,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t\tlet annotations = window.innerWidth >= 992 ? [targetAnnotation] : []\n\t\t\t\t\tfor (let i = values.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tif (Number.isNaN(values[i])) {\n\t\t\t\t\t\t\tlet annotation = {\n\t\t\t\t\t\t\t\ttype: 'label',\n\t\t\t\t\t\t\t\txValue: i,\n\t\t\t\t\t\t\t\tyValue: 0,\n\t\t\t\t\t\t\t\tcontent: 'N/A',\n\t\t\t\t\t\t\t\tcolor: COLORS.quartz,\n\t\t\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\t\t\tx: 'center',\n\t\t\t\t\t\t\t\t\ty: 'end',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tpadding: 10,\n\t\t\t\t\t\t\t\tfont: {\n\t\t\t\t\t\t\t\t\tfamily: 'Arboria, sans-serif',\n\t\t\t\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t\t\t\twindow.innerWidth >= 1536\n\t\t\t\t\t\t\t\t\t\t\t? 18\n\t\t\t\t\t\t\t\t\t\t\t: window.innerWidth >= 1200\n\t\t\t\t\t\t\t\t\t\t\t? 14\n\t\t\t\t\t\t\t\t\t\t\t: 12,\n\t\t\t\t\t\t\t\t\tweight: 500,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tannotations.push(annotation)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst externalTooltipHandler = context => {\n\t\t\t\t\t\t// Tooltip Element\n\t\t\t\t\t\tconst { chart, tooltip } = context\n\t\t\t\t\t\tconst tooltipEl = getOrCreateTooltip(chart)\n\n\t\t\t\t\t\t// Hide if no tooltip\n\t\t\t\t\t\tif (tooltip.opacity === 0 || tooltip.body.length === 0) {\n\t\t\t\t\t\t\ttooltipEl.style.opacity = 0\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Set Text\n\t\t\t\t\t\tif (tooltip.body) {\n\t\t\t\t\t\t\tconst titleLines = tooltip.title || []\n\t\t\t\t\t\t\tconst bodyLines = tooltip.body.map(b => b.lines)\n\n\t\t\t\t\t\t\tconst tableHead = document.createElement('thead')\n\n\t\t\t\t\t\t\ttitleLines.forEach(title => {\n\t\t\t\t\t\t\t\tconst tr = document.createElement('tr')\n\t\t\t\t\t\t\t\ttr.style.borderWidth = 0\n\n\t\t\t\t\t\t\t\tconst th = document.createElement('th')\n\t\t\t\t\t\t\t\tth.style.borderWidth = 0\n\t\t\t\t\t\t\t\tconst text = document.createTextNode(title)\n\n\t\t\t\t\t\t\t\tth.appendChild(text)\n\t\t\t\t\t\t\t\ttr.appendChild(th)\n\t\t\t\t\t\t\t\ttableHead.appendChild(tr)\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tconst tableBody = document.createElement('tbody')\n\t\t\t\t\t\t\tbodyLines.forEach((body, i) => {\n\t\t\t\t\t\t\t\tconst tr = document.createElement('tr')\n\t\t\t\t\t\t\t\ttr.style.backgroundColor = 'inherit'\n\t\t\t\t\t\t\t\ttr.style.borderWidth = 0\n\n\t\t\t\t\t\t\t\tconst td = document.createElement('td')\n\t\t\t\t\t\t\t\ttd.style.borderWidth = 0\n\n\t\t\t\t\t\t\t\tlet textContent = ''\n\t\t\t\t\t\t\t\tif (targetType === 'lower') {\n\t\t\t\t\t\t\t\t\ttextContent =\n\t\t\t\t\t\t\t\t\t\tparseFloat(body) <= targetVal\n\t\t\t\t\t\t\t\t\t\t\t? 'Meets target'\n\t\t\t\t\t\t\t\t\t\t\t: 'Does not meet target'\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\ttextContent =\n\t\t\t\t\t\t\t\t\t\tparseFloat(body) >= targetVal\n\t\t\t\t\t\t\t\t\t\t\t? 'Meets target'\n\t\t\t\t\t\t\t\t\t\t\t: 'Does not meet target'\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst text = document.createTextNode(textContent)\n\n\t\t\t\t\t\t\t\ttd.appendChild(text)\n\t\t\t\t\t\t\t\ttr.appendChild(td)\n\t\t\t\t\t\t\t\ttableBody.appendChild(tr)\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tconst tableRoot = tooltipEl.querySelector('table')\n\n\t\t\t\t\t\t\t// Remove old children\n\t\t\t\t\t\t\twhile (tableRoot.firstChild) {\n\t\t\t\t\t\t\t\ttableRoot.firstChild.remove()\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Add new children\n\t\t\t\t\t\t\ttableRoot.appendChild(tableHead)\n\t\t\t\t\t\t\ttableRoot.appendChild(tableBody)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { offsetLeft: positionX, offsetTop: positionY } = chart.canvas\n\n\t\t\t\t\t\t// Display, position, and set styles for font\n\t\t\t\t\t\ttooltipEl.style.opacity = 1\n\t\t\t\t\t\ttooltipEl.style.left = positionX + tooltip.caretX + 'px'\n\t\t\t\t\t\ttooltipEl.style.top = positionY + tooltip.caretY + 'px'\n\t\t\t\t\t\ttooltipEl.style.padding =\n\t\t\t\t\t\t\ttooltip.options.padding + 'px ' + tooltip.options.padding + 'px'\n\t\t\t\t\t}\n\n\t\t\t\t\tnew Chart(chartElement, {\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tlabels: labels,\n\t\t\t\t\t\t\tdatasets: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'line',\n\t\t\t\t\t\t\t\t\tdata: values,\n\t\t\t\t\t\t\t\t\tpointStyle: 'circle',\n\t\t\t\t\t\t\t\t\tborderCapStyle: 'round',\n\t\t\t\t\t\t\t\t\tborderColor: COLORS.quartz,\n\t\t\t\t\t\t\t\t\tbackgroundColor: COLORS.quartz,\n\t\t\t\t\t\t\t\t\tpointRadius: window.innerWidth >= 1200 ? 20 : 14,\n\t\t\t\t\t\t\t\t\tpointHoverBorderColor: COLORS.quartz,\n\t\t\t\t\t\t\t\t\tpointHoverBackgroundColor: COLORS.quartz,\n\t\t\t\t\t\t\t\t\tpointHoverRadius: window.innerWidth >= 1200 ? 20 : 14,\n\t\t\t\t\t\t\t\t\tsegment: {\n\t\t\t\t\t\t\t\t\t\tborderDash: ctx => skipped(ctx, [10, 10]),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tspanGaps: true,\n\t\t\t\t\t\t\t\t\tdatalabels: {\n\t\t\t\t\t\t\t\t\t\tcolor: COLORS.ponderosa,\n\t\t\t\t\t\t\t\t\t\tformatter: function (value, context) {\n\t\t\t\t\t\t\t\t\t\t\tif (valueType == 'percent') {\n\t\t\t\t\t\t\t\t\t\t\t\treturn value + '%'\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tfont: {\n\t\t\t\t\t\t\t\t\t\t\tfamily: 'Arboria, sans-serif',\n\t\t\t\t\t\t\t\t\t\t\tsize: window.innerWidth >= 1200 ? '12px' : '10px',\n\t\t\t\t\t\t\t\t\t\t\tweight: '700',\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'bar',\n\t\t\t\t\t\t\t\t\tdata: targetVals,\n\t\t\t\t\t\t\t\t\tbarPercentage: 1,\n\t\t\t\t\t\t\t\t\tcategoryPercentage: 1,\n\t\t\t\t\t\t\t\t\tpointHitRadius: 0,\n\t\t\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\t\ttargetType == 'lower' ? COLORS.green90 : fillPattern,\n\t\t\t\t\t\t\t\t\thoverBackgroundColor:\n\t\t\t\t\t\t\t\t\t\ttargetType == 'lower' ? COLORS.green90 : fillPattern,\n\t\t\t\t\t\t\t\t\tdatalabels: {\n\t\t\t\t\t\t\t\t\t\tdisplay: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: 'bar',\n\t\t\t\t\t\t\t\t\tdata: maxVals,\n\t\t\t\t\t\t\t\t\tbarPercentage: 1,\n\t\t\t\t\t\t\t\t\tcategoryPercentage: 1,\n\t\t\t\t\t\t\t\t\tpointHitRadius: 0,\n\t\t\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\t\ttargetType == 'lower' ? fillPattern : COLORS.green90,\n\t\t\t\t\t\t\t\t\thoverBackgroundColor:\n\t\t\t\t\t\t\t\t\t\ttargetType == 'lower' ? fillPattern : COLORS.green90,\n\t\t\t\t\t\t\t\t\tdatalabels: {\n\t\t\t\t\t\t\t\t\t\tdisplay: false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tanimation: {\n\t\t\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tresponsive: true,\n\t\t\t\t\t\t\tmaintainAspectRatio: false,\n\t\t\t\t\t\t\tscales: {\n\t\t\t\t\t\t\t\tx: {\n\t\t\t\t\t\t\t\t\tstacked: true,\n\t\t\t\t\t\t\t\t\tbackgroundColor: COLORS.ponderosa,\n\t\t\t\t\t\t\t\t\tgrid: {\n\t\t\t\t\t\t\t\t\t\tlineWidth: 0,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tticks: {\n\t\t\t\t\t\t\t\t\t\tcolor: COLORS.quartz,\n\t\t\t\t\t\t\t\t\t\tfont: {\n\t\t\t\t\t\t\t\t\t\t\tfamily: 'Arboria, sans-serif',\n\t\t\t\t\t\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t\t\t\t\t\twindow.innerWidth >= 1536\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 16\n\t\t\t\t\t\t\t\t\t\t\t\t\t: window.innerWidth >= 1200\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 14\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 12,\n\t\t\t\t\t\t\t\t\t\t\tweight: 700,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tpadding: 15,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ty: {\n\t\t\t\t\t\t\t\t\tstacked: true,\n\t\t\t\t\t\t\t\t\tmax: maxY,\n\t\t\t\t\t\t\t\t\tgrid: {\n\t\t\t\t\t\t\t\t\t\tcolor: COLORS.black,\n\t\t\t\t\t\t\t\t\t\ttickLength: 0,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tticks: {\n\t\t\t\t\t\t\t\t\t\tdisplay: false,\n\t\t\t\t\t\t\t\t\t\tmaxTicksLimit: 6,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\t\tautoPadding: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinteraction: {\n\t\t\t\t\t\t\t\tintersect: false,\n\t\t\t\t\t\t\t\tmode: 'index',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t\tlegend: {\n\t\t\t\t\t\t\t\t\tdisplay: false,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\t\t\t\tfilter: function (tooltipItem) {\n\t\t\t\t\t\t\t\t\t\treturn tooltipItem.datasetIndex === 0\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\texternal: externalTooltipHandler,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tannotation: {\n\t\t\t\t\t\t\t\t\tannotations: annotations,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonResize: function (chart, size) {\n\t\t\t\t\t\t\t\t// Update annotations\n\t\t\t\t\t\t\t\tif (window.innerWidth >= 992) {\n\t\t\t\t\t\t\t\t\t// Check if our \"target\" annotation does not exist (it will always be the first, and is the only one with this xValue)\n\t\t\t\t\t\t\t\t\tif (annotations[0]) {\n\t\t\t\t\t\t\t\t\t\tif (annotations[0].xValue != -0.5) {\n\t\t\t\t\t\t\t\t\t\t\tannotations.unshift(targetAnnotation)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tannotations.unshift(targetAnnotation)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (annotations[0]) {\n\t\t\t\t\t\t\t\t\t\tif (annotations[0].xValue == -0.5) {\n\t\t\t\t\t\t\t\t\t\t\tannotations.shift()\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Update annotation font sizes based on chart size\n\t\t\t\t\t\t\t\tif (size.width >= 800) {\n\t\t\t\t\t\t\t\t\tannotations.forEach(annotation => {\n\t\t\t\t\t\t\t\t\t\tannotation.font.size = 18\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t} else if (size.width >= 700) {\n\t\t\t\t\t\t\t\t\tannotations.forEach(annotation => {\n\t\t\t\t\t\t\t\t\t\tannotation.font.size = 16\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t} else if (size.width >= 600) {\n\t\t\t\t\t\t\t\t\tannotations.forEach(annotation => {\n\t\t\t\t\t\t\t\t\t\tannotation.font.size = 14\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tannotations.forEach(annotation => {\n\t\t\t\t\t\t\t\t\t\tannotation.font.size = 12\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Update tick font sizes based on window size\n\t\t\t\t\t\t\t\tif (window.innerWidth >= 1536) {\n\t\t\t\t\t\t\t\t\tchart.options.scales.x.ticks.font.size = 16\n\t\t\t\t\t\t\t\t} else if (window.innerWidth >= 1200) {\n\t\t\t\t\t\t\t\t\tchart.options.scales.x.ticks.font.size = 14\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tchart.options.scales.x.ticks.font.size = 12\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Dataset point and border sizes\n\t\t\t\t\t\t\t\tif (window.innerWidth >= 1200) {\n\t\t\t\t\t\t\t\t\tchart.data.datasets[0].pointRadius = 20\n\t\t\t\t\t\t\t\t\tchart.data.datasets[0].pointHoverRadius = 20\n\t\t\t\t\t\t\t\t\tchart.data.datasets[0].datalabels.font.size = '12px'\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tchart.data.datasets[0].pointRadius = 14\n\t\t\t\t\t\t\t\t\tchart.data.datasets[0].pointHoverRadius = 14\n\t\t\t\t\t\t\t\t\tchart.data.datasets[0].datalabels.font.size = '10px'\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: [ChartDataLabels],\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t})\n\n\thealthPriorityDatas.forEach(details => {\n\t\tvar summary = details.querySelector('.summary')\n\t\tsummary.addEventListener('click', () => {\n\t\t\tdetails.classList.toggle('open')\n\t\t\tif (details.classList.contains('open')) {\n\t\t\t\tsummary.setAttribute('aria-expanded', 'true')\n\t\t\t} else {\n\t\t\t\tsummary.setAttribute('aria-expanded', 'false')\n\t\t\t}\n\t\t})\n\t\tdetails.addEventListener('click', () => {\n\t\t\tif (details.dataset.beenOpened === 'false') {\n\t\t\t\tdetails.dataset.beenOpened = 'true'\n\t\t\t\tlet chartElement = details.querySelector('.chart-wrapper canvas')\n\t\t\t\tlet whitmanData = JSON.parse(chartElement.dataset.whitmanData)\n\t\t\t\tlet washingtonData = JSON.parse(chartElement.dataset.washingtonData)\n\n\t\t\t\tlet keys = Object.keys(whitmanData)\n\t\t\t\tlet labels = keys.map(key => key.replace('year', ''))\n\t\t\t\tlet whitmanValues = keys.map(\n\t\t\t\t\tkey => Math.round(parseFloat(whitmanData[key]) * 10) / 10\n\t\t\t\t)\n\t\t\t\tlet washingtonValues = keys.map(\n\t\t\t\t\tkey => Math.round(parseFloat(washingtonData[key]) * 10) / 10\n\t\t\t\t)\n\n\t\t\t\tlet valueType = chartElement.dataset.chartValueType\n\n\t\t\t\tlet datasetColors = [COLORS.green, COLORS.gold]\n\n\t\t\t\tconst externalTooltipHandler = context => {\n\t\t\t\t\t// Tooltip Element\n\t\t\t\t\tconst { chart, tooltip } = context\n\t\t\t\t\tconst tooltipEl = getOrCreateTooltip(chart)\n\n\t\t\t\t\t// Hide if no tooltip\n\t\t\t\t\tif (tooltip.opacity === 0 || tooltip.body.length === 0) {\n\t\t\t\t\t\ttooltipEl.style.opacity = 0\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set Text\n\t\t\t\t\tif (tooltip.body) {\n\t\t\t\t\t\tconst titleLines = tooltip.title || []\n\t\t\t\t\t\tconst bodyLines = tooltip.body.map(b => b.lines)\n\n\t\t\t\t\t\tconst tableHead = document.createElement('thead')\n\n\t\t\t\t\t\ttitleLines.forEach(title => {\n\t\t\t\t\t\t\tconst tr = document.createElement('tr')\n\t\t\t\t\t\t\ttr.style.borderWidth = 0\n\n\t\t\t\t\t\t\tconst th = document.createElement('th')\n\t\t\t\t\t\t\tth.style.borderWidth = 0\n\t\t\t\t\t\t\tconst text = document.createTextNode(title)\n\n\t\t\t\t\t\t\tth.appendChild(text)\n\t\t\t\t\t\t\ttr.appendChild(th)\n\t\t\t\t\t\t\ttableHead.appendChild(tr)\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tconst tableBody = document.createElement('tbody')\n\t\t\t\t\t\t// Determine if data is missing for one set, and slot it in where applicable\n\t\t\t\t\t\tif (bodyLines.length < 2) {\n\t\t\t\t\t\t\tif (bodyLines[0][0].includes('Washington State')) {\n\t\t\t\t\t\t\t\tbodyLines.unshift(['Whitman County: N/A'])\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbodyLines.push(['Washington State: N/A'])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbodyLines.forEach((body, i) => {\n\t\t\t\t\t\t\tconst span = document.createElement('span')\n\t\t\t\t\t\t\tspan.style.background = datasetColors[i]\n\t\t\t\t\t\t\tspan.style.borderColor = datasetColors[i]\n\t\t\t\t\t\t\tspan.style.borderWidth = '2px'\n\t\t\t\t\t\t\tspan.style.marginRight = '10px'\n\t\t\t\t\t\t\tspan.style.height = '10px'\n\t\t\t\t\t\t\tspan.style.width = '10px'\n\t\t\t\t\t\t\tspan.style.display = 'inline-block'\n\n\t\t\t\t\t\t\tconst tr = document.createElement('tr')\n\t\t\t\t\t\t\ttr.style.backgroundColor = 'inherit'\n\t\t\t\t\t\t\ttr.style.borderWidth = 0\n\n\t\t\t\t\t\t\tconst td = document.createElement('td')\n\t\t\t\t\t\t\ttd.style.borderWidth = 0\n\n\t\t\t\t\t\t\tif (!body[0].includes('N/A') && valueType == 'percent') {\n\t\t\t\t\t\t\t\tbody = body + '%'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst text = document.createTextNode(body)\n\n\t\t\t\t\t\t\ttd.appendChild(span)\n\t\t\t\t\t\t\ttd.appendChild(text)\n\t\t\t\t\t\t\ttr.appendChild(td)\n\t\t\t\t\t\t\ttableBody.appendChild(tr)\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tconst tableRoot = tooltipEl.querySelector('table')\n\n\t\t\t\t\t\t// Remove old children\n\t\t\t\t\t\twhile (tableRoot.firstChild) {\n\t\t\t\t\t\t\ttableRoot.firstChild.remove()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Add new children\n\t\t\t\t\t\ttableRoot.appendChild(tableHead)\n\t\t\t\t\t\ttableRoot.appendChild(tableBody)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { offsetLeft: positionX, offsetTop: positionY } = chart.canvas\n\n\t\t\t\t\t// Display, position, and set styles for font\n\t\t\t\t\ttooltipEl.style.opacity = 1\n\t\t\t\t\ttooltipEl.style.left = positionX + tooltip.caretX + 'px'\n\t\t\t\t\ttooltipEl.style.top = positionY + tooltip.caretY + 'px'\n\t\t\t\t\ttooltipEl.style.padding =\n\t\t\t\t\t\ttooltip.options.padding + 'px ' + tooltip.options.padding + 'px'\n\t\t\t\t}\n\n\t\t\t\tnew Chart(chartElement, {\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tlabels: labels,\n\t\t\t\t\t\tdatasets: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'line',\n\t\t\t\t\t\t\t\tlabel: 'Whitman County',\n\t\t\t\t\t\t\t\tdata: whitmanValues,\n\t\t\t\t\t\t\t\tpointStyle: 'circle',\n\t\t\t\t\t\t\t\tborderCapStyle: 'round',\n\t\t\t\t\t\t\t\tborderWidth: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tborderColor: datasetColors[0],\n\t\t\t\t\t\t\t\tbackgroundColor: datasetColors[0],\n\t\t\t\t\t\t\t\tpointRadius: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tpointHoverBorderColor: datasetColors[0],\n\t\t\t\t\t\t\t\tpointHoverBackgroundColor: datasetColors[0],\n\t\t\t\t\t\t\t\tpointHoverRadius: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tpointHoverBorderWidth: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tsegment: {\n\t\t\t\t\t\t\t\t\tborderDash: ctx => skipped(ctx, [16, 16]),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tspanGaps: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'line',\n\t\t\t\t\t\t\t\tlabel: 'Washington State',\n\t\t\t\t\t\t\t\tdata: washingtonValues,\n\t\t\t\t\t\t\t\tpointStyle: 'circle',\n\t\t\t\t\t\t\t\tborderCapStyle: 'round',\n\t\t\t\t\t\t\t\tborderWidth: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tborderColor: datasetColors[1],\n\t\t\t\t\t\t\t\tbackgroundColor: datasetColors[1],\n\t\t\t\t\t\t\t\tpointRadius: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tpointHoverBorderColor: datasetColors[1],\n\t\t\t\t\t\t\t\tpointHoverBackgroundColor: datasetColors[1],\n\t\t\t\t\t\t\t\tpointHoverRadius: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tpointHoverBorderWidth: window.innerWidth >= 1200 ? 8 : 4,\n\t\t\t\t\t\t\t\tsegment: {\n\t\t\t\t\t\t\t\t\tborderDash: ctx => skipped(ctx, [16, 16]),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tspanGaps: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tanimation: {\n\t\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tresponsive: true,\n\t\t\t\t\t\tmaintainAspectRatio: false,\n\t\t\t\t\t\tscales: {\n\t\t\t\t\t\t\tx: {\n\t\t\t\t\t\t\t\tgrid: {\n\t\t\t\t\t\t\t\t\tlineWidth: 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tticks: {\n\t\t\t\t\t\t\t\t\tcolor: COLORS.ponderosa,\n\t\t\t\t\t\t\t\t\tfont: {\n\t\t\t\t\t\t\t\t\t\tfamily: 'Arboria, sans-serif',\n\t\t\t\t\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t\t\t\t\twindow.innerWidth >= 1536\n\t\t\t\t\t\t\t\t\t\t\t\t? 16\n\t\t\t\t\t\t\t\t\t\t\t\t: window.innerWidth >= 1200\n\t\t\t\t\t\t\t\t\t\t\t\t? 14\n\t\t\t\t\t\t\t\t\t\t\t\t: 12,\n\t\t\t\t\t\t\t\t\t\tweight: 700,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tpadding: 15,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ty: {\n\t\t\t\t\t\t\t\tgrid: {\n\t\t\t\t\t\t\t\t\tcolor: COLORS.ponderosa40,\n\t\t\t\t\t\t\t\t\ttickLength: 0,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tticks: {\n\t\t\t\t\t\t\t\t\tcolor: COLORS.ponderosa,\n\t\t\t\t\t\t\t\t\tfont: {\n\t\t\t\t\t\t\t\t\t\tfamily: 'Arboria, sans-serif',\n\t\t\t\t\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t\t\t\t\twindow.innerWidth >= 1536\n\t\t\t\t\t\t\t\t\t\t\t\t? 16\n\t\t\t\t\t\t\t\t\t\t\t\t: window.innerWidth >= 1200\n\t\t\t\t\t\t\t\t\t\t\t\t? 14\n\t\t\t\t\t\t\t\t\t\t\t\t: 12,\n\t\t\t\t\t\t\t\t\t\tweight: 700,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tpadding: 15,\n\t\t\t\t\t\t\t\t\tmaxTicksLimit: 6,\n\t\t\t\t\t\t\t\t\t// Include a % if valueType is percent\n\t\t\t\t\t\t\t\t\tcallback: function (value, index, ticks) {\n\t\t\t\t\t\t\t\t\t\tif (valueType == 'percent') {\n\t\t\t\t\t\t\t\t\t\t\treturn value + '%'\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinteraction: {\n\t\t\t\t\t\t\tintersect: false,\n\t\t\t\t\t\t\tmode: 'index',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\tlegend: {\n\t\t\t\t\t\t\t\tdisplay: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttooltip: {\n\t\t\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\t\t\texternal: externalTooltipHandler,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonResize: function (chart, size) {\n\t\t\t\t\t\t\t// Update tick font sizes based on window size\n\t\t\t\t\t\t\tif (window.innerWidth >= 1536) {\n\t\t\t\t\t\t\t\tchart.options.scales.x.ticks.font.size = 16\n\t\t\t\t\t\t\t\tchart.options.scales.y.ticks.font.size = 16\n\t\t\t\t\t\t\t} else if (window.innerWidth >= 1200) {\n\t\t\t\t\t\t\t\tchart.options.scales.x.ticks.font.size = 14\n\t\t\t\t\t\t\t\tchart.options.scales.y.ticks.font.size = 14\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchart.options.scales.x.ticks.font.size = 12\n\t\t\t\t\t\t\t\tchart.options.scales.y.ticks.font.size = 12\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Dataset point and border sizes\n\t\t\t\t\t\t\tif (window.innerWidth >= 1200) {\n\t\t\t\t\t\t\t\tchart.data.datasets[0].borderWidth = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[0].pointRadius = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[0].pointHoverRadius = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[0].pointHoverBorderWidth = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[1].borderWidth = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[1].pointRadius = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[1].pointHoverRadius = 8\n\t\t\t\t\t\t\t\tchart.data.datasets[1].pointHoverBorderWidth = 8\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchart.data.datasets[0].borderWidth = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[0].pointRadius = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[0].pointHoverRadius = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[0].pointHoverBorderWidth = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[1].borderWidth = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[1].pointRadius = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[1].pointHoverRadius = 4\n\t\t\t\t\t\t\t\tchart.data.datasets[1].pointHoverBorderWidth = 4\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n\n\t// Filter buttons\n\tvar dataGroups = document.querySelectorAll('.data')\n\tdataGroups.forEach(dataGroup => {\n\t\tvar filterButtons = dataGroup.querySelectorAll('button')\n\t\tvar groups = dataGroup.querySelectorAll('.group')\n\n\t\tfilterButtons.forEach(filterButton => {\n\t\t\tfilterButton.addEventListener('click', () => {\n\t\t\t\tfilterButtons.forEach(filterButton => {\n\t\t\t\t\tfilterButton.classList.remove('selected')\n\t\t\t\t})\n\t\t\t\tfilterButton.classList.add('selected')\n\n\t\t\t\tgroups.forEach(group => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tgroup.dataset.group == filterButton.dataset.group ||\n\t\t\t\t\t\tfilterButton.dataset.group == 'all'\n\t\t\t\t\t) {\n\t\t\t\t\t\tgroup.classList.remove('hidden')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgroup.classList.add('hidden')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n})\n", "import './navigation'\nimport './banner'\nimport './form-thank-you'\n// import './scroll-expand';\nimport './calendar-tab'\nimport './accordion'\nimport './calendar-messaging'\nimport './slider'\nimport './video'\nimport './video-w-chapters'\nimport './inspections'\nimport './comm-data-reports-archive'\nimport './latest-news-slider'\nimport './one-whitman-slider'\nimport './card-game-popup'\nimport './conversation-starters'\nimport './tooltip'\nimport './public-archive'\nimport './thrive-locally'\nimport './thrive-locally-lotties'\nimport './data-dashboard'\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\t// AOS\n\tAOS.init({\n\t\tduration: 600,\n\t\tdelay: 100,\n\t\tonce: true,\n\t})\n})\n"], "mappings": "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", "names": ["e", "toggleMenu", "el", "link", "isExpanded", "li", "gtWidgetSelect", "getGtWidgetSelect", "hamburger", "startY", "group", "e", "banner", "checkSeenContent", "seenContent", "contentArr", "contentHash", "hashCode", "closeBtn", "str", "hash", "i", "len", "chr", "e", "forms", "form", "status", "handleSubmit", "event", "statusHead", "statusBody", "button", "data", "response", "error", "e", "calendarTab", "calendarTabMenu", "createItemToggleHandler", "item", "copy", "noop", "cl", "accordion", "item", "createItemToggleHandler", "accordion", "item", "heading", "copy", "cl", "updateURLFragment", "activateAccordionsByHash", "itemHash", "hashValue", "activateFirstAccordion", "fragmentAccordion", "getAccordionItemById", "deactivateAllNavItems", "navItem", "activeNav", "id", "accordion", "setupFaqsItem", "item", "createItemToggleHandler", "item", "createItemToggleHandler", "iframe", "channel", "e", "n", "i", "e", "r", "t", "a", "o", "u", "s", "c", "d", "l", "f", "p", "v", "h", "m", "g", "b", "x", "k", "y", "w", "M", "T", "C", "_", "E", "z", "D", "I", "S", "A", "O", "L", "H", "navigation", "slider", "wrapper", "dots", "arrowLeft", "arrowRight", "markup", "remove", "wrapperMarkup", "dotMarkup", "arrowMarkup", "removeElement", "element", "createDiv", "className", "div", "classNames", "name", "parent", "_e", "idx", "dot", "updateClasses", "slide", "y", "video", "plyBtn", "vidWrapper", "videoPausePlayHandler", "e", "videoSection", "vidWrapper", "plyBtn", "chapters", "video", "videoPausePlayHandler", "e", "chapter", "time", "mins", "secs", "chaptersWrapper", "chaptersSlider", "slider", "y", "prevBtn", "nextBtn", "est", "currActive", "establishments", "e", "sortby", "form", "yearFilter", "typeFilter", "years", "reports", "year", "report", "navWrapper", "dots", "prevArrow", "nextArrow", "slider", "y", "updateClasses", "slide", "dot", "idx", "navWrapper", "prevArrow", "nextArrow", "slider", "y", "updateClasses", "slide", "shipButtons", "shipPopup", "shipClose", "btn", "decks", "nextCard", "deck", "e", "index", "previousCard", "info", "btn", "tooltip", "e", "folderFilters", "filesList", "files", "filter", "e", "file", "folderIds", "sortYearButton", "sortNameButton", "sortSelect", "sortedYearDesc", "sortedYearAsc", "sortedNameDesc", "a", "b", "sortedNameAsc", "details", "childPagesText", "childPageText", "sliderWrapper", "dots", "prevArrow", "nextArrow", "sliderEl", "numSlides", "slider", "y", "updateClasses", "slide", "dot", "idx", "canvas", "dotLottieHero", "round", "v", "lim", "l", "h", "p2b", "n2b", "v", "lim", "round", "b2n", "n2p", "map$1", "hex", "h1", "b", "h2", "eq", "isShort", "hexParse", "str", "len", "ret", "alpha", "a", "f", "hexString", "HUE_RE", "hsl2rgbn", "h", "s", "l", "n", "k", "hsv2rgbn", "hwb2rgbn", "w", "rgb", "i", "hueValue", "r", "g", "d", "max", "rgb2hsl", "min", "calln", "c", "hsl2rgb", "hwb2rgb", "hsv2rgb", "hue", "hueParse", "m", "p2b", "p1", "p2", "rotate", "deg", "hslString", "map", "names$1", "unpack", "unpacked", "keys", "tkeys", "j", "ok", "nk", "names", "nameParse", "RGB_RE", "rgbParse", "rgbString", "to", "from", "interpolate", "rgb1", "rgb2", "t", "modHSL", "ratio", "tmp", "clone", "proto", "fromObject", "input", "functionParse", "Color", "_Color", "type", "obj", "color", "weight", "c1", "c2", "w2", "p", "w1", "val", "noop", "uid", "id", "isNullOrUndef", "value", "isArray", "Array", "type", "Object", "prototype", "toString", "call", "slice", "isObject", "isNumberFinite", "Number", "isFinite", "finiteOrDefault", "defaultValue", "valueOrDefault", "toPercentage", "dimension", "endsWith", "parseFloat", "toDimension", "callback", "fn", "args", "thisArg", "apply", "each", "loopable", "reverse", "i", "len", "keys", "length", "_elementsEqual", "a0", "a1", "ilen", "v0", "v1", "datasetIndex", "index", "clone", "source", "map", "target", "create", "klen", "k", "isValidKey", "key", "indexOf", "_merger", "options", "tval", "sval", "merge", "sources", "merger", "current", "mergeIf", "_mergerIf", "hasOwnProperty", "keyResolvers", "v", "x", "o", "y", "_splitKey", "key", "parts", "split", "keys", "tmp", "part", "endsWith", "slice", "push", "_getKeyResolver", "obj", "k", "resolveObjectKey", "_capitalize", "str", "charAt", "toUpperCase", "defined", "value", "isFunction", "setsEqual", "a", "b", "size", "item", "has", "_isClickEvent", "e", "type", "PI", "Math", "TAU", "PITAU", "INFINITY", "Number", "POSITIVE_INFINITY", "RAD_PER_DEG", "HALF_PI", "QUARTER_PI", "TWO_THIRDS_PI", "log10", "sign", "almostEquals", "epsilon", "abs", "niceNum", "range", "roundedRange", "round", "niceRange", "pow", "floor", "fraction", "_factorize", "result", "sqrt", "i", "sort", "pop", "isNumber", "n", "isNaN", "parseFloat", "isFinite", "almostWhole", "rounded", "_setMinAndMaxByKey", "array", "target", "property", "ilen", "length", "min", "max", "toRadians", "degrees", "toDegrees", "radians", "_decimalPlaces", "isFiniteNumber", "p", "getAngleFromPoint", "centrePoint", "anglePoint", "distanceFromXCenter", "distanceFromYCenter", "radialDistanceFromCenter", "angle", "atan2", "distance", "distanceBetweenPoints", "pt1", "pt2", "_angleDiff", "_normalizeAngle", "_angleBetween", "start", "end", "sameAngleIsFullCircle", "s", "angleToStart", "angleToEnd", "startToAngle", "endToAngle", "_limitValue", "_int16Range", "_isBetween", "_lookup", "table", "cmp", "index", "hi", "lo", "mid", "_lookupByKey", "last", "ti", "_rlookupByKey", "_filterBetween", "values", "arrayEvents", "listenArrayEvents", "listener", "_chartjs", "listeners", "Object", "defineProperty", "configurable", "enumerable", "forEach", "method", "base", "args", "res", "apply", "object", "unlistenArrayEvents", "stub", "indexOf", "splice", "_arrayUnique", "items", "set", "Set", "Array", "from", "requestAnimFrame", "window", "callback", "requestAnimationFrame", "throttled", "fn", "thisArg", "argsToUse", "ticking", "args", "call", "apply", "debounce", "delay", "timeout", "clearTimeout", "setTimeout", "_toLeftRightCenter", "align", "_alignStartEnd", "start", "end", "_textX", "left", "right", "rtl", "_getStartAndCountOfVisiblePoints", "meta", "points", "animationsDisabled", "pointCount", "length", "count", "_sorted", "iScale", "_parsed", "axis", "min", "max", "minDefined", "maxDefined", "getUserBounds", "_limitValue", "Math", "_lookupByKey", "lo", "getPixelForValue", "hi", "_scaleRangesChanged", "xScale", "yScale", "_scaleRanges", "newRanges", "xmin", "xmax", "ymin", "ymax", "changed", "Object", "assign", "atEdge", "t", "elasticIn", "s", "p", "pow", "sin", "TAU", "elasticOut", "effects", "linear", "easeInQuad", "easeOutQuad", "easeInOutQuad", "easeInCubic", "easeOutCubic", "easeInOutCubic", "easeInQuart", "easeOutQuart", "easeInOutQuart", "easeInQuint", "easeOutQuint", "easeInOutQuint", "easeInSine", "cos", "HALF_PI", "easeOutSine", "easeInOutSine", "PI", "easeInExpo", "easeOutExpo", "easeInOutExpo", "easeInCirc", "sqrt", "easeOutCirc", "easeInOutCirc", "easeInElastic", "easeOutElastic", "easeInOutElastic", "easeInBack", "easeOutBack", "easeInOutBack", "easeInBounce", "easeOutBounce", "d", "m", "easeInOutBounce", "isPatternOrGradient", "value", "type", "toString", "color", "Color", "getHoverColor", "saturate", "darken", "hexString", "numbers", "colors", "applyAnimationsDefaults", "defaults", "set", "undefined", "duration", "easing", "from", "loop", "to", "describe", "_fallback", "_indexable", "_scriptable", "name", "properties", "active", "animation", "resize", "show", "animations", "visible", "hide", "v", "applyLayoutsDefaults", "autoPadding", "padding", "top", "bottom", "intlCache", "Map", "getNumberFormat", "locale", "options", "cacheKey", "JSON", "stringify", "formatter", "get", "Intl", "NumberFormat", "formatNumber", "num", "format", "formatters", "values", "isArray", "numeric", "tickValue", "index", "ticks", "chart", "notation", "delta", "maxTick", "abs", "calculateDelta", "logDelta", "log10", "numDecimal", "isNaN", "floor", "minimumFractionDigits", "maximumFractionDigits", "logarithmic", "remain", "significand", "includes", "Ticks", "applyScaleDefaults", "display", "offset", "reverse", "beginAtZero", "bounds", "clip", "grace", "grid", "lineWidth", "drawOnChartArea", "drawTicks", "tickLength", "tickWidth", "_ctx", "tickColor", "border", "dash", "dashOffset", "width", "title", "text", "minRotation", "maxRotation", "mirror", "textStrokeWidth", "textStrokeColor", "autoSkip", "autoSkipPadding", "labelOffset", "minor", "major", "crossAlign", "showLabelBackdrop", "backdropColor", "backdropPadding", "route", "startsWith", "overrides", "create", "descriptors", "getScope", "node", "key", "keys", "split", "i", "n", "k", "root", "scope", "merge", "Defaults", "constructor", "_descriptors", "_appliers", "backgroundColor", "borderColor", "datasets", "devicePixelRatio", "context", "platform", "getDevicePixelRatio", "elements", "events", "font", "family", "size", "style", "lineHeight", "weight", "hover", "hoverBackgroundColor", "ctx", "hoverBorderColor", "hoverColor", "indexAxis", "interaction", "mode", "intersect", "includeInvisible", "maintainAspectRatio", "onHover", "onClick", "parsing", "plugins", "responsive", "scale", "scales", "showLine", "drawActiveElementsOnTop", "override", "targetScope", "targetName", "scopeObject", "targetScopeObject", "privateName", "defineProperties", "writable", "enumerable", "local", "target", "isObject", "valueOrDefault", "appliers", "forEach", "toFontString", "isNullOrUndef", "_measureText", "data", "gc", "longest", "string", "textWidth", "measureText", "push", "_longestText", "arrayOfThings", "cache", "garbageCollect", "save", "ilen", "j", "jlen", "thing", "nestedThing", "restore", "gcLen", "splice", "_alignPixel", "pixel", "currentDevicePixelRatio", "halfWidth", "round", "clearCanvas", "canvas", "getContext", "resetTransform", "clearRect", "height", "drawPoint", "x", "y", "drawPointLegend", "w", "xOffset", "yOffset", "cornerRadius", "xOffsetW", "yOffsetW", "pointStyle", "rotation", "radius", "rad", "RAD_PER_DEG", "translate", "rotate", "drawImage", "beginPath", "ellipse", "arc", "closePath", "moveTo", "TWO_THIRDS_PI", "lineTo", "QUARTER_PI", "SQRT1_2", "rect", "fill", "borderWidth", "stroke", "_isPointInArea", "point", "area", "margin", "clipArea", "unclipArea", "_steppedLineTo", "previous", "flip", "midpoint", "_bezierCurveTo", "bezierCurveTo", "cp1x", "cp2x", "cp1y", "cp2y", "setRenderOpts", "opts", "translation", "fillStyle", "textAlign", "textBaseline", "decorateText", "line", "strikethrough", "underline", "metrics", "actualBoundingBoxLeft", "actualBoundingBoxRight", "actualBoundingBoxAscent", "actualBoundingBoxDescent", "yDecoration", "strokeStyle", "decorationWidth", "drawBackdrop", "oldColor", "fillRect", "renderText", "lines", "strokeWidth", "strokeColor", "backdrop", "strokeText", "maxWidth", "fillText", "Number", "addRoundedRectPath", "h", "topLeft", "bottomLeft", "bottomRight", "topRight", "LINE_HEIGHT", "FONT_STYLE", "toLineHeight", "matches", "match", "numberOrZero", "_readValueToProps", "props", "ret", "objProps", "read", "prop", "toTRBL", "toTRBLCorners", "toPadding", "obj", "toFont", "fallback", "parseInt", "console", "warn", "resolve", "inputs", "info", "cacheable", "_addGrace", "minmax", "change", "toDimension", "keepZero", "add", "createContext", "parentContext", "_createResolver", "scopes", "prefixes", "rootScopes", "getTarget", "finalRootScopes", "_resolve", "Symbol", "toStringTag", "_cacheable", "_scopes", "_rootScopes", "_getTarget", "Proxy", "deleteProperty", "_keys", "_cached", "_resolveWithPrefixes", "getOwnPropertyDescriptor", "Reflect", "getPrototypeOf", "has", "getKeysFromAllScopes", "ownKeys", "storage", "_storage", "_attachContext", "proxy", "subProxy", "descriptorDefaults", "_proxy", "_context", "_subProxy", "_stack", "Set", "setContext", "receiver", "_resolveWithContext", "allKeys", "configurable", "scriptable", "indexable", "_allKeys", "isScriptable", "isFunction", "isIndexable", "readKey", "prefix", "_capitalize", "needsSubResolver", "prototype", "hasOwnProperty", "_resolveScriptable", "_resolveArray", "getValue", "Error", "Array", "join", "delete", "createSubResolver", "arr", "filter", "item", "resolver", "resolveFallback", "parent", "resolveObjectKey", "addScopes", "parentScopes", "parentFallback", "allScopes", "addScopesFromKey", "subGetTarget", "resolveKeysFromAllScopes", "_parseObjectDataRadialScale", "_parsing", "parsed", "r", "parse", "EPSILON", "getPoint", "skip", "getValueAxis", "splineCurve", "firstPoint", "middlePoint", "afterPoint", "current", "next", "d01", "distanceBetweenPoints", "d12", "s01", "s12", "fa", "fb", "monotoneAdjust", "deltaK", "mK", "pointsLen", "alphaK", "betaK", "tauK", "squaredMagnitude", "pointCurrent", "pointAfter", "almostEquals", "monotoneCompute", "valueAxis", "pointBefore", "iPixel", "vPixel", "splineCurveMonotone", "slopeDelta", "sign", "capControlPoint", "pt", "capBezierPoints", "inArea", "inAreaPrev", "inAreaNext", "_updateBezierControlPoints", "controlPoints", "spanGaps", "cubicInterpolationMode", "prev", "tension", "_isDomSupported", "document", "_getParentNode", "domNode", "parentNode", "host", "parseMaxStyle", "styleValue", "parentProperty", "valueInPixels", "indexOf", "getComputedStyle", "element", "ownerDocument", "defaultView", "getStyle", "el", "property", "getPropertyValue", "positions", "getPositionedStyle", "styles", "suffix", "result", "pos", "parseFloat", "useOffsetPos", "shadowRoot", "getCanvasPosition", "e", "touches", "source", "offsetX", "offsetY", "box", "getBoundingClientRect", "clientX", "clientY", "getRelativePosition", "event", "borderBox", "boxSizing", "paddings", "borders", "getContainerSize", "maxHeight", "container", "clientWidth", "clientHeight", "containerStyle", "containerBorder", "containerPadding", "INFINITY", "round1", "getMaximumSize", "bbWidth", "bbHeight", "aspectRatio", "margins", "containerSize", "retinaScale", "forceRatio", "forceStyle", "pixelRatio", "deviceHeight", "deviceWidth", "setTransform", "supportsEventListenerOptions", "passiveSupported", "passive", "addEventListener", "removeEventListener", "readUsedSize", "_pointInLine", "p1", "p2", "_steppedInterpolation", "_bezierInterpolation", "cp1", "cp2", "a", "b", "c", "getRightToLeftAdapter", "rectX", "setWidth", "xPlus", "leftForLtr", "itemWidth", "getLeftToRightAdapter", "_itemWidth", "getRtlAdapter", "overrideTextDirection", "direction", "original", "getPropertyPriority", "setProperty", "prevTextDirection", "restoreTextDirection", "propertyFn", "between", "_angleBetween", "compare", "_angleDiff", "normalize", "_normalizeAngle", "_isBetween", "normalizeSegment", "getSegment", "segment", "startBound", "endBound", "_boundSegment", "inside", "subStart", "prevValue", "startIsBefore", "endIsBefore", "shouldStart", "shouldStop", "_boundSegments", "segments", "sub", "findStartAndEnd", "solidSegments", "last", "cur", "stop", "_computeSegments", "segmentOptions", "_loop", "splitByStyles", "completeLoop", "_fullLoop", "doSplitByStyles", "chartContext", "_chart", "baseStyle", "readStyle", "_datasetIndex", "datasetIndex", "prevStyle", "addStyle", "l", "st", "dir", "p0", "p0DataIndex", "p1DataIndex", "styleChanged", "borderCapStyle", "borderDash", "borderDashOffset", "borderJoinStyle", "replacer", "Animator", "constructor", "_request", "_charts", "Map", "_running", "_lastDate", "undefined", "_notify", "chart", "anims", "date", "type", "callbacks", "listeners", "numSteps", "duration", "forEach", "fn", "initial", "currentStep", "Math", "min", "start", "_refresh", "requestAnimFrame", "call", "window", "_update", "Date", "now", "remaining", "running", "items", "length", "i", "draw", "item", "_active", "_total", "tick", "pop", "_getAnims", "charts", "get", "complete", "progress", "set", "listen", "event", "cb", "push", "add", "has", "reduce", "acc", "cur", "max", "_duration", "stop", "cancel", "remove", "delete", "animator", "transparent", "interpolators", "boolean", "from", "to", "factor", "color", "c0", "helpersColor", "c1", "valid", "mix", "hexString", "number", "Animation", "cfg", "target", "prop", "currentValue", "resolve", "_fn", "_easing", "effects", "easing", "linear", "_start", "floor", "delay", "_loop", "loop", "_target", "_prop", "_from", "_to", "_promises", "active", "update", "elapsed", "remain", "wait", "promises", "Promise", "res", "rej", "resolved", "method", "Animations", "config", "_chart", "_properties", "configure", "isObject", "animationOptions", "Object", "keys", "defaults", "animation", "animatedProps", "getOwnPropertyNames", "key", "option", "isArray", "properties", "_animateOptions", "values", "newOptions", "options", "resolveTargetOptions", "animations", "_createAnimations", "$shared", "awaitAll", "$animations", "then", "props", "charAt", "value", "size", "assign", "anim", "all", "scaleClip", "scale", "allowedOverflow", "opts", "reverse", "end", "defaultClip", "xScale", "yScale", "x", "y", "top", "right", "bottom", "left", "toClip", "t", "r", "b", "l", "disabled", "getSortedDatasetIndices", "filterVisible", "metasets", "_getSortedDatasetMetas", "ilen", "index", "applyStack", "stack", "dsIndex", "singleMode", "mode", "datasetIndex", "otherValue", "found", "isFinite", "sign", "convertObjectDataToArray", "data", "meta", "iScale", "vScale", "iAxisKey", "axis", "vAxisKey", "adata", "Array", "isStacked", "stacked", "getStackKey", "indexScale", "valueScale", "id", "getUserBounds", "minDefined", "maxDefined", "Number", "NEGATIVE_INFINITY", "POSITIVE_INFINITY", "getOrCreateStack", "stacks", "stackKey", "indexValue", "subStack", "getLastIndexInStack", "positive", "getMatchingVisibleMetas", "updateStacks", "controller", "parsed", "_cachedMeta", "_stacks", "iAxis", "vAxis", "itemStacks", "_top", "_bottom", "visualValues", "_visualValues", "getFirstScaleId", "scales", "filter", "shift", "createDatasetContext", "parent", "createContext", "dataset", "createDataContext", "element", "dataIndex", "raw", "clearStacks", "_parsed", "isDirectUpdateMode", "cloneIfNotShared", "cached", "shared", "createStack", "canStack", "hidden", "_stacked", "DatasetController", "datasetElementType", "dataElementType", "_ctx", "ctx", "_cachedDataOpts", "getMeta", "_type", "_parsing", "_data", "_objectData", "_sharedOptions", "_drawStart", "_drawCount", "enableOptionSharing", "supportsDecimation", "$context", "_syncList", "initialize", "linkScales", "addElements", "fill", "isPluginEnabled", "console", "warn", "updateIndex", "getDataset", "chooseId", "xid", "xAxisID", "valueOrDefault", "yid", "yAxisID", "rid", "rAxisID", "indexAxis", "iid", "iAxisID", "vid", "vAxisID", "getScaleForId", "rScale", "datasets", "getDatasetMeta", "scaleID", "_getOtherScale", "reset", "_destroy", "unlistenArrayEvents", "_dataCheck", "isExtensible", "listenArrayEvents", "buildOrUpdateElements", "resetNewElements", "stackChanged", "oldStacked", "_resyncElements", "scopeKeys", "datasetScopeKeys", "scopes", "getOptionScopes", "createResolver", "getContext", "parsing", "parse", "count", "sorted", "_sorted", "prev", "parseArrayData", "parseObjectData", "parsePrimitiveData", "isNotInOrderComparedToPrev", "labels", "getLabels", "singleScale", "xAxisKey", "yAxisKey", "resolveObjectKey", "getParsed", "getDataElement", "updateRangeFromParsed", "range", "parsedValue", "NaN", "getMinMax", "otherScale", "otherMin", "otherMax", "_skip", "getAllParsedValues", "getMaxOverflow", "getLabelAndValue", "label", "getLabelForValue", "_clip", "clip", "elements", "area", "chartArea", "drawActiveElementsOnTop", "getStyle", "resolveDatasetElementOptions", "resolveDataElementOptions", "context", "_resolveElementOptions", "elementType", "cache", "cacheKey", "sharing", "defined", "datasetElementScopeKeys", "prefixes", "names", "resolveNamedOptions", "freeze", "_resolveAnimations", "transition", "datasetAnimationScopeKeys", "_cacheable", "getSharedOptions", "includeOptions", "sharedOptions", "_animationsDisabled", "_getSharedOptions", "firstOpts", "previouslySharedOptions", "updateSharedOptions", "updateElement", "_setStyle", "removeHoverStyle", "setHoverStyle", "_removeDatasetHoverStyle", "_setDatasetHoverStyle", "arg1", "arg2", "numMeta", "numData", "_insertElements", "_removeElements", "move", "arr", "updateElements", "removed", "splice", "_sync", "args", "_dataChanges", "_onDataPush", "arguments", "_onDataPop", "_onDataShift", "_onDataSplice", "newCount", "_onDataUnshift", "getAllScaleValues", "_cache", "$bar", "visibleMetas", "concat", "_arrayUnique", "sort", "a", "computeMinSampleSize", "_length", "curr", "updateMinAndPrev", "abs", "getPixelForValue", "ticks", "getPixelForTick", "computeFitCategoryTraits", "ruler", "stackCount", "thickness", "barThickness", "ratio", "isNullOrUndef", "categoryPercentage", "barPercentage", "chunk", "pixels", "computeFlexCategoryTraits", "next", "percent", "parseFloatBar", "entry", "startValue", "endValue", "barStart", "barEnd", "_custom", "parseValue", "parseArrayOrPrimitive", "isFloatBar", "custom", "barSign", "actualBase", "isHorizontal", "borderProps", "horizontal", "base", "setBorderSkipped", "edge", "borderSkipped", "enableBorderRadius", "parseEdge", "swap", "startEnd", "orig", "v1", "v2", "v", "setInflateAmount", "inflateAmount", "BarController", "grouped", "numbers", "overrides", "_index_", "offset", "grid", "_value_", "beginAtZero", "obj", "bars", "getBasePixel", "_getRuler", "vpixels", "head", "_calculateBarValuePixels", "ipixels", "_calculateBarIndexPixels", "center", "height", "width", "_getStacks", "last", "currentParsed", "iScaleValue", "skipNull", "find", "val", "isNaN", "indexOf", "_getStackCount", "_getStackIndex", "name", "_startPixel", "_endPixel", "baseValue", "minBarLength", "floating", "getDataVisibility", "startPixel", "getPixelForDecimal", "endPixel", "getValueForPixel", "halfGrid", "getLineWidthForValue", "maxBarThickness", "Infinity", "stackIndex", "rects", "BubbleController", "radius", "points", "point", "iPixel", "vPixel", "skip", "getRatioAndOffset", "rotation", "circumference", "cutout", "ratioX", "ratioY", "offsetX", "offsetY", "TAU", "startAngle", "endAngle", "startX", "cos", "startY", "sin", "endX", "endY", "calcMax", "angle", "_angleBetween", "calcMin", "maxX", "maxY", "HALF_PI", "minX", "PI", "minY", "DoughnutController", "animateRotate", "animateScale", "spacing", "descriptors", "_scriptable", "_indexable", "startsWith", "aspectRatio", "plugins", "legend", "generateLabels", "pointStyle", "map", "style", "text", "fillStyle", "backgroundColor", "strokeStyle", "borderColor", "fontColor", "lineWidth", "borderWidth", "onClick", "e", "legendItem", "toggleDataVisibility", "innerRadius", "outerRadius", "getter", "_getRotation", "toRadians", "_getCircumference", "_getRotationExtents", "isDatasetVisible", "arcs", "getMaxBorderWidth", "getMaxOffset", "maxSize", "toPercentage", "chartWeight", "_getRingWeight", "maxWidth", "maxHeight", "maxRadius", "toDimension", "radiusLength", "_getVisibleDatasetWeightTotal", "total", "calculateTotal", "_getRingWeightOffset", "_circumference", "calculateCircumference", "animationOpts", "centerX", "centerY", "arc", "metaData", "formatNumber", "locale", "borderAlign", "hoverBorderWidth", "hoverOffset", "ringWeightOffset", "weight", "LineController", "showLine", "spanGaps", "line", "_dataset", "animationsDisabled", "_getStartAndCountOfVisiblePoints", "_scaleRangesChanged", "_datasetIndex", "_decimated", "segment", "animated", "maxGapLength", "isNumber", "directUpdate", "pointsCount", "prevParsed", "nullData", "border", "firstPoint", "lastPoint", "updateControlPoints", "PolarAreaController", "angleLines", "display", "circular", "pointLabels", "_parseObjectDataRadialScale", "bind", "_updateRadius", "minSize", "cutoutPercentage", "getVisibleDatasetCount", "xCenter", "yCenter", "datasetStartAngle", "getIndexAngle", "defaultAngle", "countVisibleElements", "_computeAngle", "getDistanceFromCenterForValue", "PieController", "RadarController", "_fullLoop", "pointPosition", "getPointPositionForValue", "ScatterController", "interaction", "registry", "getElement", "abstract", "Error", "DateAdapterBase", "override", "members", "prototype", "init", "formats", "format", "diff", "startOf", "endOf", "adapters", "_date", "binarySearch", "metaset", "intersect", "lookupMethod", "_reversePixels", "_rlookupByKey", "_lookupByKey", "el", "getRange", "lo", "hi", "evaluateInteractionItems", "position", "handler", "getSortedVisibleDatasetMetas", "j", "getDistanceMetricForAxis", "useX", "useY", "pt1", "pt2", "deltaX", "deltaY", "sqrt", "pow", "getIntersectItems", "useFinalPosition", "includeInvisible", "isPointInArea", "_isPointInArea", "inRange", "getNearestRadialItems", "evaluationFunc", "getProps", "getAngleFromPoint", "getNearestCartesianItems", "distanceMetric", "minDistance", "getCenterPoint", "distance", "getNearestItems", "getAxisItems", "rangeMethod", "intersectsItem", "Interaction", "modes", "getRelativePosition", "nearest", "STATIC_POSITIONS", "filterByPosition", "array", "pos", "filterDynamicPositionByAxis", "box", "sortByWeight", "v0", "wrapBoxes", "boxes", "layoutBoxes", "stackWeight", "buildStacks", "layouts", "wrap", "includes", "_stack", "placed", "setLayoutDims", "params", "vBoxMaxWidth", "hBoxMaxHeight", "layout", "fullSize", "availableWidth", "availableHeight", "buildLayoutBoxes", "centerHorizontal", "centerVertical", "leftAndTop", "rightAndBottom", "vertical", "getCombinedMax", "maxPadding", "updateMaxPadding", "boxPadding", "updateDims", "getPadding", "newWidth", "outerWidth", "newHeight", "outerHeight", "widthChanged", "w", "heightChanged", "h", "same", "other", "handleMaxPadding", "updatePos", "change", "getMargins", "marginForPositions", "positions", "margin", "fitBoxes", "refitBoxes", "refit", "changed", "setBoxDims", "placeBoxes", "userPadding", "padding", "addBox", "_layers", "z", "removeBox", "layoutItem", "minPadding", "toPadding", "verticalBoxes", "horizontalBoxes", "each", "beforeLayout", "visibleVerticalBoxCount", "BasePlatform", "acquireContext", "canvas", "releaseContext", "addEventListener", "listener", "removeEventListener", "getDevicePixelRatio", "getMaximumSize", "isAttached", "updateConfig", "BasicPlatform", "EXPANDO_KEY", "EVENT_TYPES", "touchstart", "touchmove", "touchend", "pointerenter", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointerout", "isNullOrEmpty", "initCanvas", "renderHeight", "getAttribute", "renderWidth", "boxSizing", "displayWidth", "readUsedSize", "displayHeight", "eventListenerOptions", "supportsEventListenerOptions", "passive", "addListener", "node", "removeListener", "fromNativeEvent", "native", "nodeListContains", "nodeList", "contains", "createAttachObserver", "observer", "MutationObserver", "entries", "trigger", "addedNodes", "removedNodes", "observe", "document", "childList", "subtree", "createDetachObserver", "drpListeningCharts", "oldDevicePixelRatio", "onWindowResize", "dpr", "devicePixelRatio", "resize", "currentDevicePixelRatio", "listenDevicePixelRatioChanges", "unlistenDevicePixelRatioChanges", "createResizeObserver", "container", "_getParentNode", "throttled", "clientWidth", "ResizeObserver", "contentRect", "releaseObserver", "disconnect", "createProxyAndListen", "proxy", "DomPlatform", "removeAttribute", "setAttribute", "proxies", "$proxies", "attach", "detach", "isConnected", "_detectPlatform", "_isDomSupported", "OffscreenCanvas", "Element", "defaultRoutes", "tooltipPosition", "hasValue", "final", "ret", "autoSkip", "tickOpts", "determinedMaxTicks", "determineMaxTicks", "ticksLimit", "maxTicksLimit", "majorIndices", "major", "enabled", "getMajorIndices", "numMajorIndices", "first", "newTicks", "skipMajors", "calculateSpacing", "avgMajorSpacing", "round", "tickLength", "_tickSize", "maxScale", "maxChart", "_maxLength", "evenMajorSpacing", "getEvenSpacing", "factors", "_factorize", "result", "ceil", "majorStart", "majorEnd", "len", "reverseAlign", "align", "offsetFromEdge", "getTicksLimit", "ticksLength", "sample", "numItems", "increment", "getPixelForGridLine", "offsetGridLines", "validIndex", "epsilon", "lineValue", "garbageCollect", "caches", "gc", "gcLen", "getTickMarkLength", "drawTicks", "getTitleHeight", "fallback", "font", "toFont", "lineHeight", "createScaleContext", "createTickContext", "titleAlign", "_toLeftRightCenter", "titleArgs", "titleX", "titleY", "_alignStartEnd", "positionAxisID", "Scale", "_margins", "paddingTop", "paddingBottom", "paddingLeft", "paddingRight", "labelRotation", "_range", "_gridLineItems", "_labelItems", "_labelSizes", "_longestTextCache", "_userMax", "_userMin", "_suggestedMax", "_suggestedMin", "_ticksLength", "_borderValue", "_dataLimitsCached", "setContext", "suggestedMin", "suggestedMax", "finiteOrDefault", "metas", "getTicks", "xLabels", "yLabels", "getLabelItems", "_computeLabelItems", "beforeUpdate", "margins", "grace", "sampleSize", "beforeSetDimensions", "setDimensions", "afterSetDimensions", "beforeDataLimits", "determineDataLimits", "afterDataLimits", "_addGrace", "beforeBuildTicks", "buildTicks", "afterBuildTicks", "samplingEnabled", "_convertTicksToLabels", "beforeCalculateLabelRotation", "calculateLabelRotation", "afterCalculateLabelRotation", "source", "afterAutoSkip", "beforeFit", "fit", "afterFit", "afterUpdate", "reversePixels", "_alignToPixels", "alignToPixels", "_callHooks", "notifyPlugins", "beforeTickToLabelConversion", "generateTickLabels", "callback", "afterTickToLabelConversion", "numTicks", "minRotation", "maxRotation", "tickWidth", "maxLabelDiagonal", "_isVisible", "labelSizes", "_getLabelSizes", "maxLabelWidth", "widest", "maxLabelHeight", "highest", "_limitValue", "title", "toDegrees", "asin", "titleOpts", "gridOpts", "titleHeight", "tickPadding", "angleRadians", "labelHeight", "mirror", "labelWidth", "_calculatePadding", "_handleMargins", "isRotated", "labelsBelowTicks", "offsetLeft", "offsetRight", "isFullSize", "_computeLabelSizes", "widths", "heights", "widestLabelSize", "highestLabelSize", "jlen", "tickFont", "fontString", "nestedLabel", "_resolveTickFontOptions", "string", "_measureText", "valueAt", "idx", "pixel", "decimal", "_int16Range", "_alignPixel", "getDecimalForPixel", "getBaseValue", "optionTicks", "rot", "autoSkipPadding", "_computeGridLineItems", "tl", "borderOpts", "axisWidth", "axisHalfWidth", "alignBorderValue", "borderValue", "alignedLineValue", "tx1", "ty1", "tx2", "ty2", "x1", "y1", "x2", "y2", "limit", "step", "optsAtIndex", "optsAtIndexBorder", "lineColor", "borderDash", "dash", "borderDashOffset", "dashOffset", "tickColor", "tickBorderDash", "tickBorderDashOffset", "crossAlign", "tickAndPadding", "hTickAndPadding", "textAlign", "lineCount", "textOffset", "textBaseline", "_getXAxisLabelAlignment", "_getYAxisLabelAlignment", "labelOffset", "halfCount", "strokeColor", "textStrokeColor", "strokeWidth", "textStrokeWidth", "tickTextAlign", "showLabelBackdrop", "backdrop", "labelPadding", "backdropPadding", "backdropColor", "translation", "_computeLabelArea", "drawBackground", "save", "fillRect", "restore", "findIndex", "drawGrid", "drawLine", "p1", "p2", "setLineDash", "lineDashOffset", "beginPath", "moveTo", "lineTo", "stroke", "drawOnChartArea", "drawBorder", "lastLineWidth", "drawLabels", "clipArea", "renderTextOptions", "renderText", "unclipArea", "drawTitle", "tz", "gz", "bz", "axisID", "_maxDigits", "fontSize", "TypedRegistry", "scope", "create", "isForType", "isPrototypeOf", "register", "proto", "getPrototypeOf", "parentScope", "isIChartComponent", "registerDefaults", "unregister", "itemDefaults", "merge", "routeDefaults", "describe", "routes", "property", "propertyParts", "split", "sourceName", "sourceScope", "join", "parts", "targetName", "targetScope", "route", "Registry", "controllers", "_typedRegistries", "_each", "addControllers", "addPlugins", "addScales", "getController", "_get", "getPlugin", "getScale", "removeControllers", "removeElements", "removePlugins", "removeScales", "typedRegistry", "arg", "reg", "_getRegistryForType", "_exec", "itemReg", "component", "camelMethod", "_capitalize", "PluginService", "_init", "notify", "hook", "_createDescriptors", "_descriptors", "descriptor", "plugin", "callCallback", "cancelable", "invalidate", "_oldCache", "_notifyStateChanges", "allPlugins", "createDescriptors", "previousDescriptors", "some", "localIds", "local", "getOpts", "pluginOpts", "pluginScopeKeys", "scriptable", "indexable", "allKeys", "getIndexAxis", "datasetDefaults", "getAxisFromDefaultScaleID", "getDefaultScaleIDFromAxis", "idMatchesAxis", "axisFromPosition", "determineAxis", "scaleOptions", "toLowerCase", "getAxisFromDataset", "retrieveAxisFromDatasets", "boundDs", "d", "mergeScaleConfig", "chartDefaults", "configScales", "chartIndexAxis", "scaleConf", "error", "_proxy", "defaultId", "defaultScaleOptions", "mergeIf", "defaultID", "initOptions", "initData", "initConfig", "keyCache", "keysCached", "Set", "cachedKeys", "generate", "addIfFound", "Config", "_config", "_scopeCache", "_resolverCache", "platform", "clearCache", "clear", "datasetType", "additionalOptionScopes", "_cachedScopes", "mainScope", "resetCache", "keyLists", "chartOptionScopes", "resolver", "subPrefixes", "getResolver", "needContext", "isFunction", "subResolver", "_attachContext", "descriptorDefaults", "resolverCache", "_createResolver", "p", "hasFunction", "isScriptable", "isIndexable", "KNOWN_POSITIONS", "positionIsHorizontal", "compare2Level", "l1", "l2", "onAnimationsComplete", "onComplete", "onAnimationProgress", "onProgress", "getCanvas", "getElementById", "instances", "getChart", "c", "moveNumericKeys", "intKey", "determineLastEvent", "lastEvent", "inChartArea", "isClick", "getSizeForArea", "field", "getDatasetArea", "Chart", "version", "invalidatePlugins", "userConfig", "initialCanvas", "existingChart", "uid", "_options", "_aspectRatio", "_metasets", "_lastEvent", "_listeners", "_responsiveListeners", "_sortedMetasets", "_plugins", "_hiddenIndices", "attached", "_doResize", "debounce", "resizeDelay", "_initialize", "maintainAspectRatio", "responsive", "retinaScale", "bindEvents", "clearCanvas", "_resizeBeforeDraw", "_resize", "newSize", "newRatio", "onResize", "render", "ensureScalesHaveIDs", "scalesOptions", "axisOptions", "buildOrUpdateScales", "scaleOpts", "updated", "isRadial", "dposition", "dtype", "scaleType", "scaleClass", "hasUpdated", "_updateMetasets", "_destroyDatasetMeta", "slice", "_removeUnreferencedMetasets", "buildOrUpdateControllers", "newControllers", "order", "visible", "ControllerClass", "_resetElements", "animsDisabled", "_updateScales", "_checkEventBindings", "_updateHiddenIndices", "_minPadding", "autoPadding", "_updateLayout", "_updateDatasets", "_eventHandler", "_updateHoverStyles", "existingEvents", "newEvents", "events", "setsEqual", "unbindEvents", "changes", "_getUniformDataChanges", "datasetCount", "makeSet", "changeSet", "noArea", "_idx", "_updateDataset", "layers", "_drawDatasets", "_drawDataset", "useClip", "getElementsAtEventForMode", "setDatasetVisibility", "_updateVisibility", "hide", "show", "_stop", "destroy", "toBase64Image", "toDataURL", "bindUserEvents", "bindResponsiveEvents", "_add", "_remove", "detached", "updateHoverStyle", "prefix", "getActiveElements", "setActiveElements", "activeElements", "lastActive", "_elementsEqual", "pluginId", "replay", "hoverOptions", "hover", "deactivated", "activated", "eventFilter", "_handleEvent", "_getActiveElements", "_isClickEvent", "onHover", "clipArc", "pixelMargin", "angleMargin", "closePath", "toRadiusCorners", "_readValueToProps", "parseBorderRadius", "angleDelta", "o", "borderRadius", "halfThickness", "innerLimit", "computeOuterLimit", "outerArcLimit", "outerStart", "outerEnd", "innerStart", "innerEnd", "rThetaToXY", "theta", "pathArc", "innerR", "spacingOffset", "alpha", "noSpacingInnerRadius", "noSpacingOuterRadius", "avNogSpacingRadius", "adjustedAngle", "beta", "angleOffset", "outerStartAdjustedRadius", "outerEndAdjustedRadius", "outerStartAdjustedAngle", "outerEndAdjustedAngle", "innerStartAdjustedRadius", "innerEndAdjustedRadius", "innerStartAdjustedAngle", "innerEndAdjustedAngle", "outerMidAdjustedAngle", "pCenter", "p4", "innerMidAdjustedAngle", "p8", "outerStartX", "outerStartY", "outerEndX", "outerEndY", "drawArc", "fullCircles", "borderJoinStyle", "inner", "lineJoin", "ArcElement", "chartX", "chartY", "rAdjust", "nonZeroBetween", "betweenAngles", "withinRadius", "_isBetween", "halfAngle", "halfRadius", "translate", "fix", "radiusOffset", "setStyle", "lineCap", "borderCapStyle", "previous", "getLineMethod", "stepped", "_steppedLineTo", "tension", "cubicInterpolationMode", "_bezierCurveTo", "pathVars", "paramsStart", "paramsEnd", "segmentStart", "segmentEnd", "outside", "pathSegment", "lineMethod", "fastPathSegment", "avgX", "countX", "prevX", "lastY", "pointIndex", "drawX", "truncX", "_getSegmentMethod", "_getInterpolationMethod", "_steppedInterpolation", "_bezierInterpolation", "_pointInLine", "strokePathWithCache", "path", "_path", "Path2D", "strokePathDirect", "segments", "segmentMethod", "usePath2D", "LineElement", "capBezierPoints", "_points", "_segments", "_pointsUpdated", "_updateBezierControlPoints", "_computeSegments", "interpolate", "_boundSegments", "_interpolate", "interpolated", "hitRadius", "PointElement", "hoverRadius", "mouseX", "mouseY", "inXRange", "inYRange", "drawPoint", "getBarBounds", "bar", "half", "skipOrLimit", "parseBorderWidth", "maxW", "maxH", "toTRBL", "toTRBLCorners", "maxR", "enableBorder", "topLeft", "topRight", "bottomLeft", "bottomRight", "boundingRects", "bounds", "outer", "skipX", "skipY", "hasRadius", "addNormalRectPath", "rect", "inflateRect", "amount", "refRect", "BarElement", "addRectPath", "addRoundedRectPath", "BORDER_COLORS", "BACKGROUND_COLORS", "replace", "getBorderColor", "getBackgroundColor", "colorizeDefaultDataset", "colorizeDoughnutDataset", "colorizePolarAreaDataset", "getColorizer", "containsColorsDefinitions", "k", "containsColorsDefinition", "containsDefaultColorsDefenitions", "plugin_colors", "forceOverride", "_args", "chartOptions", "containsColorDefenition", "colorizer", "lttbDecimation", "samples", "decimated", "bucketWidth", "sampledIndex", "endIndex", "maxAreaPoint", "maxArea", "nextA", "avgY", "avgRangeStart", "avgRangeEnd", "avgRangeLength", "rangeOffs", "rangeTo", "pointAx", "pointAy", "minMaxDecimation", "minIndex", "maxIndex", "startIndex", "xMin", "dx", "lastIndex", "intermediateIndex1", "intermediateIndex2", "cleanDecimatedDataset", "defineProperty", "configurable", "enumerable", "writable", "cleanDecimatedData", "getStartAndCountOfVisiblePointsSimplified", "pointCount", "plugin_decimation", "algorithm", "beforeElementsUpdate", "xAxis", "threshold", "tpoints", "_findSegmentEnd", "_getBounds", "targetSegments", "tgt", "subBounds", "fillSources", "_boundSegment", "fillSource", "_getEdge", "_normalizeAngle", "_pointsFromSegments", "boundary", "linePoints", "_createBoundaryLine", "_shouldApplyFill", "_resolveTarget", "sources", "propagate", "visited", "_decodeFill", "parseFillOption", "parseFloat", "decodeTargetIndex", "firstCh", "_getTargetPixel", "_getTargetValue", "fillOption", "_buildStackLine", "sourcePoints", "linesBelow", "getLinesBelow", "addPointsBelow", "below", "unshift", "sourcePoint", "postponed", "findPoint", "pointValue", "firstValue", "lastValue", "simpleArc", "_getTarget", "getLineByIndex", "computeBoundary", "computeCircularBoundary", "computeLinearBoundary", "_drawfill", "lineOpts", "above", "doFill", "clipVertical", "clipY", "lineLoop", "src", "notShape", "clipBounds", "interpolatedLineTo", "targetLoop", "interpolatedPoint", "afterDatasetsUpdate", "$filler", "beforeDraw", "drawTime", "beforeDatasetsDraw", "beforeDatasetDraw", "getBoxSize", "labelOpts", "boxHeight", "boxWidth", "usePointStyle", "pointStyleWidth", "itemHeight", "itemsEqual", "Legend", "_added", "legendHitBoxes", "_hoveredItem", "doughnutMode", "legendItems", "columnSizes", "lineWidths", "buildLabels", "labelFont", "_computeTitleHeight", "_fitRows", "_fitCols", "hitboxes", "totalHeight", "row", "itemWidth", "measureText", "_itemHeight", "heightLimit", "totalWidth", "currentColWidth", "currentColHeight", "col", "calculateItemSize", "adjustHitBoxes", "rtl", "rtlHelper", "getRtlAdapter", "hitbox", "leftForLtr", "_draw", "defaultColor", "halfFontSize", "cursor", "drawLegendBox", "lineDash", "drawOptions", "SQRT2", "xPlus", "drawPointLegend", "yBoxTop", "xBoxLeft", "fillText", "strikethrough", "overrideTextDirection", "textDirection", "textWidth", "setWidth", "realX", "_textX", "fontLineHeight", "calculateLegendItemHeight", "restoreTextDirection", "titleFont", "titlePadding", "topPaddingPlusHalfFontSize", "_getLegendItemAt", "hitBox", "lh", "handleEvent", "isListened", "hoveredItem", "sameItem", "onLeave", "calculateItemWidth", "calculateItemHeight", "legendItemText", "plugin_legend", "_element", "afterEvent", "ci", "useBorderRadius", "Title", "_padding", "textSize", "_drawArgs", "fontOpts", "createTitle", "titleBlock", "plugin_title", "WeakMap", "plugin_subtitle", "positioners", "average", "xSet", "eventPosition", "nearestElement", "distanceBetweenPoints", "tp", "pushOrConcat", "toPush", "apply", "splitNewlines", "str", "String", "createTooltipItem", "formattedValue", "getTooltipSize", "tooltip", "body", "footer", "bodyFont", "footerFont", "titleLineCount", "footerLineCount", "bodyLineItemCount", "combinedBodyLength", "bodyItem", "before", "lines", "after", "beforeBody", "afterBody", "titleSpacing", "titleMarginBottom", "bodyLineHeight", "displayColors", "bodySpacing", "footerMarginTop", "footerSpacing", "widthPadding", "maxLineWidth", "determineYAlign", "doesNotFitWithAlign", "xAlign", "caret", "caretSize", "caretPadding", "determineXAlign", "yAlign", "chartWidth", "determineAlignment", "alignX", "alignY", "paddingAndSize", "getBackgroundPoint", "alignment", "cornerRadius", "getAlignedX", "getBeforeAfterBodyLines", "createTooltipContext", "tooltipItems", "overrideCallbacks", "defaultCallbacks", "beforeTitle", "noop", "labelCount", "afterTitle", "beforeLabel", "tooltipItem", "labelColor", "labelTextColor", "bodyColor", "labelPointStyle", "afterLabel", "beforeFooter", "afterFooter", "invokeCallbackWithFallback", "Tooltip", "opacity", "_eventPosition", "_size", "_cachedAnimations", "_tooltipItems", "dataPoints", "caretX", "caretY", "labelColors", "labelPointStyles", "labelTextColors", "getTitle", "getBeforeBody", "getBody", "bodyItems", "scoped", "getAfterBody", "getFooter", "_createItems", "itemSort", "positionAndSize", "backgroundPoint", "external", "drawCaret", "tooltipPoint", "caretPosition", "getCaretPosition", "x3", "y3", "ptX", "ptY", "pt", "titleColor", "_drawColorBox", "colorX", "rtlColorX", "yOffSet", "colorY", "multiKeyBackground", "outerX", "innerX", "strokeRect", "drawBody", "bodyAlign", "xLinePadding", "fillLineOfText", "bodyAlignForCalculation", "textColor", "drawFooter", "footerAlign", "footerColor", "tooltipSize", "quadraticCurveTo", "_updateAnimationTarget", "animX", "animY", "_willRender", "hasTooltipContent", "globalAlpha", "positionChanged", "_positionChanged", "_ignoreReplayEvents", "plugin_tooltip", "afterInit", "afterDraw", "_fallback", "addIfString", "addedLabels", "findOrAddLabel", "lastIndexOf", "_getLabelForValue", "CategoryScale", "_startValue", "_valueRange", "_addedLabels", "added", "generateTicks", "generationOptions", "dataRange", "precision", "maxTicks", "maxDigits", "includeBounds", "unit", "maxSpaces", "rmin", "rmax", "countDefined", "minSpacing", "niceNum", "niceMin", "niceMax", "numSpaces", "MIN_SPACING", "almostWhole", "almostEquals", "decimalPlaces", "_decimalPlaces", "relativeLabelSize", "tickValue", "rad", "LinearScaleBase", "_endValue", "handleTickRangeOptions", "setMin", "setMax", "minSign", "maxSign", "getTickLimit", "stepSize", "computeTickLimit", "numericGeneratorOptions", "_setMinAndMaxByKey", "LinearScale", "Ticks", "formatters", "numeric", "log10Floor", "log10", "changeExponent", "m", "isMajor", "tickVal", "steps", "rangeExp", "rangeStep", "startExp", "minExp", "exp", "significand", "lastTick", "LogarithmicScale", "logarithmic", "_zero", "getTickBackdropHeight", "measureLabelSize", "_longestText", "determineLimits", "fitWithPointLabels", "limits", "valueCount", "_pointLabels", "pointLabelOpts", "additionalAngle", "centerPointLabels", "getPointLabelContext", "getPointPosition", "drawingArea", "plFont", "hLimits", "vLimits", "updateLimits", "setCenterPoint", "_pointLabelItems", "buildPointLabelItems", "createPointLabelItem", "itemOpts", "outerDistance", "extra", "pointLabelPosition", "yForAngle", "getTextAlignForAngle", "leftForTextAlign", "isNotOverlapped", "drawPointLabelBox", "backdropLeft", "backdropTop", "backdropWidth", "backdropHeight", "drawPointLabels", "pathRadiusLine", "drawRadiusLine", "gridLineOpts", "createPointLabelContext", "RadialLinearScale", "animate", "leftMovement", "rightMovement", "topMovement", "bottomMovement", "angleMultiplier", "scalingFactor", "getValueForDistanceFromCenter", "scaledDistance", "pointLabel", "distanceFromCenter", "getBasePosition", "getPointLabelPosition", "rotate", "INTERVALS", "millisecond", "common", "second", "minute", "hour", "day", "week", "month", "quarter", "year", "UNITS", "sorter", "input", "adapter", "_adapter", "parser", "isoWeekday", "_parseOpts", "determineUnitForAutoTicks", "minUnit", "capacity", "interval", "MAX_SAFE_INTEGER", "determineUnitForFormatting", "determineMajorUnit", "addTick", "time", "timestamps", "_lookup", "timestamp", "setMajorTicks", "majorUnit", "ticksFromTimestamps", "TimeScale", "displayFormats", "_unit", "_majorUnit", "_offsets", "_normalized", "normalized", "_applyBounds", "_getLabelBounds", "getLabelTimestamps", "timeOpts", "_generate", "_filterBetween", "_getLabelCapacity", "initOffsets", "offsetAfterAutoskip", "getDecimalForValue", "minor", "weekday", "hasWeekday", "getDataTimestamps", "tooltipFormat", "datetime", "fmt", "_tickFormatFunction", "formatter", "minorFormat", "majorFormat", "offsets", "_getLabelSize", "ticksOpts", "tickLabelWidth", "cosRotation", "sinRotation", "tickFontSize", "exampleTime", "exampleLabel", "normalize", "table", "prevSource", "nextSource", "prevTarget", "nextTarget", "span", "TimeSeriesScale", "_table", "_minPos", "_tableRange", "_getTimestampsForTable", "buildLookupTable", "registerables", "Chart", "registerables", "auto_default", "devicePixelRatio", "screen", "utils", "inputs", "lines", "input", "isNullOrUndef", "ctx", "font", "items", "ilen", "prev", "width", "i", "min", "value", "max", "a0", "a1", "updates", "j", "v", "orient", "point", "origin", "x0", "y0", "dx", "dy", "ln", "aligned", "x", "y", "vx", "vy", "align", "R_INSIDE", "R_LEFT", "R_RIGHT", "R_BOTTOM", "R_TOP", "region", "rect", "res", "clipped", "segment", "area", "x1", "y1", "r0", "r1", "r", "compute$1", "range", "config", "anchor", "positioners", "el", "angle", "rx", "ry", "sx", "sy", "rasterize", "boundingRects", "model", "borderWidth", "padding", "th", "tw", "tx", "ty", "getScaleOrigin", "context", "scale", "pixel", "getPositioner", "ArcElement", "PointElement", "BarElement", "drawRoundedRect", "w", "h", "radius", "HALF_PI", "left", "top", "right", "bottom", "drawFrame", "bgColor", "borderColor", "textGeometry", "drawTextLine", "text", "cfg", "shadow", "stroked", "drawText", "color", "filled", "strokeColor", "strokeWidth", "Label", "index", "me", "merge", "display", "toFont", "resolve", "defaults", "toPadding", "rects", "label", "valueOrDefault", "callback", "chart", "center", "MIN_INTEGER", "MAX_INTEGER", "rotated", "cos", "sin", "cx", "cy", "projected", "points", "axis", "pt", "dp", "toAxis", "p0", "p1", "HitBox", "rotation", "margin", "other", "axes", "pr0", "pr1", "coordinates", "geometry", "vs", "collide", "labels", "collider", "s0", "s1", "compute", "state", "proxy", "p", "h0", "h1", "layout", "datasets", "jlen", "a", "b", "sa", "sb", "dirty", "formatter", "keys", "klen", "k", "isObject", "EXPANDO_KEY", "DEFAULT_KEY", "configure", "dataset", "options", "override", "listeners", "configs", "key", "target", "each", "fn", "event", "dispatchEvent", "groups", "callback$1", "dispatchMoveEvents", "previous", "enter", "leave", "handleMoveEvents", "expando", "handleClickEvents", "handlers", "plugin", "args", "datasetIndex", "visible", "elements", "source", "actives", "update", "interaction", "visibleElements", "event", "filterElements", "options", "getNearestItem", "getElements", "inRangeByAxis", "element", "axis", "getPointByAxis", "center", "minDistance", "nearestItems", "evenPoint", "distance", "distanceBetweenPoints", "a", "b", "rotated", "point", "angle", "cos", "sin", "cx", "cy", "isOlderPart", "act", "req", "EPSILON", "clamp", "x", "from", "to", "inLimit", "limit", "hitSize", "clampAll", "obj", "key", "inPointRange", "radius", "inBoxRange", "y", "x2", "y2", "borderWidth", "hitTolerance", "inRangeX", "inRangeY", "inLabelRange", "rect", "rotation", "rotPoint", "toRadians", "getElementCenterPoint", "useFinalPosition", "centerX", "centerY", "requireVersion", "pkg", "min", "ver", "strict", "parts", "i", "isPercentString", "s", "toPercent", "toPositivePercent", "boxAppering", "defaultInitAnimation", "properties", "getRelativePosition", "size", "position", "getSize", "value", "positivePercent", "calculateTextAlignment", "width", "textAlign", "measureLabelRectangle", "labelSize", "xAdjust", "yAdjust", "padding", "hasPadding", "isObject", "height", "positionObj", "toPosition", "calculateLabelPosition$1", "defaultValue", "valueOrDefault", "shouldFit", "fitRatio", "toFonts", "optFont", "fonts", "isArray", "f", "font", "toFont", "isBoundToPoint", "defined", "start", "adjust", "initAnimationProperties", "chart", "initAnim", "applyDefault", "execCallback", "loadHooks", "hooks", "hooksContainer", "activated", "hook", "isFunction", "type", "result", "callback", "widthCache", "notRadius", "fontsKey", "prev", "item", "isImageOrCanvas", "content", "translate", "ctx", "setBorderStyle", "setShadowStyle", "measureLabelSize", "strokeWidth", "lines", "mapKey", "calculateLabelSize", "drawBox", "stroke", "addRoundedRectPath", "toTRBLCorners", "drawLabel", "getOpacity", "labels", "optColor", "colors", "setTextStrokeStyle", "applyLabelDecoration", "applyLabelContent", "drawPoint", "style", "rad", "RAD_PER_DEG", "drawPointStyle", "xOffset", "yOffset", "cornerRadius", "TAU", "TWO_THIRDS_PI", "QUARTER_PI", "PI", "HALF_PI", "count", "text", "lhs", "l", "lh", "elementValue", "opacity", "isNumber", "positions", "drawCallout", "pointX", "pointY", "callout", "calloutPosition", "resolveCalloutPosition", "isPointInRange", "separatorStart", "separatorEnd", "getCalloutSeparatorCoord", "sideStart", "sideEnd", "getCalloutSideCoord", "rotatedPoint", "getCalloutSeparatorAdjust", "side", "getCalloutSideAdjust", "resolveCalloutAutoPosition", "xPoints", "yPoints", "index", "margin", "limitedLineScale", "scaleValue", "scale", "fallback", "isNumberFinite", "retrieveScaleID", "scales", "scaleID", "axes", "getDimensionByScale", "reverse", "end", "getChartPoint", "chartArea", "xScale", "yScale", "resolveBoxProperties", "xDim", "getChartDimensionByScale", "yDim", "resolvePointProperties", "box", "adjustCenterX", "adjustCenterY", "getChartCircle", "resolveLineProperties", "area", "resolveFullLineProperties", "resolveLimitedLineProperties", "resolveBoxAndLabelProperties", "resolveLabelElementProperties$1", "max", "scaleId", "startProp", "endProp", "dim", "calculateX", "calculatePosition", "calculateY", "boxOpts", "labelOpts", "padStart", "padEnd", "availableSize", "label", "toPadding", "moveHooks", "eventHooks", "updateListeners", "state", "scope", "handleEvent", "handleMoveEvents", "handleClickEvents", "elements", "previous", "context", "changed", "dispatchMoveEvents", "checkElements", "dispatchEvent", "listeners", "handler", "elementHooks", "updateHooks", "invokeHook", "callbackHook", "adjustScaleRange", "annotations", "range", "getScaleLimits", "changeScaleLimit", "verifyScaleOptions", "annotation", "verifyScaleIDs", "suggestedLimit", "scaleLimitDefined", "scaleOptions", "verifyProperties", "prop", "scaleIDOption", "limits", "updateLimits", "props", "raw", "BoxAnnotation", "Element", "mouseX", "mouseY", "DoughnutLabelAnnotation", "drawBackground", "meta", "getDatasetMeta", "controllerMeta", "getControllerMeta", "_fitRatio", "getFitRatio", "boxSize", "controller", "DoughnutController", "isControllerVisible", "left", "top", "right", "bottom", "innerRadius", "offsetX", "offsetY", "square", "space", "_radius", "_counterclockwise", "angles", "getAngles", "hypo", "yk2", "r2", "c", "delta", "getAngleFromPoint", "_centerX", "_centerY", "_startAngle", "_endAngle", "LabelAnnotation", "visible", "getLabelSize", "hBorderWidth", "pointInLine", "p1", "p2", "t", "interpolateX", "interpolateY", "sqr", "v", "rangeLimit", "coordInCurve", "cp", "pointInCurve", "coordAngleInCurve", "angleInCurve", "LineAnnotation", "path", "mx", "my", "isOnLabel", "epsilon", "intersects", "inAxisRange", "length", "drawCurve", "startOpts", "endOpts", "startAdjust", "endAdjust", "getArrowHeads", "drawArrowHead", "inside", "isLineInArea", "limitLineToArea", "getControlPoint", "labelProperties", "resolveLabelElementProperties", "arrowHeadsDefaults", "limitPointToArea", "x1", "y1", "dx", "dy", "lenSq", "xx", "yy", "textSize", "calculateLabelPosition", "calculateAutoRotation", "sizes", "rotatedSize", "calculateT", "pt", "xCoordinateSizes", "yCoordinateSizes", "adjustLabelCoordinate", "toDegrees", "spaceAround", "calculateTAdjust", "lineSize", "lineW", "lineH", "r", "coordinate", "labelSizes", "halfSize", "line", "arrowStartOpts", "arrowEndOpts", "getLineAdjust", "arrowOpts", "offset", "fill", "backgroundColor", "borderColor", "arrowOffsetX", "drawArrowHeadOnCurve", "startAngle", "endAngle", "ps", "pe", "EllipseAnnotation", "pointInEllipse", "p", "ellipse", "xRadius", "yRadius", "cosAngle", "sinAngle", "PointAnnotation", "PolygonAnnotation", "pointIsInPolygon", "axisPoints", "first", "el", "sides", "elProps", "buildPointElement", "points", "isInside", "A", "B", "annotationTypes", "defaults", "directUpdater", "hooks$1", "resolve", "optDefs", "resolveObj", "isIndexable", "resolveType", "updateElements", "mode", "animations", "resolveAnimations", "resyncElements", "annotationOptions", "getOrCreateElement", "resolver", "getContext", "toSkip", "updateSubElements", "resolveAnnotationOptions", "animOpts", "Animations", "mainElement", "subElements", "definition", "subElement", "subResolver", "initProperties", "elementClass", "defs", "add", "version", "chartStates", "isNotDoughnutLabel", "Chart", "args", "_args", "draw", "opts", "caller", "clip", "clipArea", "drawableElements", "getDrawableElements", "drawElement", "unclipArea", "sub", "auto_default", "annotation", "healthSnapshots", "healthPriorityDatas", "COLORS", "skipped", "ctx", "value", "getOrCreateTooltip", "chart", "tooltipEl", "table", "details", "summary", "redLines", "chartElement", "chartData", "fillPattern", "keys", "labels", "key", "values", "targetVal", "maxValue", "maxY", "targetVals", "maxVals", "i", "targetType", "valueType", "populationParameter", "targetAnnotation", "content", "annotations", "externalTooltipHandler", "context", "tooltip", "titleLines", "bodyLines", "b", "tableHead", "title", "tr", "th", "text", "tableBody", "body", "td", "textContent", "tableRoot", "positionX", "positionY", "tooltipItem", "size", "plugin", "whitmanData", "washingtonData", "whitmanValues", "washingtonValues", "datasetColors", "span", "index", "ticks", "dataGroups", "dataGroup", "filterButtons", "groups", "filterButton", "group"] }