{"version":3,"sources":["webpack:///./node_modules/chart.js/src/core/core.animation.js","webpack:///./node_modules/chart.js/src/core/core.defaults.js","webpack:///./node_modules/chart.js/src/controllers/controller.line.js","webpack:///./node_modules/chart.js/src/core/core.datasetController.js","webpack:///./node_modules/chart.js/src/core/core.element.js","webpack:///./node_modules/chart.js/src/charts/Chart.Bar.js","webpack:///./node_modules/chart.js/src/charts/Chart.Bubble.js","webpack:///./node_modules/chart.js/src/charts/Chart.Scatter.js","webpack:///./node_modules/chart.js/src/charts/Chart.Doughnut.js","webpack:///./node_modules/chart.js/src/core/core.plugins.js","webpack:///./node_modules/chart.js/src/chart.js","webpack:///./node_modules/chart.js/src/controllers/controller.doughnut.js","webpack:///./node_modules/chart.js/src/controllers/controller.bar.js","webpack:///./node_modules/chart.js/src/controllers/controller.radar.js","webpack:///./node_modules/chart.js/src/controllers/controller.bubble.js","webpack:///./node_modules/chart.js/src/core/core.scale.js","webpack:///./node_modules/chart.js/src/core/core.layouts.js","webpack:///./node_modules/chart.js/src/core/core.ticks.js","webpack:///./node_modules/chart.js/src/charts/Chart.Radar.js","webpack:///./node_modules/chart.js/src/core/core.interaction.js","webpack:///./node_modules/chart.js/src/core/core.helpers.js","webpack:///./node_modules/chart.js/src/charts/Chart.PolarArea.js","webpack:///./node_modules/chart.js/src/core/core.scaleService.js","webpack:///./node_modules/chart.js/src/core/core.tooltip.js","webpack:///./node_modules/chart.js/src/core/core.js","webpack:///./node_modules/chart.js/src/controllers/controller.scatter.js","webpack:///./node_modules/chart.js/src/controllers/controller.polarArea.js","webpack:///./node_modules/chart.js/src/core/core.controller.js","webpack:///./node_modules/chart.js/src/charts/Chart.Line.js"],"names":["defaults","Element","helpers","_set","animation","duration","easing","onProgress","noop","onComplete","module","exports","Chart","Animation","extend","chart","currentStep","numSteps","render","onAnimationProgress","onAnimationComplete","animationService","frameDuration","animations","dropFrames","request","addAnimation","lazy","i","ilen","this","animating","length","push","requestAnimationFrame","cancelAnimation","index","findIndex","splice","me","requestAnimFrame","call","window","startDigest","startTime","Date","now","framesToDrop","Math","floor","advance","endTime","count","min","callback","Object","defineProperty","prototype","get","set","value","scope","values","merge","elements","showLines","spanGaps","hover","mode","scales","xAxes","type","id","yAxes","lineEnabled","dataset","options","valueOrDefault","showLine","controllers","line","DatasetController","datasetElementType","Line","dataElementType","Point","update","reset","custom","meta","getMeta","points","data","lineElementOptions","scale","getScaleForId","yAxisID","getDataset","undefined","tension","lineTension","_scale","_datasetIndex","_children","_model","backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","steppedLine","stepped","cubicInterpolationMode","pivot","updateElement","updateBezierControlPoints","getPointBackgroundColor","point","pointBackgroundColor","valueAtIndexOrDefault","getPointBorderColor","pointBorderColor","getPointBorderWidth","isNaN","pointBorderWidth","isArray","x","y","datasetIndex","yScale","xScale","xAxisID","pointOptions","radius","pointRadius","hitRadius","pointHitRadius","getPixelForValue","NaN","getBasePixel","calculatePointY","_xScale","_yScale","_index","skip","pointStyle","ds","dsMeta","sumPos","sumNeg","stacked","datasets","getDatasetMeta","isDatasetVisible","stackedRightValue","Number","getRightValue","rightValue","model","controlPoints","area","chartArea","capControlPoint","pt","max","filter","splineCurveMonotone","splineCurve","previousItem","nextItem","controlPointPreviousX","previous","controlPointPreviousY","controlPointNextX","next","controlPointNextY","capBezierPoints","left","right","top","bottom","draw","canvas","clipArea","ctx","unclipArea","setHoverStyle","hoverRadius","pointHoverRadius","hoverBackgroundColor","pointHoverBackgroundColor","getHoverColor","hoverBorderColor","pointHoverBorderColor","hoverBorderWidth","pointHoverBorderWidth","removeHoverStyle","arrayEvents","listenArrayEvents","array","listener","_chartjs","listeners","configurable","enumerable","forEach","key","method","charAt","toUpperCase","slice","base","args","Array","arguments","res","apply","each","object","unlistenArrayEvents","stub","indexOf","initialize","linkScales","addElements","updateIndex","scaleID","destroy","_data","createMetaDataset","_chart","createMetaData","metaData","addElementAndReset","element","buildOrUpdateElements","resyncElements","transition","easingValue","elementOpts","numMeta","numData","insertElements","start","onDataPush","onDataPop","pop","onDataShift","shift","onDataSplice","onDataUnshift","inherits","color","interpolate","view","ease","actual","origin","target","c0","c1","keys","hasOwnProperty","valid","mix","rgbString","isFinite","configuration","hidden","_view","clone","_start","tooltipPosition","hasValue","isNumber","Bar","context","config","Bubble","Scatter","Doughnut","plugins","_plugins","_cacheId","register","p","concat","plugin","unregister","idx","clear","getAll","notify","hook","descriptor","params","descriptors","cache","$plugins","opts","global","_invalidate","Interaction","layouts","platform","Ticks","k","Legend","legend","_element","Title","title","pluginService","PluginBase","canvasHelpers","layoutService","animateRotate","animateScale","legendCallback","text","labels","join","generateLabels","map","label","arc","arcOpts","stroke","bw","fillStyle","strokeStyle","lineWidth","onClick","e","legendItem","cutoutPercentage","rotation","PI","circumference","tooltips","callbacks","tooltipItem","dataLabel","doughnut","pie","Arc","getRingIndex","ringIndex","j","availableWidth","availableHeight","minSize","offset","startAngle","endAngle","cos","sin","end","contains0","contains90","contains180","contains270","cutout","size","width","height","getMaxBorderWidth","outerRadius","innerRadius","radiusLength","getVisibleDatasetCount","offsetX","offsetY","total","calculateTotal","animationOpts","centerX","centerY","calculateCircumference","abs","arcs","hoverWidth","computeMinSampleSize","pixels","prev","curr","isHorizontal","ticks","getTicks","getPixelForTick","computeFitCategoryTraits","ruler","ratio","thickness","barThickness","stackCount","isNullOrUndef","categoryPercentage","barPercentage","chunk","computeFlexCategoryTraits","percent","gridLines","offsetGridLines","axis","position","rectangle","borderSkipped","item","yLabel","datasetLabel","xLabel","bar","Rectangle","stack","rects","_ruler","getRuler","rectangleOptions","updateElementGeometry","vscale","getValueScale","horizontal","vpixels","calculateBarValuePixels","ipixels","calculateBarIndexPixels","head","center","getValueScaleId","getIndexScaleId","getIndexScale","_getStacks","last","stacks","getStackCount","getStackIndex","name","imeta","ivalue","controller","range","stackIndex","maxBarThickness","Infinity","rectangleElementOptions","horizontalBar","radar","_loop","pointElementOptions","pointPosition","getPointPositionForValue","xCenter","yCenter","dataPoint","r","bubble","_resolveElementOptions","dsIndex","getPixelForDecimal","_options","resolve","dataIndex","labelsFromTicks","getLineValue","lineValue","display","drawBorder","drawOnChartArea","drawTicks","tickMarkLength","zeroLineWidth","zeroLineColor","zeroLineBorderDash","zeroLineBorderDashOffset","scaleLabel","labelString","lineHeight","padding","beginAtZero","minRotation","maxRotation","mirror","reverse","autoSkip","autoSkipPadding","labelOffset","formatters","minor","major","computeTextSize","tick","font","longestText","measureText","parseFontOptions","globalDefaults","fontSize","defaultFontSize","style","fontStyle","defaultFontStyle","family","fontFamily","defaultFontFamily","fontString","parseLineHeight","toLineHeight","Scale","getPadding","paddingLeft","paddingTop","paddingRight","paddingBottom","_ticks","mergeTicksOptions","beforeUpdate","maxWidth","maxHeight","margins","longestTextCache","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","beforeTickToLabelConversion","convertTicksToLabels","afterTickToLabelConversion","beforeCalculateTickRotation","calculateTickRotation","afterCalculateTickRotation","beforeFit","fit","afterFit","afterUpdate","tickOpts","userCallback","tickFont","labelRotation","cosRotation","sinRotation","originalLabelWidth","labelWidth","tickWidth","angleRadians","toRadians","scaleLabelOpts","gridLineOpts","isFullWidth","scaleLabelLineHeight","scaleLabelPadding","toPadding","deltaHeight","largestTextWidth","tallestLabelHeightInLines","numberOfLabelLines","lineSpace","tickPadding","longestLabelWidth","labelHeight","firstLabelWidth","lastLabelWidth","handleMargins","rawValue","getLabelForIndex","getValueForPixel","innerWidth","pixel","finalVal","round","innerHeight","decimal","valueOffset","getBaseValue","_autoSkip","skipRatio","shouldSkip","maxTicks","optionTicks","tickCount","labelRotationRadians","longestRotatedLabel","result","maxTicksLimit","optionMajorTicks","isRotated","tickFontColor","fontColor","defaultFontColor","majorTickFontColor","majorTickFont","tl","scaleLabelFontColor","scaleLabelFont","itemsToDraw","axisWidth","xTickStart","xTickEnd","yTickStart","yTickEnd","lineColor","tx1","ty1","tx2","ty2","x1","y1","x2","y2","labelX","labelY","zeroLineIndex","textAlign","textBaseline","labelYOffset","xLineValue","aliasPixel","labelXOffset","isLeft","yLineValue","glWidth","glColor","glBorderDash","glBorderDashOffset","itemToDraw","save","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","restore","translate","rotate","lineCount","fillText","scaleLabelX","scaleLabelY","halfLineHeight","filterByPosition","where","v","sortByWeight","_tmpIndex_","sort","a","b","v0","v1","weight","addBox","boxes","fullWidth","removeBox","layoutItem","configure","prop","props","layoutOptions","layout","leftPadding","rightPadding","topPadding","bottomPadding","leftBoxes","rightBoxes","topBoxes","bottomBoxes","chartAreaBoxes","chartWidth","chartHeight","chartAreaWidth","chartAreaHeight","verticalBoxWidth","horizontalBoxHeight","maxChartAreaWidth","maxChartAreaHeight","minBoxSizes","getMinimumBoxSize","maxHorizontalLeftPadding","maxHorizontalRightPadding","maxVerticalTopPadding","maxVerticalBottomPadding","horizontalBox","boxPadding","verticalBox","totalLeftBoxesWidth","totalRightBoxesWidth","totalTopBoxesHeight","totalBottomBoxesHeight","fitBox","box","finalFitVerticalBox","leftPaddingAddition","topPaddingAddition","newMaxChartAreaHeight","newMaxChartAreaWidth","placeBox","minBoxSize","findNextWhere","minBox","scaleMargin","linear","tickValue","delta","logDelta","log10","tickString","numDecimal","toFixed","logarithmic","remain","pow","toExponential","Radar","getRelativePosition","native","parseVisibleItems","handler","jlen","getIntersectItems","inRange","getNearestItems","intersect","distanceMetric","minDistance","POSITIVE_INFINITY","nearestItems","getCenterPoint","distance","getDistanceMetricForAxis","useX","useY","pt1","pt2","deltaX","deltaY","sqrt","indexMode","items","modes","single","nearest","sizeA","getArea","sizeB","ret","intersectsItem","inXRange","inYRange","parseMaxStyle","styleValue","node","parentProperty","valueInPixels","parseInt","parentNode","isConstrainedValue","getConstraintDimension","domNode","maxStyle","percentageProperty","document","defaultView","constrainedNode","getComputedStyle","constrainedContainer","hasCNode","hasCContainer","infinity","configMerge","merger","source","tval","sval","scaleMerge","scaleService","getScaleDefaults","_merger","slen","collection","filterCallback","filtered","arrayToSearch","startIndex","currentItem","findPreviousWhere","n","parseFloat","almostEquals","epsilon","almostWhole","rounded","reduce","NEGATIVE_INFINITY","sign","exponent","log","LOG10E","powerOf10","isPowerOf10","degrees","toDegrees","radians","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distanceBetweenPoints","pixelWidth","firstPoint","middlePoint","afterPoint","t","current","d01","d12","s01","s12","fa","fb","EPSILON","pointBefore","pointCurrent","pointAfter","alphaK","betaK","tauK","squaredMagnitude","pointsWithTangents","deltaK","mK","pointsLen","slopeDeltaX","loop","niceNum","niceFraction","fraction","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","evt","mouseX","mouseY","originalEvent","currentTarget","srcElement","boundingRect","getBoundingClientRect","touches","clientX","clientY","getStyle","currentDevicePixelRatio","getConstraintWidth","getConstraintHeight","getMaximumWidth","container","clientWidth","w","cw","getMaximumHeight","clientHeight","h","ch","el","property","currentStyle","getPropertyValue","retinaScale","forceRatio","pixelRatio","devicePixelRatio","pixelSize","arrayOfThings","gc","garbageCollect","longest","thing","nestedThing","gcLen","string","textWidth","numberOfLines","CanvasGradient","defaultColor","console","error","colorValue","CanvasPattern","saturate","darken","PolarArea","constructors","registerScaleType","scaleConstructor","scaleDefaults","getScaleConstructor","updateScaleDefaults","additions","addScalesToLayout","enabled","titleFontStyle","titleSpacing","titleMarginBottom","titleFontColor","titleAlign","bodySpacing","bodyFontColor","bodyAlign","footerFontStyle","footerSpacing","footerMarginTop","footerFontColor","footerAlign","yPadding","xPadding","caretPadding","caretSize","cornerRadius","multiKeyBackground","displayColors","beforeTitle","tooltipItems","labelCount","afterTitle","beforeBody","beforeLabel","labelColor","activeElement","labelTextColor","afterLabel","afterBody","beforeFooter","footer","afterFooter","mergeOpacity","colorString","opacity","alpha","rgbaString","pushOrConcat","toPush","createTooltipItem","getBaseModel","tooltipOpts","xAlign","yAlign","_bodyFontFamily","bodyFontFamily","_bodyFontStyle","bodyFontStyle","_bodyAlign","bodyFontSize","_titleFontFamily","titleFontFamily","_titleFontStyle","titleFontSize","_titleAlign","_footerFontFamily","footerFontFamily","_footerFontStyle","footerFontSize","_footerAlign","legendColorBackground","getTooltipSize","tooltip","body","combinedBodyLength","bodyItem","before","lines","after","titleLineCount","footerLineCount","widthPadding","maxLineWidth","determineAlignment","lf","rf","olf","orf","yf","midX","midY","getBackgroundPoint","vm","alignment","paddingAndSize","radiusAndPadding","Tooltip","_lastActive","getTitle","getBeforeBody","getBody","bodyItems","getAfterBody","getFooter","changed","len","existingModel","active","_active","backgroundPoint","tooltipSize","caretX","caretY","labelColors","labelTextColors","positioners","_eventPosition","itemSort","dataPoints","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","tmp","drawTitle","drawBody","xLinePadding","fillLineOfText","drawColorBoxes","textColor","fillRect","strokeRect","drawFooter","drawBackground","quadraticCurveTo","closePath","hasTooltipContent","handleEvent","getElementsAtEventForMode","arrayEquals","average","pos","eventPosition","nearestElement","d","tp","responsive","responsiveAnimationDuration","maintainAspectRatio","events","onHover","animationDuration","construct","scatter","angleLines","circular","pointLabels","polarArea","countVisibleElements","visibleCount","datasetStartAngle","getDistanceFromCenterForValue","resetRadius","initConfig","updateConfig","newOptions","ensureScalesHaveIDs","buildOrUpdateScales","positionIsHorizontal","types","instances","acquireContext","uid","aspectRatio","_bufferedRender","bindEvents","resize","initToolTip","stop","silent","newWidth","newHeight","newSize","onResize","scalesOptions","scaleOptions","xAxisOptions","yAxisOptions","updated","obj","dtype","dposition","isDefault","scaleType","scaleClass","hasUpdated","buildOrUpdateControllers","newControllers","destroyDatasetMeta","ControllerClass","Error","resetElements","updateLayout","updateDatasets","lastActive","_bufferedRequest","updateDataset","animationOptions","animationObject","easingFunction","effects","stepDecimal","drawDatasets","_drawTooltip","drawDataset","getElementAtEvent","getElementsAtEvent","getElementsAtXAxis","getDatasetAtEvent","_meta","generateLegend","unbindEvents","releaseContext","toBase64Image","toDataURL","_chartInstance","_listeners","eventHandler","addEventListener","removeEventListener","updateHoverStyle","bufferedRequest","hoverOptions","Controller"],"mappings":"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","file":"js/chunk-vendors~8f4a6b7b.4587abdc.js","sourcesContent":["/* global window: false */\n'use strict';\n\nvar defaults = require('./core.defaults');\nvar Element = require('./core.element');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\tanimation: {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.Animation = Element.extend({\n\t\tchart: null, // the animation associated chart instance\n\t\tcurrentStep: 0, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @param {Chart} chart - The chart to animate.\n\t\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t\t * @param {Number} duration - The animation duration in ms.\n\t\t * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chart, animation, duration, lazy) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar i, ilen;\n\n\t\t\tanimation.chart = chart;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchart.animating = true;\n\t\t\t}\n\n\t\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tanimations.push(animation);\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (animations.length === 1) {\n\t\t\t\tthis.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\tcancelAnimation: function(chart) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animation) {\n\t\t\t\treturn animation.chart === chart;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchart.animating = false;\n\t\t\t}\n\t\t},\n\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\tvar endTime = Date.now();\n\n\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tadvance: function(count) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar animation, chart;\n\t\t\tvar i = 0;\n\n\t\t\twhile (i < animations.length) {\n\t\t\t\tanimation = animations[i];\n\t\t\t\tchart = animation.chart;\n\n\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\tchart.animating = false;\n\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation instead\n\t * @prop Chart.Animation#animationObject\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'animationObject', {\n\t\tget: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation#chart instead\n\t * @prop Chart.Animation#chartInstance\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n\t\tget: function() {\n\t\t\treturn this.chart;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.chart = value;\n\t\t}\n\t});\n\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\nmodule.exports = {\n\t/**\n\t * @private\n\t */\n\t_set: function(scope, values) {\n\t\treturn helpers.merge(this[scope] || (this[scope] = {}), values);\n\t}\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('line', {\n\tshowLines: true,\n\tspanGaps: false,\n\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\tid: 'x-axis-0'\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.valueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar area = chart.chartArea;\n\t\t\tvar ilen = points.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, area);\n\n\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tpoints[i].draw(area);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\nmodule.exports = function(Chart) {\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\ttransition: function(easingValue) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].transition(easingValue);\n\t\t\t}\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\telements[i].draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\tvar index = element._index;\n\t\t\tvar custom = element.custom || {};\n\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\tvar getHoverColor = helpers.getHoverColor;\n\t\t\tvar model = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i = 0; i < count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length - 1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n","'use strict';\n\nvar color = require('chartjs-color');\nvar helpers = require('../helpers/index');\n\nfunction interpolate(start, view, model, ease) {\n\tvar keys = Object.keys(model);\n\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\tkey = keys[i];\n\n\t\ttarget = model[key];\n\n\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\tif (!view.hasOwnProperty(key)) {\n\t\t\tview[key] = target;\n\t\t}\n\n\t\tactual = view[key];\n\n\t\tif (actual === target || key[0] === '_') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!start.hasOwnProperty(key)) {\n\t\t\tstart[key] = actual;\n\t\t}\n\n\t\torigin = start[key];\n\n\t\ttype = typeof target;\n\n\t\tif (type === typeof origin) {\n\t\t\tif (type === 'string') {\n\t\t\t\tc0 = color(origin);\n\t\t\t\tif (c0.valid) {\n\t\t\t\t\tc1 = color(target);\n\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tview[key] = target;\n\t}\n}\n\nvar Element = function(configuration) {\n\thelpers.extend(this, configuration);\n\tthis.initialize.apply(this, arguments);\n};\n\nhelpers.extend(Element.prototype, {\n\n\tinitialize: function() {\n\t\tthis.hidden = false;\n\t},\n\n\tpivot: function() {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\tme._view = helpers.clone(me._model);\n\t\t}\n\t\tme._start = {};\n\t\treturn me;\n\t},\n\n\ttransition: function(ease) {\n\t\tvar me = this;\n\t\tvar model = me._model;\n\t\tvar start = me._start;\n\t\tvar view = me._view;\n\n\t\t// No animation -> No Transition\n\t\tif (!model || ease === 1) {\n\t\t\tme._view = model;\n\t\t\tme._start = null;\n\t\t\treturn me;\n\t\t}\n\n\t\tif (!view) {\n\t\t\tview = me._view = {};\n\t\t}\n\n\t\tif (!start) {\n\t\t\tstart = me._start = {};\n\t\t}\n\n\t\tinterpolate(start, view, model, ease);\n\n\t\treturn me;\n\t},\n\n\ttooltipPosition: function() {\n\t\treturn {\n\t\t\tx: this._model.x,\n\t\t\ty: this._model.y\n\t\t};\n\t},\n\n\thasValue: function() {\n\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t}\n});\n\nElement.extend = helpers.inherits;\n\nmodule.exports = Element;\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\tplugins: {}\n});\n\n/**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\nmodule.exports = {\n\t/**\n\t * Globally registered plugins.\n\t * @private\n\t */\n\t_plugins: [],\n\n\t/**\n\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t * incremented and descriptors are regenerated during following API calls.\n\t * @private\n\t */\n\t_cacheId: 0,\n\n\t/**\n\t * Registers the given plugin(s) if not already registered.\n\t * @param {Array|Object} plugins plugin instance(s).\n\t */\n\tregister: function(plugins) {\n\t\tvar p = this._plugins;\n\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\tp.push(plugin);\n\t\t\t}\n\t\t});\n\n\t\tthis._cacheId++;\n\t},\n\n\t/**\n\t * Unregisters the given plugin(s) only if registered.\n\t * @param {Array|Object} plugins plugin instance(s).\n\t */\n\tunregister: function(plugins) {\n\t\tvar p = this._plugins;\n\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\tvar idx = p.indexOf(plugin);\n\t\t\tif (idx !== -1) {\n\t\t\t\tp.splice(idx, 1);\n\t\t\t}\n\t\t});\n\n\t\tthis._cacheId++;\n\t},\n\n\t/**\n\t * Remove all registered plugins.\n\t * @since 2.1.5\n\t */\n\tclear: function() {\n\t\tthis._plugins = [];\n\t\tthis._cacheId++;\n\t},\n\n\t/**\n\t * Returns the number of registered plugins?\n\t * @returns {Number}\n\t * @since 2.1.5\n\t */\n\tcount: function() {\n\t\treturn this._plugins.length;\n\t},\n\n\t/**\n\t * Returns all registered plugin instances.\n\t * @returns {Array} array of plugin objects.\n\t * @since 2.1.5\n\t */\n\tgetAll: function() {\n\t\treturn this._plugins;\n\t},\n\n\t/**\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 {Object} 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 {Array} [args] - Extra arguments to apply to the hook call.\n\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t */\n\tnotify: function(chart, hook, args) {\n\t\tvar descriptors = this.descriptors(chart);\n\t\tvar ilen = descriptors.length;\n\t\tvar i, descriptor, plugin, params, method;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tdescriptor = descriptors[i];\n\t\t\tplugin = descriptor.plugin;\n\t\t\tmethod = plugin[hook];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\tparams.push(descriptor.options);\n\t\t\t\tif (method.apply(plugin, params) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns descriptors of enabled plugins for the given chart.\n\t * @returns {Array} [{ plugin, options }]\n\t * @private\n\t */\n\tdescriptors: function(chart) {\n\t\tvar cache = chart.$plugins || (chart.$plugins = {});\n\t\tif (cache.id === this._cacheId) {\n\t\t\treturn cache.descriptors;\n\t\t}\n\n\t\tvar plugins = [];\n\t\tvar descriptors = [];\n\t\tvar config = (chart && chart.config) || {};\n\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\tif (idx !== -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar id = plugin.id;\n\t\t\tvar opts = options[id];\n\t\t\tif (opts === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (opts === true) {\n\t\t\t\topts = helpers.clone(defaults.global.plugins[id]);\n\t\t\t}\n\n\t\t\tplugins.push(plugin);\n\t\t\tdescriptors.push({\n\t\t\t\tplugin: plugin,\n\t\t\t\toptions: opts || {}\n\t\t\t});\n\t\t});\n\n\t\tcache.descriptors = descriptors;\n\t\tcache.id = this._cacheId;\n\t\treturn descriptors;\n\t},\n\n\t/**\n\t * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\n\t * but in some cases, this reference can be changed by the user when updating options.\n\t * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t * @private\n\t */\n\t_invalidate: function(chart) {\n\t\tdelete chart.$plugins;\n\t}\n};\n\n/**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n/**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n/**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n*/\n/**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n/**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n/**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n/**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n/**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n/**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n/**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n/**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeTooltipDraw\n * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\n * the tooltip drawing is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart tooltip drawing.\n */\n/**\n * @method IPlugin#afterTooltipDraw\n * @desc Called after drawing the `tooltip`. Note that this hook will not\n * be called if the tooltip drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n/**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n","/**\n * @namespace Chart\n */\nvar Chart = require('./core/core')();\n\nChart.helpers = require('./helpers/index');\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\nrequire('./core/core.helpers')(Chart);\n\nChart.defaults = require('./core/core.defaults');\nChart.Element = require('./core/core.element');\nChart.elements = require('./elements/index');\nChart.Interaction = require('./core/core.interaction');\nChart.layouts = require('./core/core.layouts');\nChart.platform = require('./platforms/platform');\nChart.plugins = require('./core/core.plugins');\nChart.Ticks = require('./core/core.ticks');\n\nrequire('./core/core.animation')(Chart);\nrequire('./core/core.controller')(Chart);\nrequire('./core/core.datasetController')(Chart);\nrequire('./core/core.scaleService')(Chart);\nrequire('./core/core.scale')(Chart);\nrequire('./core/core.tooltip')(Chart);\n\nrequire('./scales/scale.linearbase')(Chart);\nrequire('./scales/scale.category')(Chart);\nrequire('./scales/scale.linear')(Chart);\nrequire('./scales/scale.logarithmic')(Chart);\nrequire('./scales/scale.radialLinear')(Chart);\nrequire('./scales/scale.time')(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire('./controllers/controller.bar')(Chart);\nrequire('./controllers/controller.bubble')(Chart);\nrequire('./controllers/controller.doughnut')(Chart);\nrequire('./controllers/controller.line')(Chart);\nrequire('./controllers/controller.polarArea')(Chart);\nrequire('./controllers/controller.radar')(Chart);\nrequire('./controllers/controller.scatter')(Chart);\n\nrequire('./charts/Chart.Bar')(Chart);\nrequire('./charts/Chart.Bubble')(Chart);\nrequire('./charts/Chart.Doughnut')(Chart);\nrequire('./charts/Chart.Line')(Chart);\nrequire('./charts/Chart.PolarArea')(Chart);\nrequire('./charts/Chart.Radar')(Chart);\nrequire('./charts/Chart.Scatter')(Chart);\n\n// Loading built-it plugins\nvar plugins = require('./plugins');\nfor (var k in plugins) {\n\tif (plugins.hasOwnProperty(k)) {\n\t\tChart.plugins.register(plugins[k]);\n\t}\n}\n\nChart.platform.initialize();\n\nmodule.exports = Chart;\nif (typeof window !== 'undefined') {\n\twindow.Chart = Chart;\n}\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Legend\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\nChart.Legend = plugins.legend._element;\n\n/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Title\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\nChart.Title = plugins.title._element;\n\n/**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\nChart.pluginService = Chart.plugins;\n\n/**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\nChart.PluginBase = Chart.Element.extend({});\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nChart.canvasHelpers = Chart.helpers.canvas;\n\n/**\n * Provided for backward compatibility, use Chart.layouts instead.\n * @namespace Chart.layoutService\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\nChart.layoutService = Chart.layouts;\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('doughnut', {\n\tanimation: {\n\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\tanimateRotate: true,\n\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\tanimateScale: false\n\t},\n\thover: {\n\t\tmode: 'single'\n\t},\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t// toggle visibility of index if exists\n\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// The percentage of the chart that we cut out of the middle.\n\tcutoutPercentage: 50,\n\n\t// The rotation of the chart, where the first data arc begins.\n\trotation: Math.PI * -0.5,\n\n\t// The total circumference of the chart.\n\tcircumference: Math.PI * 2.0,\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t} else {\n\t\t\t\t\tdataLabel += value;\n\t\t\t\t}\n\n\t\t\t\treturn dataLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\ndefaults._set('pie', helpers.clone(defaults.doughnut));\ndefaults._set('pie', {\n\tcutoutPercentage: 0\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n\t\t\tvar availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n\t\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\t\tvar offset = {x: 0, y: 0};\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\t\tvar circumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (Math.abs(value) / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(arcs) {\n\t\t\tvar max = 0;\n\t\t\tvar index = this.index;\n\t\t\tvar length = arcs.length;\n\t\t\tvar borderWidth;\n\t\t\tvar hoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('bar', {\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\ttype: 'linear'\n\t\t}]\n\t}\n});\n\ndefaults._set('horizontalBar', {\n\thover: {\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'bottom'\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\tposition: 'left',\n\t\t\ttype: 'category',\n\n\t\t\t// Specific to Horizontal Bar Controller\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9,\n\n\t\t\t// offset settings\n\t\t\toffset: true,\n\n\t\t\t// grid line settings\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}]\n\t},\n\n\telements: {\n\t\trectangle: {\n\t\t\tborderSkipped: 'left'\n\t\t}\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function(item, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\n\t\t\t\tif (item.length > 0) {\n\t\t\t\t\tif (item[0].yLabel) {\n\t\t\t\t\t\ttitle = item[0].yLabel;\n\t\t\t\t\t} else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n\t\t\t\t\t\ttitle = data.labels[item[0].index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\treturn datasetLabel + ': ' + item.xLabel;\n\t\t\t}\n\t\t},\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t}\n});\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(scale, pixels) {\n\tvar min = scale.isHorizontal() ? scale.width : scale.height;\n\tvar ticks = scale.getTicks();\n\tvar prev, curr, i, ilen;\n\n\tfor (i = 1, ilen = pixels.length; i < ilen; ++i) {\n\t\tmin = Math.min(min, pixels[i] - pixels[i - 1]);\n\t}\n\n\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\tcurr = scale.getPixelForTick(i);\n\t\tmin = i > 0 ? Math.min(min, curr - prev) : min;\n\t\tprev = curr;\n\t}\n\n\treturn 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) {\n\tvar thickness = options.barThickness;\n\tvar count = ruler.stackCount;\n\tvar curr = ruler.pixels[index];\n\tvar size, ratio;\n\n\tif (helpers.isNullOrUndef(thickness)) {\n\t\tsize = ruler.min * options.categoryPercentage;\n\t\tratio = options.barPercentage;\n\t} else {\n\t\t// When bar thickness is enforced, category and bar percentages are ignored.\n\t\t// Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n\t\t// and deprecate barPercentage since this value is ignored when thickness is absolute.\n\t\tsize = thickness * count;\n\t\tratio = 1;\n\t}\n\n\treturn {\n\t\tchunk: size / count,\n\t\tratio: ratio,\n\t\tstart: curr - (size / 2)\n\t};\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) {\n\tvar pixels = ruler.pixels;\n\tvar curr = pixels[index];\n\tvar prev = index > 0 ? pixels[index - 1] : null;\n\tvar next = index < pixels.length - 1 ? pixels[index + 1] : null;\n\tvar percent = options.categoryPercentage;\n\tvar start, size;\n\n\tif (prev === null) {\n\t\t// first data: its size is double based on the next point or,\n\t\t// if it's also the last data, we use the scale end extremity.\n\t\tprev = curr - (next === null ? ruler.end - curr : next - curr);\n\t}\n\n\tif (next === null) {\n\t\t// last data: its size is also double based on the previous point.\n\t\tnext = curr + curr - prev;\n\t}\n\n\tstart = curr - ((curr - prev) / 2) * percent;\n\tsize = ((next - prev) / 2) * percent;\n\n\treturn {\n\t\tchunk: size / ruler.stackCount,\n\t\tratio: options.barPercentage,\n\t\tstart: start\n\t};\n}\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Rectangle,\n\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta;\n\n\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\tmeta = me.getMeta();\n\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar i, ilen;\n\n\t\t\tme._ruler = me.getRuler();\n\n\t\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(rects[i], i, reset);\n\t\t\t}\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\trectangle._model = {\n\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t};\n\n\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tupdateElementGeometry: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar model = rectangle._model;\n\t\t\tvar vscale = me.getValueScale();\n\t\t\tvar base = vscale.getBasePixel();\n\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\tmodel.horizontal = horizontal;\n\t\t\tmodel.base = reset ? base : vpixels.base;\n\t\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScale: function() {\n\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScale: function() {\n\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t},\n\n\t\t/**\n\t\t * Returns the stacks based on groups and bar visibility.\n\t\t * @param {Number} [last] - The dataset index\n\t\t * @returns {Array} The stack list\n\t\t * @private\n\t\t */\n\t\t_getStacks: function(last) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\t\tvar stacks = [];\n\t\t\tvar i, meta;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) &&\n\t\t\t\t\t(stacked === false ||\n\t\t\t\t\t(stacked === true && stacks.indexOf(meta.stack) === -1) ||\n\t\t\t\t\t(stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks;\n\t\t},\n\n\t\t/**\n\t\t * Returns the effective number of stacks based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackCount: function() {\n\t\t\treturn this._getStacks().length;\n\t\t},\n\n\t\t/**\n\t\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t\t * @param {Number} [datasetIndex] - The dataset index\n\t\t * @param {String} [name] - The stack name to find\n\t\t * @returns {Number} The stack index\n\t\t * @private\n\t\t */\n\t\tgetStackIndex: function(datasetIndex, name) {\n\t\t\tvar stacks = this._getStacks(datasetIndex);\n\t\t\tvar index = (name !== undefined)\n\t\t\t\t? stacks.indexOf(name)\n\t\t\t\t: -1; // indexOf returns -1 if element is not present\n\n\t\t\treturn (index === -1)\n\t\t\t\t? stacks.length - 1\n\t\t\t\t: index;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stackCount = me.getStackCount();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar isHorizontal = scale.isHorizontal();\n\t\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\t\tvar pixels = [];\n\t\t\tvar i, ilen, min;\n\n\t\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t\t}\n\n\t\t\tmin = helpers.isNullOrUndef(scale.options.barThickness)\n\t\t\t\t? computeMinSampleSize(scale, pixels)\n\t\t\t\t: -1;\n\n\t\t\treturn {\n\t\t\t\tmin: min,\n\t\t\t\tpixels: pixels,\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tstackCount: stackCount,\n\t\t\t\tscale: scale\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Note: pixel values are not clamped to the scale area.\n\t\t * @private\n\t\t */\n\t\tcalculateBarValuePixels: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar value = scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar stack = meta.stack;\n\t\t\tvar start = 0;\n\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\tif (imeta.bar &&\n\t\t\t\t\t\timeta.stack === stack &&\n\t\t\t\t\t\timeta.controller.getValueScaleId() === scale.id &&\n\t\t\t\t\t\tchart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\tivalue = scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\t\tif ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n\t\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbase = scale.getPixelForValue(start);\n\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\tsize = (head - base) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: head,\n\t\t\t\tcenter: head + size / 2\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tcalculateBarIndexPixels: function(datasetIndex, index, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar options = ruler.scale.options;\n\t\t\tvar range = options.barThickness === 'flex'\n\t\t\t\t? computeFlexCategoryTraits(index, ruler, options)\n\t\t\t\t: computeFitCategoryTraits(index, ruler, options);\n\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n\t\t\tvar center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n\t\t\tvar size = Math.min(\n\t\t\t\thelpers.valueOrDefault(options.maxBarThickness, Infinity),\n\t\t\t\trange.chunk * range.ratio);\n\n\t\t\treturn {\n\t\t\t\tbase: center - size / 2,\n\t\t\t\thead: center + size / 2,\n\t\t\t\tcenter: center,\n\t\t\t\tsize: size\n\t\t\t};\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar rects = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar ilen = rects.length;\n\t\t\tvar i = 0;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\t\trects[i].draw();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\t});\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('radar', {\n\tscale: {\n\t\ttype: 'radialLinear'\n\t},\n\telements: {\n\t\tline: {\n\t\t\ttension: 0 // no bezier in radar\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: elements.Line,\n\n\t\tdataElementType: elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_scale: scale,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('bubble', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\tposition: 'bottom',\n\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tdataElementType: elements.Point,\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar options = me._resolveElementOptions(point, index);\n\t\t\tvar data = me.getDataset().data[index];\n\t\t\tvar dsIndex = me.index;\n\n\t\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n\t\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._options = options;\n\t\t\tpoint._datasetIndex = dsIndex;\n\t\t\tpoint._index = index;\n\t\t\tpoint._model = {\n\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\tborderColor: options.borderColor,\n\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\thitRadius: options.hitRadius,\n\t\t\t\tpointStyle: options.pointStyle,\n\t\t\t\tradius: reset ? 0 : options.radius,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t};\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n\t\t\tmodel.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n\t\t\tmodel.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t\t\tmodel.radius = options.radius + options.hoverRadius;\n\t\t},\n\n\t\t/**\n\t\t * @protected\n\t\t */\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar model = point._model;\n\t\t\tvar options = point._options;\n\n\t\t\tmodel.backgroundColor = options.backgroundColor;\n\t\t\tmodel.borderColor = options.borderColor;\n\t\t\tmodel.borderWidth = options.borderWidth;\n\t\t\tmodel.radius = options.radius;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\t_resolveElementOptions: function(point, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar dataset = datasets[me.index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar options = chart.options.elements.point;\n\t\t\tvar resolve = helpers.options.resolve;\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar values = {};\n\t\t\tvar i, ilen, key;\n\n\t\t\t// Scriptable options\n\t\t\tvar context = {\n\t\t\t\tchart: chart,\n\t\t\t\tdataIndex: index,\n\t\t\t\tdataset: dataset,\n\t\t\t\tdatasetIndex: me.index\n\t\t\t};\n\n\t\t\tvar keys = [\n\t\t\t\t'backgroundColor',\n\t\t\t\t'borderColor',\n\t\t\t\t'borderWidth',\n\t\t\t\t'hoverBackgroundColor',\n\t\t\t\t'hoverBorderColor',\n\t\t\t\t'hoverBorderWidth',\n\t\t\t\t'hoverRadius',\n\t\t\t\t'hitRadius',\n\t\t\t\t'pointStyle'\n\t\t\t];\n\n\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\tkey = keys[i];\n\t\t\t\tvalues[key] = resolve([\n\t\t\t\t\tcustom[key],\n\t\t\t\t\tdataset[key],\n\t\t\t\t\toptions[key]\n\t\t\t\t], context, index);\n\t\t\t}\n\n\t\t\t// Custom radius resolution\n\t\t\tvalues.radius = resolve([\n\t\t\t\tcustom.radius,\n\t\t\t\tdata ? data.r : undefined,\n\t\t\t\tdataset.radius,\n\t\t\t\toptions.radius\n\t\t\t], context, index);\n\n\t\t\treturn values;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar Element = require('./core.element');\nvar helpers = require('../helpers/index');\nvar Ticks = require('./core.ticks');\n\ndefaults._set('scale', {\n\tdisplay: true,\n\tposition: 'left',\n\toffset: false,\n\n\t// grid line settings\n\tgridLines: {\n\t\tdisplay: true,\n\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\tlineWidth: 1,\n\t\tdrawBorder: true,\n\t\tdrawOnChartArea: true,\n\t\tdrawTicks: true,\n\t\ttickMarkLength: 10,\n\t\tzeroLineWidth: 1,\n\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\tzeroLineBorderDash: [],\n\t\tzeroLineBorderDashOffset: 0.0,\n\t\toffsetGridLines: false,\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0\n\t},\n\n\t// scale label\n\tscaleLabel: {\n\t\t// display property\n\t\tdisplay: false,\n\n\t\t// actual label\n\t\tlabelString: '',\n\n\t\t// line height\n\t\tlineHeight: 1.2,\n\n\t\t// top/bottom padding\n\t\tpadding: {\n\t\t\ttop: 4,\n\t\t\tbottom: 4\n\t\t}\n\t},\n\n\t// label settings\n\tticks: {\n\t\tbeginAtZero: false,\n\t\tminRotation: 0,\n\t\tmaxRotation: 50,\n\t\tmirror: false,\n\t\tpadding: 0,\n\t\treverse: false,\n\t\tdisplay: true,\n\t\tautoSkip: true,\n\t\tautoSkipPadding: 0,\n\t\tlabelOffset: 0,\n\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\tcallback: Ticks.formatters.values,\n\t\tminor: {},\n\t\tmajor: {}\n\t}\n});\n\nfunction labelsFromTicks(ticks) {\n\tvar labels = [];\n\tvar i, ilen;\n\n\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\tlabels.push(ticks[i].label);\n\t}\n\n\treturn labels;\n}\n\nfunction getLineValue(scale, index, offsetGridLines) {\n\tvar lineValue = scale.getPixelForTick(index);\n\n\tif (offsetGridLines) {\n\t\tif (index === 0) {\n\t\t\tlineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n\t\t} else {\n\t\t\tlineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n\t\t}\n\t}\n\treturn lineValue;\n}\n\nmodule.exports = function(Chart) {\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\tvar globalDefaults = defaults.global;\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tfunction parseLineHeight(options) {\n\t\treturn helpers.options.toLineHeight(\n\t\t\thelpers.valueOrDefault(options.lineHeight, 1.2),\n\t\t\thelpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n\t}\n\n\tChart.Scale = Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Returns the scale tick objects ({label, major})\n\t\t * @since 2.7\n\t\t */\n\t\tgetTicks: function() {\n\t\t\treturn this._ticks;\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tmergeTicksOptions: function() {\n\t\t\tvar ticks = this.options.ticks;\n\t\t\tif (ticks.minor === false) {\n\t\t\t\tticks.minor = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (ticks.major === false) {\n\t\t\t\tticks.major = {\n\t\t\t\t\tdisplay: false\n\t\t\t\t};\n\t\t\t}\n\t\t\tfor (var key in ticks) {\n\t\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\t\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t\t// around for long time and not marked as private, we can't change its structure\n\t\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t\t// use scale.getTicks() instead.\n\n\t\t\tme.beforeBuildTicks();\n\n\t\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\t\tticks = me.buildTicks() || [];\n\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\n\t\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t\t// this method and supposed to contain only string values).\n\t\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\tme.ticks = labels; // BACKWARD COMPATIBILITY\n\n\t\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\t\tlabel = labels[i];\n\t\t\t\ttick = ticks[i];\n\t\t\t\tif (!tick) {\n\t\t\t\t\tticks.push(tick = {\n\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\tmajor: false\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttick.label = label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme._ticks = ticks;\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tvar scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n\t\t\t\tvar deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += deltaHeight;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += deltaHeight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * (tallestLabelHeightInLines - 1))\n\t\t\t\t\t\t+ lineSpace; // padding\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t\t}\n\n\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (helpers.isNullOrUndef(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof rawValue === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (rawValue) {\n\t\t\t\tif (this.isHorizontal()) {\n\t\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t\t}\n\t\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t/**\n\t\t * Used to get the value to display in the tooltip for the data at the given index\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param value\n\t\t * @param index\n\t\t * @param datasetIndex\n\t\t */\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t/**\n\t\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t * @param pixel\n\t\t */\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t/**\n\t\t * Returns the location of the tick at the given index\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForTick: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar offset = me.options.offset;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (offset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me._ticks.length - 1)));\n\t\t},\n\n\t\t/**\n\t\t * Utility for getting the pixel location of a percentage of scale\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetPixelForDecimal: function(decimal) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\t/**\n\t\t * Returns the pixel for the minimum chart value\n\t\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t\t */\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.beginAtZero ? 0 :\n\t\t\t\tmin < 0 && max < 0 ? max :\n\t\t\t\tmin > 0 && max > 0 ? min :\n\t\t\t\t0;\n\t\t},\n\n\t\t/**\n\t\t * Returns a subset of ticks to be plotted to avoid overlapping labels.\n\t\t * @private\n\t\t */\n\t\t_autoSkip: function(ticks) {\n\t\t\tvar skipRatio;\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar optionTicks = me.options.ticks.minor;\n\t\t\tvar tickCount = ticks.length;\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\t\t\tvar result = [];\n\t\t\tvar i, tick, shouldSkip;\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && tickCount > maxTicks) {\n\t\t\t\t\tskipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\t\ttick = ticks[i];\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tshouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n\t\t\t\tif (shouldSkip && i !== tickCount - 1) {\n\t\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\t\tdelete tick.label;\n\t\t\t\t}\n\t\t\t\tresult.push(tick);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = defaults.global;\n\t\t\tvar optionTicks = options.ticks.minor;\n\t\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\t\tvar tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\t\t\tvar majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar majorTickFont = parseFontOptions(optionMajorTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\tvar scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tvar axisWidth = me.options.gridLines.lineWidth;\n\t\t\tvar xTickStart = options.position === 'right' ? me.right : me.right - axisWidth - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.right + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top + axisWidth : me.bottom - tl - axisWidth;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + axisWidth + tl : me.bottom + axisWidth;\n\n\t\t\thelpers.each(ticks, function(tick, index) {\n\t\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\t\tif (helpers.isNullOrUndef(tick.label)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar label = tick.label;\n\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\tborderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\tborderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\t\t\t\tvar tickPadding = optionTicks.padding;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'top' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated ? 'bottom' : 'middle';\n\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (xLineValue < me.left) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\txLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom + axisWidth;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\tif (yLineValue < me.top) {\n\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t}\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\tlabelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right + axisWidth;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tmajor: tick.major,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n\t\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tvar lineCount = label.length;\n\t\t\t\t\t\tvar lineHeight = tickFont.size * 1.5;\n\t\t\t\t\t\tvar y = me.isHorizontal() ? 0 : -lineHeight * (lineCount - 1) / 2;\n\n\t\t\t\t\t\tfor (var i = 0; i < lineCount; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\t\t\t\tvar halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom'\n\t\t\t\t\t\t? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n\t\t\t\t\t\t: me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft\n\t\t\t\t\t\t? me.left + halfLineHeight + scaleLabelPadding.top\n\t\t\t\t\t\t: me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left;\n\t\t\t\tvar x2 = me.right + axisWidth;\n\t\t\t\tvar y1 = me.top;\n\t\t\t\tvar y2 = me.bottom + axisWidth;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\nfunction filterByPosition(array, position) {\n\treturn helpers.where(array, function(v) {\n\t\treturn v.position === position;\n\t});\n}\n\nfunction sortByWeight(array, reverse) {\n\tarray.forEach(function(v, i) {\n\t\tv._tmpIndex_ = i;\n\t\treturn v;\n\t});\n\tarray.sort(function(a, b) {\n\t\tvar v0 = reverse ? b : a;\n\t\tvar v1 = reverse ? a : b;\n\t\treturn v0.weight === v1.weight ?\n\t\t\tv0._tmpIndex_ - v1._tmpIndex_ :\n\t\t\tv0.weight - v1.weight;\n\t});\n\tarray.forEach(function(v) {\n\t\tdelete v._tmpIndex_;\n\t});\n}\n\n/**\n * @interface ILayoutItem\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} fullWidth - 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} 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.\nmodule.exports = {\n\tdefaults: {},\n\n\t/**\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 {ILayoutItem} item - the item to add to be layed out\n\t */\n\taddBox: function(chart, item) {\n\t\tif (!chart.boxes) {\n\t\t\tchart.boxes = [];\n\t\t}\n\n\t\t// initialize item with default values\n\t\titem.fullWidth = item.fullWidth || false;\n\t\titem.position = item.position || 'top';\n\t\titem.weight = item.weight || 0;\n\n\t\tchart.boxes.push(item);\n\t},\n\n\t/**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {Object} layoutItem - the item to remove from the layout\n\t */\n\tremoveBox: function(chart, layoutItem) {\n\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\tif (index !== -1) {\n\t\t\tchart.boxes.splice(index, 1);\n\t\t}\n\t},\n\n\t/**\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 {Object} item - the item to configure with the given options\n\t * @param {Object} options - the new item options.\n\t */\n\tconfigure: function(chart, item, options) {\n\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\tvar ilen = props.length;\n\t\tvar i = 0;\n\t\tvar prop;\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\tprop = props[i];\n\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\titem[prop] = options[prop];\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\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\t */\n\tupdate: function(chart, width, height) {\n\t\tif (!chart) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar layoutOptions = chart.options.layout || {};\n\t\tvar padding = helpers.options.toPadding(layoutOptions.padding);\n\t\tvar leftPadding = padding.left;\n\t\tvar rightPadding = padding.right;\n\t\tvar topPadding = padding.top;\n\t\tvar bottomPadding = padding.bottom;\n\n\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\tsortByWeight(leftBoxes, true);\n\t\tsortByWeight(rightBoxes, false);\n\t\tsortByWeight(topBoxes, true);\n\t\tsortByWeight(bottomBoxes, false);\n\n\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t// Our canvas looks like the following.\n\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t// B1 is the bottom axis\n\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t// an error will be thrown.\n\t\t//\n\t\t// |----------------------------------------------------|\n\t\t// | T1 (Full Width) |\n\t\t// |----------------------------------------------------|\n\t\t// | | | T2 | |\n\t\t// | |----|-------------------------------------|----|\n\t\t// | | | C1 | | C2 | |\n\t\t// | | |----| |----| |\n\t\t// | | | | |\n\t\t// | L1 | L2 | ChartArea (C0) | R1 |\n\t\t// | | | | |\n\t\t// | | |----| |----| |\n\t\t// | | | C3 | | C4 | |\n\t\t// | |----|-------------------------------------|----|\n\t\t// | | | B1 | |\n\t\t// |----------------------------------------------------|\n\t\t// | B2 (Full Width) |\n\t\t// |----------------------------------------------------|\n\t\t//\n\t\t// What we do to find the best sizing, we do the following\n\t\t// 1. Determine the minimum size of the chart area.\n\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t// 6. Refit each axis\n\t\t// 7. Position each axis in the final location\n\t\t// 8. Tell the chart the final location of the chart area\n\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t// Step 1\n\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t// Step 2\n\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t// Step 3\n\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t// Step 4\n\t\tvar maxChartAreaWidth = chartWidth;\n\t\tvar maxChartAreaHeight = chartHeight;\n\t\tvar minBoxSizes = [];\n\n\t\tfunction getMinimumBoxSize(box) {\n\t\t\tvar minSize;\n\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t} else {\n\t\t\t\tminSize = box.update(verticalBoxWidth, maxChartAreaHeight);\n\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t}\n\n\t\t\tminBoxSizes.push({\n\t\t\t\thorizontal: isHorizontal,\n\t\t\t\tminSize: minSize,\n\t\t\t\tbox: box,\n\t\t\t});\n\t\t}\n\n\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\tvar maxHorizontalLeftPadding = 0;\n\t\tvar maxHorizontalRightPadding = 0;\n\t\tvar maxVerticalTopPadding = 0;\n\t\tvar maxVerticalBottomPadding = 0;\n\n\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t}\n\t\t});\n\n\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\tif (verticalBox.getPadding) {\n\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t}\n\t\t});\n\n\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t// be if the axes are drawn at their minimum sizes.\n\t\t// Steps 5 & 6\n\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\tvar totalRightBoxesWidth = rightPadding;\n\t\tvar totalTopBoxesHeight = topPadding;\n\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t// Function to fit a box\n\t\tfunction fitBox(box) {\n\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\treturn minBox.box === box;\n\t\t\t});\n\n\t\t\tif (minBoxSize) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t};\n\n\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t} else {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\thelpers.each(leftBoxes, function(box) {\n\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t});\n\n\t\thelpers.each(rightBoxes, function(box) {\n\t\t\ttotalRightBoxesWidth += box.width;\n\t\t});\n\n\t\t// Set the Left and Right margins for the horizontal boxes\n\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\thelpers.each(topBoxes, function(box) {\n\t\t\ttotalTopBoxesHeight += box.height;\n\t\t});\n\n\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t});\n\n\t\tfunction finalFitVerticalBox(box) {\n\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\treturn minSize.box === box;\n\t\t\t});\n\n\t\t\tvar scaleMargin = {\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t};\n\n\t\t\tif (minBoxSize) {\n\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t}\n\t\t}\n\n\t\t// Let the left layout know the final margin\n\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\ttotalLeftBoxesWidth = leftPadding;\n\t\ttotalRightBoxesWidth = rightPadding;\n\t\ttotalTopBoxesHeight = topPadding;\n\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\thelpers.each(leftBoxes, function(box) {\n\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t});\n\n\t\thelpers.each(rightBoxes, function(box) {\n\t\t\ttotalRightBoxesWidth += box.width;\n\t\t});\n\n\t\thelpers.each(topBoxes, function(box) {\n\t\t\ttotalTopBoxesHeight += box.height;\n\t\t});\n\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t});\n\n\t\t// We may be adding some padding to account for rotated x axis labels\n\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t// without calling `fit` again\n\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t}\n\n\t\t// Step 7 - Position the boxes\n\t\tvar left = leftPadding + leftPaddingAddition;\n\t\tvar top = topPadding + topPaddingAddition;\n\n\t\tfunction placeBox(box) {\n\t\t\tif (box.isHorizontal()) {\n\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\tbox.top = top;\n\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t// Move to next point\n\t\t\t\ttop = box.bottom;\n\n\t\t\t} else {\n\n\t\t\t\tbox.left = left;\n\t\t\t\tbox.right = left + box.width;\n\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t// Move to next point\n\t\t\t\tleft = box.right;\n\t\t\t}\n\t\t}\n\n\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t// Account for chart width and height\n\t\tleft += maxChartAreaWidth;\n\t\ttop += maxChartAreaHeight;\n\n\t\thelpers.each(rightBoxes, placeBox);\n\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t// Step 8\n\t\tchart.chartArea = {\n\t\t\tleft: totalLeftBoxesWidth,\n\t\t\ttop: totalTopBoxesHeight,\n\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t};\n\n\t\t// Step 9\n\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\tbox.left = chart.chartArea.left;\n\t\t\tbox.top = chart.chartArea.top;\n\t\t\tbox.right = chart.chartArea.right;\n\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t});\n\t}\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nmodule.exports = {\n\t/**\n\t * Namespace to hold formatters for different types of ticks\n\t * @namespace Chart.Ticks.formatters\n\t */\n\tformatters: {\n\t\t/**\n\t\t * Formatter for value labels\n\t\t * @method Chart.Ticks.formatters.values\n\t\t * @param value the value to display\n\t\t * @return {String|Array} the label to display\n\t\t */\n\t\tvalues: function(value) {\n\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t},\n\n\t\t/**\n\t\t * Formatter for linear numeric ticks\n\t\t * @method Chart.Ticks.formatters.linear\n\t\t * @param tickValue {Number} the value to be formatted\n\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t * @param ticks {Array} the list of ticks being converted\n\t\t * @return {String} string representation of the tickValue parameter\n\t\t */\n\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t// not an integer\n\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\tvar tickString = '';\n\n\t\t\tif (tickValue !== 0) {\n\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t} else {\n\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t}\n\n\t\t\treturn tickString;\n\t\t},\n\n\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\tif (tickValue === 0) {\n\t\t\t\treturn '0';\n\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\treturn tickValue.toExponential();\n\t\t\t}\n\t\t\treturn '';\n\t\t}\n\t}\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nvar helpers = require('../helpers/index');\n\n/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\nfunction getRelativePosition(e, chart) {\n\tif (e.native) {\n\t\treturn {\n\t\t\tx: e.x,\n\t\t\ty: e.y\n\t\t};\n\t}\n\n\treturn helpers.getRelativePosition(e, chart);\n}\n\n/**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\nfunction parseVisibleItems(chart, handler) {\n\tvar datasets = chart.data.datasets;\n\tvar meta, i, j, ilen, jlen;\n\n\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tmeta = chart.getDatasetMeta(i);\n\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\tvar element = meta.data[j];\n\t\t\tif (!element._view.skip) {\n\t\t\t\thandler(element);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\nfunction getIntersectItems(chart, position) {\n\tvar elements = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (element.inRange(position.x, position.y)) {\n\t\t\telements.push(element);\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\nfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\tvar minDistance = Number.POSITIVE_INFINITY;\n\tvar nearestItems = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar center = element.getCenterPoint();\n\t\tvar distance = distanceMetric(position, center);\n\n\t\tif (distance < minDistance) {\n\t\t\tnearestItems = [element];\n\t\t\tminDistance = distance;\n\t\t} else if (distance === minDistance) {\n\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\tnearestItems.push(element);\n\t\t}\n\t});\n\n\treturn nearestItems;\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\n */\nfunction getDistanceMetricForAxis(axis) {\n\tvar useX = axis.indexOf('x') !== -1;\n\tvar useY = axis.indexOf('y') !== -1;\n\n\treturn function(pt1, pt2) {\n\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t};\n}\n\nfunction indexMode(chart, e, options) {\n\tvar position = getRelativePosition(e, chart);\n\t// Default axis for index mode is 'x' to match old behaviour\n\toptions.axis = options.axis || 'x';\n\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\tvar elements = [];\n\n\tif (!items.length) {\n\t\treturn [];\n\t}\n\n\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\tvar element = meta.data[items[0]._index];\n\n\t\t\t// don't count items that are skipped (null data)\n\t\t\tif (element && !element._view.skip) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * @interface IInteractionOptions\n */\n/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nmodule.exports = {\n\t// Helper function for different modes\n\tmodes: {\n\t\tsingle: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar elements = [];\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t\treturn elements;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn elements.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.label\n\t\t * @deprecated since version 2.4.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tlabel: indexMode,\n\n\t\t/**\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 e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tindex: indexMode,\n\n\t\t/**\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 e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tdataset: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\tif (items.length > 0) {\n\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.x-axis\n\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\t'x-axis': function(chart, e) {\n\t\t\treturn indexMode(chart, e, {intersect: false});\n\t\t},\n\n\t\t/**\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 e {Event} the event we are find things at\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tpoint: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\treturn getIntersectItems(chart, position);\n\t\t},\n\n\t\t/**\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 e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tnearest: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\tif (nearestItems.length > 1) {\n\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Return only 1 item\n\t\t\treturn nearestItems.slice(0, 1);\n\t\t},\n\n\t\t/**\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 e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tx: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\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 e {Event} the event we are find things at\n\t\t * @param options {IInteractionOptions} options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\ty: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t}\n\t}\n};\n","/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require('chartjs-color');\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\n\nmodule.exports = function(Chart) {\n\n\t// -- Basic js utility methods\n\n\thelpers.configMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tvar tval = target[key] || {};\n\t\t\t\tvar sval = source[key];\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\t\ttarget[key] = helpers.scaleMerge(tval, sval);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\t\ttarget[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.scaleMerge = function(/* objects ... */) {\n\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, target, source, options) {\n\t\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t\tvar slen = source[key].length;\n\t\t\t\t\tvar i, type, scale;\n\n\t\t\t\t\tif (!target[key]) {\n\t\t\t\t\t\ttarget[key] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\t\ttype = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n\t\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\n\t\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\t\thelpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\t\thelpers.merge(target[key][i], scale);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex ?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined ? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign ?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10 ?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tvar exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n\t\t\t// Check for whole powers of 10,\n\t\t\t// which due to floating point rounding error should be corrected.\n\t\t\tvar powerOf10 = Math.round(exponent);\n\t\t\tvar isPowerOf10 = x === Math.pow(10, powerOf10);\n\n\t\t\treturn isPowerOf10 ? powerOf10 : exponent;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\n\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\n\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\n\t\tvar current = middlePoint;\n\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn function(callback) {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t}\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt;\n\t\tvar canvas = evt.currentTarget || evt.srcElement;\n\t\tvar boundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof styleValue === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientWidth;\n\t\t}\n\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tif (!container) {\n\t\t\treturn domNode.clientHeight;\n\t\t}\n\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart, forceRatio) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tif (!canvas.style.height && !canvas.style.width) {\n\t\t\tcanvas.style.height = height + 'px';\n\t\t\tcanvas.style.width = width + 'px';\n\t\t}\n\t};\n\t// -- Canvas methods\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\n\thelpers.color = !color ?\n\t\tfunction(value) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn value;\n\t\t} :\n\t\tfunction(value) {\n\t\t\t/* global CanvasGradient */\n\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\tvalue = defaults.global.defaultColor;\n\t\t\t}\n\n\t\t\treturn color(value);\n\t\t};\n\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\nvar layouts = require('./core.layouts');\n\nmodule.exports = function(Chart) {\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, scaleDefaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(scaleDefaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar me = this;\n\t\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\t\tme.defaults[type] = helpers.extend(me.defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chart) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chart.scales, function(scale) {\n\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\tscale.position = scale.options.position;\n\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\tlayouts.addBox(chart, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar Element = require('./core.element');\nvar helpers = require('../helpers/index');\n\ndefaults._set('global', {\n\ttooltips: {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretPadding: 2,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tborderColor: 'rgba(0,0,0,0)',\n\t\tborderWidth: 0,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\tif (label) {\n\t\t\t\t\tlabel += ': ';\n\t\t\t\t}\n\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\treturn label;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chart) {\n\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tlabelTextColor: function() {\n\t\t\t\treturn this._options.bodyFontColor;\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index;\n\t\tvar datasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = defaults.global;\n\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize;\n\t\tvar bodyFontSize = model.bodyFontSize;\n\t\tvar footerFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chart.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width + model.caretSize + model.caretPadding > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width - model.caretSize - model.caretPadding < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @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\t */\n\tfunction getBackgroundPoint(vm, size, alignment, chart) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize;\n\t\tvar caretPadding = vm.caretPadding;\n\t\tvar cornerRadius = vm.cornerRadius;\n\t\tvar xAlign = alignment.xAlign;\n\t\tvar yAlign = alignment.yAlign;\n\t\tvar paddingAndSize = caretSize + caretPadding;\n\t\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t\tif (x + size.width > chart.width) {\n\t\t\t\tx = chart.width - size.width;\n\t\t\t}\n\t\t\tif (x < 0) {\n\t\t\t\tx = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t\tthis._lastActive = [];\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\t\tvar title = callbacks.title.apply(me, arguments);\n\t\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\tvar labelTextColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t\t});\n\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\tmodel.labelColors = labelColors;\n\t\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size) {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t},\n\t\tgetCaretPosition: function(tooltipPoint, size, vm) {\n\t\t\tvar x1, x2, x3, y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x;\n\t\t\tvar ptY = tooltipPoint.y;\n\t\t\tvar width = size.width;\n\t\t\tvar height = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\ty2 = ptY + (height / 2);\n\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = vm.caretX;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t\t// invert drawing order\n\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t\tx1 = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\tctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\tvar textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar x = pt.x;\n\t\t\tvar y = pt.y;\n\t\t\tvar width = tooltipSize.width;\n\t\t\tvar height = tooltipSize.height;\n\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x + radius, y);\n\t\t\tif (yAlign === 'top') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\tif (yAlign === 'bottom') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x, y + radius);\n\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\tctx.closePath();\n\n\t\t\tctx.fill();\n\n\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t// Only handle target event on tooltip change\n\t\t\tif (changed) {\n\t\t\t\tme._lastActive = me._active;\n\n\t\t\t\tif (options.enabled || options.custom) {\n\t\t\t\t\tme._eventPosition = {\n\t\t\t\t\t\tx: e.x,\n\t\t\t\t\t\ty: e.y\n\t\t\t\t\t};\n\n\t\t\t\t\tme.update(true);\n\t\t\t\t\tme.pivot();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len, nearestElement;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t};\n\t\t}\n\t};\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\n\ndefaults._set('global', {\n\tresponsive: true,\n\tresponsiveAnimationDuration: 0,\n\tmaintainAspectRatio: true,\n\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\thover: {\n\t\tonHover: null,\n\t\tmode: 'nearest',\n\t\tintersect: true,\n\t\tanimationDuration: 400\n\t},\n\tonClick: null,\n\tdefaultColor: 'rgba(0,0,0,0.1)',\n\tdefaultFontColor: '#666',\n\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\tdefaultFontSize: 12,\n\tdefaultFontStyle: 'normal',\n\tshowLines: true,\n\n\t// Element defaults defined in element extensions\n\telements: {},\n\n\t// Layout options such as padding\n\tlayout: {\n\t\tpadding: {\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0\n\t\t}\n\t}\n});\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.construct(item, config);\n\t\treturn this;\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\n\ndefaults._set('scatter', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\tid: 'x-axis-1', // need an ID so datasets can reference the scale\n\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\tposition: 'bottom'\n\t\t}],\n\t\tyAxes: [{\n\t\t\tid: 'y-axis-1',\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left'\n\t\t}]\n\t},\n\n\tshowLines: false,\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn ''; // doesn't make sense for scatter since data are formatted as a point\n\t\t\t},\n\t\t\tlabel: function(item) {\n\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\n\n};\n","'use strict';\n\nvar defaults = require('../core/core.defaults');\nvar elements = require('../elements/index');\nvar helpers = require('../helpers/index');\n\ndefaults._set('polarArea', {\n\tscale: {\n\t\ttype: 'radialLinear',\n\t\tangleLines: {\n\t\t\tdisplay: false\n\t\t},\n\t\tgridLines: {\n\t\t\tcircular: true\n\t\t},\n\t\tpointLabels: {\n\t\t\tdisplay: false\n\t\t},\n\t\tticks: {\n\t\t\tbeginAtZero: true\n\t\t}\n\t},\n\n\t// Boolean - Whether to animate the rotation of the chart\n\tanimation: {\n\t\tanimateRotate: true,\n\t\tanimateScale: true\n\t},\n\n\tstartAngle: -0.5 * Math.PI,\n\tlegendCallback: function(chart) {\n\t\tvar text = [];\n\t\ttext.push('');\n\t\treturn text.join('');\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\nmodule.exports = function(Chart) {\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n","'use strict';\n\nvar defaults = require('./core.defaults');\nvar helpers = require('../helpers/index');\nvar Interaction = require('./core.interaction');\nvar layouts = require('./core.layouts');\nvar platform = require('../platforms/platform');\nvar plugins = require('./core.plugins');\n\nmodule.exports = function(Chart) {\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tdefaults.global,\n\t\t\tdefaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\thelpers.each(chart.scales, function(scale) {\n\t\t\tlayouts.removeBox(chart, scale);\n\t\t});\n\n\t\tnewOptions = helpers.configMerge(\n\t\t\tChart.defaults.global,\n\t\t\tChart.defaults[chart.config.type],\n\t\t\tnewOptions);\n\n\t\tchart.options = chart.config.options = newOptions;\n\t\tchart.ensureScalesHaveIDs();\n\t\tchart.buildOrUpdateScales();\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t\tchart.tooltip.initialize();\n\t}\n\n\tfunction positionIsHorizontal(position) {\n\t\treturn position === 'top' || position === 'bottom';\n\t}\n\n\thelpers.extend(Chart.prototype, /** @lends Chart */ {\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tconstruct: function(item, config) {\n\t\t\tvar me = this;\n\n\t\t\tconfig = initConfig(config);\n\n\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\tvar canvas = context && context.canvas;\n\t\t\tvar height = canvas && canvas.height;\n\t\t\tvar width = canvas && canvas.width;\n\n\t\t\tme.id = helpers.uid();\n\t\t\tme.ctx = context;\n\t\t\tme.canvas = canvas;\n\t\t\tme.config = config;\n\t\t\tme.width = width;\n\t\t\tme.height = height;\n\t\t\tme.aspectRatio = height ? width / height : null;\n\t\t\tme.options = config.options;\n\t\t\tme._bufferedRender = false;\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n\t\t\t * the \"instance\" still need to be defined since it might be called from plugins.\n\t\t\t * @prop Chart#chart\n\t\t\t * @deprecated since version 2.6.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tme.chart = me;\n\t\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t\t// Add the chart instance to the global namespace\n\t\t\tChart.instances[me.id] = me;\n\n\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn me.config.data;\n\t\t\t\t},\n\t\t\t\tset: function(value) {\n\t\t\t\t\tme.config.data = value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!context || !canvas) {\n\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tme.initialize();\n\t\t\tme.update();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me, me.options.devicePixelRatio);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildOrUpdateScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.canvas.clear(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n\t\t\tvar newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n\t\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = me.width = newWidth;\n\t\t\tcanvas.height = me.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(me, options.devicePixelRatio);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildOrUpdateScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales || {};\n\t\t\tvar items = [];\n\t\t\tvar updated = Object.keys(scales).reduce(function(obj, id) {\n\t\t\t\tobj[id] = false;\n\t\t\t\treturn obj;\n\t\t\t}, {});\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({\n\t\t\t\t\toptions: options.scale,\n\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\tisDefault: true,\n\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar id = scaleOptions.id;\n\t\t\t\tvar scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n\n\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t}\n\n\t\t\t\tupdated[id] = true;\n\t\t\t\tvar scale = null;\n\t\t\t\tif (id in scales && scales[id].type === scaleType) {\n\t\t\t\t\tscale = scales[id];\n\t\t\t\t\tscale.options = scaleOptions;\n\t\t\t\t\tscale.ctx = me.ctx;\n\t\t\t\t\tscale.chart = me;\n\t\t\t\t} else {\n\t\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\t\tif (!scaleClass) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tscale = new scaleClass({\n\t\t\t\t\t\tid: id,\n\t\t\t\t\t\ttype: scaleType,\n\t\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\t\tchart: me\n\t\t\t\t\t});\n\t\t\t\t\tscales[scale.id] = scale;\n\t\t\t\t}\n\n\t\t\t\tscale.mergeTicksOptions();\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// clear up discarded scales\n\t\t\thelpers.each(updated, function(hasUpdated, id) {\n\t\t\t\tif (!hasUpdated) {\n\t\t\t\t\tdelete scales[id];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.scales = scales;\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t}\n\t\t\t\tmeta.type = type;\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t\tmeta.controller.linkScales();\n\t\t\t\t} else {\n\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tupdateConfig(me);\n\n\t\t\t// plugins options references might have change, let's invalidate the cache\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t\t\tplugins._invalidate(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\tif (me.options.animation && me.options.animation.duration) {\n\t\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\t\tcontroller.reset();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t\t// after update.\n\t\t\tme.tooltip.initialize();\n\n\t\t\t// Last active contains items that were previously in the tooltip.\n\t\t\t// When we reset the tooltip, we need to clear it\n\t\t\tme.lastActive = [];\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tduration: config.duration,\n\t\t\t\t\teasing: config.easing,\n\t\t\t\t\tlazy: config.lazy\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(config);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlayouts.update(this, this.width, this.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.updateDataset(i);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\t/**\n\t\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDataset: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.update();\n\n\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t},\n\n\t\trender: function(config) {\n\t\t\tvar me = this;\n\n\t\t\tif (!config || typeof config !== 'object') {\n\t\t\t\t// backwards compatibility\n\t\t\t\tconfig = {\n\t\t\t\t\tduration: config,\n\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar duration = config.duration;\n\t\t\tvar lazy = config.lazy;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function(animation) {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation({\n\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\t\trender: function(chart, animationObject) {\n\t\t\t\t\t\tvar easingFunction = helpers.easing.effects[animationObject.easing];\n\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t},\n\n\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t});\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\n\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\tonComplete(new Chart.Animation({numSteps: 0, chart: me}));\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (helpers.isNullOrUndef(easingValue)) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tme.transition(easingValue);\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\t\t\tme._drawTooltip(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\ttransition: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.tooltip.transition(easingValue);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDataset: function(index, easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t},\n\n\t\t/**\n\t\t * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n\t\t * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n\t\t * @private\n\t\t */\n\t\t_drawTooltip: function(easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\t\t\tvar args = {\n\t\t\t\ttooltip: tooltip,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttooltip.draw();\n\n\t\t\tplugins.notify(me, 'afterTooltipDraw', [args]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroyDatasetMeta: function(datasetIndex) {\n\t\t\tvar id = this.id;\n\t\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\t\tif (meta) {\n\t\t\t\tmeta.controller.destroy();\n\t\t\t\tdelete dataset._meta[id];\n\t\t\t}\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.destroyDatasetMeta(i);\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.canvas.clear(me);\n\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\tme.canvas = null;\n\t\t\t\tme.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me,\n\t\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\t// for smooth tooltip animations issue #4989\n\t\t\t// the tooltip should be the source of change\n\t\t\t// Animation check workaround:\n\t\t\t// tooltip._start will be null when tooltip isn't animating\n\t\t\tif (tooltip) {\n\t\t\t\tchanged = tooltip._start\n\t\t\t\t\t? tooltip.handleEvent(e)\n\t\t\t\t\t: changed | tooltip.handleEvent(e);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// Invoke onHover hook\n\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\thelpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart instead.\n\t * @class Chart.Controller\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.Controller = Chart;\n};\n","'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n"],"sourceRoot":""}